From acc2b3d3081bfd1c8abc25c9dc6f98a5a71d1d51 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 10 May 2020 12:16:48 +0200 Subject: [PATCH 001/185] Add RCD+Bilinear demosaic for Bayer sensors, #5748 --- rtdata/languages/default | 1 + rtengine/CMakeLists.txt | 1 + rtengine/bayer_bilinear_demosaic.cc | 58 +++++++++++++++++++++++++++++ rtengine/dual_demosaic_RT.cc | 12 +++++- rtengine/procparams.cc | 1 + rtengine/procparams.h | 1 + rtengine/rawimagesource.cc | 1 + rtengine/rawimagesource.h | 1 + rtgui/bayerprocess.cc | 3 +- 9 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 rtengine/bayer_bilinear_demosaic.cc diff --git a/rtdata/languages/default b/rtdata/languages/default index f33608903..8b03dd439 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1954,6 +1954,7 @@ TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for b TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. TP_RAW_RCD;RCD +TP_RAW_RCDBILINEAR;RCD+Bilinear TP_RAW_RCDVNG4;RCD+VNG4 TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.\n+fast gives less artifacts in flat areas diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 3813c5708..0450ee29f 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -63,6 +63,7 @@ set(RTENGINESOURCEFILES ahd_demosaic_RT.cc amaze_demosaic_RT.cc badpixels.cc + bayer_bilinear_demosaic.cc boxblur.cc canon_cr3_decoder.cc CA_correct_RT.cc diff --git a/rtengine/bayer_bilinear_demosaic.cc b/rtengine/bayer_bilinear_demosaic.cc new file mode 100644 index 000000000..0125a21e7 --- /dev/null +++ b/rtengine/bayer_bilinear_demosaic.cc @@ -0,0 +1,58 @@ +//////////////////////////////////////////////////////////////// +// +// Bilinear bayer demosaic, optimized for speed, intended use is for flat regions of dual-demosaic +// +// copyright (c) 2020 Ingo Weyrich +// +// +// code dated: May 09, 2020 +// +// bayer_bilinear_demosaic.cc 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 . +// +//////////////////////////////////////////////////////////////// + +#include "rawimagesource.h" +#define BENCHMARK +#include "StopWatch.h" + +using namespace rtengine; + +void RawImageSource::bayer_bilinear_demosaic(const array2D &rawData, array2D &red, array2D &green, array2D &blue) +{ +BENCHFUN +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 1; i < H - 1; ++i) { + float **nonGreen1 = red; + float **nonGreen2 = blue; + if (FC(i, 0) == 2 || FC(i, 1) == 2) { // blue row => swap pointers + std::swap(nonGreen1, nonGreen2); + } +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep +#endif + for (int j = 2 - (FC(i, 1) & 1); j < W - 2; j += 2) { // always begin with a green pixel + green[i][j] = rawData[i][j]; + nonGreen1[i][j] = (rawData[i][j - 1] + rawData[i][j + 1]) * 0.5f; + nonGreen2[i][j] = (rawData[i - 1][j] + rawData[i + 1][j]) * 0.5f; + green[i][j + 1] = ((rawData[i - 1][j + 1] + rawData[i][j]) + (rawData[i][j + 2] + rawData[i + 1][j + 1])) * 0.25f; + nonGreen1[i][j + 1] = rawData[i][j + 1]; + nonGreen2[i][j + 1] = ((rawData[i - 1][j] + rawData[i - 1][j + 2]) + (rawData[i + 1][j] + rawData[i + 1][j + 2])) * 0.25f; + } + } + border_interpolate(W, H, 2, rawData, red, green, blue); +} diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc index 253468a76..bbf4e621a 100644 --- a/rtengine/dual_demosaic_RT.cc +++ b/rtengine/dual_demosaic_RT.cc @@ -33,7 +33,7 @@ #include "../rtgui/options.h" -//#define BENCHMARK +#define BENCHMARK #include "StopWatch.h" using namespace std; @@ -52,6 +52,8 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) ) { dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) ) { + rcd_demosaic(options.chunkSizeRCD, options.measure); } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4) ) { rcd_demosaic(options.chunkSizeRCD, options.measure); } @@ -73,6 +75,8 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) ) { dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) ) { + rcd_demosaic(options.chunkSizeRCD, options.measure); } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4) ) { rcd_demosaic(options.chunkSizeRCD, options.measure); } @@ -113,7 +117,11 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams array2D blueTmp(winw, winh); if (isBayer) { - vng4_demosaic(rawData, redTmp, greenTmp, blueTmp); + if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) ) { + bayer_bilinear_demosaic(rawData, redTmp, greenTmp, blueTmp); + } else { + vng4_demosaic(rawData, redTmp, greenTmp, blueTmp); + } } else { fast_xtrans_interpolate(rawData, redTmp, greenTmp, blueTmp); } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index a198a6813..00a261056 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2717,6 +2717,7 @@ const std::vector& RAWParams::BayerSensor::getMethodStrings() "amaze", "amazevng4", "rcd", + "rcdbilinear", "rcdvng4", "dcb", "dcbvng4", diff --git a/rtengine/procparams.h b/rtengine/procparams.h index f9710b01d..f33214d44 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1395,6 +1395,7 @@ struct RAWParams { AMAZE, AMAZEVNG4, RCD, + RCDBILINEAR, RCDVNG4, DCB, DCBVNG4, diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 75088a07c..a599f9a22 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1575,6 +1575,7 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4) || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCBVNG4) + || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCDBILINEAR) || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCDVNG4)) { if (!autoContrast) { double threshold = raw.bayersensor.dualDemosaicContrast; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 770c18ae3..861eb942a 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -300,6 +300,7 @@ protected: void xtrans_interpolate (const int passes, const bool useCieLab, size_t chunkSize = 1, bool measure = false); void fast_xtrans_interpolate (const array2D &rawData, array2D &red, array2D &green, array2D &blue); void pixelshift(int winx, int winy, int winw, int winh, const procparams::RAWParams &rawParams, unsigned int frame, const std::string &make, const std::string &model, float rawWpCorrection); + void bayer_bilinear_demosaic(const array2D &rawData, array2D &red, array2D &green, array2D &blue); void hflip (Imagefloat* im); void vflip (Imagefloat* im); void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override; diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index 5b5cfe9c4..9ba011c59 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -365,6 +365,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params lmmseOptions->set_visible(pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::LMMSE)); dualDemosaicOptions->set_visible(pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) + || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4)); if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::PIXELSHIFT)) { pixelShiftOptions->set_visible(pp->raw.bayersensor.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::PSMotionCorrectionMethod::CUSTOM); @@ -573,7 +574,7 @@ void BayerProcess::methodChanged () lmmseOptions->hide(); } - if (currentMethod == procparams::RAWParams::BayerSensor::Method::AMAZEVNG4 || currentMethod == procparams::RAWParams::BayerSensor::Method::DCBVNG4 || currentMethod == procparams::RAWParams::BayerSensor::Method::RCDVNG4) { + if (currentMethod == procparams::RAWParams::BayerSensor::Method::AMAZEVNG4 || currentMethod == procparams::RAWParams::BayerSensor::Method::DCBVNG4 || currentMethod == procparams::RAWParams::BayerSensor::Method::RCDVNG4 || currentMethod == procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) { dualDemosaicOptions->show(); } else { dualDemosaicOptions->hide(); From bf30ca6c05ef134852b84013c6706bb10edd2479 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 24 May 2020 19:28:56 +0200 Subject: [PATCH 002/185] dual_demosaic: added Amaze+bilinear and Vng4+biliner, also made a small speedup, #5748 --- rtdata/languages/default | 2 ++ rtengine/dual_demosaic_RT.cc | 61 +++++++++++++++--------------------- rtengine/procparams.cc | 2 ++ rtengine/procparams.h | 2 ++ rtengine/rawimagesource.cc | 4 ++- 5 files changed, 34 insertions(+), 37 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index e4c3a3a08..b30e7dd32 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1909,11 +1909,13 @@ TP_RAW_3PASSBEST;3-pass (Markesteijn) TP_RAW_4PASS;3-pass+fast TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear TP_RAW_AMAZEVNG4;AMaZE+VNG4 TP_RAW_BORDER;Border TP_RAW_DCB;DCB TP_RAW_DCBENHANCE;DCB enhancement TP_RAW_DCBITERATIONS;Number of DCB iterations +TP_RAW_DCBBILINEAR;DCB+Bilinear TP_RAW_DCBVNG4;DCB+VNG4 TP_RAW_DMETHOD;Method TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc index bbf4e621a..f7a403c16 100644 --- a/rtengine/dual_demosaic_RT.cc +++ b/rtengine/dual_demosaic_RT.cc @@ -48,17 +48,18 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams if (contrast == 0.0 && !autoContrast) { // contrast == 0.0 means only first demosaicer will be used if(isBayer) { - if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) ) { + if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4)) { amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); - } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) ) { + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4)) { dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); - } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) ) { - rcd_demosaic(options.chunkSizeRCD, options.measure); - } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4) ) { + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4)) { rcd_demosaic(options.chunkSizeRCD, options.measure); } } else { - if (raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FOUR_PASS) ) { + if (raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FOUR_PASS)) { xtrans_interpolate (3, true, options.chunkSizeXT, options.measure); } else { xtrans_interpolate (1, false, options.chunkSizeXT, options.measure); @@ -71,17 +72,19 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams array2D L(winw, winh); if (isBayer) { - if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) || raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::PIXELSHIFT)) { + if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::PIXELSHIFT)) { amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); - } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) ) { + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4)) { dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); - } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) ) { - rcd_demosaic(options.chunkSizeRCD, options.measure); - } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4) ) { + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4)) { rcd_demosaic(options.chunkSizeRCD, options.measure); } } else { - if (raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FOUR_PASS) ) { + if (raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FOUR_PASS)) { xtrans_interpolate (3, true, options.chunkSizeXT, options.measure); } else { xtrans_interpolate (1, false, options.chunkSizeXT, options.measure); @@ -95,17 +98,13 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams }; #ifdef _OPENMP - #pragma omp parallel + #pragma omp parallel for schedule(dynamic,16) #endif - { -#ifdef _OPENMP - #pragma omp for -#endif - for(int i = 0; i < winh; ++i) { - Color::RGB2L(red[i], green[i], blue[i], L[i], xyz_rgb, winw); - } + for(int i = 0; i < winh; ++i) { + Color::RGB2L(red[i], green[i], blue[i], L[i], xyz_rgb, winw); } - // calculate contrast based blend factors to use vng4 in regions with low contrast + + // calculate contrast based blend factors to use flat demosaicer in regions with low contrast JaggedArray blend(winw, winh); float contrastf = contrast / 100.0; @@ -117,7 +116,9 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams array2D blueTmp(winw, winh); if (isBayer) { - if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) ) { + if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBBILINEAR)) { bayer_bilinear_demosaic(rawData, redTmp, greenTmp, blueTmp); } else { vng4_demosaic(rawData, redTmp, greenTmp, blueTmp); @@ -126,32 +127,20 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams fast_xtrans_interpolate(rawData, redTmp, greenTmp, blueTmp); } - - // the following is split into 3 loops intentionally to avoid cache conflicts on CPUs with only 4-way cache #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel for schedule(dynamic,16) #endif for(int i = 0; i < winh; ++i) { + // the following is split into 3 loops intentionally to avoid cache conflicts on CPUs with only 4-way cache for(int j = 0; j < winw; ++j) { red[i][j] = intp(blend[i][j], red[i][j], redTmp[i][j]); } - } -#ifdef _OPENMP - #pragma omp parallel for -#endif - for(int i = 0; i < winh; ++i) { for(int j = 0; j < winw; ++j) { green[i][j] = intp(blend[i][j], green[i][j], greenTmp[i][j]); } - } -#ifdef _OPENMP - #pragma omp parallel for -#endif - for(int i = 0; i < winh; ++i) { for(int j = 0; j < winw; ++j) { blue[i][j] = intp(blend[i][j], blue[i][j], blueTmp[i][j]); } } - } } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 56cccb4bb..57bcf604a 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2764,11 +2764,13 @@ const std::vector& RAWParams::BayerSensor::getMethodStrings() { static const std::vector method_strings { "amaze", + "amazebilinear", "amazevng4", "rcd", "rcdbilinear", "rcdvng4", "dcb", + "dcbbilinear", "dcbvng4", "lmmse", "igv", diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 4e7f6d3ff..0c0631624 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1408,11 +1408,13 @@ struct RAWParams { struct BayerSensor { enum class Method { AMAZE, + AMAZEBILINEAR, AMAZEVNG4, RCD, RCDBILINEAR, RCDVNG4, DCB, + DCBBILINEAR, DCBVNG4, LMMSE, IGV, diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 4f78dfbdb..7d3f5ab2c 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1578,7 +1578,9 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c ahd_demosaic (); } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZE)) { amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4) + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEBILINEAR) + || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4) + || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCBBILINEAR) || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCBVNG4) || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCDBILINEAR) || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCDVNG4)) { From 1c11db3fc959e2403d63005ad40fd3f2c4832f6c Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 25 May 2020 16:28:04 +0200 Subject: [PATCH 003/185] Speedup for bilinear dual demosaicers, #5748 --- rtengine/bayer_bilinear_demosaic.cc | 16 ++++++++-------- rtengine/dual_demosaic_RT.cc | 11 ++++++++--- rtengine/rawimagesource.h | 2 +- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/rtengine/bayer_bilinear_demosaic.cc b/rtengine/bayer_bilinear_demosaic.cc index 0125a21e7..2fa0812dc 100644 --- a/rtengine/bayer_bilinear_demosaic.cc +++ b/rtengine/bayer_bilinear_demosaic.cc @@ -23,12 +23,13 @@ //////////////////////////////////////////////////////////////// #include "rawimagesource.h" +#include "rt_math.h" #define BENCHMARK #include "StopWatch.h" using namespace rtengine; -void RawImageSource::bayer_bilinear_demosaic(const array2D &rawData, array2D &red, array2D &green, array2D &blue) +void RawImageSource::bayer_bilinear_demosaic(const float* const * blend, const array2D &rawData, array2D &red, array2D &green, array2D &blue) { BENCHFUN #ifdef _OPENMP @@ -46,13 +47,12 @@ BENCHFUN #pragma GCC ivdep #endif for (int j = 2 - (FC(i, 1) & 1); j < W - 2; j += 2) { // always begin with a green pixel - green[i][j] = rawData[i][j]; - nonGreen1[i][j] = (rawData[i][j - 1] + rawData[i][j + 1]) * 0.5f; - nonGreen2[i][j] = (rawData[i - 1][j] + rawData[i + 1][j]) * 0.5f; - green[i][j + 1] = ((rawData[i - 1][j + 1] + rawData[i][j]) + (rawData[i][j + 2] + rawData[i + 1][j + 1])) * 0.25f; - nonGreen1[i][j + 1] = rawData[i][j + 1]; - nonGreen2[i][j + 1] = ((rawData[i - 1][j] + rawData[i - 1][j + 2]) + (rawData[i + 1][j] + rawData[i + 1][j + 2])) * 0.25f; + green[i][j] = intp(blend[i][j], green[i][j], rawData[i][j]); + nonGreen1[i][j] = intp(blend[i][j], nonGreen1[i][j], (rawData[i][j - 1] + rawData[i][j + 1]) * 0.5f); + nonGreen2[i][j] = intp(blend[i][j], nonGreen2[i][j], (rawData[i - 1][j] + rawData[i + 1][j]) * 0.5f); + green[i][j + 1] = intp(blend[i][j + 1], green[i][j + 1], ((rawData[i - 1][j + 1] + rawData[i][j]) + (rawData[i][j + 2] + rawData[i + 1][j + 1])) * 0.25f); + nonGreen1[i][j + 1] = intp(blend[i][j + 1], nonGreen1[i][j + 1], rawData[i][j + 1]); + nonGreen2[i][j + 1] = intp(blend[i][j + 1], nonGreen2[i][j + 1], ((rawData[i - 1][j] + rawData[i - 1][j + 2]) + (rawData[i + 1][j] + rawData[i + 1][j + 2])) * 0.25f); } } - border_interpolate(W, H, 2, rawData, red, green, blue); } diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc index f7a403c16..ad95776ce 100644 --- a/rtengine/dual_demosaic_RT.cc +++ b/rtengine/dual_demosaic_RT.cc @@ -112,18 +112,23 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams contrast = contrastf * 100.f; array2D& redTmp = L; // L is not needed anymore => reuse it - array2D greenTmp(winw, winh); - array2D blueTmp(winw, winh); + array2D greenTmp; + array2D blueTmp; if (isBayer) { if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEBILINEAR) || raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) || raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBBILINEAR)) { - bayer_bilinear_demosaic(rawData, redTmp, greenTmp, blueTmp); + bayer_bilinear_demosaic(blend, rawData, red, green, blue); + return; } else { + greenTmp(winw, winh); + blueTmp(winw, winh); vng4_demosaic(rawData, redTmp, greenTmp, blueTmp); } } else { + greenTmp(winw, winh); + blueTmp(winw, winh); fast_xtrans_interpolate(rawData, redTmp, greenTmp, blueTmp); } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 861eb942a..712ecb073 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -300,7 +300,7 @@ protected: void xtrans_interpolate (const int passes, const bool useCieLab, size_t chunkSize = 1, bool measure = false); void fast_xtrans_interpolate (const array2D &rawData, array2D &red, array2D &green, array2D &blue); void pixelshift(int winx, int winy, int winw, int winh, const procparams::RAWParams &rawParams, unsigned int frame, const std::string &make, const std::string &model, float rawWpCorrection); - void bayer_bilinear_demosaic(const array2D &rawData, array2D &red, array2D &green, array2D &blue); + void bayer_bilinear_demosaic(const float *const * blend, const array2D &rawData, array2D &red, array2D &green, array2D &blue); void hflip (Imagefloat* im); void vflip (Imagefloat* im); void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override; From 6b7c1871b9bd14e0bd6aa854953b46c032969033 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Mon, 8 Jun 2020 18:21:12 -0700 Subject: [PATCH 004/185] Implement basic perspective control lines (WIP) --- rtengine/iptransform.cc | 7 +- rtengine/perspectivecorrection.cc | 125 +++++--- rtengine/perspectivecorrection.h | 14 +- rtengine/procparams.cc | 2 + rtengine/procparams.h | 1 + rtgui/cropwindow.cc | 7 +- rtgui/editcallbacks.h | 6 +- rtgui/lensgeomlistener.h | 11 +- rtgui/perspective.cc | 464 ++++++++++++++++++++++++++++++ rtgui/perspective.h | 98 +++++++ rtgui/toolpanelcoord.cc | 16 +- rtgui/toolpanelcoord.h | 3 +- 12 files changed, 703 insertions(+), 51 deletions(-) diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index eb823d711..aa22aac56 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -454,7 +454,7 @@ bool ImProcFunctions::transCoord (int W, int H, const std::vector &src, double cost = cos (params->rotate.degree * rtengine::RT_PI / 180.0); double sint = sin (params->rotate.degree * rtengine::RT_PI / 180.0); - double ascale = ascaleDef > 0 ? ascaleDef : (params->commonTrans.autofill ? getTransformAutoFill (oW, oH, pLCPMap) : 1.0); + double ascale = ascaleDef > 0 ? ascaleDef : (params->commonTrans.autofill && params->perspective.render ? getTransformAutoFill (oW, oH, pLCPMap) : 1.0); // auxiliary variables for perspective correction // Simple. @@ -1185,7 +1185,7 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I p_projection_rotate, p_projection_shift_horiz, p_projection_shift_vert, p_projection_scale); - const double ascale = params->commonTrans.autofill ? getTransformAutoFill(oW, oH, pLCPMap) : 1.0; + const double ascale = params->commonTrans.autofill && params->perspective.render ? getTransformAutoFill(oW, oH, pLCPMap) : 1.0; const bool darkening = (params->vignetting.amount <= 0.0); const bool useLog = params->commonTrans.method == "log" && highQuality; @@ -1477,7 +1477,8 @@ bool ImProcFunctions::needsPerspective () const { return ( (params->perspective.method == "simple") && (params->perspective.horizontal || params->perspective.vertical) ) - || ( (params->perspective.method == "camera_based") && ( + || ( (params->perspective.method == "camera_based") && + params->perspective.render && ( params->perspective.camera_pitch || params->perspective.camera_roll || params->perspective.camera_shift_horiz || diff --git a/rtengine/perspectivecorrection.cc b/rtengine/perspectivecorrection.cc index 5fa7b32f3..2c8d9e9f2 100644 --- a/rtengine/perspectivecorrection.cc +++ b/rtengine/perspectivecorrection.cc @@ -225,10 +225,44 @@ void get_view_size(int w, int h, const procparams::PerspectiveParams ¶ms, do } */ +/** + * Allocates a new array and populates it with ashift lines corresponding to the + * provided control lines. + */ +dt_iop_ashift_line_t* toAshiftLines(const ControlLine *lines, size_t count) +{ + auto retval = (dt_iop_ashift_line_t*)malloc(count * sizeof(dt_iop_ashift_line_t)); + + for (size_t i = 0; i < count; i++) { + const float x1 = lines[i].x1; + const float y1 = lines[i].y1; + const float x2 = lines[i].x2; + const float y2 = lines[i].y2; + retval[i].p1[0] = x1; + retval[i].p1[1] = y1; + retval[i].p1[2] = 1.0f; + retval[i].p2[0] = x2; + retval[i].p2[1] = y2; + retval[i].p2[2] = 1.0f; + retval[i].length = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); + retval[i].width = 1.0f; + retval[i].weight = retval[i].length; + if (lines[i].type == ControlLine::HORIZONTAL) { + retval[i].type = ASHIFT_LINE_HORIZONTAL_SELECTED; + } else if (lines[i].type == ControlLine::VERTICAL) { + retval[i].type = ASHIFT_LINE_VERTICAL_SELECTED; + } else { + retval[i].type = ASHIFT_LINE_IRRELEVANT; + } + } + + return retval; +} + } // namespace -PerspectiveCorrection::Params PerspectiveCorrection::autocompute(ImageSource *src, bool corr_pitch, bool corr_yaw, const procparams::ProcParams *pparams, const FramesMetaData *metadata) +PerspectiveCorrection::Params PerspectiveCorrection::autocompute(ImageSource *src, bool corr_pitch, bool corr_yaw, const procparams::ProcParams *pparams, const FramesMetaData *metadata, const ControlLine *control_lines, size_t control_lines_count) { auto pcp = procparams::PerspectiveParams(pparams->perspective); procparams::PerspectiveParams dflt; @@ -252,49 +286,51 @@ PerspectiveCorrection::Params PerspectiveCorrection::autocompute(ImageSource *sr int tr = getCoarseBitMask(pparams->coarse); int fw, fh; src->getFullSize(fw, fh, tr); - int skip = max(float(max(fw, fh)) / 900.f + 0.5f, 1.f); - PreviewProps pp(0, 0, fw, fh, skip); - int w, h; - src->getSize(pp, w, h); - std::unique_ptr img(new Imagefloat(w, h)); + if (control_lines == nullptr) { + int skip = max(float(max(fw, fh)) / 900.f + 0.5f, 1.f); + PreviewProps pp(0, 0, fw, fh, skip); + int w, h; + src->getSize(pp, w, h); + std::unique_ptr img(new Imagefloat(w, h)); - ProcParams neutral; - neutral.raw.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST); - neutral.raw.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST); - neutral.icm.outputProfile = ColorManagementParams::NoICMString; - src->getImage(src->getWB(), tr, img.get(), pp, neutral.toneCurve, neutral.raw); - src->convertColorSpace(img.get(), pparams->icm, src->getWB()); + ProcParams neutral; + neutral.raw.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST); + neutral.raw.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST); + neutral.icm.outputProfile = ColorManagementParams::NoICMString; + src->getImage(src->getWB(), tr, img.get(), pp, neutral.toneCurve, neutral.raw); + src->convertColorSpace(img.get(), pparams->icm, src->getWB()); - neutral.commonTrans.autofill = false; // Ensures crop factor is correct. - // TODO: Ensure image borders of rotated image do not get detected as lines. - neutral.rotate = pparams->rotate; - neutral.distortion = pparams->distortion; - neutral.lensProf = pparams->lensProf; - ImProcFunctions ipf(&neutral, true); - if (ipf.needsTransform(w, h, src->getRotateDegree(), src->getMetaData())) { - Imagefloat *tmp = new Imagefloat(w, h); - ipf.transform(img.get(), tmp, 0, 0, 0, 0, w, h, w, h, - src->getMetaData(), src->getRotateDegree(), false); - img.reset(tmp); - } + neutral.commonTrans.autofill = false; // Ensures crop factor is correct. + // TODO: Ensure image borders of rotated image do not get detected as lines. + neutral.rotate = pparams->rotate; + neutral.distortion = pparams->distortion; + neutral.lensProf = pparams->lensProf; + ImProcFunctions ipf(&neutral, true); + if (ipf.needsTransform(w, h, src->getRotateDegree(), src->getMetaData())) { + Imagefloat *tmp = new Imagefloat(w, h); + ipf.transform(img.get(), tmp, 0, 0, 0, 0, w, h, w, h, + src->getMetaData(), src->getRotateDegree(), false); + img.reset(tmp); + } - // allocate the gui buffer - g.buf = static_cast(malloc(sizeof(float) * w * h * 4)); - g.buf_width = w; - g.buf_height = h; + // allocate the gui buffer + g.buf = static_cast(malloc(sizeof(float) * w * h * 4)); + g.buf_width = w; + g.buf_height = h; + + img->normalizeFloatTo1(); - img->normalizeFloatTo1(); - #ifdef _OPENMP # pragma omp parallel for #endif - for (int y = 0; y < h; ++y) { - for (int x = 0; x < w; ++x) { - int i = (y * w + x) * 4; - g.buf[i] = img->r(y, x); - g.buf[i+1] = img->g(y, x); - g.buf[i+2] = img->b(y, x); - g.buf[i+3] = 1.f; + for (int y = 0; y < h; ++y) { + for (int x = 0; x < w; ++x) { + int i = (y * w + x) * 4; + g.buf[i] = img->r(y, x); + g.buf[i+1] = img->g(y, x); + g.buf[i+2] = img->b(y, x); + g.buf[i+3] = 1.f; + } } } @@ -311,7 +347,20 @@ PerspectiveCorrection::Params PerspectiveCorrection::autocompute(ImageSource *sr // internally! srand(1); - auto res = do_get_structure(&module, &p, ASHIFT_ENHANCE_EDGES) && do_fit(&module, &p, fitaxis); + bool res; + if (control_lines == nullptr) { + res = do_get_structure(&module, &p, ASHIFT_ENHANCE_EDGES) && do_fit(&module, &p, fitaxis); + } else { + dt_iop_ashift_gui_data_t *g = module.gui_data; + g->lines_count = control_lines_count; + g->lines = toAshiftLines(control_lines, control_lines_count); + g->lines_in_height = fh; + g->lines_in_width = fw; + // A hack. + g->horizontal_count = 4; + g->vertical_count = 4; + res = do_fit(&module, &p, fitaxis); + } Params retval = { .angle = p.rotation, .pitch = p.camera_pitch, diff --git a/rtengine/perspectivecorrection.h b/rtengine/perspectivecorrection.h index bf7cfa08d..94a63a42c 100644 --- a/rtengine/perspectivecorrection.h +++ b/rtengine/perspectivecorrection.h @@ -26,6 +26,18 @@ namespace rtengine { +class ControlLine +{ +public: + enum Type + { + HORIZONTAL, + VERTICAL + }; + float x1, y1, x2, y2; + Type type; +}; + class PerspectiveCorrection { public: struct Params @@ -35,7 +47,7 @@ public: double yaw; }; - static Params autocompute(ImageSource *src, bool corr_pitch, bool corr_yaw, const procparams::ProcParams *pparams, const FramesMetaData *metadata); + static Params autocompute(ImageSource *src, bool corr_pitch, bool corr_yaw, const procparams::ProcParams *pparams, const FramesMetaData *metadata, const ControlLine *control_lines = nullptr, size_t control_lines_count = 0); //static void autocrop(int width, int height, bool fixratio, const procparams::PerspectiveParams ¶ms, const FramesMetaData *metadata, int &x, int &y, int &w, int &h); }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index af48d027a..e00e50186 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1860,6 +1860,7 @@ LensProfParams::LcMode LensProfParams::getMethodNumber(const Glib::ustring& mode PerspectiveParams::PerspectiveParams() : method("simple"), + render(true), horizontal(0.0), vertical(0.0), camera_crop_factor(0.0), @@ -1881,6 +1882,7 @@ bool PerspectiveParams::operator ==(const PerspectiveParams& other) const { return method == other.method + && render == other.render && horizontal == other.horizontal && vertical == other.vertical && camera_focal_length == other.camera_focal_length diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 8a95032e8..b6d2b9c3a 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -911,6 +911,7 @@ struct LensProfParams { */ struct PerspectiveParams { Glib::ustring method; + bool render; double horizontal; double vertical; double camera_crop_factor; diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index d87876cec..975bac15c 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -429,6 +429,8 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) state = SEditPick1; pickedObject = iarea->getObject(); pickModifierKey = bstate; + } else { + state = SCropImgMove; } press_x = x; press_y = y; @@ -764,7 +766,10 @@ void CropWindow::buttonRelease (int button, int num, int bstate, int x, int y) iarea->setObject(ObjectMOBuffer::getObjectID(cropPos)); - bool elemPicked = iarea->getObject() == pickedObject && bstate == pickModifierKey; + int buttonMask = ((state == SEditPick1) ? GDK_BUTTON1_MASK : 0) + | ((state == SEditPick2) ? GDK_BUTTON2_MASK : 0) + | ((state == SEditPick3) ? GDK_BUTTON3_MASK : 0); + bool elemPicked = iarea->getObject() == pickedObject && bstate == (pickModifierKey | buttonMask); if (state == SEditPick1) { needRedraw = editSubscriber->pick1 (elemPicked); diff --git a/rtgui/editcallbacks.h b/rtgui/editcallbacks.h index ee357c2f7..c2efcf53e 100644 --- a/rtgui/editcallbacks.h +++ b/rtgui/editcallbacks.h @@ -129,19 +129,19 @@ public: @param picked True if the cursor is still above the the same object than on button pressed and with the same modifier keys. If false, the user moved the cursor away or the modifier key is different, so the element is considered as NOT selected. @return true if the preview has to be redrawn, false otherwise */ - bool pick1 (bool picked); + virtual bool pick1 (bool picked); /** @brief Triggered when the user is releasing mouse button 2 while in action==ES_ACTION_PICKING mode @param picked True if the cursor is still above the the same object than on button pressed and with the same modifier keys. If false, the user moved the cursor away or the modifier key is different, so the element is considered as NOT selected. @return true if the preview has to be redrawn, false otherwise */ - bool pick2 (bool picked); + virtual bool pick2 (bool picked); /** @brief Triggered when the user is releasing mouse button 3 while in action==ES_ACTION_PICKING mode @param picked True if the cursor is still above the the same object than on button pressed and with the same modifier keys. If false, the user moved the cursor away or the modifier key is different, so the element is considered as NOT selected. @return true if the preview has to be redrawn, false otherwise */ - bool pick3 (bool picked); + virtual bool pick3 (bool picked); /** @brief Get the geometry to be shown to the user */ const std::vector& getVisibleGeometry (); diff --git a/rtgui/lensgeomlistener.h b/rtgui/lensgeomlistener.h index 810b7ed98..9bbaf125a 100644 --- a/rtgui/lensgeomlistener.h +++ b/rtgui/lensgeomlistener.h @@ -18,6 +18,14 @@ */ #pragma once +#include + +namespace rtengine +{ +class ControlLine; +class ProcEvent; +} + class LensGeomListener { public: @@ -25,5 +33,6 @@ public: virtual void straightenRequested () = 0; virtual void autoCropRequested () = 0; virtual double autoDistorRequested () = 0; - virtual void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw) = 0; + virtual void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const rtengine::ControlLine *lines = nullptr, size_t line_count = 0) = 0; + virtual void updateTransformPreviewRequested (rtengine::ProcEvent event, bool render_perspective) = 0; }; diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 0607a7604..1b1672914 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -37,6 +37,7 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" EvPerspProjAngle = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_PROJ_ANGLE"); EvPerspProjRotate = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_PROJ_ROTATE"); EvPerspProjShift = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_PROJ_SHIFT"); + EvPerspRender = mapper->newEvent(TRANSFORM); lens_geom_listener = nullptr; Gtk::Image* ipersHL = Gtk::manage (new RTImage ("perspective-horizontal-left-small.png")); @@ -107,6 +108,31 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" -60, 60, 0.1, 0, ipers_cam_yaw_left, ipers_cam_yaw_right)); camera_yaw->setAdjusterListener (this); + // Begin control lines interface. + lines_button_h = Gtk::manage (new Gtk::ToggleButton()); + lines_button_h->signal_toggled().connect(sigc::bind(sigc::mem_fun( + *this, &::PerspCorrection::linesButtonPressed), lines_button_h)); + + lines_button_v = Gtk::manage (new Gtk::ToggleButton()); + lines_button_v->signal_toggled().connect(sigc::bind(sigc::mem_fun( + *this, &::PerspCorrection::linesButtonPressed), lines_button_v)); + + lines_button_edit = Gtk::manage (new Gtk::ToggleButton()); + lines_button_edit->signal_toggled().connect(sigc::mem_fun( + *this, &::PerspCorrection::linesEditButtonPressed)); + + lines = new ControlLineManager(); + lines->callbacks = new LinesCallbacks(this, lines); + + img_ctrl_lines_apply = NULL; + img_ctrl_lines_edit = NULL; + + Gtk::HBox* control_lines_box = Gtk::manage (new Gtk::HBox()); + control_lines_box->pack_start(*lines_button_v); + control_lines_box->pack_start(*lines_button_h); + control_lines_box->pack_start(*lines_button_edit); + // End control lines interface. + auto_pitch = Gtk::manage (new Gtk::Button ()); auto_pitch->set_image(*ipers_auto_pitch); auto_pitch->signal_pressed().connect( sigc::bind(sigc::mem_fun(*this, &PerspCorrection::autoCorrectionPressed), auto_pitch) ); @@ -164,6 +190,7 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" camera_vbox->pack_start (*camera_roll); camera_vbox->pack_start (*camera_pitch); camera_vbox->pack_start (*camera_yaw); + camera_vbox->pack_start (*control_lines_box); camera_vbox->pack_start (*auto_hbox); camera_frame->add(*camera_vbox); camera_based->pack_start(*camera_frame); @@ -192,6 +219,18 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" show_all(); } +PerspCorrection::~PerspCorrection() +{ + delete lines->callbacks; + delete lines; + if (img_ctrl_lines_apply) { + delete img_ctrl_lines_apply; + } + if (img_ctrl_lines_edit) { + delete img_ctrl_lines_edit; + } +} + void PerspCorrection::read (const ProcParams* pp, const ParamsEdited* pedited) { @@ -242,6 +281,8 @@ void PerspCorrection::read (const ProcParams* pp, const ParamsEdited* pedited) void PerspCorrection::write (ProcParams* pp, ParamsEdited* pedited) { + pp->perspective.render = render; + pp->perspective.horizontal = horiz->getValue (); pp->perspective.vertical = vert->getValue (); pp->perspective.camera_crop_factor= camera_crop_factor->getValue (); @@ -387,6 +428,39 @@ void PerspCorrection::adjusterChanged(Adjuster* a, double newval) } } +void PerspCorrection::applyControlLines(void) +{ + if (!lens_geom_listener) { + return; + } + + auto control_lines = lines->toControlLines(); + int h_count = 0, v_count = 0; + double rot = 0; + double pitch = 0; + double yaw = 0; + + for (unsigned int i = 0; i < lines->size(); i++) { + if (control_lines[i].type == rtengine::ControlLine::HORIZONTAL) { + h_count++; + } else if (control_lines[i].type == rtengine::ControlLine::VERTICAL) { + v_count++; + } + } + lens_geom_listener->autoPerspRequested(v_count > 1, h_count > 1, rot, pitch, + yaw, control_lines, lines->size()); + + free(control_lines); + + disableListener(); + camera_pitch->setValue(pitch); + camera_roll->setValue(rot); + camera_yaw->setValue(yaw); + enableListener(); + + adjusterChanged(camera_pitch, pitch); +} + void PerspCorrection::autoCorrectionPressed(Gtk::Button* b) { if (!lens_geom_listener) { @@ -548,3 +622,393 @@ void PerspCorrection::setFocalLengthValue (const ProcParams* pparams, const Fram camera_focal_length->setValue(default_focal_length); } } + +void PerspCorrection::switchOffEditMode(ControlLineManager* lines) +{ + lines_button_h->set_active(false); + lines_button_v->set_active(false); + lines_button_edit->set_active(false); +} + +void PerspCorrection::setEditProvider(EditDataProvider* provider) +{ + lines->setEditProvider(provider); +} + +void PerspCorrection::linesButtonPressed(Gtk::ToggleButton* button) +{ + lines->setLinesState(lines_button_h->get_active(), lines_button_v->get_active()); + + if (!button->get_active()) { + return; + } + + if (button == lines_button_h) { + lines->draw_line_type = rtengine::ControlLine::HORIZONTAL; + if (lines_button_v->get_active()) { + lines_button_v->set_active(false); + } + } else if (button == lines_button_v) { + lines->draw_line_type = rtengine::ControlLine::VERTICAL; + if (lines_button_h->get_active()) { + lines_button_h->set_active(false); + } + } + + if (!lines_button_edit->get_active()) { + lines_button_edit->set_active(true); + } + + lines->setDrawMode(true); +} + +void PerspCorrection::linesEditButtonPressed(void) +{ + if (lines_button_edit->get_active()) { // Enter edit mode. + lines->setActive(true); + if (img_ctrl_lines_apply) { + lines_button_edit->set_image(*img_ctrl_lines_apply); + } + render = false; + lines->setLinesState(lines_button_h->get_active(), lines_button_v->get_active()); + if (lens_geom_listener) { + lens_geom_listener->updateTransformPreviewRequested(EvPerspRender, false); + } + } else { // Leave edit mode. + render = true; + lines->setDrawMode(false); + lines->setActive(false); + if (img_ctrl_lines_edit) { + lines_button_edit->set_image(*img_ctrl_lines_edit); + } + lines_button_h->set_active(false); + lines_button_v->set_active(false); + applyControlLines(); + } +} + +ControlLineManager::ControlLineManager(): + EditSubscriber(ET_OBJECTS), + cursor(CSCrosshair), + prev_obj(-1), + selected_object(-1) +{ + canvas_area = new Rectangle(); + canvas_area->filled = true; + canvas_area->topLeft = Coord(0, 0); + mouseOverGeometry.push_back(canvas_area); +} + +ControlLineManager::~ControlLineManager() +{ + for (auto i = mouseOverGeometry.begin(); i != mouseOverGeometry.end(); i++) { + delete *i; + } + for (auto i = control_lines.begin(); i != control_lines.end(); i++) { + delete *i; + } +} + +Geometry::State ControlLineManager::calcLineState(const ::ControlLine& line) const +{ + if (line.type == rtengine::ControlLine::HORIZONTAL && active_h) { + return Geometry::NORMAL; + } else if (line.type == rtengine::ControlLine::VERTICAL && active_v) { + return Geometry::NORMAL; + } + return Geometry::INSENSITIVE; +} + +void ControlLineManager::setActive(bool active) +{ + EditDataProvider* provider = getEditProvider(); + + if (!provider || (this == provider->getCurrSubscriber()) == active) { + return; + } + + if (active) { + subscribe(); + + int ih, iw; + provider->getImageSize(iw, ih); + canvas_area->bottomRight = Coord(iw, ih); + } else { + unsubscribe(); + } +} + +void ControlLineManager::setDrawMode(bool draw) +{ + draw_mode = draw; +} + +void ControlLineManager::setLinesState(bool horiz_active, bool vert_active) +{ + active_h = horiz_active; + active_v = vert_active; + + for (auto line = control_lines.begin(); line != control_lines.end(); line++) { + auto state = calcLineState(**line); + (*line)->begin->state = state; + (*line)->end->state = state; + (*line)->line->state = state; + } +} + +size_t ControlLineManager::size(void) const +{ + return control_lines.size(); +} + +bool ControlLineManager::button1Pressed(int modifierKey) +{ + EditDataProvider* dataProvider = getEditProvider(); + + if (!dataProvider) { + return false; + } + + drag_delta = Coord(0, 0); + + const int object = dataProvider->getObject(); + if (object > 0) { // A control line. + selected_object = object; + action = Action::DRAGGING; + } else if (draw_mode && (modifierKey & GDK_CONTROL_MASK)) { // Add new line. + addLine(dataProvider->posImage, dataProvider->posImage); + selected_object = mouseOverGeometry.size() - 1; // Select endpoint. + action = Action::DRAGGING; + } + + return false; +} + +bool ControlLineManager::button1Released(void) +{ + action = Action::NONE; + selected_object = -1; + return false; +} + +bool ControlLineManager::button3Pressed(int modifierKey) +{ + EditDataProvider* provider = getEditProvider(); + + action = Action::NONE; + + if (!provider || provider->getObject() < 1) { + return false; + } + + action = Action::PICKING; + return false; +} + +bool ControlLineManager::pick3(bool picked) +{ + if (!picked) { + return false; + } + + EditDataProvider* provider = getEditProvider(); + + if (!provider) { + return false; + } + + removeLine((provider->getObject() - 1) / 3); + return false; +} + +bool ControlLineManager::drag1(int modifierKey) +{ + EditDataProvider* provider = getEditProvider(); + + if (!provider || selected_object < 1) { + return false; + } + + ::ControlLine* control_line = control_lines[(selected_object - 1) / 3]; + int component = selected_object % 3; // 0 == end, 1 == line, 2 == begin + Coord mouse = provider->posImage + provider->deltaImage; + Coord delta = provider->deltaImage - drag_delta; + int ih, iw; + provider->getImageSize(iw, ih); + + switch (component) { + case (0): // end + control_line->end->center = mouse; + control_line->end->center.clip(iw, ih); + control_line->line->end = control_line->end->center; + control_line->end->state = Geometry::DRAGGED; + break; + case (1): { // line + // Constrain delta so the end stays above the image. + Coord new_delta = control_line->end->center + delta; + new_delta.clip(iw, ih); + new_delta -= control_line->end->center; + // Constrain delta so the beginning stays above the image. + new_delta += control_line->begin->center; + new_delta.clip(iw, ih); + new_delta -= control_line->begin->center; + // Move all objects in the control line. + control_line->end->center += new_delta; + control_line->begin->center += new_delta; + control_line->line->end = control_line->end->center; + control_line->line->begin = control_line->begin->center; + drag_delta += new_delta; + control_line->line->state = Geometry::DRAGGED; + break; + } + case (2): // begin + control_line->begin->center = mouse; + control_line->begin->center.clip(iw, ih); + control_line->line->begin = control_line->begin->center; + control_line->begin->state = Geometry::DRAGGED; + break; + } + + return false; +} + +CursorShape ControlLineManager::getCursor(int objectID) const +{ + return cursor; +} + +bool ControlLineManager::mouseOver(int modifierKey) +{ + EditDataProvider* provider = getEditProvider(); + + if (!provider) { + return false; + } + + int cur_obj = provider->getObject(); + + if (cur_obj == 0) { // Canvas + if (draw_mode && modifierKey & GDK_CONTROL_MASK) { + cursor = CSPlus; + } else { + cursor = CSCrosshair; + } + } else if (cur_obj < 0) { // Nothing + cursor = CSArrow; + } else { // Object + visibleGeometry[cur_obj - 1]->state = Geometry::PRELIGHT; + cursor = CSMove2D; + } + + if (prev_obj != cur_obj && prev_obj > 0) { + auto state = calcLineState(*control_lines[(prev_obj - 1) / 3]); + visibleGeometry[prev_obj - 1]->state = state; + } + + prev_obj = cur_obj; + + return false; +} + +void ControlLineManager::switchOffEditMode(void) +{ + if (callbacks) { + callbacks->switchOffEditMode(); + } +} + +void ControlLineManager::setEditProvider(EditDataProvider* provider) +{ + EditSubscriber::setEditProvider(provider); +} + +void ControlLineManager::addLine(Coord begin, Coord end) +{ + constexpr int line_width = 2; + constexpr int handle_radius = 6; + Line* line; + Circle *begin_c, *end_c; + + line = new Line(); + line->datum = Geometry::IMAGE; + line->innerLineWidth = line_width; + line->begin = begin; + line->end = end; + + begin_c = new Circle(); + begin_c->datum = Geometry::IMAGE; + begin_c->filled = true; + begin_c->radius = handle_radius; + begin_c->center = begin; + + end_c = new Circle(); + end_c->datum = Geometry::IMAGE; + end_c->filled = true; + end_c->radius = handle_radius; + end_c->center = begin; + + EditSubscriber::visibleGeometry.push_back(line); + EditSubscriber::visibleGeometry.push_back(begin_c); + EditSubscriber::visibleGeometry.push_back(end_c); + + EditSubscriber::mouseOverGeometry.push_back(line); + EditSubscriber::mouseOverGeometry.push_back(begin_c); + EditSubscriber::mouseOverGeometry.push_back(end_c); + + ::ControlLine* control_line = new ::ControlLine(); + control_line->begin = begin_c; + control_line->end = end_c; + control_line->line = line; + control_line->type = draw_line_type; + control_lines.push_back(control_line); +} + +void ControlLineManager::removeLine(size_t line_id) +{ + if (line_id >= control_lines.size()) { + return; + } + + ::ControlLine* line = control_lines[line_id]; + delete line->begin; + delete line->end; + delete line->line; + delete line; + control_lines.erase(control_lines.begin() + line_id); + visibleGeometry.erase(visibleGeometry.begin() + 3 * line_id, + visibleGeometry.begin() + 3 * line_id + 3); + mouseOverGeometry.erase(mouseOverGeometry.begin() + 3 * line_id + 1, + mouseOverGeometry.begin() + 3 * line_id + 4); +} + +rtengine::ControlLine* ControlLineManager::toControlLines(void) const +{ + auto retval = (rtengine::ControlLine*)malloc(control_lines.size() * sizeof(rtengine::ControlLine)); + + for (unsigned int i = 0; i < control_lines.size(); i++) { + retval[i].x1 = control_lines[i]->begin->center.x; + retval[i].y1 = control_lines[i]->begin->center.y; + retval[i].x2 = control_lines[i]->end->center.x; + retval[i].y2 = control_lines[i]->end->center.y; + retval[i].type = control_lines[i]->type; + } + + return retval; +} + +LinesCallbacks::LinesCallbacks(PerspCorrection* tool, ControlLineManager* lines): + lines(lines), + tool(tool) +{ +} + +LinesCallbacks::~LinesCallbacks() +{ +} + +void LinesCallbacks::switchOffEditMode(void) +{ + if (tool) { + tool->switchOffEditMode(lines); + } +} diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 1be392f7c..8a9933b19 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -21,8 +21,80 @@ #include #include "adjuster.h" +#include "editcallbacks.h" +#include "editwidgets.h" #include "lensgeomlistener.h" #include "toolpanel.h" +#include "../rtengine/coord.h" +#include "../rtengine/perspectivecorrection.h" + +struct ControlLine +{ + Line* line; + Circle *begin, *end; + rtengine::ControlLine::Type type; +}; + +class ControlLineManager: EditSubscriber +{ + +protected: + /** Determine how horizontal and vertical lines are displayed. */ + bool active_h, active_v; + /** Hidden object for capturing mouse events. */ + Rectangle* canvas_area; + rtengine::Coord drag_delta; + std::vector control_lines; + CursorShape cursor; + bool draw_mode; + int prev_obj; + int selected_object; + + void addLine (rtengine::Coord begin, rtengine::Coord end); + Geometry::State calcLineState(const ControlLine& line) const; + void removeLine (size_t line_id); + +public: + class Callbacks + { + public: + virtual ~Callbacks() {}; + /** Called when the EditSubscriber's switchOffEditMode is called. */ + virtual void switchOffEditMode (void) {}; + }; + + /** Callbacks to invoke. */ + Callbacks* callbacks; + /** Type of line for newly drawn lines. */ + rtengine::ControlLine::Type draw_line_type; + + ControlLineManager(); + ~ControlLineManager(); + + /** Sets whether or not the lines are visible and interact-able. */ + void setActive (bool active); + /** Set whether or not lines can be drawn and deleted. */ + void setDrawMode (bool draw); + void setEditProvider (EditDataProvider* provider); + /** Determines how each line type is displayed. */ + void setLinesState (bool horiz_active, bool vert_active); + /** Returns the number of lines. */ + size_t size (void) const; + /** + * Allocates a new array and populates it with copies of the control lines. + */ + rtengine::ControlLine* toControlLines (void) const; + + // EditSubscriber overrides + bool button1Pressed (int modifierKey) override; + bool button1Released (void) override; + bool button3Pressed (int modifierKey) override; + bool pick3 (bool picked) override; + bool drag1 (int modifierKey) override; + CursorShape getCursor (int objectID) const override; + bool mouseOver (int modifierKey) override; + void switchOffEditMode (void) override; +}; class PerspCorrection final : public ToolParamBlock, @@ -31,6 +103,7 @@ class PerspCorrection final : { protected: + bool render = true; MyComboBoxText* method; Gtk::VBox* simple; Adjuster* horiz; @@ -46,6 +119,12 @@ protected: Adjuster* camera_shift_horiz; Adjuster* camera_shift_vert; Adjuster* camera_yaw; + Gtk::Image* img_ctrl_lines_edit; + Gtk::Image* img_ctrl_lines_apply; + ControlLineManager* lines; + Gtk::ToggleButton* lines_button_edit; + Gtk::ToggleButton* lines_button_h; + Gtk::ToggleButton* lines_button_v; Adjuster* projection_pitch; Adjuster* projection_rotate; Adjuster* projection_shift_horiz; @@ -58,14 +137,17 @@ protected: rtengine::ProcEvent EvPerspProjShift; rtengine::ProcEvent EvPerspProjRotate; rtengine::ProcEvent EvPerspProjAngle; + rtengine::ProcEvent EvPerspRender; LensGeomListener* lens_geom_listener; const rtengine::FramesMetaData* metadata; + void applyControlLines (void); void setFocalLengthValue (const rtengine::procparams::ProcParams* pparams, const rtengine::FramesMetaData* metadata); public: PerspCorrection (); + ~PerspCorrection (); void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; @@ -74,12 +156,28 @@ public: void adjusterChanged (Adjuster* a, double newval) override; void autoCorrectionPressed (Gtk::Button* b); + void linesButtonPressed (Gtk::ToggleButton* button); + void linesEditButtonPressed (void); void methodChanged (void); void setAdjusterBehavior (bool badd, bool camera_focal_length_add, bool camera_shift_add, bool camera_angle_add, bool projection_angle_add, bool projection_shift_add, bool projection_rotate_add); + void setEditProvider (EditDataProvider* provider) override; void setLensGeomListener (LensGeomListener* listener) { lens_geom_listener = listener; } void setMetadata (const rtengine::FramesMetaData* metadata); + void switchOffEditMode (ControlLineManager* lines); void trimValues (rtengine::procparams::ProcParams* pp) override; }; + +class LinesCallbacks: public ControlLineManager::Callbacks +{ +protected: + ControlLineManager* lines; + PerspCorrection* tool; + +public: + LinesCallbacks(PerspCorrection* tool, ControlLineManager* lines); + ~LinesCallbacks(); + void switchOffEditMode (void) override; +}; diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index dadc56d44..d02dd0237 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -860,7 +860,7 @@ void ToolPanelCoordinator::straightenRequested () toolBar->setTool (TMStraighten); } -void ToolPanelCoordinator::autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw) +void ToolPanelCoordinator::autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const rtengine::ControlLine *lines, size_t line_count) { if (!(ipc && (corr_pitch || corr_yaw))) { return; @@ -874,7 +874,7 @@ void ToolPanelCoordinator::autoPerspRequested (bool corr_pitch, bool corr_yaw, d rtengine::procparams::ProcParams params; ipc->getParams(¶ms); - auto res = rtengine::PerspectiveCorrection::autocompute(src, corr_pitch, corr_yaw, ¶ms, src->getMetaData()); + auto res = rtengine::PerspectiveCorrection::autocompute(src, corr_pitch, corr_yaw, ¶ms, src->getMetaData(), lines, line_count); rot = res.angle; pitch = res.pitch; yaw = res.yaw; @@ -889,6 +889,16 @@ double ToolPanelCoordinator::autoDistorRequested () return rtengine::ImProcFunctions::getAutoDistor (ipc->getInitialImage()->getFileName(), 400); } +void ToolPanelCoordinator::updateTransformPreviewRequested(rtengine::ProcEvent event, bool render_perspective) +{ + if (!ipc) { + return; + } + + ipc->beginUpdateParams()->perspective.render = render_perspective; + ipc->endUpdateParams(event); +} + void ToolPanelCoordinator::spotWBRequested (int size) { @@ -1101,4 +1111,4 @@ bool ToolPanelCoordinator::getFilmNegativeExponents(rtengine::Coord spotA, rteng bool ToolPanelCoordinator::getRawSpotValues(rtengine::Coord spot, int spotSize, std::array& rawValues) { return ipc && ipc->getRawSpotValues(spot.x, spot.y, spotSize, rawValues); -} \ No newline at end of file +} diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 3861052cd..fe65a0745 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -302,8 +302,9 @@ public: // rotatelistener interface void straightenRequested () override; void autoCropRequested () override; - void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw) override; + void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const rtengine::ControlLine *lines = nullptr, size_t line_count = 0) override; double autoDistorRequested () override; + void updateTransformPreviewRequested (rtengine::ProcEvent event, bool render_perspective) override; // spotwblistener interface void spotWBRequested (int size) override; From 5e5a86f513d61615d32cd7cf6ec50287e0231418 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 9 Jun 2020 16:29:57 -0700 Subject: [PATCH 005/185] Add icons for perspective control line buttons --- rtdata/images/svg/draw-horizontal.svg | 117 ++++++++++++++++++++++++++ rtdata/images/svg/draw-vertical.svg | 117 ++++++++++++++++++++++++++ rtdata/images/svg/draw.svg | 112 ++++++++++++++++++++++++ rtgui/perspective.cc | 11 ++- 4 files changed, 355 insertions(+), 2 deletions(-) create mode 100644 rtdata/images/svg/draw-horizontal.svg create mode 100644 rtdata/images/svg/draw-vertical.svg create mode 100644 rtdata/images/svg/draw.svg diff --git a/rtdata/images/svg/draw-horizontal.svg b/rtdata/images/svg/draw-horizontal.svg new file mode 100644 index 000000000..ae8fa8c44 --- /dev/null +++ b/rtdata/images/svg/draw-horizontal.svg @@ -0,0 +1,117 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/draw-vertical.svg b/rtdata/images/svg/draw-vertical.svg new file mode 100644 index 000000000..4613d95c6 --- /dev/null +++ b/rtdata/images/svg/draw-vertical.svg @@ -0,0 +1,117 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/draw.svg b/rtdata/images/svg/draw.svg new file mode 100644 index 000000000..308e15654 --- /dev/null +++ b/rtdata/images/svg/draw.svg @@ -0,0 +1,112 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 1b1672914..1d72011fa 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -40,6 +40,10 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" EvPerspRender = mapper->newEvent(TRANSFORM); lens_geom_listener = nullptr; + Gtk::Image* ipers_draw_horiz = Gtk::manage (new RTImage ("draw-horizontal.png")); + Gtk::Image* ipers_draw_vert = Gtk::manage (new RTImage ("draw-vertical.png")); + Gtk::Image* ipers_draw = new RTImage ("draw.png"); + Gtk::Image* ipersHL = Gtk::manage (new RTImage ("perspective-horizontal-left-small.png")); Gtk::Image* ipersHR = Gtk::manage (new RTImage ("perspective-horizontal-right-small.png")); Gtk::Image* ipersVL = Gtk::manage (new RTImage ("perspective-vertical-bottom-small.png")); @@ -110,22 +114,25 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" // Begin control lines interface. lines_button_h = Gtk::manage (new Gtk::ToggleButton()); + lines_button_h->set_image(*ipers_draw_horiz); lines_button_h->signal_toggled().connect(sigc::bind(sigc::mem_fun( *this, &::PerspCorrection::linesButtonPressed), lines_button_h)); lines_button_v = Gtk::manage (new Gtk::ToggleButton()); + lines_button_v->set_image(*ipers_draw_vert); lines_button_v->signal_toggled().connect(sigc::bind(sigc::mem_fun( *this, &::PerspCorrection::linesButtonPressed), lines_button_v)); lines_button_edit = Gtk::manage (new Gtk::ToggleButton()); + lines_button_edit->set_image(*ipers_draw); lines_button_edit->signal_toggled().connect(sigc::mem_fun( *this, &::PerspCorrection::linesEditButtonPressed)); lines = new ControlLineManager(); lines->callbacks = new LinesCallbacks(this, lines); - img_ctrl_lines_apply = NULL; - img_ctrl_lines_edit = NULL; + img_ctrl_lines_apply = new RTImage ("tick.png"); + img_ctrl_lines_edit = ipers_draw; Gtk::HBox* control_lines_box = Gtk::manage (new Gtk::HBox()); control_lines_box->pack_start(*lines_button_v); From dd4364fab3e0a4699de133125a1d6bc8d1c619aa Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 10 Jun 2020 11:41:15 -0700 Subject: [PATCH 006/185] Add buttons for switching control line type --- ...irectional-arrow-horizontal-hicontrast.svg | 127 ++++++++++++++++++ ...idirectional-arrow-horizontal-prelight.svg | 127 ++++++++++++++++++ ...idirectional-arrow-vertical-hicontrast.svg | 127 ++++++++++++++++++ .../bidirectional-arrow-vertical-prelight.svg | 127 ++++++++++++++++++ rtgui/perspective.cc | 127 ++++++++++++++---- rtgui/perspective.h | 6 + 6 files changed, 617 insertions(+), 24 deletions(-) create mode 100644 rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg create mode 100644 rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg create mode 100644 rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg create mode 100644 rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg diff --git a/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg b/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg new file mode 100644 index 000000000..b41979c6a --- /dev/null +++ b/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg @@ -0,0 +1,127 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg b/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg new file mode 100644 index 000000000..0ad40b970 --- /dev/null +++ b/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg @@ -0,0 +1,127 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg b/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg new file mode 100644 index 000000000..18d041279 --- /dev/null +++ b/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg @@ -0,0 +1,127 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg b/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg new file mode 100644 index 000000000..3dc5034f4 --- /dev/null +++ b/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg @@ -0,0 +1,127 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 1d72011fa..777278419 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -20,6 +20,7 @@ #include "perspective.h" #include "rtimage.h" +#include "rtsurface.h" #include "../rtengine/procparams.h" @@ -704,14 +705,22 @@ ControlLineManager::ControlLineManager(): canvas_area->filled = true; canvas_area->topLeft = Coord(0, 0); mouseOverGeometry.push_back(canvas_area); + + line_icon_h = Cairo::RefPtr(new RTSurface("bidirectional-arrow-horizontal-hicontrast.png")); + line_icon_v = Cairo::RefPtr(new RTSurface("bidirectional-arrow-vertical-hicontrast.png")); + line_icon_h_prelight = Cairo::RefPtr(new RTSurface("bidirectional-arrow-horizontal-prelight.png")); + line_icon_v_prelight = Cairo::RefPtr(new RTSurface("bidirectional-arrow-vertical-prelight.png")); } ControlLineManager::~ControlLineManager() { - for (auto i = mouseOverGeometry.begin(); i != mouseOverGeometry.end(); i++) { - delete *i; - } + delete canvas_area; for (auto i = control_lines.begin(); i != control_lines.end(); i++) { + delete (*i)->begin; + delete (*i)->end; + delete (*i)->line; + delete (*i)->icon_h; + delete (*i)->icon_v; delete *i; } } @@ -780,15 +789,19 @@ bool ControlLineManager::button1Pressed(int modifierKey) const int object = dataProvider->getObject(); if (object > 0) { // A control line. - selected_object = object; - action = Action::DRAGGING; + if (object % ::ControlLine::OBJ_COUNT == 2) { // Icon. + action = Action::PICKING; + } else { + selected_object = object; + action = Action::DRAGGING; + } } else if (draw_mode && (modifierKey & GDK_CONTROL_MASK)) { // Add new line. addLine(dataProvider->posImage, dataProvider->posImage); selected_object = mouseOverGeometry.size() - 1; // Select endpoint. action = Action::DRAGGING; } - return false; + return true; } bool ControlLineManager::button1Released(void) @@ -812,6 +825,42 @@ bool ControlLineManager::button3Pressed(int modifierKey) return false; } +bool ControlLineManager::pick1(bool picked) +{ + action = Action::NONE; + + if (!picked) { + return false; + } + + EditDataProvider* provider = getEditProvider(); + + if (!provider || provider->getObject() % ::ControlLine::OBJ_COUNT != 2) { + return false; + } + + // Change line type. + int object_id = provider->getObject(); + auto line = control_lines[(object_id - 1) / ::ControlLine::OBJ_COUNT]; + + if (line->type == rtengine::ControlLine::HORIZONTAL) { + line->icon = line->icon_v; + line->type = rtengine::ControlLine::VERTICAL; + } else if (line->type == rtengine::ControlLine::VERTICAL) { + line->icon = line->icon_h; + line->type = rtengine::ControlLine::HORIZONTAL; + } + + visibleGeometry[object_id - 1] = line->icon; + + auto state = calcLineState(*line); + line->begin->state = state; + line->end->state = state; + line->line->state = state; + + return true; +} + bool ControlLineManager::pick3(bool picked) { if (!picked) { @@ -824,7 +873,7 @@ bool ControlLineManager::pick3(bool picked) return false; } - removeLine((provider->getObject() - 1) / 3); + removeLine((provider->getObject() - 1) / ::ControlLine::OBJ_COUNT); return false; } @@ -836,8 +885,8 @@ bool ControlLineManager::drag1(int modifierKey) return false; } - ::ControlLine* control_line = control_lines[(selected_object - 1) / 3]; - int component = selected_object % 3; // 0 == end, 1 == line, 2 == begin + ::ControlLine* control_line = control_lines[(selected_object - 1) / ::ControlLine::OBJ_COUNT]; + int component = selected_object % ::ControlLine::OBJ_COUNT; // 0 == end, 1 == line, 2 == icon, 3 == begin Coord mouse = provider->posImage + provider->deltaImage; Coord delta = provider->deltaImage - drag_delta; int ih, iw; @@ -850,7 +899,8 @@ bool ControlLineManager::drag1(int modifierKey) control_line->line->end = control_line->end->center; control_line->end->state = Geometry::DRAGGED; break; - case (1): { // line + case (1): + case (2): { // line // Constrain delta so the end stays above the image. Coord new_delta = control_line->end->center + delta; new_delta.clip(iw, ih); @@ -868,7 +918,7 @@ bool ControlLineManager::drag1(int modifierKey) control_line->line->state = Geometry::DRAGGED; break; } - case (2): // begin + case (3): // begin control_line->begin->center = mouse; control_line->begin->center.clip(iw, ih); control_line->line->begin = control_line->begin->center; @@ -876,6 +926,12 @@ bool ControlLineManager::drag1(int modifierKey) break; } + control_line->icon_h->position.x = (control_line->begin->center.x + control_line->end->center.x) / 2; + control_line->icon_h->position.y = (control_line->begin->center.y + control_line->end->center.y) / 2; + control_line->icon_v->position.x = control_line->icon_h->position.x; + control_line->icon_v->position.y = control_line->icon_h->position.y; + + return false; } @@ -902,19 +958,22 @@ bool ControlLineManager::mouseOver(int modifierKey) } } else if (cur_obj < 0) { // Nothing cursor = CSArrow; + } else if (cur_obj % ::ControlLine::OBJ_COUNT == 2) { // Icon + visibleGeometry[cur_obj - 1]->state = Geometry::PRELIGHT; + cursor = CSArrow; } else { // Object visibleGeometry[cur_obj - 1]->state = Geometry::PRELIGHT; cursor = CSMove2D; } if (prev_obj != cur_obj && prev_obj > 0) { - auto state = calcLineState(*control_lines[(prev_obj - 1) / 3]); + auto state = calcLineState(*control_lines[(prev_obj - 1) / ::ControlLine::OBJ_COUNT]); visibleGeometry[prev_obj - 1]->state = state; } prev_obj = cur_obj; - return false; + return true; } void ControlLineManager::switchOffEditMode(void) @@ -934,6 +993,7 @@ void ControlLineManager::addLine(Coord begin, Coord end) constexpr int line_width = 2; constexpr int handle_radius = 6; Line* line; + OPIcon *icon_h, *icon_v; Circle *begin_c, *end_c; line = new Line(); @@ -942,6 +1002,16 @@ void ControlLineManager::addLine(Coord begin, Coord end) line->begin = begin; line->end = end; + const Cairo::RefPtr null_surface = Cairo::RefPtr(nullptr); + + icon_h = new OPIcon(line_icon_h, null_surface, line_icon_h_prelight, + null_surface, null_surface, Geometry::DP_CENTERCENTER); + icon_h->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2); + + icon_v = new OPIcon(line_icon_v, null_surface, line_icon_v_prelight, + null_surface, null_surface, Geometry::DP_CENTERCENTER); + icon_v->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2); + begin_c = new Circle(); begin_c->datum = Geometry::IMAGE; begin_c->filled = true; @@ -954,20 +1024,29 @@ void ControlLineManager::addLine(Coord begin, Coord end) end_c->radius = handle_radius; end_c->center = begin; + ::ControlLine* control_line = new ::ControlLine(); + control_line->begin = begin_c; + control_line->end = end_c; + control_line->icon_h = icon_h; + control_line->icon_v = icon_v; + if (draw_line_type == rtengine::ControlLine::HORIZONTAL) { + control_line->icon = icon_h; + } else if (draw_line_type == rtengine::ControlLine::VERTICAL) { + control_line->icon = icon_v; + } + control_line->line = line; + control_line->type = draw_line_type; + control_lines.push_back(control_line); + EditSubscriber::visibleGeometry.push_back(line); + EditSubscriber::visibleGeometry.push_back(control_line->icon); EditSubscriber::visibleGeometry.push_back(begin_c); EditSubscriber::visibleGeometry.push_back(end_c); EditSubscriber::mouseOverGeometry.push_back(line); + EditSubscriber::mouseOverGeometry.push_back(control_line->icon); EditSubscriber::mouseOverGeometry.push_back(begin_c); EditSubscriber::mouseOverGeometry.push_back(end_c); - - ::ControlLine* control_line = new ::ControlLine(); - control_line->begin = begin_c; - control_line->end = end_c; - control_line->line = line; - control_line->type = draw_line_type; - control_lines.push_back(control_line); } void ControlLineManager::removeLine(size_t line_id) @@ -982,10 +1061,10 @@ void ControlLineManager::removeLine(size_t line_id) delete line->line; delete line; control_lines.erase(control_lines.begin() + line_id); - visibleGeometry.erase(visibleGeometry.begin() + 3 * line_id, - visibleGeometry.begin() + 3 * line_id + 3); - mouseOverGeometry.erase(mouseOverGeometry.begin() + 3 * line_id + 1, - mouseOverGeometry.begin() + 3 * line_id + 4); + visibleGeometry.erase(visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id, + visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + ::ControlLine::OBJ_COUNT); + mouseOverGeometry.erase(mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + 1, + mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + ::ControlLine::OBJ_COUNT + 1); } rtengine::ControlLine* ControlLineManager::toControlLines(void) const diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 8a9933b19..5956c20c8 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -30,7 +30,10 @@ struct ControlLine { + static constexpr int OBJ_COUNT = 4; Line* line; + OPIcon* icon; + OPIcon *icon_h, *icon_v; Circle *begin, *end; rtengine::ControlLine::Type type; }; @@ -47,6 +50,8 @@ protected: std::vector control_lines; CursorShape cursor; bool draw_mode; + Cairo::RefPtr line_icon_h, line_icon_v; + Cairo::RefPtr line_icon_h_prelight, line_icon_v_prelight; int prev_obj; int selected_object; @@ -89,6 +94,7 @@ public: bool button1Pressed (int modifierKey) override; bool button1Released (void) override; bool button3Pressed (int modifierKey) override; + bool pick1 (bool picked) override; bool pick3 (bool picked) override; bool drag1 (int modifierKey) override; CursorShape getCursor (int objectID) const override; From 72b69b3249d86909e1e254d7b3908fc1558b1f09 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 10 Jun 2020 12:35:53 -0700 Subject: [PATCH 007/185] Fix a few small control lines bugs --- rtgui/perspective.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 777278419..d141cb07a 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -807,6 +807,9 @@ bool ControlLineManager::button1Pressed(int modifierKey) bool ControlLineManager::button1Released(void) { action = Action::NONE; + if (selected_object > 0) { + mouseOverGeometry[selected_object]->state = Geometry::NORMAL; + } selected_object = -1; return false; } @@ -863,6 +866,8 @@ bool ControlLineManager::pick1(bool picked) bool ControlLineManager::pick3(bool picked) { + action = Action::NONE; + if (!picked) { return false; } From 11459a8bb1a94eaaae118539bf1c332f4af7313f Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 10 Jun 2020 12:50:14 -0700 Subject: [PATCH 008/185] Add label for control lines buttons --- rtdata/languages/default | 1 + rtgui/perspective.cc | 2 ++ 2 files changed, 3 insertions(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index e1b4399f6..a0eccd167 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1868,6 +1868,7 @@ TP_PERSPECTIVE_CAMERA_ROLL;Rotation TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift TP_PERSPECTIVE_CAMERA_YAW;Horizontal +TP_PERSPECTIVE_CONTROL_LINES;Control lines TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspective TP_PERSPECTIVE_METHOD;Method diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index d141cb07a..aade62911 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -136,6 +136,8 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" img_ctrl_lines_edit = ipers_draw; Gtk::HBox* control_lines_box = Gtk::manage (new Gtk::HBox()); + Gtk::Label* control_lines_label = Gtk::manage (new Gtk::Label (M("TP_PERSPECTIVE_CONTROL_LINES") + ": ")); + control_lines_box->pack_start(*control_lines_label, Gtk::PACK_SHRINK); control_lines_box->pack_start(*lines_button_v); control_lines_box->pack_start(*lines_button_h); control_lines_box->pack_start(*lines_button_edit); From 976cf4c10388ddceba931f4369f9a79cdcbf26b4 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 10 Jun 2020 12:57:08 -0700 Subject: [PATCH 009/185] Make control lines buttons disabled in batch mode --- rtgui/perspective.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index aade62911..00d6cfa49 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -580,6 +580,9 @@ void PerspCorrection::setBatchMode (bool batchMode) projection_shift_vert->showEditedCB (); projection_yaw->showEditedCB (); + lines_button_h->set_sensitive(false); + lines_button_v->set_sensitive(false); + lines_button_edit->set_sensitive(false); auto_pitch->set_sensitive(false); auto_yaw->set_sensitive(false); auto_pitch_yaw->set_sensitive(false); From a120b304f1bf2f24de1e5ff2adf014e5beb084c0 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 10 Jun 2020 13:13:18 -0700 Subject: [PATCH 010/185] Add tooltip for control lines --- rtdata/languages/default | 1 + rtgui/perspective.cc | 1 + 2 files changed, 2 insertions(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index a0eccd167..6589c3a43 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1869,6 +1869,7 @@ TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift TP_PERSPECTIVE_CAMERA_YAW;Horizontal TP_PERSPECTIVE_CONTROL_LINES;Control lines +TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Correct perspective distortion by drawing control lines.\n\nTo draw a line, activate either the vertical or horizontal drawing button. Hold down the control key and click-and-drag to draw a line. At least two vertical lines are required for vertical perspective correction. The same is true for horizontal correction. Click the tick mark button to apply perspective correction. TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspective TP_PERSPECTIVE_METHOD;Method diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 00d6cfa49..d84e1747e 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -136,6 +136,7 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" img_ctrl_lines_edit = ipers_draw; Gtk::HBox* control_lines_box = Gtk::manage (new Gtk::HBox()); + control_lines_box->set_tooltip_text( M("TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP") ); Gtk::Label* control_lines_label = Gtk::manage (new Gtk::Label (M("TP_PERSPECTIVE_CONTROL_LINES") + ": ")); control_lines_box->pack_start(*control_lines_label, Gtk::PACK_SHRINK); control_lines_box->pack_start(*lines_button_v); From 72d390e99a158ce0d1037731281f6ce1fa1b646b Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 10 Jun 2020 16:16:40 -0700 Subject: [PATCH 011/185] Add button for deleting all control lines --- rtgui/perspective.cc | 28 ++++++++++++++++++++++++++++ rtgui/perspective.h | 3 +++ 2 files changed, 31 insertions(+) diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index d84e1747e..bffc2f301 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -44,6 +44,7 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" Gtk::Image* ipers_draw_horiz = Gtk::manage (new RTImage ("draw-horizontal.png")); Gtk::Image* ipers_draw_vert = Gtk::manage (new RTImage ("draw-vertical.png")); Gtk::Image* ipers_draw = new RTImage ("draw.png"); + Gtk::Image* ipers_trash = new RTImage ("trash-empty.png"); Gtk::Image* ipersHL = Gtk::manage (new RTImage ("perspective-horizontal-left-small.png")); Gtk::Image* ipersHR = Gtk::manage (new RTImage ("perspective-horizontal-right-small.png")); @@ -129,6 +130,12 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" lines_button_edit->signal_toggled().connect(sigc::mem_fun( *this, &::PerspCorrection::linesEditButtonPressed)); + lines_button_erase = Gtk::manage (new Gtk::Button()); + lines_button_erase->set_image(*ipers_trash); + lines_button_erase->set_sensitive(false); + lines_button_erase->signal_pressed().connect(sigc::mem_fun( + *this, &::PerspCorrection::linesEraseButtonPressed)); + lines = new ControlLineManager(); lines->callbacks = new LinesCallbacks(this, lines); @@ -142,6 +149,7 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" control_lines_box->pack_start(*lines_button_v); control_lines_box->pack_start(*lines_button_h); control_lines_box->pack_start(*lines_button_edit); + control_lines_box->pack_start(*lines_button_erase); // End control lines interface. auto_pitch = Gtk::manage (new Gtk::Button ()); @@ -688,7 +696,9 @@ void PerspCorrection::linesEditButtonPressed(void) if (lens_geom_listener) { lens_geom_listener->updateTransformPreviewRequested(EvPerspRender, false); } + lines_button_erase->set_sensitive(true); } else { // Leave edit mode. + lines_button_erase->set_sensitive(false); render = true; lines->setDrawMode(false); lines->setActive(false); @@ -701,6 +711,11 @@ void PerspCorrection::linesEditButtonPressed(void) } } +void PerspCorrection::linesEraseButtonPressed(void) +{ + lines->removeAll(); +} + ControlLineManager::ControlLineManager(): EditSubscriber(ET_OBJECTS), cursor(CSCrosshair), @@ -1060,6 +1075,19 @@ void ControlLineManager::addLine(Coord begin, Coord end) EditSubscriber::mouseOverGeometry.push_back(end_c); } +void ControlLineManager::removeAll(void) +{ + for (unsigned int i = 0; i < control_lines.size(); i++) { + delete control_lines[i]->begin; + delete control_lines[i]->end; + delete control_lines[i]->line; + delete control_lines[i]; + } + control_lines.clear(); + visibleGeometry.clear(); + mouseOverGeometry.erase(mouseOverGeometry.begin() + 1, mouseOverGeometry.end()); +} + void ControlLineManager::removeLine(size_t line_id) { if (line_id >= control_lines.size()) { diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 5956c20c8..8ddc2c1b7 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -76,6 +76,7 @@ public: ControlLineManager(); ~ControlLineManager(); + void removeAll (void); /** Sets whether or not the lines are visible and interact-able. */ void setActive (bool active); /** Set whether or not lines can be drawn and deleted. */ @@ -129,6 +130,7 @@ protected: Gtk::Image* img_ctrl_lines_apply; ControlLineManager* lines; Gtk::ToggleButton* lines_button_edit; + Gtk::Button* lines_button_erase; Gtk::ToggleButton* lines_button_h; Gtk::ToggleButton* lines_button_v; Adjuster* projection_pitch; @@ -164,6 +166,7 @@ public: void autoCorrectionPressed (Gtk::Button* b); void linesButtonPressed (Gtk::ToggleButton* button); void linesEditButtonPressed (void); + void linesEraseButtonPressed (void); void methodChanged (void); void setAdjusterBehavior (bool badd, bool camera_focal_length_add, bool camera_shift_add, bool camera_angle_add, bool projection_angle_add, bool projection_shift_add, bool projection_rotate_add); void setEditProvider (EditDataProvider* provider) override; From 24681f324c70fedc6fcda81fe7150a19a873770c Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 10 Jun 2020 16:53:33 -0700 Subject: [PATCH 012/185] Remove unneeded code --- rtgui/perspective.cc | 3 +-- rtgui/perspective.h | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index bffc2f301..cf366a766 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -925,8 +925,7 @@ bool ControlLineManager::drag1(int modifierKey) control_line->line->end = control_line->end->center; control_line->end->state = Geometry::DRAGGED; break; - case (1): - case (2): { // line + case (1): { // line // Constrain delta so the end stays above the image. Coord new_delta = control_line->end->center + delta; new_delta.clip(iw, ih); diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 8ddc2c1b7..89a743a50 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -25,7 +25,6 @@ #include "editwidgets.h" #include "lensgeomlistener.h" #include "toolpanel.h" -#include "../rtengine/coord.h" #include "../rtengine/perspectivecorrection.h" struct ControlLine From 6c59f0586fa930149fb0c2e069551f5451639070 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Thu, 11 Jun 2020 12:41:43 -0700 Subject: [PATCH 013/185] Fix minor memory leaks --- rtengine/perspectivecorrection.cc | 2 +- rtgui/perspective.cc | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/rtengine/perspectivecorrection.cc b/rtengine/perspectivecorrection.cc index 2c8d9e9f2..5744aef50 100644 --- a/rtengine/perspectivecorrection.cc +++ b/rtengine/perspectivecorrection.cc @@ -371,7 +371,7 @@ PerspectiveCorrection::Params PerspectiveCorrection::autocompute(ImageSource *sr if (g.lines) free(g.lines); if (g.points) free(g.points); if (g.points_idx) free(g.points_idx); - free(g.buf); + if (g.buf) free(g.buf); if (!res) { retval.angle = pparams->perspective.camera_roll; diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index cf366a766..bd9027f33 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -44,7 +44,7 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" Gtk::Image* ipers_draw_horiz = Gtk::manage (new RTImage ("draw-horizontal.png")); Gtk::Image* ipers_draw_vert = Gtk::manage (new RTImage ("draw-vertical.png")); Gtk::Image* ipers_draw = new RTImage ("draw.png"); - Gtk::Image* ipers_trash = new RTImage ("trash-empty.png"); + Gtk::Image* ipers_trash = Gtk::manage (new RTImage ("trash-empty.png")); Gtk::Image* ipersHL = Gtk::manage (new RTImage ("perspective-horizontal-left-small.png")); Gtk::Image* ipersHR = Gtk::manage (new RTImage ("perspective-horizontal-right-small.png")); @@ -242,12 +242,8 @@ PerspCorrection::~PerspCorrection() { delete lines->callbacks; delete lines; - if (img_ctrl_lines_apply) { - delete img_ctrl_lines_apply; - } - if (img_ctrl_lines_edit) { - delete img_ctrl_lines_edit; - } + delete img_ctrl_lines_apply; + delete img_ctrl_lines_edit; } void PerspCorrection::read (const ProcParams* pp, const ParamsEdited* pedited) @@ -1080,6 +1076,8 @@ void ControlLineManager::removeAll(void) delete control_lines[i]->begin; delete control_lines[i]->end; delete control_lines[i]->line; + delete control_lines[i]->icon_h; + delete control_lines[i]->icon_v; delete control_lines[i]; } control_lines.clear(); @@ -1097,6 +1095,8 @@ void ControlLineManager::removeLine(size_t line_id) delete line->begin; delete line->end; delete line->line; + delete line->icon_h; + delete line->icon_v; delete line; control_lines.erase(control_lines.begin() + line_id); visibleGeometry.erase(visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id, From 9a40c1485879454930496e3742212fa491f960a1 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 23 Jun 2020 21:57:10 -0700 Subject: [PATCH 014/185] Make proper use of minimum control line count When using control lines for perspective correction, set the number of vertical and horizontal lines to the proper values instead of hard-coding them to 4. The minimum line count is set to 2 when using control lines, and defaults to 4 when using fully-automatic correction. --- rtengine/ashift_dt.c | 17 +++++++++++------ rtengine/perspectivecorrection.cc | 6 ++---- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/rtengine/ashift_dt.c b/rtengine/ashift_dt.c index 3894a1c1b..ce19b6808 100644 --- a/rtengine/ashift_dt.c +++ b/rtengine/ashift_dt.c @@ -2111,7 +2111,7 @@ static double model_fitness(double *params, void *data) } // setup all data structures for fitting and call NM simplex -static dt_iop_ashift_nmsresult_t nmsfit(dt_iop_module_t *module, dt_iop_ashift_params_t *p, dt_iop_ashift_fitaxis_t dir) +static dt_iop_ashift_nmsresult_t nmsfit(dt_iop_module_t *module, dt_iop_ashift_params_t *p, dt_iop_ashift_fitaxis_t dir, int min_line_count) { dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data; @@ -2227,7 +2227,7 @@ static dt_iop_ashift_nmsresult_t nmsfit(dt_iop_module_t *module, dt_iop_ashift_p // we use vertical lines for fitting fit.linetype |= ASHIFT_LINE_DIRVERT; fit.weight += g->vertical_weight; - enough_lines = enough_lines && (g->vertical_count >= MINIMUM_FITLINES); + enough_lines = enough_lines && (g->vertical_count >= min_line_count); } if(mdir & ASHIFT_FIT_LINES_HOR) @@ -2235,7 +2235,7 @@ static dt_iop_ashift_nmsresult_t nmsfit(dt_iop_module_t *module, dt_iop_ashift_p // we use horizontal lines for fitting fit.linetype |= 0; fit.weight += g->horizontal_weight; - enough_lines = enough_lines && (g->horizontal_count >= MINIMUM_FITLINES); + enough_lines = enough_lines && (g->horizontal_count >= min_line_count); } // this needs to come after ASHIFT_FIT_LINES_VERT and ASHIFT_FIT_LINES_HOR @@ -2905,7 +2905,7 @@ static int do_clean_structure(dt_iop_module_t *module, dt_iop_ashift_params_t *p //----------------------------------------------------------------------------- // helper function to start parameter fit and report about errors -static int do_fit(dt_iop_module_t *module, dt_iop_ashift_params_t *p, dt_iop_ashift_fitaxis_t dir) +static int do_fit(dt_iop_module_t *module, dt_iop_ashift_params_t *p, dt_iop_ashift_fitaxis_t dir, int min_line_count = MINIMUM_FITLINES) { dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data; dt_iop_ashift_nmsresult_t res; @@ -2918,7 +2918,7 @@ static int do_fit(dt_iop_module_t *module, dt_iop_ashift_params_t *p, dt_iop_ash g->fitting = 1; - res = nmsfit(module, p, dir); + res = nmsfit(module, p, dir, min_line_count); switch(res) { @@ -3815,8 +3815,10 @@ void gui_post_expose(struct dt_iop_module_t *self, cairo_t *cr, int32_t width, i cairo_restore(cr); } +#endif // if 0 +//----------------------------------------------------------------------------- -update the number of selected vertical and horizontal lines +// update the number of selected vertical and horizontal lines static void update_lines_count(const dt_iop_ashift_line_t *lines, const int lines_count, int *vertical_count, int *horizontal_count) { @@ -3835,6 +3837,9 @@ static void update_lines_count(const dt_iop_ashift_line_t *lines, const int line *horizontal_count = hlines; } +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT +#if 0 int mouse_moved(struct dt_iop_module_t *self, double x, double y, double pressure, int which) { dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; diff --git a/rtengine/perspectivecorrection.cc b/rtengine/perspectivecorrection.cc index 5744aef50..9a1288aba 100644 --- a/rtengine/perspectivecorrection.cc +++ b/rtengine/perspectivecorrection.cc @@ -356,10 +356,8 @@ PerspectiveCorrection::Params PerspectiveCorrection::autocompute(ImageSource *sr g->lines = toAshiftLines(control_lines, control_lines_count); g->lines_in_height = fh; g->lines_in_width = fw; - // A hack. - g->horizontal_count = 4; - g->vertical_count = 4; - res = do_fit(&module, &p, fitaxis); + update_lines_count(g->lines, g->lines_count, &(g->vertical_count), &(g->horizontal_count)); + res = do_fit(&module, &p, fitaxis, 2); } Params retval = { .angle = p.rotation, From afc3edae26d98e2184a70754830e170dec479e84 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 23 Jun 2020 22:24:27 -0700 Subject: [PATCH 015/185] Make control line correction keep old values Perspective correction through control lines will no longer modify any parameters if there are not enough lines to do any correction. --- rtgui/perspective.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index bd9027f33..e58cec211 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -451,9 +451,9 @@ void PerspCorrection::applyControlLines(void) auto control_lines = lines->toControlLines(); int h_count = 0, v_count = 0; - double rot = 0; - double pitch = 0; - double yaw = 0; + double rot = camera_roll->getValue(); + double pitch = camera_pitch->getValue(); + double yaw = camera_yaw->getValue(); for (unsigned int i = 0; i < lines->size(); i++) { if (control_lines[i].type == rtengine::ControlLine::HORIZONTAL) { From 8d7a5546e182d4c3c611a5a251ba5a4db713a172 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 23 Jun 2020 22:33:08 -0700 Subject: [PATCH 016/185] Add separators in camera-based persp correction Horizontal lines to separate the sliders, control lines buttons, and automatic buttons. --- rtgui/perspective.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index e58cec211..7ce981548 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -209,7 +209,9 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" camera_vbox->pack_start (*camera_roll); camera_vbox->pack_start (*camera_pitch); camera_vbox->pack_start (*camera_yaw); + camera_vbox->pack_start (*Gtk::manage (new Gtk::HSeparator())); camera_vbox->pack_start (*control_lines_box); + camera_vbox->pack_start (*Gtk::manage (new Gtk::HSeparator())); camera_vbox->pack_start (*auto_hbox); camera_frame->add(*camera_vbox); camera_based->pack_start(*camera_frame); From d76cf5cdaebee53cae907ef190819abd5a546919 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 24 Jun 2020 16:20:03 -0700 Subject: [PATCH 017/185] Make control lines hidden when switching mode The program now exits control line editing mode when the perspective correction method is switched out of camera-based mode. --- rtgui/perspective.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 7ce981548..7048b31d1 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -517,6 +517,11 @@ void PerspCorrection::methodChanged (void) } else if (method->get_active_row_number() == 1) { pack_start (*camera_based); } + + // If no longer in camera-based mode and control lines are being edited. + if (method->get_active_row_number() != 1 && lines_button_edit->get_active()) { + lines_button_edit->set_active(false); + } } if (listener) { @@ -705,7 +710,10 @@ void PerspCorrection::linesEditButtonPressed(void) } lines_button_h->set_active(false); lines_button_v->set_active(false); - applyControlLines(); + if (method->get_active_row_number() == 1) { + // Calculate perspective distortion if in camera-based mode. + applyControlLines(); + } } } From 1b06cb999934f97e9373fee1ce9dccfb1c25a33c Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 24 Jun 2020 17:06:21 -0700 Subject: [PATCH 018/185] Limit preview refreshing in control line edit mode Previously, changing values in the camera-based perspective correction tool while in control line edit mode resulted in the preview being refreshed. This is unnecessary because all perspective transformations are disabled in edit mode. This commit disables preview refreshing for camera-based perspective adjustments in edit mode. --- rtgui/perspective.cc | 43 +++++++++++++++++++++++++++++++++++++------ rtgui/perspective.h | 13 +++++++++++++ 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 7048b31d1..bdcc40a8b 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -31,6 +31,7 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" { auto mapper = ProcEventMapper::getInstance(); + // Normal events. EvPerspCamAngle = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_CAM_ANGLE"); EvPerspCamFocalLength = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_CAM_FL"); EvPerspCamShift = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_CAM_SHIFT"); @@ -39,6 +40,15 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" EvPerspProjRotate = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_PROJ_ROTATE"); EvPerspProjShift = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_PROJ_SHIFT"); EvPerspRender = mapper->newEvent(TRANSFORM); + // Void events. + EvPerspCamAngleVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_CAM_ANGLE"); + EvPerspCamFocalLengthVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_CAM_FL"); + EvPerspCamShiftVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_CAM_SHIFT"); + EvPerspProjAngleVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_PROJ_ANGLE"); + EvPerspProjRotateVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_PROJ_ROTATE"); + EvPerspProjShiftVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_PROJ_SHIFT"); + setCamBasedEventsActive(); + lens_geom_listener = nullptr; Gtk::Image* ipers_draw_horiz = Gtk::manage (new RTImage ("draw-horizontal.png")); @@ -402,21 +412,21 @@ void PerspCorrection::adjusterChanged(Adjuster* a, double newval) M("TP_PERSPECTIVE_VERTICAL"), vert->getValue())); } else if (a == camera_focal_length || a == camera_crop_factor) { - listener->panelChanged (EvPerspCamFocalLength, + listener->panelChanged (*event_persp_cam_focal_length, Glib::ustring::compose("%1=%2\n%3=%4", M("TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH"), camera_focal_length->getValue(), M("TP_PERSPECTIVE_CAMERA_CROP_FACTOR"), camera_crop_factor->getValue())); } else if (a == camera_shift_horiz || a == camera_shift_vert) { - listener->panelChanged (EvPerspCamShift, + listener->panelChanged (*event_persp_cam_shift, Glib::ustring::compose("%1=%2\n%3=%4", M("TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL"), camera_shift_horiz->getValue(), M("TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL"), camera_shift_vert->getValue())); } else if (a == camera_pitch || a == camera_roll|| a == camera_yaw) { - listener->panelChanged (EvPerspCamAngle, + listener->panelChanged (*event_persp_cam_angle, Glib::ustring::compose("%1=%2\n%3=%4\n%5=%6", M("TP_PERSPECTIVE_CAMERA_ROLL"), camera_roll->getValue(), @@ -425,17 +435,17 @@ void PerspCorrection::adjusterChanged(Adjuster* a, double newval) M("TP_PERSPECTIVE_CAMERA_PITCH"), camera_pitch->getValue())); } else if (a == projection_shift_horiz || a == projection_shift_vert) { - listener->panelChanged (EvPerspProjShift, + listener->panelChanged (*event_persp_proj_shift, Glib::ustring::compose("%1=%2\n%3=%4", M("TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL"), projection_shift_horiz->getValue(), M("TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL"), projection_shift_vert->getValue())); } else if (a == projection_rotate) { - listener->panelChanged (EvPerspProjRotate, + listener->panelChanged (*event_persp_proj_rotate, Glib::ustring::format(projection_rotate->getValue())); } else if (a == projection_pitch || a == projection_yaw) { - listener->panelChanged (EvPerspProjAngle, + listener->panelChanged (*event_persp_proj_angle, Glib::ustring::compose("%1=%2\n%3=%4", M("TP_PERSPECTIVE_PROJECTION_PITCH"), projection_pitch->getValue(), @@ -700,7 +710,9 @@ void PerspCorrection::linesEditButtonPressed(void) lens_geom_listener->updateTransformPreviewRequested(EvPerspRender, false); } lines_button_erase->set_sensitive(true); + setCamBasedEventsActive(false); } else { // Leave edit mode. + setCamBasedEventsActive(true); lines_button_erase->set_sensitive(false); render = true; lines->setDrawMode(false); @@ -722,6 +734,25 @@ void PerspCorrection::linesEraseButtonPressed(void) lines->removeAll(); } +void PerspCorrection::setCamBasedEventsActive(bool active) +{ + if (active) { + event_persp_cam_focal_length = &EvPerspCamFocalLength; + event_persp_cam_shift = &EvPerspCamShift; + event_persp_cam_angle = &EvPerspCamAngle; + event_persp_proj_shift = &EvPerspProjShift; + event_persp_proj_rotate = &EvPerspProjRotate; + event_persp_proj_angle = &EvPerspProjAngle; + } else { + event_persp_cam_focal_length = &EvPerspCamFocalLengthVoid; + event_persp_cam_shift = &EvPerspCamShiftVoid; + event_persp_cam_angle = &EvPerspCamAngleVoid; + event_persp_proj_shift = &EvPerspProjShiftVoid; + event_persp_proj_rotate = &EvPerspProjRotateVoid; + event_persp_proj_angle = &EvPerspProjAngleVoid; + } +} + ControlLineManager::ControlLineManager(): EditSubscriber(ET_OBJECTS), cursor(CSCrosshair), diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 89a743a50..dd9155c50 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -145,10 +145,23 @@ protected: rtengine::ProcEvent EvPerspProjRotate; rtengine::ProcEvent EvPerspProjAngle; rtengine::ProcEvent EvPerspRender; + rtengine::ProcEvent EvPerspCamFocalLengthVoid; + rtengine::ProcEvent EvPerspCamShiftVoid; + rtengine::ProcEvent EvPerspCamAngleVoid; + rtengine::ProcEvent EvPerspProjShiftVoid; + rtengine::ProcEvent EvPerspProjRotateVoid; + rtengine::ProcEvent EvPerspProjAngleVoid; + rtengine::ProcEvent* event_persp_cam_focal_length; + rtengine::ProcEvent* event_persp_cam_shift; + rtengine::ProcEvent* event_persp_cam_angle; + rtengine::ProcEvent* event_persp_proj_shift; + rtengine::ProcEvent* event_persp_proj_rotate; + rtengine::ProcEvent* event_persp_proj_angle; LensGeomListener* lens_geom_listener; const rtengine::FramesMetaData* metadata; void applyControlLines (void); + void setCamBasedEventsActive (bool active = true); void setFocalLengthValue (const rtengine::procparams::ProcParams* pparams, const rtengine::FramesMetaData* metadata); public: From 98678c1f48c822a105270b6d21b485c3cd051e98 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sun, 5 Jul 2020 16:37:49 -0700 Subject: [PATCH 019/185] Use smart pointers --- rtengine/perspectivecorrection.cc | 26 ++-- rtengine/perspectivecorrection.h | 2 +- rtgui/lensgeomlistener.h | 3 +- rtgui/perspective.cc | 205 ++++++++++++------------------ rtgui/perspective.h | 30 ++--- rtgui/toolpanelcoord.cc | 4 +- rtgui/toolpanelcoord.h | 2 +- 7 files changed, 117 insertions(+), 155 deletions(-) diff --git a/rtengine/perspectivecorrection.cc b/rtengine/perspectivecorrection.cc index 9a1288aba..7a56ef5a8 100644 --- a/rtengine/perspectivecorrection.cc +++ b/rtengine/perspectivecorrection.cc @@ -229,15 +229,15 @@ void get_view_size(int w, int h, const procparams::PerspectiveParams ¶ms, do * Allocates a new array and populates it with ashift lines corresponding to the * provided control lines. */ -dt_iop_ashift_line_t* toAshiftLines(const ControlLine *lines, size_t count) +std::unique_ptr toAshiftLines(const std::vector *lines) { - auto retval = (dt_iop_ashift_line_t*)malloc(count * sizeof(dt_iop_ashift_line_t)); + std::unique_ptr retval(new dt_iop_ashift_line_t[lines->size()]); - for (size_t i = 0; i < count; i++) { - const float x1 = lines[i].x1; - const float y1 = lines[i].y1; - const float x2 = lines[i].x2; - const float y2 = lines[i].y2; + for (size_t i = 0; i < lines->size(); i++) { + const float x1 = (*lines)[i].x1; + const float y1 = (*lines)[i].y1; + const float x2 = (*lines)[i].x2; + const float y2 = (*lines)[i].y2; retval[i].p1[0] = x1; retval[i].p1[1] = y1; retval[i].p1[2] = 1.0f; @@ -247,9 +247,9 @@ dt_iop_ashift_line_t* toAshiftLines(const ControlLine *lines, size_t count) retval[i].length = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); retval[i].width = 1.0f; retval[i].weight = retval[i].length; - if (lines[i].type == ControlLine::HORIZONTAL) { + if ((*lines)[i].type == ControlLine::HORIZONTAL) { retval[i].type = ASHIFT_LINE_HORIZONTAL_SELECTED; - } else if (lines[i].type == ControlLine::VERTICAL) { + } else if ((*lines)[i].type == ControlLine::VERTICAL) { retval[i].type = ASHIFT_LINE_VERTICAL_SELECTED; } else { retval[i].type = ASHIFT_LINE_IRRELEVANT; @@ -262,7 +262,7 @@ dt_iop_ashift_line_t* toAshiftLines(const ControlLine *lines, size_t count) } // namespace -PerspectiveCorrection::Params PerspectiveCorrection::autocompute(ImageSource *src, bool corr_pitch, bool corr_yaw, const procparams::ProcParams *pparams, const FramesMetaData *metadata, const ControlLine *control_lines, size_t control_lines_count) +PerspectiveCorrection::Params PerspectiveCorrection::autocompute(ImageSource *src, bool corr_pitch, bool corr_yaw, const procparams::ProcParams *pparams, const FramesMetaData *metadata, const std::vector *control_lines) { auto pcp = procparams::PerspectiveParams(pparams->perspective); procparams::PerspectiveParams dflt; @@ -351,13 +351,15 @@ PerspectiveCorrection::Params PerspectiveCorrection::autocompute(ImageSource *sr if (control_lines == nullptr) { res = do_get_structure(&module, &p, ASHIFT_ENHANCE_EDGES) && do_fit(&module, &p, fitaxis); } else { + std::unique_ptr ashift_lines = toAshiftLines(control_lines); dt_iop_ashift_gui_data_t *g = module.gui_data; - g->lines_count = control_lines_count; - g->lines = toAshiftLines(control_lines, control_lines_count); + g->lines_count = control_lines->size(); + g->lines = ashift_lines.get(); g->lines_in_height = fh; g->lines_in_width = fw; update_lines_count(g->lines, g->lines_count, &(g->vertical_count), &(g->horizontal_count)); res = do_fit(&module, &p, fitaxis, 2); + g->lines = nullptr; } Params retval = { .angle = p.rotation, diff --git a/rtengine/perspectivecorrection.h b/rtengine/perspectivecorrection.h index 94a63a42c..c46c34147 100644 --- a/rtengine/perspectivecorrection.h +++ b/rtengine/perspectivecorrection.h @@ -47,7 +47,7 @@ public: double yaw; }; - static Params autocompute(ImageSource *src, bool corr_pitch, bool corr_yaw, const procparams::ProcParams *pparams, const FramesMetaData *metadata, const ControlLine *control_lines = nullptr, size_t control_lines_count = 0); + static Params autocompute(ImageSource *src, bool corr_pitch, bool corr_yaw, const procparams::ProcParams *pparams, const FramesMetaData *metadata, const std::vector *control_lines = nullptr); //static void autocrop(int width, int height, bool fixratio, const procparams::PerspectiveParams ¶ms, const FramesMetaData *metadata, int &x, int &y, int &w, int &h); }; diff --git a/rtgui/lensgeomlistener.h b/rtgui/lensgeomlistener.h index 9bbaf125a..b9979f9a2 100644 --- a/rtgui/lensgeomlistener.h +++ b/rtgui/lensgeomlistener.h @@ -19,6 +19,7 @@ #pragma once #include +#include namespace rtengine { @@ -33,6 +34,6 @@ public: virtual void straightenRequested () = 0; virtual void autoCropRequested () = 0; virtual double autoDistorRequested () = 0; - virtual void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const rtengine::ControlLine *lines = nullptr, size_t line_count = 0) = 0; + virtual void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector *lines = nullptr) = 0; virtual void updateTransformPreviewRequested (rtengine::ProcEvent event, bool render_perspective) = 0; }; diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 8031772fd..13fc170dc 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -54,7 +54,7 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" Gtk::Image* ipers_draw_horiz = Gtk::manage (new RTImage ("draw-horizontal.png")); Gtk::Image* ipers_draw_vert = Gtk::manage (new RTImage ("draw-vertical.png")); - Gtk::Image* ipers_draw = new RTImage ("draw.png"); + std::unique_ptr ipers_draw(new RTImage ("draw.png")); Gtk::Image* ipers_trash = Gtk::manage (new RTImage ("trash-empty.png")); Gtk::Image* ipersHL = Gtk::manage (new RTImage ("perspective-horizontal-left-small.png")); @@ -147,11 +147,11 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" lines_button_erase->signal_pressed().connect(sigc::mem_fun( *this, &::PerspCorrection::linesEraseButtonPressed)); - lines = new ControlLineManager(); - lines->callbacks = new LinesCallbacks(this, lines); + lines = std::unique_ptr(new ControlLineManager()); + lines->callbacks = std::make_shared(this); - img_ctrl_lines_apply = new RTImage ("tick.png"); - img_ctrl_lines_edit = ipers_draw; + img_ctrl_lines_apply = std::unique_ptr(new RTImage ("tick.png")); + img_ctrl_lines_edit = std::move(ipers_draw); Gtk::HBox* control_lines_box = Gtk::manage (new Gtk::HBox()); control_lines_box->set_tooltip_text( M("TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP") ); @@ -251,14 +251,6 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" show_all(); } -PerspCorrection::~PerspCorrection() -{ - delete lines->callbacks; - delete lines; - delete img_ctrl_lines_apply; - delete img_ctrl_lines_edit; -} - void PerspCorrection::read (const ProcParams* pp, const ParamsEdited* pedited) { @@ -462,12 +454,14 @@ void PerspCorrection::applyControlLines(void) return; } - auto control_lines = lines->toControlLines(); + std::vector control_lines; int h_count = 0, v_count = 0; double rot = camera_roll->getValue(); double pitch = camera_pitch->getValue(); double yaw = camera_yaw->getValue(); + lines->toControlLines(control_lines); + for (unsigned int i = 0; i < lines->size(); i++) { if (control_lines[i].type == rtengine::ControlLine::HORIZONTAL) { h_count++; @@ -476,9 +470,7 @@ void PerspCorrection::applyControlLines(void) } } lens_geom_listener->autoPerspRequested(v_count > 1, h_count > 1, rot, pitch, - yaw, control_lines, lines->size()); - - free(control_lines); + yaw, &control_lines); disableListener(); camera_pitch->setValue(pitch); @@ -659,7 +651,7 @@ void PerspCorrection::setFocalLengthValue (const ProcParams* pparams, const Fram } } -void PerspCorrection::switchOffEditMode(ControlLineManager* lines) +void PerspCorrection::switchOffEditMode(void) { lines_button_h->set_active(false); lines_button_v->set_active(false); @@ -760,10 +752,10 @@ ControlLineManager::ControlLineManager(): prev_obj(-1), selected_object(-1) { - canvas_area = new Rectangle(); + canvas_area = std::unique_ptr(new Rectangle()); canvas_area->filled = true; canvas_area->topLeft = Coord(0, 0); - mouseOverGeometry.push_back(canvas_area); + mouseOverGeometry.push_back(canvas_area.get()); line_icon_h = Cairo::RefPtr(new RTSurface("bidirectional-arrow-horizontal-hicontrast.png")); line_icon_v = Cairo::RefPtr(new RTSurface("bidirectional-arrow-vertical-hicontrast.png")); @@ -771,19 +763,6 @@ ControlLineManager::ControlLineManager(): line_icon_v_prelight = Cairo::RefPtr(new RTSurface("bidirectional-arrow-vertical-prelight.png")); } -ControlLineManager::~ControlLineManager() -{ - delete canvas_area; - for (auto i = control_lines.begin(); i != control_lines.end(); i++) { - delete (*i)->begin; - delete (*i)->end; - delete (*i)->line; - delete (*i)->icon_h; - delete (*i)->icon_v; - delete *i; - } -} - Geometry::State ControlLineManager::calcLineState(const ::ControlLine& line) const { if (line.type == rtengine::ControlLine::HORIZONTAL && active_h) { @@ -903,22 +882,22 @@ bool ControlLineManager::pick1(bool picked) // Change line type. int object_id = provider->getObject(); - auto line = control_lines[(object_id - 1) / ::ControlLine::OBJ_COUNT]; + ::ControlLine& line = *control_lines[(object_id - 1) / ::ControlLine::OBJ_COUNT]; - if (line->type == rtengine::ControlLine::HORIZONTAL) { - line->icon = line->icon_v; - line->type = rtengine::ControlLine::VERTICAL; - } else if (line->type == rtengine::ControlLine::VERTICAL) { - line->icon = line->icon_h; - line->type = rtengine::ControlLine::HORIZONTAL; + if (line.type == rtengine::ControlLine::HORIZONTAL) { + line.icon = line.icon_v; + line.type = rtengine::ControlLine::VERTICAL; + } else if (line.type == rtengine::ControlLine::VERTICAL) { + line.icon = line.icon_h; + line.type = rtengine::ControlLine::HORIZONTAL; } - visibleGeometry[object_id - 1] = line->icon; + visibleGeometry[object_id - 1] = line.icon.get(); - auto state = calcLineState(*line); - line->begin->state = state; - line->end->state = state; - line->line->state = state; + auto state = calcLineState(line); + line.begin->state = state; + line.end->state = state; + line.line->state = state; return true; } @@ -938,6 +917,8 @@ bool ControlLineManager::pick3(bool picked) } removeLine((provider->getObject() - 1) / ::ControlLine::OBJ_COUNT); + prev_obj = -1; + selected_object = -1; return false; } @@ -949,7 +930,7 @@ bool ControlLineManager::drag1(int modifierKey) return false; } - ::ControlLine* control_line = control_lines[(selected_object - 1) / ::ControlLine::OBJ_COUNT]; + ::ControlLine& control_line = *control_lines[(selected_object - 1) / ::ControlLine::OBJ_COUNT]; int component = selected_object % ::ControlLine::OBJ_COUNT; // 0 == end, 1 == line, 2 == icon, 3 == begin Coord mouse = provider->posImage + provider->deltaImage; Coord delta = provider->deltaImage - drag_delta; @@ -958,41 +939,41 @@ bool ControlLineManager::drag1(int modifierKey) switch (component) { case (0): // end - control_line->end->center = mouse; - control_line->end->center.clip(iw, ih); - control_line->line->end = control_line->end->center; - control_line->end->state = Geometry::DRAGGED; + control_line.end->center = mouse; + control_line.end->center.clip(iw, ih); + control_line.line->end = control_line.end->center; + control_line.end->state = Geometry::DRAGGED; break; case (1): { // line // Constrain delta so the end stays above the image. - Coord new_delta = control_line->end->center + delta; + Coord new_delta = control_line.end->center + delta; new_delta.clip(iw, ih); - new_delta -= control_line->end->center; + new_delta -= control_line.end->center; // Constrain delta so the beginning stays above the image. - new_delta += control_line->begin->center; + new_delta += control_line.begin->center; new_delta.clip(iw, ih); - new_delta -= control_line->begin->center; + new_delta -= control_line.begin->center; // Move all objects in the control line. - control_line->end->center += new_delta; - control_line->begin->center += new_delta; - control_line->line->end = control_line->end->center; - control_line->line->begin = control_line->begin->center; + control_line.end->center += new_delta; + control_line.begin->center += new_delta; + control_line.line->end = control_line.end->center; + control_line.line->begin = control_line.begin->center; drag_delta += new_delta; - control_line->line->state = Geometry::DRAGGED; + control_line.line->state = Geometry::DRAGGED; break; } case (3): // begin - control_line->begin->center = mouse; - control_line->begin->center.clip(iw, ih); - control_line->line->begin = control_line->begin->center; - control_line->begin->state = Geometry::DRAGGED; + control_line.begin->center = mouse; + control_line.begin->center.clip(iw, ih); + control_line.line->begin = control_line.begin->center; + control_line.begin->state = Geometry::DRAGGED; break; } - control_line->icon_h->position.x = (control_line->begin->center.x + control_line->end->center.x) / 2; - control_line->icon_h->position.y = (control_line->begin->center.y + control_line->end->center.y) / 2; - control_line->icon_v->position.x = control_line->icon_h->position.x; - control_line->icon_v->position.y = control_line->icon_h->position.y; + control_line.icon_h->position.x = (control_line.begin->center.x + control_line.end->center.x) / 2; + control_line.icon_h->position.y = (control_line.begin->center.y + control_line.end->center.y) / 2; + control_line.icon_v->position.x = control_line.icon_h->position.x; + control_line.icon_v->position.y = control_line.icon_h->position.y; return false; @@ -1055,11 +1036,11 @@ void ControlLineManager::addLine(Coord begin, Coord end) { constexpr int line_width = 2; constexpr int handle_radius = 6; - Line* line; - OPIcon *icon_h, *icon_v; - Circle *begin_c, *end_c; + std::unique_ptr line; + std::shared_ptr icon_h, icon_v; + std::unique_ptr begin_c, end_c; - line = new Line(); + line = std::unique_ptr(new Line()); line->datum = Geometry::IMAGE; line->innerLineWidth = line_width; line->begin = begin; @@ -1067,29 +1048,29 @@ void ControlLineManager::addLine(Coord begin, Coord end) const Cairo::RefPtr null_surface = Cairo::RefPtr(nullptr); - icon_h = new OPIcon(line_icon_h, null_surface, line_icon_h_prelight, + icon_h = std::make_shared(line_icon_h, null_surface, line_icon_h_prelight, null_surface, null_surface, Geometry::DP_CENTERCENTER); icon_h->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2); - icon_v = new OPIcon(line_icon_v, null_surface, line_icon_v_prelight, + icon_v = std::make_shared(line_icon_v, null_surface, line_icon_v_prelight, null_surface, null_surface, Geometry::DP_CENTERCENTER); icon_v->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2); - begin_c = new Circle(); + begin_c = std::unique_ptr(new Circle()); begin_c->datum = Geometry::IMAGE; begin_c->filled = true; begin_c->radius = handle_radius; begin_c->center = begin; - end_c = new Circle(); + end_c = std::unique_ptr(new Circle()); end_c->datum = Geometry::IMAGE; end_c->filled = true; end_c->radius = handle_radius; end_c->center = begin; - ::ControlLine* control_line = new ::ControlLine(); - control_line->begin = begin_c; - control_line->end = end_c; + std::unique_ptr<::ControlLine> control_line(new ::ControlLine()); + control_line->begin = std::move(begin_c); + control_line->end = std::move(end_c); control_line->icon_h = icon_h; control_line->icon_v = icon_v; if (draw_line_type == rtengine::ControlLine::HORIZONTAL) { @@ -1097,34 +1078,29 @@ void ControlLineManager::addLine(Coord begin, Coord end) } else if (draw_line_type == rtengine::ControlLine::VERTICAL) { control_line->icon = icon_v; } - control_line->line = line; + control_line->line = std::move(line); control_line->type = draw_line_type; - control_lines.push_back(control_line); - EditSubscriber::visibleGeometry.push_back(line); - EditSubscriber::visibleGeometry.push_back(control_line->icon); - EditSubscriber::visibleGeometry.push_back(begin_c); - EditSubscriber::visibleGeometry.push_back(end_c); + EditSubscriber::visibleGeometry.push_back(control_line->line.get()); + EditSubscriber::visibleGeometry.push_back(control_line->icon.get()); + EditSubscriber::visibleGeometry.push_back(control_line->begin.get()); + EditSubscriber::visibleGeometry.push_back(control_line->end.get()); - EditSubscriber::mouseOverGeometry.push_back(line); - EditSubscriber::mouseOverGeometry.push_back(control_line->icon); - EditSubscriber::mouseOverGeometry.push_back(begin_c); - EditSubscriber::mouseOverGeometry.push_back(end_c); + EditSubscriber::mouseOverGeometry.push_back(control_line->line.get()); + EditSubscriber::mouseOverGeometry.push_back(control_line->icon.get()); + EditSubscriber::mouseOverGeometry.push_back(control_line->begin.get()); + EditSubscriber::mouseOverGeometry.push_back(control_line->end.get()); + + control_lines.push_back(std::move(control_line)); } void ControlLineManager::removeAll(void) { - for (unsigned int i = 0; i < control_lines.size(); i++) { - delete control_lines[i]->begin; - delete control_lines[i]->end; - delete control_lines[i]->line; - delete control_lines[i]->icon_h; - delete control_lines[i]->icon_v; - delete control_lines[i]; - } - control_lines.clear(); visibleGeometry.clear(); mouseOverGeometry.erase(mouseOverGeometry.begin() + 1, mouseOverGeometry.end()); + control_lines.clear(); + prev_obj = -1; + selected_object = -1; } void ControlLineManager::removeLine(size_t line_id) @@ -1133,48 +1109,35 @@ void ControlLineManager::removeLine(size_t line_id) return; } - ::ControlLine* line = control_lines[line_id]; - delete line->begin; - delete line->end; - delete line->line; - delete line->icon_h; - delete line->icon_v; - delete line; - control_lines.erase(control_lines.begin() + line_id); visibleGeometry.erase(visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id, visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + ::ControlLine::OBJ_COUNT); mouseOverGeometry.erase(mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + 1, mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + ::ControlLine::OBJ_COUNT + 1); + control_lines.erase(control_lines.begin() + line_id); } -rtengine::ControlLine* ControlLineManager::toControlLines(void) const +void ControlLineManager::toControlLines(std::vector& converted) const { - auto retval = (rtengine::ControlLine*)malloc(control_lines.size() * sizeof(rtengine::ControlLine)); + converted.clear(); + converted.resize(control_lines.size()); for (unsigned int i = 0; i < control_lines.size(); i++) { - retval[i].x1 = control_lines[i]->begin->center.x; - retval[i].y1 = control_lines[i]->begin->center.y; - retval[i].x2 = control_lines[i]->end->center.x; - retval[i].y2 = control_lines[i]->end->center.y; - retval[i].type = control_lines[i]->type; + converted[i].x1 = control_lines[i]->begin->center.x; + converted[i].y1 = control_lines[i]->begin->center.y; + converted[i].x2 = control_lines[i]->end->center.x; + converted[i].y2 = control_lines[i]->end->center.y; + converted[i].type = control_lines[i]->type; } - - return retval; } -LinesCallbacks::LinesCallbacks(PerspCorrection* tool, ControlLineManager* lines): - lines(lines), +LinesCallbacks::LinesCallbacks(PerspCorrection* tool): tool(tool) { } -LinesCallbacks::~LinesCallbacks() -{ -} - void LinesCallbacks::switchOffEditMode(void) { if (tool) { - tool->switchOffEditMode(lines); + tool->switchOffEditMode(); } } diff --git a/rtgui/perspective.h b/rtgui/perspective.h index dd9155c50..0c636373c 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -30,10 +30,10 @@ struct ControlLine { static constexpr int OBJ_COUNT = 4; - Line* line; - OPIcon* icon; - OPIcon *icon_h, *icon_v; - Circle *begin, *end; + std::unique_ptr line; + std::shared_ptr icon; + std::shared_ptr icon_h, icon_v; + std::unique_ptr begin, end; rtengine::ControlLine::Type type; }; @@ -44,9 +44,9 @@ protected: /** Determine how horizontal and vertical lines are displayed. */ bool active_h, active_v; /** Hidden object for capturing mouse events. */ - Rectangle* canvas_area; + std::unique_ptr canvas_area; rtengine::Coord drag_delta; - std::vector control_lines; + std::vector> control_lines; CursorShape cursor; bool draw_mode; Cairo::RefPtr line_icon_h, line_icon_v; @@ -68,12 +68,11 @@ public: }; /** Callbacks to invoke. */ - Callbacks* callbacks; + std::shared_ptr callbacks; /** Type of line for newly drawn lines. */ rtengine::ControlLine::Type draw_line_type; ControlLineManager(); - ~ControlLineManager(); void removeAll (void); /** Sets whether or not the lines are visible and interact-able. */ @@ -88,7 +87,7 @@ public: /** * Allocates a new array and populates it with copies of the control lines. */ - rtengine::ControlLine* toControlLines (void) const; + void toControlLines (std::vector& converted) const; // EditSubscriber overrides bool button1Pressed (int modifierKey) override; @@ -125,9 +124,9 @@ protected: Adjuster* camera_shift_horiz; Adjuster* camera_shift_vert; Adjuster* camera_yaw; - Gtk::Image* img_ctrl_lines_edit; - Gtk::Image* img_ctrl_lines_apply; - ControlLineManager* lines; + std::unique_ptr img_ctrl_lines_edit; + std::unique_ptr img_ctrl_lines_apply; + std::unique_ptr lines; Gtk::ToggleButton* lines_button_edit; Gtk::Button* lines_button_erase; Gtk::ToggleButton* lines_button_h; @@ -167,7 +166,6 @@ protected: public: PerspCorrection (); - ~PerspCorrection (); void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; @@ -187,18 +185,16 @@ public: lens_geom_listener = listener; } void setMetadata (const rtengine::FramesMetaData* metadata); - void switchOffEditMode (ControlLineManager* lines); + void switchOffEditMode (void); void trimValues (rtengine::procparams::ProcParams* pp) override; }; class LinesCallbacks: public ControlLineManager::Callbacks { protected: - ControlLineManager* lines; PerspCorrection* tool; public: - LinesCallbacks(PerspCorrection* tool, ControlLineManager* lines); - ~LinesCallbacks(); + LinesCallbacks(PerspCorrection* tool); void switchOffEditMode (void) override; }; diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 857a4c57b..d25d6414d 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -986,7 +986,7 @@ void ToolPanelCoordinator::straightenRequested() toolBar->setTool(TMStraighten); } -void ToolPanelCoordinator::autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const rtengine::ControlLine *lines, size_t line_count) +void ToolPanelCoordinator::autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector *lines) { if (!(ipc && (corr_pitch || corr_yaw))) { return; @@ -1000,7 +1000,7 @@ void ToolPanelCoordinator::autoPerspRequested (bool corr_pitch, bool corr_yaw, d rtengine::procparams::ProcParams params; ipc->getParams(¶ms); - auto res = rtengine::PerspectiveCorrection::autocompute(src, corr_pitch, corr_yaw, ¶ms, src->getMetaData(), lines, line_count); + auto res = rtengine::PerspectiveCorrection::autocompute(src, corr_pitch, corr_yaw, ¶ms, src->getMetaData(), lines); rot = res.angle; pitch = res.pitch; yaw = res.yaw; diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 7ab17018b..3889e786c 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -313,7 +313,7 @@ public: // rotatelistener interface void straightenRequested () override; void autoCropRequested () override; - void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const rtengine::ControlLine *lines = nullptr, size_t line_count = 0) override; + void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector *lines = nullptr) override; double autoDistorRequested () override; void updateTransformPreviewRequested (rtengine::ProcEvent event, bool render_perspective) override; From a7f397541a425ea582def20683badaaf980deea5 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 8 Jul 2020 11:46:28 -0700 Subject: [PATCH 020/185] Make control line type automatically set Perspective control line type is automatically set when first drawn. The type is determined by the line's angle. Buttons for specifying which line type to draw are removed. --- rtdata/images/svg/draw-horizontal.svg | 117 ------------------- rtdata/images/svg/draw-vertical.svg | 117 ------------------- rtgui/perspective.cc | 154 ++++++++++---------------- rtgui/perspective.h | 23 ++-- 4 files changed, 71 insertions(+), 340 deletions(-) delete mode 100644 rtdata/images/svg/draw-horizontal.svg delete mode 100644 rtdata/images/svg/draw-vertical.svg diff --git a/rtdata/images/svg/draw-horizontal.svg b/rtdata/images/svg/draw-horizontal.svg deleted file mode 100644 index ae8fa8c44..000000000 --- a/rtdata/images/svg/draw-horizontal.svg +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - Lawrence - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/draw-vertical.svg b/rtdata/images/svg/draw-vertical.svg deleted file mode 100644 index 4613d95c6..000000000 --- a/rtdata/images/svg/draw-vertical.svg +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - Lawrence - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 13fc170dc..02aea16f6 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -52,10 +52,9 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" lens_geom_listener = nullptr; metadata = nullptr; - Gtk::Image* ipers_draw_horiz = Gtk::manage (new RTImage ("draw-horizontal.png")); - Gtk::Image* ipers_draw_vert = Gtk::manage (new RTImage ("draw-vertical.png")); - std::unique_ptr ipers_draw(new RTImage ("draw.png")); + Gtk::Image* ipers_draw(new RTImage ("draw.png")); Gtk::Image* ipers_trash = Gtk::manage (new RTImage ("trash-empty.png")); + Gtk::Image* ipers_apply = Gtk::manage (new RTImage ("tick.png")); Gtk::Image* ipersHL = Gtk::manage (new RTImage ("perspective-horizontal-left-small.png")); Gtk::Image* ipersHR = Gtk::manage (new RTImage ("perspective-horizontal-right-small.png")); @@ -126,15 +125,11 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" camera_yaw->setAdjusterListener (this); // Begin control lines interface. - lines_button_h = Gtk::manage (new Gtk::ToggleButton()); - lines_button_h->set_image(*ipers_draw_horiz); - lines_button_h->signal_toggled().connect(sigc::bind(sigc::mem_fun( - *this, &::PerspCorrection::linesButtonPressed), lines_button_h)); - - lines_button_v = Gtk::manage (new Gtk::ToggleButton()); - lines_button_v->set_image(*ipers_draw_vert); - lines_button_v->signal_toggled().connect(sigc::bind(sigc::mem_fun( - *this, &::PerspCorrection::linesButtonPressed), lines_button_v)); + lines_button_apply = Gtk::manage (new Gtk::Button()); + lines_button_apply->set_image(*ipers_apply); + lines_button_apply->set_sensitive(false); + lines_button_apply->signal_pressed().connect(sigc::mem_fun( + *this, &::PerspCorrection::linesApplyButtonPressed)); lines_button_edit = Gtk::manage (new Gtk::ToggleButton()); lines_button_edit->set_image(*ipers_draw); @@ -150,16 +145,12 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" lines = std::unique_ptr(new ControlLineManager()); lines->callbacks = std::make_shared(this); - img_ctrl_lines_apply = std::unique_ptr(new RTImage ("tick.png")); - img_ctrl_lines_edit = std::move(ipers_draw); - Gtk::HBox* control_lines_box = Gtk::manage (new Gtk::HBox()); control_lines_box->set_tooltip_text( M("TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP") ); Gtk::Label* control_lines_label = Gtk::manage (new Gtk::Label (M("TP_PERSPECTIVE_CONTROL_LINES") + ": ")); control_lines_box->pack_start(*control_lines_label, Gtk::PACK_SHRINK); - control_lines_box->pack_start(*lines_button_v); - control_lines_box->pack_start(*lines_button_h); control_lines_box->pack_start(*lines_button_edit); + control_lines_box->pack_start(*lines_button_apply); control_lines_box->pack_start(*lines_button_erase); // End control lines interface. @@ -595,8 +586,6 @@ void PerspCorrection::setBatchMode (bool batchMode) projection_shift_vert->showEditedCB (); projection_yaw->showEditedCB (); - lines_button_h->set_sensitive(false); - lines_button_v->set_sensitive(false); lines_button_edit->set_sensitive(false); auto_pitch->set_sensitive(false); auto_yaw->set_sensitive(false); @@ -653,8 +642,6 @@ void PerspCorrection::setFocalLengthValue (const ProcParams* pparams, const Fram void PerspCorrection::switchOffEditMode(void) { - lines_button_h->set_active(false); - lines_button_v->set_active(false); lines_button_edit->set_active(false); } @@ -663,62 +650,37 @@ void PerspCorrection::setEditProvider(EditDataProvider* provider) lines->setEditProvider(provider); } -void PerspCorrection::linesButtonPressed(Gtk::ToggleButton* button) +void PerspCorrection::linesApplyButtonPressed(void) { - lines->setLinesState(lines_button_h->get_active(), lines_button_v->get_active()); - - if (!button->get_active()) { - return; + if (method->get_active_row_number() == 1) { + // Calculate perspective distortion if in camera-based mode. + applyControlLines(); } - - if (button == lines_button_h) { - lines->draw_line_type = rtengine::ControlLine::HORIZONTAL; - if (lines_button_v->get_active()) { - lines_button_v->set_active(false); - } - } else if (button == lines_button_v) { - lines->draw_line_type = rtengine::ControlLine::VERTICAL; - if (lines_button_h->get_active()) { - lines_button_h->set_active(false); - } - } - - if (!lines_button_edit->get_active()) { - lines_button_edit->set_active(true); - } - - lines->setDrawMode(true); + lines_button_edit->set_active(false); } void PerspCorrection::linesEditButtonPressed(void) { if (lines_button_edit->get_active()) { // Enter edit mode. lines->setActive(true); - if (img_ctrl_lines_apply) { - lines_button_edit->set_image(*img_ctrl_lines_apply); - } + lines->setDrawMode(true); render = false; - lines->setLinesState(lines_button_h->get_active(), lines_button_v->get_active()); if (lens_geom_listener) { lens_geom_listener->updateTransformPreviewRequested(EvPerspRender, false); } + lines_button_apply->set_sensitive(true); lines_button_erase->set_sensitive(true); setCamBasedEventsActive(false); } else { // Leave edit mode. setCamBasedEventsActive(true); + lines_button_apply->set_sensitive(false); lines_button_erase->set_sensitive(false); render = true; + if (lens_geom_listener) { + lens_geom_listener->updateTransformPreviewRequested(EvPerspRender, true); + } lines->setDrawMode(false); lines->setActive(false); - if (img_ctrl_lines_edit) { - lines_button_edit->set_image(*img_ctrl_lines_edit); - } - lines_button_h->set_active(false); - lines_button_v->set_active(false); - if (method->get_active_row_number() == 1) { - // Calculate perspective distortion if in camera-based mode. - applyControlLines(); - } } } @@ -763,16 +725,6 @@ ControlLineManager::ControlLineManager(): line_icon_v_prelight = Cairo::RefPtr(new RTSurface("bidirectional-arrow-vertical-prelight.png")); } -Geometry::State ControlLineManager::calcLineState(const ::ControlLine& line) const -{ - if (line.type == rtengine::ControlLine::HORIZONTAL && active_h) { - return Geometry::NORMAL; - } else if (line.type == rtengine::ControlLine::VERTICAL && active_v) { - return Geometry::NORMAL; - } - return Geometry::INSENSITIVE; -} - void ControlLineManager::setActive(bool active) { EditDataProvider* provider = getEditProvider(); @@ -797,19 +749,6 @@ void ControlLineManager::setDrawMode(bool draw) draw_mode = draw; } -void ControlLineManager::setLinesState(bool horiz_active, bool vert_active) -{ - active_h = horiz_active; - active_v = vert_active; - - for (auto line = control_lines.begin(); line != control_lines.end(); line++) { - auto state = calcLineState(**line); - (*line)->begin->state = state; - (*line)->end->state = state; - (*line)->line->state = state; - } -} - size_t ControlLineManager::size(void) const { return control_lines.size(); @@ -835,6 +774,7 @@ bool ControlLineManager::button1Pressed(int modifierKey) } } else if (draw_mode && (modifierKey & GDK_CONTROL_MASK)) { // Add new line. addLine(dataProvider->posImage, dataProvider->posImage); + drawing_line = true; selected_object = mouseOverGeometry.size() - 1; // Select endpoint. action = Action::DRAGGING; } @@ -848,6 +788,7 @@ bool ControlLineManager::button1Released(void) if (selected_object > 0) { mouseOverGeometry[selected_object]->state = Geometry::NORMAL; } + drawing_line = false; selected_object = -1; return false; } @@ -894,11 +835,6 @@ bool ControlLineManager::pick1(bool picked) visibleGeometry[object_id - 1] = line.icon.get(); - auto state = calcLineState(line); - line.begin->state = state; - line.end->state = state; - line.line->state = state; - return true; } @@ -975,6 +911,9 @@ bool ControlLineManager::drag1(int modifierKey) control_line.icon_v->position.x = control_line.icon_h->position.x; control_line.icon_v->position.y = control_line.icon_h->position.y; + if (drawing_line) { + autoSetLineType(selected_object); + } return false; } @@ -1011,10 +950,8 @@ bool ControlLineManager::mouseOver(int modifierKey) } if (prev_obj != cur_obj && prev_obj > 0) { - auto state = calcLineState(*control_lines[(prev_obj - 1) / ::ControlLine::OBJ_COUNT]); - visibleGeometry[prev_obj - 1]->state = state; + visibleGeometry[prev_obj - 1]->state = Geometry::NORMAL; } - prev_obj = cur_obj; return true; @@ -1073,13 +1010,9 @@ void ControlLineManager::addLine(Coord begin, Coord end) control_line->end = std::move(end_c); control_line->icon_h = icon_h; control_line->icon_v = icon_v; - if (draw_line_type == rtengine::ControlLine::HORIZONTAL) { - control_line->icon = icon_h; - } else if (draw_line_type == rtengine::ControlLine::VERTICAL) { - control_line->icon = icon_v; - } + control_line->icon = icon_v; control_line->line = std::move(line); - control_line->type = draw_line_type; + control_line->type = rtengine::ControlLine::VERTICAL; EditSubscriber::visibleGeometry.push_back(control_line->line.get()); EditSubscriber::visibleGeometry.push_back(control_line->icon.get()); @@ -1094,6 +1027,39 @@ void ControlLineManager::addLine(Coord begin, Coord end) control_lines.push_back(std::move(control_line)); } +void ControlLineManager::autoSetLineType(int object_id) +{ + int line_id = (object_id - 1) / ::ControlLine::OBJ_COUNT; + ::ControlLine& line = *control_lines[line_id]; + + int dx = line.begin->center.x - line.end->center.x; + int dy = line.begin->center.y - line.end->center.y; + + if (dx < 0) { + dx = -dx; + } + if (dy < 0) { + dy = -dy; + } + + rtengine::ControlLine::Type type; + std::shared_ptr icon; + + if (dx > dy) { // More horizontal than vertical. + type = rtengine::ControlLine::HORIZONTAL; + icon = line.icon_h; + } else { + type = rtengine::ControlLine::VERTICAL; + icon = line.icon_v; + } + + if (type != line.type) { // Need to update line type. + line.type = type; + line.icon = icon; + visibleGeometry[line_id * ::ControlLine::OBJ_COUNT + 1] = line.icon.get(); + } +} + void ControlLineManager::removeAll(void) { visibleGeometry.clear(); diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 0c636373c..40c8d7e46 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -41,21 +41,27 @@ class ControlLineManager: EditSubscriber { protected: - /** Determine how horizontal and vertical lines are displayed. */ - bool active_h, active_v; /** Hidden object for capturing mouse events. */ std::unique_ptr canvas_area; rtengine::Coord drag_delta; std::vector> control_lines; CursorShape cursor; bool draw_mode; + bool drawing_line = false; Cairo::RefPtr line_icon_h, line_icon_v; Cairo::RefPtr line_icon_h_prelight, line_icon_v_prelight; int prev_obj; int selected_object; void addLine (rtengine::Coord begin, rtengine::Coord end); - Geometry::State calcLineState(const ControlLine& line) const; + /** + * Set the line type of the line containing the object according to the + * line's angle. + * + * If the line is within 45 degrees of a perfectly vertical + * line, inclusive, the line type is set to vertical. Otherwise, horizontal. + */ + void autoSetLineType(int object_id); void removeLine (size_t line_id); public: @@ -69,8 +75,6 @@ public: /** Callbacks to invoke. */ std::shared_ptr callbacks; - /** Type of line for newly drawn lines. */ - rtengine::ControlLine::Type draw_line_type; ControlLineManager(); @@ -80,8 +84,6 @@ public: /** Set whether or not lines can be drawn and deleted. */ void setDrawMode (bool draw); void setEditProvider (EditDataProvider* provider); - /** Determines how each line type is displayed. */ - void setLinesState (bool horiz_active, bool vert_active); /** Returns the number of lines. */ size_t size (void) const; /** @@ -124,13 +126,10 @@ protected: Adjuster* camera_shift_horiz; Adjuster* camera_shift_vert; Adjuster* camera_yaw; - std::unique_ptr img_ctrl_lines_edit; - std::unique_ptr img_ctrl_lines_apply; std::unique_ptr lines; + Gtk::Button* lines_button_apply; Gtk::ToggleButton* lines_button_edit; Gtk::Button* lines_button_erase; - Gtk::ToggleButton* lines_button_h; - Gtk::ToggleButton* lines_button_v; Adjuster* projection_pitch; Adjuster* projection_rotate; Adjuster* projection_shift_horiz; @@ -174,7 +173,7 @@ public: void adjusterChanged (Adjuster* a, double newval) override; void autoCorrectionPressed (Gtk::Button* b); - void linesButtonPressed (Gtk::ToggleButton* button); + void linesApplyButtonPressed (void); void linesEditButtonPressed (void); void linesEraseButtonPressed (void); void methodChanged (void); From 7f647d188c0db1f2bb6ebff7e8d16308e2dd5bb4 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 8 Jul 2020 11:57:04 -0700 Subject: [PATCH 021/185] Fix cppcheck warnings --- rtgui/perspective.cc | 4 +++- rtgui/perspective.h | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 02aea16f6..68e43278f 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -710,11 +710,13 @@ void PerspCorrection::setCamBasedEventsActive(bool active) ControlLineManager::ControlLineManager(): EditSubscriber(ET_OBJECTS), + canvas_area(new Rectangle()), cursor(CSCrosshair), + draw_mode(false), + drawing_line(false), prev_obj(-1), selected_object(-1) { - canvas_area = std::unique_ptr(new Rectangle()); canvas_area->filled = true; canvas_area->topLeft = Coord(0, 0); mouseOverGeometry.push_back(canvas_area.get()); diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 40c8d7e46..3538af279 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -47,7 +47,7 @@ protected: std::vector> control_lines; CursorShape cursor; bool draw_mode; - bool drawing_line = false; + bool drawing_line; Cairo::RefPtr line_icon_h, line_icon_v; Cairo::RefPtr line_icon_h_prelight, line_icon_v_prelight; int prev_obj; @@ -194,6 +194,6 @@ protected: PerspCorrection* tool; public: - LinesCallbacks(PerspCorrection* tool); + explicit LinesCallbacks(PerspCorrection* tool); void switchOffEditMode (void) override; }; From 70c052cc76898a8d07ac4619ffe208f22ae35c55 Mon Sep 17 00:00:00 2001 From: Yaroslav Isakov Date: Thu, 9 Jul 2020 16:35:14 +0200 Subject: [PATCH 022/185] Make libcanberra optional It is the only X11 dep in RawTherapee, so here is an option to compile without libcanberra. This will completely disables sounds for long operations on Linux, but canberra is enabled by default. --- CMakeLists.txt | 6 +++++- rtgui/soundman.cc | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b7cf35099..076e1b817 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -493,7 +493,11 @@ endif() # Check for libcanberra-gtk3 (sound events on Linux): if(UNIX AND (NOT APPLE)) - pkg_check_modules(CANBERRA-GTK REQUIRED libcanberra-gtk3) + option(USE_LIBCANBERRA "Build with libcanberra" ON) + if(USE_LIBCANBERRA) + pkg_check_modules(CANBERRA-GTK REQUIRED libcanberra-gtk3) + add_definitions(-DUSE_CANBERRA) + endif() endif() if(WITH_MYFILE_MMAP) diff --git a/rtgui/soundman.cc b/rtgui/soundman.cc index a4cf5337b..d038ffd72 100644 --- a/rtgui/soundman.cc +++ b/rtgui/soundman.cc @@ -26,7 +26,7 @@ #include #endif -#ifdef __linux__ +#if defined(__linux__) && defined(USE_CANBERRA) #include #endif @@ -67,7 +67,7 @@ void SoundManager::playSoundAsync(const Glib::ustring &sound) wchar_t *wfilename = (wchar_t*)g_utf8_to_utf16 (sound.c_str(), -1, NULL, NULL, NULL); PlaySoundW(wfilename, NULL, sndParam); g_free( wfilename ); -#elif defined(__linux__) +#elif defined(__linux__) && defined(USE_CANBERRA) ca_context_play(ca_gtk_context_get(), 0, CA_PROP_EVENT_ID, sound.c_str(), CA_PROP_MEDIA_FILENAME, sound.c_str(), NULL); #endif } From eb548f1aff48a90fc9a6d2a8c5bb11c0e1d1bdbf Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Thu, 9 Jul 2020 11:43:23 -0700 Subject: [PATCH 023/185] Make control lines part of processing parameters --- rtengine/procparams.cc | 16 +++++- rtengine/procparams.h | 4 ++ rtgui/paramsedited.cc | 7 +++ rtgui/paramsedited.h | 1 + rtgui/perspective.cc | 124 +++++++++++++++++++++++++++++++++++++++-- rtgui/perspective.h | 12 +++- 6 files changed, 158 insertions(+), 6 deletions(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index def39a5cd..0cd47f132 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1904,7 +1904,12 @@ bool PerspectiveParams::operator ==(const PerspectiveParams& other) const && projection_shift_vert == other.projection_shift_vert && projection_rotate == other.projection_rotate && projection_pitch == other.projection_pitch - && projection_yaw == other.projection_yaw; + && projection_yaw == other.projection_yaw + // Lines could still be equivalent if the vectors aren't, but this is + // rare and a small issue. Besides, a proper comparison requires lots + // more code which introduces clutter. + && control_line_values == other.control_line_values + && control_line_types == other.control_line_types; } bool PerspectiveParams::operator !=(const PerspectiveParams& other) const @@ -5210,6 +5215,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->perspective.projection_shift_horiz, "Perspective", "ProjectionShiftHorizontal", perspective.projection_shift_horiz, keyFile); saveToKeyfile(!pedited || pedited->perspective.projection_shift_vert, "Perspective", "ProjectionShiftVertical", perspective.projection_shift_vert, keyFile); saveToKeyfile(!pedited || pedited->perspective.projection_yaw, "Perspective", "ProjectionYaw", perspective.projection_yaw, keyFile); + saveToKeyfile(!pedited || pedited->perspective.control_lines, "Perspective", "ControlLineValues", perspective.control_line_values, keyFile); + saveToKeyfile(!pedited || pedited->perspective.control_lines, "Perspective", "ControlLineTypes", perspective.control_line_types, keyFile); // Gradient saveToKeyfile(!pedited || pedited->gradient.enabled, "Gradient", "Enabled", gradient.enabled, keyFile); @@ -6839,6 +6846,13 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Perspective", "ProjectionShiftHorizontal", pedited, perspective.projection_shift_horiz, pedited->perspective.projection_shift_horiz); assignFromKeyfile(keyFile, "Perspective", "ProjectionShiftVertical", pedited, perspective.projection_shift_vert, pedited->perspective.projection_shift_vert); assignFromKeyfile(keyFile, "Perspective", "ProjectionYaw", pedited, perspective.projection_yaw, pedited->perspective.projection_yaw); + if (keyFile.has_key("Perspective", "ControlLineValues") && keyFile.has_key("Perspective", "ControlLineTypes")) { + perspective.control_line_values = keyFile.get_integer_list("Perspective", "ControlLineValues"); + perspective.control_line_types = keyFile.get_integer_list("Perspective", "ControlLineTypes"); + if (pedited) { + pedited->perspective.control_lines = true; + } + } } if (keyFile.has_group("Gradient")) { diff --git a/rtengine/procparams.h b/rtengine/procparams.h index ae46174a2..c7139236c 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -945,6 +945,10 @@ struct PerspectiveParams { double projection_shift_horiz; double projection_shift_vert; double projection_yaw; + /** A line is stored as 4 integers in this order: x1, y1, x2, y2 */ + std::vector control_line_values; + /** 0 is vertical, 1 is horizontal, undefined otherwise. */ + std::vector control_line_types; PerspectiveParams(); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index bbfb7cc4e..53c514916 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -353,6 +353,7 @@ void ParamsEdited::set(bool v) perspective.projection_shift_horiz = v; perspective.projection_shift_vert = v; perspective.projection_yaw = v; + perspective.control_lines = v; gradient.enabled = v; gradient.degree = v; gradient.feather = v; @@ -1006,6 +1007,7 @@ void ParamsEdited::initFrom(const std::vector& perspective.projection_shift_horiz = perspective.projection_shift_horiz && p.perspective.projection_shift_horiz == other.perspective.projection_shift_horiz; perspective.projection_shift_vert = perspective.projection_shift_vert && p.perspective.projection_shift_vert == other.perspective.projection_shift_vert; perspective.projection_yaw = perspective.projection_yaw && p.perspective.projection_yaw == other.perspective.projection_yaw; + perspective.control_lines = perspective.control_lines && p.perspective.control_line_values == other.perspective.control_line_values && p.perspective.control_line_types == other.perspective.control_line_types; gradient.enabled = gradient.enabled && p.gradient.enabled == other.gradient.enabled; gradient.degree = gradient.degree && p.gradient.degree == other.gradient.degree; gradient.feather = gradient.feather && p.gradient.feather == other.gradient.feather; @@ -2986,6 +2988,11 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.perspective.projection_yaw = dontforceSet && options.baBehav[ADDSET_PERSP_PROJ_ANGLE] ? toEdit.perspective.projection_yaw + mods.perspective.projection_yaw : mods.perspective.projection_yaw; } + if (perspective.control_lines) { + toEdit.perspective.control_line_values = mods.perspective.control_line_values; + toEdit.perspective.control_line_types = mods.perspective.control_line_types; + } + if (gradient.enabled) { toEdit.gradient.enabled = mods.gradient.enabled; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 1bd2e045e..1c309e994 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -879,6 +879,7 @@ struct PerspectiveParamsEdited { bool projection_shift_horiz; bool projection_shift_vert; bool projection_yaw; + bool control_lines; }; struct GradientParamsEdited { diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 68e43278f..e652c21f2 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -27,6 +27,63 @@ using namespace rtengine; using namespace rtengine::procparams; +namespace +{ + +void controlLinesToValues(const std::vector& lines, + std::vector& values, std::vector& types) +{ + values.clear(); + types.clear(); + + for (auto&& line : lines) { + values.push_back(line.x1); + values.push_back(line.y1); + values.push_back(line.x2); + values.push_back(line.y2); + + int type = -1; + switch (line.type) { + case rtengine::ControlLine::VERTICAL: + type = 0; + break; + case rtengine::ControlLine::HORIZONTAL: + type = 1; + break; + } + types.push_back(type); + } +} + +std::vector valuesToControlLines( + const std::vector& values, const std::vector& types) +{ + int line_count = min(values.size() / 4, types.size()); + std::vector lines(line_count); + + auto values_iter = values.begin(); + auto types_iter = types.begin(); + for (auto&& line : lines) { + line.x1 = *(values_iter++); + line.y1 = *(values_iter++); + line.x2 = *(values_iter++); + line.y2 = *(values_iter++); + + switch (*(types_iter++)) { + case 0: + line.type = rtengine::ControlLine::VERTICAL; + break; + case 1: + line.type = rtengine::ControlLine::HORIZONTAL; + break; + } + } + + return lines; +} + +} + PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M("TP_PERSPECTIVE_LABEL")) { @@ -48,6 +105,7 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" EvPerspProjRotateVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_PROJ_ROTATE"); EvPerspProjShiftVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_PROJ_SHIFT"); setCamBasedEventsActive(); + EvPerspControlLines = mapper->newEvent(M_VOID); lens_geom_listener = nullptr; metadata = nullptr; @@ -262,6 +320,7 @@ void PerspCorrection::read (const ProcParams* pp, const ParamsEdited* pedited) projection_shift_horiz->setEditedState (pedited->perspective.projection_shift_horiz ? Edited : UnEdited); projection_shift_vert->setEditedState (pedited->perspective.projection_shift_vert ? Edited : UnEdited); projection_yaw->setEditedState (pedited->perspective.projection_yaw ? Edited : UnEdited); + lines->setEdited (pedited->perspective.control_lines); } horiz->setValue (pp->perspective.horizontal); @@ -277,6 +336,8 @@ void PerspCorrection::read (const ProcParams* pp, const ParamsEdited* pedited) projection_shift_horiz->setValue (pp->perspective.projection_shift_horiz); projection_shift_vert->setValue (pp->perspective.projection_shift_vert); projection_yaw->setValue (pp->perspective.projection_yaw); + lines->setLines(valuesToControlLines(pp->perspective.control_line_values, + pp->perspective.control_line_types)); if (pedited && !pedited->perspective.method) { method->set_active (2); @@ -309,6 +370,11 @@ void PerspCorrection::write (ProcParams* pp, ParamsEdited* pedited) pp->perspective.projection_shift_vert = projection_shift_vert->getValue (); pp->perspective.projection_yaw = projection_yaw->getValue (); + std::vector control_lines; + lines->toControlLines(control_lines); + controlLinesToValues(control_lines, pp->perspective.control_line_values, + pp->perspective.control_line_types); + if (method->get_active_row_number() == 0) { pp->perspective.method = "simple"; } else if (method->get_active_row_number() == 1) { @@ -331,6 +397,7 @@ void PerspCorrection::write (ProcParams* pp, ParamsEdited* pedited) pedited->perspective.projection_shift_horiz = projection_shift_horiz->getEditedState(); pedited->perspective.projection_shift_vert = projection_shift_vert->getEditedState(); pedited->perspective.projection_yaw = projection_yaw->getEditedState(); + pedited->perspective.control_lines = lines->getEdited(); } } @@ -650,6 +717,13 @@ void PerspCorrection::setEditProvider(EditDataProvider* provider) lines->setEditProvider(provider); } +void PerspCorrection::lineChanged(void) +{ + if (listener) { + listener->panelChanged(EvPerspControlLines, ""); + } +} + void PerspCorrection::linesApplyButtonPressed(void) { if (method->get_active_row_number() == 1) { @@ -714,6 +788,7 @@ ControlLineManager::ControlLineManager(): cursor(CSCrosshair), draw_mode(false), drawing_line(false), + edited(false), prev_obj(-1), selected_object(-1) { @@ -790,6 +865,8 @@ bool ControlLineManager::button1Released(void) if (selected_object > 0) { mouseOverGeometry[selected_object]->state = Geometry::NORMAL; } + edited = true; + callbacks->lineChanged(); drawing_line = false; selected_object = -1; return false; @@ -837,6 +914,9 @@ bool ControlLineManager::pick1(bool picked) visibleGeometry[object_id - 1] = line.icon.get(); + edited = true; + callbacks->lineChanged(); + return true; } @@ -920,6 +1000,11 @@ bool ControlLineManager::drag1(int modifierKey) return false; } +bool ControlLineManager::getEdited(void) const +{ + return edited; +} + CursorShape ControlLineManager::getCursor(int objectID) const { return cursor; @@ -966,12 +1051,27 @@ void ControlLineManager::switchOffEditMode(void) } } +void ControlLineManager::setEdited(bool edited) +{ + this->edited = edited; +} + void ControlLineManager::setEditProvider(EditDataProvider* provider) { EditSubscriber::setEditProvider(provider); } -void ControlLineManager::addLine(Coord begin, Coord end) +void ControlLineManager::setLines(const std::vector& lines) +{ + removeAll(); + for (auto&& line : lines) { + Coord start(line.x1, line.y1); + Coord end(line.x2, line.y2); + addLine(start, end, line.type); + } +} + +void ControlLineManager::addLine(Coord begin, Coord end, rtengine::ControlLine::Type type) { constexpr int line_width = 2; constexpr int handle_radius = 6; @@ -1005,16 +1105,20 @@ void ControlLineManager::addLine(Coord begin, Coord end) end_c->datum = Geometry::IMAGE; end_c->filled = true; end_c->radius = handle_radius; - end_c->center = begin; + end_c->center = end; std::unique_ptr<::ControlLine> control_line(new ::ControlLine()); control_line->begin = std::move(begin_c); control_line->end = std::move(end_c); control_line->icon_h = icon_h; control_line->icon_v = icon_v; - control_line->icon = icon_v; + if (type == rtengine::ControlLine::HORIZONTAL) { + control_line->icon = icon_h; + } else { + control_line->icon = icon_v; + } control_line->line = std::move(line); - control_line->type = rtengine::ControlLine::VERTICAL; + control_line->type = type; EditSubscriber::visibleGeometry.push_back(control_line->line.get()); EditSubscriber::visibleGeometry.push_back(control_line->icon.get()); @@ -1069,6 +1173,8 @@ void ControlLineManager::removeAll(void) control_lines.clear(); prev_obj = -1; selected_object = -1; + edited = true; + callbacks->lineChanged(); } void ControlLineManager::removeLine(size_t line_id) @@ -1082,6 +1188,9 @@ void ControlLineManager::removeLine(size_t line_id) mouseOverGeometry.erase(mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + 1, mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + ::ControlLine::OBJ_COUNT + 1); control_lines.erase(control_lines.begin() + line_id); + + edited = true; + callbacks->lineChanged(); } void ControlLineManager::toControlLines(std::vector& converted) const @@ -1103,6 +1212,13 @@ LinesCallbacks::LinesCallbacks(PerspCorrection* tool): { } +void LinesCallbacks::lineChanged(void) +{ + if (tool) { + tool->lineChanged(); + } +} + void LinesCallbacks::switchOffEditMode(void) { if (tool) { diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 3538af279..c58a9420e 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -48,12 +48,14 @@ protected: CursorShape cursor; bool draw_mode; bool drawing_line; + bool edited; Cairo::RefPtr line_icon_h, line_icon_v; Cairo::RefPtr line_icon_h_prelight, line_icon_v_prelight; int prev_obj; int selected_object; - void addLine (rtengine::Coord begin, rtengine::Coord end); + void addLine (rtengine::Coord begin, rtengine::Coord end, + rtengine::ControlLine::Type type = rtengine::ControlLine::VERTICAL); /** * Set the line type of the line containing the object according to the * line's angle. @@ -69,6 +71,8 @@ public: { public: virtual ~Callbacks() {}; + /** Called when a line changed (added, removed, moved, etc.). */ + virtual void lineChanged (void) {}; /** Called when the EditSubscriber's switchOffEditMode is called. */ virtual void switchOffEditMode (void) {}; }; @@ -78,12 +82,15 @@ public: ControlLineManager(); + bool getEdited (void) const; void removeAll (void); /** Sets whether or not the lines are visible and interact-able. */ void setActive (bool active); /** Set whether or not lines can be drawn and deleted. */ void setDrawMode (bool draw); + void setEdited (bool edited); void setEditProvider (EditDataProvider* provider); + void setLines (const std::vector& lines); /** Returns the number of lines. */ size_t size (void) const; /** @@ -138,6 +145,7 @@ protected: rtengine::ProcEvent EvPerspCamFocalLength; rtengine::ProcEvent EvPerspCamShift; rtengine::ProcEvent EvPerspCamAngle; + rtengine::ProcEvent EvPerspControlLines; rtengine::ProcEvent EvPerspMethod; rtengine::ProcEvent EvPerspProjShift; rtengine::ProcEvent EvPerspProjRotate; @@ -173,6 +181,7 @@ public: void adjusterChanged (Adjuster* a, double newval) override; void autoCorrectionPressed (Gtk::Button* b); + void lineChanged (void); void linesApplyButtonPressed (void); void linesEditButtonPressed (void); void linesEraseButtonPressed (void); @@ -195,5 +204,6 @@ protected: public: explicit LinesCallbacks(PerspCorrection* tool); + void lineChanged (void) override; void switchOffEditMode (void) override; }; From 4f8aa2db2b726779228af5f8d1a7e4973a9f2cdd Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sat, 11 Jul 2020 13:34:05 -0700 Subject: [PATCH 024/185] Add perspective control lines to history Allows undoing and redoing of changes to the control lines. --- rtdata/languages/default | 1 + rtgui/perspective.cc | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index f89c13cb5..9fd301eba 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1216,6 +1216,7 @@ HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines HISTORY_MSG_PERSP_METHOD;Perspective - Method HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index e652c21f2..a113a13f9 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -105,7 +105,7 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" EvPerspProjRotateVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_PROJ_ROTATE"); EvPerspProjShiftVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_PROJ_SHIFT"); setCamBasedEventsActive(); - EvPerspControlLines = mapper->newEvent(M_VOID); + EvPerspControlLines = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_CTRL_LINE"); lens_geom_listener = nullptr; metadata = nullptr; @@ -720,7 +720,7 @@ void PerspCorrection::setEditProvider(EditDataProvider* provider) void PerspCorrection::lineChanged(void) { if (listener) { - listener->panelChanged(EvPerspControlLines, ""); + listener->panelChanged(EvPerspControlLines, M("HISTORY_CHANGED")); } } From cef97eefeab9864274a92862dbea568b2079eb8e Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sun, 12 Jul 2020 11:36:14 -0700 Subject: [PATCH 025/185] Simplify tooltip for perspective control lines Only show how to draw new lines and delete a single line. Move the tooltip activation area to the label. --- rtdata/languages/default | 2 +- rtgui/perspective.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 9fd301eba..399d8f041 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2880,7 +2880,7 @@ TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift TP_PERSPECTIVE_CAMERA_YAW;Horizontal TP_PERSPECTIVE_CONTROL_LINES;Control lines -TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Correct perspective distortion by drawing control lines.\n\nTo draw a line, activate either the vertical or horizontal drawing button. Hold down the control key and click-and-drag to draw a line. At least two vertical lines are required for vertical perspective correction. The same is true for horizontal correction. Click the tick mark button to apply perspective correction. +TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspective TP_PERSPECTIVE_METHOD;Method diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index a113a13f9..a8a1f73d3 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -204,8 +204,8 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" lines->callbacks = std::make_shared(this); Gtk::HBox* control_lines_box = Gtk::manage (new Gtk::HBox()); - control_lines_box->set_tooltip_text( M("TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP") ); Gtk::Label* control_lines_label = Gtk::manage (new Gtk::Label (M("TP_PERSPECTIVE_CONTROL_LINES") + ": ")); + control_lines_label->set_tooltip_markup( M("TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP") ); control_lines_box->pack_start(*control_lines_label, Gtk::PACK_SHRINK); control_lines_box->pack_start(*lines_button_edit); control_lines_box->pack_start(*lines_button_apply); From 06caf40598a55aeafeffd1cb4bf3b8cb97e6f0fb Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sun, 12 Jul 2020 15:19:10 -0700 Subject: [PATCH 026/185] Move control lines code to new files --- rtengine/perspectivecorrection.h | 14 +- rtgui/CMakeLists.txt | 1 + rtgui/controllines.cc | 457 +++++++++++++++++++++++++++++++ rtgui/controllines.h | 116 ++++++++ rtgui/perspective.cc | 425 ---------------------------- rtgui/perspective.h | 87 +----- 6 files changed, 586 insertions(+), 514 deletions(-) create mode 100644 rtgui/controllines.cc create mode 100644 rtgui/controllines.h diff --git a/rtengine/perspectivecorrection.h b/rtengine/perspectivecorrection.h index c46c34147..f092f2c8c 100644 --- a/rtengine/perspectivecorrection.h +++ b/rtengine/perspectivecorrection.h @@ -20,12 +20,20 @@ #pragma once -#include "coord2d.h" -#include "procparams.h" -#include "imagesource.h" +#include namespace rtengine { +namespace procparams +{ + +class ProcParams; + +} + +class ImageSource; +class FramesMetaData; + class ControlLine { public: diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index cfadb7928..514204baf 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -34,6 +34,7 @@ set(NONCLISOURCEFILES colorappearance.cc coloredbar.cc colortoning.cc + controllines.cc controlspotpanel.cc coordinateadjuster.cc crop.cc diff --git a/rtgui/controllines.cc b/rtgui/controllines.cc new file mode 100644 index 000000000..8d39c9d59 --- /dev/null +++ b/rtgui/controllines.cc @@ -0,0 +1,457 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2020 Lawrence Lee + * + * RawTherapee 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. + * + * RawTherapee 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 RawTherapee. If not, see . + */ +#include + +#include "controllines.h" +#include "editcallbacks.h" +#include "editwidgets.h" +#include "rtsurface.h" + +#include "../rtengine/perspectivecorrection.h" + +using namespace rtengine; + +::ControlLine::~ControlLine() = default; + +ControlLineManager::ControlLineManager(): + EditSubscriber(ET_OBJECTS), + canvas_area(new Rectangle()), + cursor(CSCrosshair), + draw_mode(false), + drawing_line(false), + edited(false), + prev_obj(-1), + selected_object(-1) +{ + canvas_area->filled = true; + canvas_area->topLeft = Coord(0, 0); + mouseOverGeometry.push_back(canvas_area.get()); + + line_icon_h = Cairo::RefPtr(new RTSurface("bidirectional-arrow-horizontal-hicontrast.png")); + line_icon_v = Cairo::RefPtr(new RTSurface("bidirectional-arrow-vertical-hicontrast.png")); + line_icon_h_prelight = Cairo::RefPtr(new RTSurface("bidirectional-arrow-horizontal-prelight.png")); + line_icon_v_prelight = Cairo::RefPtr(new RTSurface("bidirectional-arrow-vertical-prelight.png")); +} + +ControlLineManager::~ControlLineManager() = default; + +void ControlLineManager::setActive(bool active) +{ + EditDataProvider* provider = getEditProvider(); + + if (!provider || (this == provider->getCurrSubscriber()) == active) { + return; + } + + if (active) { + subscribe(); + + int ih, iw; + provider->getImageSize(iw, ih); + canvas_area->bottomRight = Coord(iw, ih); + } else { + unsubscribe(); + } +} + +void ControlLineManager::setDrawMode(bool draw) +{ + draw_mode = draw; +} + +size_t ControlLineManager::size(void) const +{ + return control_lines.size(); +} + +bool ControlLineManager::button1Pressed(int modifierKey) +{ + EditDataProvider* dataProvider = getEditProvider(); + + if (!dataProvider) { + return false; + } + + drag_delta = Coord(0, 0); + + const int object = dataProvider->getObject(); + if (object > 0) { // A control line. + if (object % ::ControlLine::OBJ_COUNT == 2) { // Icon. + action = Action::PICKING; + } else { + selected_object = object; + action = Action::DRAGGING; + } + } else if (draw_mode && (modifierKey & GDK_CONTROL_MASK)) { // Add new line. + addLine(dataProvider->posImage, dataProvider->posImage); + drawing_line = true; + selected_object = mouseOverGeometry.size() - 1; // Select endpoint. + action = Action::DRAGGING; + } + + return true; +} + +bool ControlLineManager::button1Released(void) +{ + action = Action::NONE; + if (selected_object > 0) { + mouseOverGeometry[selected_object]->state = Geometry::NORMAL; + } + edited = true; + callbacks->lineChanged(); + drawing_line = false; + selected_object = -1; + return false; +} + +bool ControlLineManager::button3Pressed(int modifierKey) +{ + EditDataProvider* provider = getEditProvider(); + + action = Action::NONE; + + if (!provider || provider->getObject() < 1) { + return false; + } + + action = Action::PICKING; + return false; +} + +bool ControlLineManager::pick1(bool picked) +{ + action = Action::NONE; + + if (!picked) { + return false; + } + + EditDataProvider* provider = getEditProvider(); + + if (!provider || provider->getObject() % ::ControlLine::OBJ_COUNT != 2) { + return false; + } + + // Change line type. + int object_id = provider->getObject(); + ::ControlLine& line = *control_lines[(object_id - 1) / ::ControlLine::OBJ_COUNT]; + + if (line.type == rtengine::ControlLine::HORIZONTAL) { + line.icon = line.icon_v; + line.type = rtengine::ControlLine::VERTICAL; + } else if (line.type == rtengine::ControlLine::VERTICAL) { + line.icon = line.icon_h; + line.type = rtengine::ControlLine::HORIZONTAL; + } + + visibleGeometry[object_id - 1] = line.icon.get(); + + edited = true; + callbacks->lineChanged(); + + return true; +} + +bool ControlLineManager::pick3(bool picked) +{ + action = Action::NONE; + + if (!picked) { + return false; + } + + EditDataProvider* provider = getEditProvider(); + + if (!provider) { + return false; + } + + removeLine((provider->getObject() - 1) / ::ControlLine::OBJ_COUNT); + prev_obj = -1; + selected_object = -1; + return false; +} + +bool ControlLineManager::drag1(int modifierKey) +{ + EditDataProvider* provider = getEditProvider(); + + if (!provider || selected_object < 1) { + return false; + } + + ::ControlLine& control_line = *control_lines[(selected_object - 1) / ::ControlLine::OBJ_COUNT]; + int component = selected_object % ::ControlLine::OBJ_COUNT; // 0 == end, 1 == line, 2 == icon, 3 == begin + Coord mouse = provider->posImage + provider->deltaImage; + Coord delta = provider->deltaImage - drag_delta; + int ih, iw; + provider->getImageSize(iw, ih); + + switch (component) { + case (0): // end + control_line.end->center = mouse; + control_line.end->center.clip(iw, ih); + control_line.line->end = control_line.end->center; + control_line.end->state = Geometry::DRAGGED; + break; + case (1): { // line + // Constrain delta so the end stays above the image. + Coord new_delta = control_line.end->center + delta; + new_delta.clip(iw, ih); + new_delta -= control_line.end->center; + // Constrain delta so the beginning stays above the image. + new_delta += control_line.begin->center; + new_delta.clip(iw, ih); + new_delta -= control_line.begin->center; + // Move all objects in the control line. + control_line.end->center += new_delta; + control_line.begin->center += new_delta; + control_line.line->end = control_line.end->center; + control_line.line->begin = control_line.begin->center; + drag_delta += new_delta; + control_line.line->state = Geometry::DRAGGED; + break; + } + case (3): // begin + control_line.begin->center = mouse; + control_line.begin->center.clip(iw, ih); + control_line.line->begin = control_line.begin->center; + control_line.begin->state = Geometry::DRAGGED; + break; + } + + control_line.icon_h->position.x = (control_line.begin->center.x + control_line.end->center.x) / 2; + control_line.icon_h->position.y = (control_line.begin->center.y + control_line.end->center.y) / 2; + control_line.icon_v->position.x = control_line.icon_h->position.x; + control_line.icon_v->position.y = control_line.icon_h->position.y; + + if (drawing_line) { + autoSetLineType(selected_object); + } + + return false; +} + +bool ControlLineManager::getEdited(void) const +{ + return edited; +} + +CursorShape ControlLineManager::getCursor(int objectID) const +{ + return cursor; +} + +bool ControlLineManager::mouseOver(int modifierKey) +{ + EditDataProvider* provider = getEditProvider(); + + if (!provider) { + return false; + } + + int cur_obj = provider->getObject(); + + if (cur_obj == 0) { // Canvas + if (draw_mode && modifierKey & GDK_CONTROL_MASK) { + cursor = CSPlus; + } else { + cursor = CSCrosshair; + } + } else if (cur_obj < 0) { // Nothing + cursor = CSArrow; + } else if (cur_obj % ::ControlLine::OBJ_COUNT == 2) { // Icon + visibleGeometry[cur_obj - 1]->state = Geometry::PRELIGHT; + cursor = CSArrow; + } else { // Object + visibleGeometry[cur_obj - 1]->state = Geometry::PRELIGHT; + cursor = CSMove2D; + } + + if (prev_obj != cur_obj && prev_obj > 0) { + visibleGeometry[prev_obj - 1]->state = Geometry::NORMAL; + } + prev_obj = cur_obj; + + return true; +} + +void ControlLineManager::switchOffEditMode(void) +{ + if (callbacks) { + callbacks->switchOffEditMode(); + } +} + +void ControlLineManager::setEdited(bool edited) +{ + this->edited = edited; +} + +void ControlLineManager::setEditProvider(EditDataProvider* provider) +{ + EditSubscriber::setEditProvider(provider); +} + +void ControlLineManager::setLines(const std::vector& lines) +{ + removeAll(); + for (auto&& line : lines) { + Coord start(line.x1, line.y1); + Coord end(line.x2, line.y2); + addLine(start, end, line.type); + } +} + +void ControlLineManager::addLine(Coord begin, Coord end, rtengine::ControlLine::Type type) +{ + constexpr int line_width = 2; + constexpr int handle_radius = 6; + std::unique_ptr line; + std::shared_ptr icon_h, icon_v; + std::unique_ptr begin_c, end_c; + + line = std::unique_ptr(new Line()); + line->datum = Geometry::IMAGE; + line->innerLineWidth = line_width; + line->begin = begin; + line->end = end; + + const Cairo::RefPtr null_surface = Cairo::RefPtr(nullptr); + + icon_h = std::make_shared(line_icon_h, null_surface, line_icon_h_prelight, + null_surface, null_surface, Geometry::DP_CENTERCENTER); + icon_h->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2); + + icon_v = std::make_shared(line_icon_v, null_surface, line_icon_v_prelight, + null_surface, null_surface, Geometry::DP_CENTERCENTER); + icon_v->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2); + + begin_c = std::unique_ptr(new Circle()); + begin_c->datum = Geometry::IMAGE; + begin_c->filled = true; + begin_c->radius = handle_radius; + begin_c->center = begin; + + end_c = std::unique_ptr(new Circle()); + end_c->datum = Geometry::IMAGE; + end_c->filled = true; + end_c->radius = handle_radius; + end_c->center = end; + + std::unique_ptr<::ControlLine> control_line(new ::ControlLine()); + control_line->begin = std::move(begin_c); + control_line->end = std::move(end_c); + control_line->icon_h = icon_h; + control_line->icon_v = icon_v; + if (type == rtengine::ControlLine::HORIZONTAL) { + control_line->icon = icon_h; + } else { + control_line->icon = icon_v; + } + control_line->line = std::move(line); + control_line->type = type; + + EditSubscriber::visibleGeometry.push_back(control_line->line.get()); + EditSubscriber::visibleGeometry.push_back(control_line->icon.get()); + EditSubscriber::visibleGeometry.push_back(control_line->begin.get()); + EditSubscriber::visibleGeometry.push_back(control_line->end.get()); + + EditSubscriber::mouseOverGeometry.push_back(control_line->line.get()); + EditSubscriber::mouseOverGeometry.push_back(control_line->icon.get()); + EditSubscriber::mouseOverGeometry.push_back(control_line->begin.get()); + EditSubscriber::mouseOverGeometry.push_back(control_line->end.get()); + + control_lines.push_back(std::move(control_line)); +} + +void ControlLineManager::autoSetLineType(int object_id) +{ + int line_id = (object_id - 1) / ::ControlLine::OBJ_COUNT; + ::ControlLine& line = *control_lines[line_id]; + + int dx = line.begin->center.x - line.end->center.x; + int dy = line.begin->center.y - line.end->center.y; + + if (dx < 0) { + dx = -dx; + } + if (dy < 0) { + dy = -dy; + } + + rtengine::ControlLine::Type type; + std::shared_ptr icon; + + if (dx > dy) { // More horizontal than vertical. + type = rtengine::ControlLine::HORIZONTAL; + icon = line.icon_h; + } else { + type = rtengine::ControlLine::VERTICAL; + icon = line.icon_v; + } + + if (type != line.type) { // Need to update line type. + line.type = type; + line.icon = icon; + visibleGeometry[line_id * ::ControlLine::OBJ_COUNT + 1] = line.icon.get(); + } +} + +void ControlLineManager::removeAll(void) +{ + visibleGeometry.clear(); + mouseOverGeometry.erase(mouseOverGeometry.begin() + 1, mouseOverGeometry.end()); + control_lines.clear(); + prev_obj = -1; + selected_object = -1; + edited = true; + callbacks->lineChanged(); +} + +void ControlLineManager::removeLine(size_t line_id) +{ + if (line_id >= control_lines.size()) { + return; + } + + visibleGeometry.erase(visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id, + visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + ::ControlLine::OBJ_COUNT); + mouseOverGeometry.erase(mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + 1, + mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + ::ControlLine::OBJ_COUNT + 1); + control_lines.erase(control_lines.begin() + line_id); + + edited = true; + callbacks->lineChanged(); +} + +void ControlLineManager::toControlLines(std::vector& converted) const +{ + converted.clear(); + converted.resize(control_lines.size()); + + for (unsigned int i = 0; i < control_lines.size(); i++) { + converted[i].x1 = control_lines[i]->begin->center.x; + converted[i].y1 = control_lines[i]->begin->center.y; + converted[i].x2 = control_lines[i]->end->center.x; + converted[i].y2 = control_lines[i]->end->center.y; + converted[i].type = control_lines[i]->type; + } +} diff --git a/rtgui/controllines.h b/rtgui/controllines.h new file mode 100644 index 000000000..3743ad5b0 --- /dev/null +++ b/rtgui/controllines.h @@ -0,0 +1,116 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2020 Lawrence Lee + * + * RawTherapee 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. + * + * RawTherapee 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 RawTherapee. If not, see . + */ +#pragma once + +#include + +#include "editcallbacks.h" +#include "../rtengine/perspectivecorrection.h" + +class Circle; +class Line; +class OPIcon; +class Rectangle; +class RTSurface; + +struct ControlLine +{ + static constexpr int OBJ_COUNT = 4; + std::unique_ptr line; + std::shared_ptr icon; + std::shared_ptr icon_h, icon_v; + std::unique_ptr begin, end; + rtengine::ControlLine::Type type; + + ~ControlLine(); +}; + +class ControlLineManager: EditSubscriber +{ + +protected: + /** Hidden object for capturing mouse events. */ + std::unique_ptr canvas_area; + rtengine::Coord drag_delta; + std::vector> control_lines; + CursorShape cursor; + bool draw_mode; + bool drawing_line; + bool edited; + Cairo::RefPtr line_icon_h, line_icon_v; + Cairo::RefPtr line_icon_h_prelight, line_icon_v_prelight; + int prev_obj; + int selected_object; + + void addLine (rtengine::Coord begin, rtengine::Coord end, + rtengine::ControlLine::Type type = rtengine::ControlLine::VERTICAL); + /** + * Set the line type of the line containing the object according to the + * line's angle. + * + * If the line is within 45 degrees of a perfectly vertical + * line, inclusive, the line type is set to vertical. Otherwise, horizontal. + */ + void autoSetLineType(int object_id); + void removeLine (size_t line_id); + +public: + class Callbacks + { + public: + virtual ~Callbacks() {}; + /** Called when a line changed (added, removed, moved, etc.). */ + virtual void lineChanged (void) {}; + /** Called when the EditSubscriber's switchOffEditMode is called. */ + virtual void switchOffEditMode (void) {}; + }; + + /** Callbacks to invoke. */ + std::shared_ptr callbacks; + + ControlLineManager(); + ~ControlLineManager(); + + bool getEdited (void) const; + void removeAll (void); + /** Sets whether or not the lines are visible and interact-able. */ + void setActive (bool active); + /** Set whether or not lines can be drawn and deleted. */ + void setDrawMode (bool draw); + void setEdited (bool edited); + void setEditProvider (EditDataProvider* provider); + void setLines (const std::vector& lines); + /** Returns the number of lines. */ + size_t size (void) const; + /** + * Allocates a new array and populates it with copies of the control lines. + */ + void toControlLines (std::vector& converted) const; + + // EditSubscriber overrides + bool button1Pressed (int modifierKey) override; + bool button1Released (void) override; + bool button3Pressed (int modifierKey) override; + bool pick1 (bool picked) override; + bool pick3 (bool picked) override; + bool drag1 (int modifierKey) override; + CursorShape getCursor (int objectID) const override; + bool mouseOver (int modifierKey) override; + void switchOffEditMode (void) override; +}; diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index a8a1f73d3..ec86da161 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -782,431 +782,6 @@ void PerspCorrection::setCamBasedEventsActive(bool active) } } -ControlLineManager::ControlLineManager(): - EditSubscriber(ET_OBJECTS), - canvas_area(new Rectangle()), - cursor(CSCrosshair), - draw_mode(false), - drawing_line(false), - edited(false), - prev_obj(-1), - selected_object(-1) -{ - canvas_area->filled = true; - canvas_area->topLeft = Coord(0, 0); - mouseOverGeometry.push_back(canvas_area.get()); - - line_icon_h = Cairo::RefPtr(new RTSurface("bidirectional-arrow-horizontal-hicontrast.png")); - line_icon_v = Cairo::RefPtr(new RTSurface("bidirectional-arrow-vertical-hicontrast.png")); - line_icon_h_prelight = Cairo::RefPtr(new RTSurface("bidirectional-arrow-horizontal-prelight.png")); - line_icon_v_prelight = Cairo::RefPtr(new RTSurface("bidirectional-arrow-vertical-prelight.png")); -} - -void ControlLineManager::setActive(bool active) -{ - EditDataProvider* provider = getEditProvider(); - - if (!provider || (this == provider->getCurrSubscriber()) == active) { - return; - } - - if (active) { - subscribe(); - - int ih, iw; - provider->getImageSize(iw, ih); - canvas_area->bottomRight = Coord(iw, ih); - } else { - unsubscribe(); - } -} - -void ControlLineManager::setDrawMode(bool draw) -{ - draw_mode = draw; -} - -size_t ControlLineManager::size(void) const -{ - return control_lines.size(); -} - -bool ControlLineManager::button1Pressed(int modifierKey) -{ - EditDataProvider* dataProvider = getEditProvider(); - - if (!dataProvider) { - return false; - } - - drag_delta = Coord(0, 0); - - const int object = dataProvider->getObject(); - if (object > 0) { // A control line. - if (object % ::ControlLine::OBJ_COUNT == 2) { // Icon. - action = Action::PICKING; - } else { - selected_object = object; - action = Action::DRAGGING; - } - } else if (draw_mode && (modifierKey & GDK_CONTROL_MASK)) { // Add new line. - addLine(dataProvider->posImage, dataProvider->posImage); - drawing_line = true; - selected_object = mouseOverGeometry.size() - 1; // Select endpoint. - action = Action::DRAGGING; - } - - return true; -} - -bool ControlLineManager::button1Released(void) -{ - action = Action::NONE; - if (selected_object > 0) { - mouseOverGeometry[selected_object]->state = Geometry::NORMAL; - } - edited = true; - callbacks->lineChanged(); - drawing_line = false; - selected_object = -1; - return false; -} - -bool ControlLineManager::button3Pressed(int modifierKey) -{ - EditDataProvider* provider = getEditProvider(); - - action = Action::NONE; - - if (!provider || provider->getObject() < 1) { - return false; - } - - action = Action::PICKING; - return false; -} - -bool ControlLineManager::pick1(bool picked) -{ - action = Action::NONE; - - if (!picked) { - return false; - } - - EditDataProvider* provider = getEditProvider(); - - if (!provider || provider->getObject() % ::ControlLine::OBJ_COUNT != 2) { - return false; - } - - // Change line type. - int object_id = provider->getObject(); - ::ControlLine& line = *control_lines[(object_id - 1) / ::ControlLine::OBJ_COUNT]; - - if (line.type == rtengine::ControlLine::HORIZONTAL) { - line.icon = line.icon_v; - line.type = rtengine::ControlLine::VERTICAL; - } else if (line.type == rtengine::ControlLine::VERTICAL) { - line.icon = line.icon_h; - line.type = rtengine::ControlLine::HORIZONTAL; - } - - visibleGeometry[object_id - 1] = line.icon.get(); - - edited = true; - callbacks->lineChanged(); - - return true; -} - -bool ControlLineManager::pick3(bool picked) -{ - action = Action::NONE; - - if (!picked) { - return false; - } - - EditDataProvider* provider = getEditProvider(); - - if (!provider) { - return false; - } - - removeLine((provider->getObject() - 1) / ::ControlLine::OBJ_COUNT); - prev_obj = -1; - selected_object = -1; - return false; -} - -bool ControlLineManager::drag1(int modifierKey) -{ - EditDataProvider* provider = getEditProvider(); - - if (!provider || selected_object < 1) { - return false; - } - - ::ControlLine& control_line = *control_lines[(selected_object - 1) / ::ControlLine::OBJ_COUNT]; - int component = selected_object % ::ControlLine::OBJ_COUNT; // 0 == end, 1 == line, 2 == icon, 3 == begin - Coord mouse = provider->posImage + provider->deltaImage; - Coord delta = provider->deltaImage - drag_delta; - int ih, iw; - provider->getImageSize(iw, ih); - - switch (component) { - case (0): // end - control_line.end->center = mouse; - control_line.end->center.clip(iw, ih); - control_line.line->end = control_line.end->center; - control_line.end->state = Geometry::DRAGGED; - break; - case (1): { // line - // Constrain delta so the end stays above the image. - Coord new_delta = control_line.end->center + delta; - new_delta.clip(iw, ih); - new_delta -= control_line.end->center; - // Constrain delta so the beginning stays above the image. - new_delta += control_line.begin->center; - new_delta.clip(iw, ih); - new_delta -= control_line.begin->center; - // Move all objects in the control line. - control_line.end->center += new_delta; - control_line.begin->center += new_delta; - control_line.line->end = control_line.end->center; - control_line.line->begin = control_line.begin->center; - drag_delta += new_delta; - control_line.line->state = Geometry::DRAGGED; - break; - } - case (3): // begin - control_line.begin->center = mouse; - control_line.begin->center.clip(iw, ih); - control_line.line->begin = control_line.begin->center; - control_line.begin->state = Geometry::DRAGGED; - break; - } - - control_line.icon_h->position.x = (control_line.begin->center.x + control_line.end->center.x) / 2; - control_line.icon_h->position.y = (control_line.begin->center.y + control_line.end->center.y) / 2; - control_line.icon_v->position.x = control_line.icon_h->position.x; - control_line.icon_v->position.y = control_line.icon_h->position.y; - - if (drawing_line) { - autoSetLineType(selected_object); - } - - return false; -} - -bool ControlLineManager::getEdited(void) const -{ - return edited; -} - -CursorShape ControlLineManager::getCursor(int objectID) const -{ - return cursor; -} - -bool ControlLineManager::mouseOver(int modifierKey) -{ - EditDataProvider* provider = getEditProvider(); - - if (!provider) { - return false; - } - - int cur_obj = provider->getObject(); - - if (cur_obj == 0) { // Canvas - if (draw_mode && modifierKey & GDK_CONTROL_MASK) { - cursor = CSPlus; - } else { - cursor = CSCrosshair; - } - } else if (cur_obj < 0) { // Nothing - cursor = CSArrow; - } else if (cur_obj % ::ControlLine::OBJ_COUNT == 2) { // Icon - visibleGeometry[cur_obj - 1]->state = Geometry::PRELIGHT; - cursor = CSArrow; - } else { // Object - visibleGeometry[cur_obj - 1]->state = Geometry::PRELIGHT; - cursor = CSMove2D; - } - - if (prev_obj != cur_obj && prev_obj > 0) { - visibleGeometry[prev_obj - 1]->state = Geometry::NORMAL; - } - prev_obj = cur_obj; - - return true; -} - -void ControlLineManager::switchOffEditMode(void) -{ - if (callbacks) { - callbacks->switchOffEditMode(); - } -} - -void ControlLineManager::setEdited(bool edited) -{ - this->edited = edited; -} - -void ControlLineManager::setEditProvider(EditDataProvider* provider) -{ - EditSubscriber::setEditProvider(provider); -} - -void ControlLineManager::setLines(const std::vector& lines) -{ - removeAll(); - for (auto&& line : lines) { - Coord start(line.x1, line.y1); - Coord end(line.x2, line.y2); - addLine(start, end, line.type); - } -} - -void ControlLineManager::addLine(Coord begin, Coord end, rtengine::ControlLine::Type type) -{ - constexpr int line_width = 2; - constexpr int handle_radius = 6; - std::unique_ptr line; - std::shared_ptr icon_h, icon_v; - std::unique_ptr begin_c, end_c; - - line = std::unique_ptr(new Line()); - line->datum = Geometry::IMAGE; - line->innerLineWidth = line_width; - line->begin = begin; - line->end = end; - - const Cairo::RefPtr null_surface = Cairo::RefPtr(nullptr); - - icon_h = std::make_shared(line_icon_h, null_surface, line_icon_h_prelight, - null_surface, null_surface, Geometry::DP_CENTERCENTER); - icon_h->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2); - - icon_v = std::make_shared(line_icon_v, null_surface, line_icon_v_prelight, - null_surface, null_surface, Geometry::DP_CENTERCENTER); - icon_v->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2); - - begin_c = std::unique_ptr(new Circle()); - begin_c->datum = Geometry::IMAGE; - begin_c->filled = true; - begin_c->radius = handle_radius; - begin_c->center = begin; - - end_c = std::unique_ptr(new Circle()); - end_c->datum = Geometry::IMAGE; - end_c->filled = true; - end_c->radius = handle_radius; - end_c->center = end; - - std::unique_ptr<::ControlLine> control_line(new ::ControlLine()); - control_line->begin = std::move(begin_c); - control_line->end = std::move(end_c); - control_line->icon_h = icon_h; - control_line->icon_v = icon_v; - if (type == rtengine::ControlLine::HORIZONTAL) { - control_line->icon = icon_h; - } else { - control_line->icon = icon_v; - } - control_line->line = std::move(line); - control_line->type = type; - - EditSubscriber::visibleGeometry.push_back(control_line->line.get()); - EditSubscriber::visibleGeometry.push_back(control_line->icon.get()); - EditSubscriber::visibleGeometry.push_back(control_line->begin.get()); - EditSubscriber::visibleGeometry.push_back(control_line->end.get()); - - EditSubscriber::mouseOverGeometry.push_back(control_line->line.get()); - EditSubscriber::mouseOverGeometry.push_back(control_line->icon.get()); - EditSubscriber::mouseOverGeometry.push_back(control_line->begin.get()); - EditSubscriber::mouseOverGeometry.push_back(control_line->end.get()); - - control_lines.push_back(std::move(control_line)); -} - -void ControlLineManager::autoSetLineType(int object_id) -{ - int line_id = (object_id - 1) / ::ControlLine::OBJ_COUNT; - ::ControlLine& line = *control_lines[line_id]; - - int dx = line.begin->center.x - line.end->center.x; - int dy = line.begin->center.y - line.end->center.y; - - if (dx < 0) { - dx = -dx; - } - if (dy < 0) { - dy = -dy; - } - - rtengine::ControlLine::Type type; - std::shared_ptr icon; - - if (dx > dy) { // More horizontal than vertical. - type = rtengine::ControlLine::HORIZONTAL; - icon = line.icon_h; - } else { - type = rtengine::ControlLine::VERTICAL; - icon = line.icon_v; - } - - if (type != line.type) { // Need to update line type. - line.type = type; - line.icon = icon; - visibleGeometry[line_id * ::ControlLine::OBJ_COUNT + 1] = line.icon.get(); - } -} - -void ControlLineManager::removeAll(void) -{ - visibleGeometry.clear(); - mouseOverGeometry.erase(mouseOverGeometry.begin() + 1, mouseOverGeometry.end()); - control_lines.clear(); - prev_obj = -1; - selected_object = -1; - edited = true; - callbacks->lineChanged(); -} - -void ControlLineManager::removeLine(size_t line_id) -{ - if (line_id >= control_lines.size()) { - return; - } - - visibleGeometry.erase(visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id, - visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + ::ControlLine::OBJ_COUNT); - mouseOverGeometry.erase(mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + 1, - mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + ::ControlLine::OBJ_COUNT + 1); - control_lines.erase(control_lines.begin() + line_id); - - edited = true; - callbacks->lineChanged(); -} - -void ControlLineManager::toControlLines(std::vector& converted) const -{ - converted.clear(); - converted.resize(control_lines.size()); - - for (unsigned int i = 0; i < control_lines.size(); i++) { - converted[i].x1 = control_lines[i]->begin->center.x; - converted[i].y1 = control_lines[i]->begin->center.y; - converted[i].x2 = control_lines[i]->end->center.x; - converted[i].y2 = control_lines[i]->end->center.y; - converted[i].type = control_lines[i]->type; - } -} - LinesCallbacks::LinesCallbacks(PerspCorrection* tool): tool(tool) { diff --git a/rtgui/perspective.h b/rtgui/perspective.h index c58a9420e..0694ccb4e 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -21,94 +21,9 @@ #include #include "adjuster.h" -#include "editcallbacks.h" -#include "editwidgets.h" +#include "controllines.h" #include "lensgeomlistener.h" #include "toolpanel.h" -#include "../rtengine/perspectivecorrection.h" - -struct ControlLine -{ - static constexpr int OBJ_COUNT = 4; - std::unique_ptr line; - std::shared_ptr icon; - std::shared_ptr icon_h, icon_v; - std::unique_ptr begin, end; - rtengine::ControlLine::Type type; -}; - -class ControlLineManager: EditSubscriber -{ - -protected: - /** Hidden object for capturing mouse events. */ - std::unique_ptr canvas_area; - rtengine::Coord drag_delta; - std::vector> control_lines; - CursorShape cursor; - bool draw_mode; - bool drawing_line; - bool edited; - Cairo::RefPtr line_icon_h, line_icon_v; - Cairo::RefPtr line_icon_h_prelight, line_icon_v_prelight; - int prev_obj; - int selected_object; - - void addLine (rtengine::Coord begin, rtengine::Coord end, - rtengine::ControlLine::Type type = rtengine::ControlLine::VERTICAL); - /** - * Set the line type of the line containing the object according to the - * line's angle. - * - * If the line is within 45 degrees of a perfectly vertical - * line, inclusive, the line type is set to vertical. Otherwise, horizontal. - */ - void autoSetLineType(int object_id); - void removeLine (size_t line_id); - -public: - class Callbacks - { - public: - virtual ~Callbacks() {}; - /** Called when a line changed (added, removed, moved, etc.). */ - virtual void lineChanged (void) {}; - /** Called when the EditSubscriber's switchOffEditMode is called. */ - virtual void switchOffEditMode (void) {}; - }; - - /** Callbacks to invoke. */ - std::shared_ptr callbacks; - - ControlLineManager(); - - bool getEdited (void) const; - void removeAll (void); - /** Sets whether or not the lines are visible and interact-able. */ - void setActive (bool active); - /** Set whether or not lines can be drawn and deleted. */ - void setDrawMode (bool draw); - void setEdited (bool edited); - void setEditProvider (EditDataProvider* provider); - void setLines (const std::vector& lines); - /** Returns the number of lines. */ - size_t size (void) const; - /** - * Allocates a new array and populates it with copies of the control lines. - */ - void toControlLines (std::vector& converted) const; - - // EditSubscriber overrides - bool button1Pressed (int modifierKey) override; - bool button1Released (void) override; - bool button3Pressed (int modifierKey) override; - bool pick1 (bool picked) override; - bool pick3 (bool picked) override; - bool drag1 (int modifierKey) override; - CursorShape getCursor (int objectID) const override; - bool mouseOver (int modifierKey) override; - void switchOffEditMode (void) override; -}; class PerspCorrection final : public ToolParamBlock, From ef405eeb1dbe7f5d49a41e1b42346d4300fd20a7 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sun, 12 Jul 2020 15:44:58 -0700 Subject: [PATCH 027/185] Apply astyle to rtgui/controllines.* --- rtgui/controllines.cc | 81 +++++++++++++++++++++++++++++++------------ rtgui/controllines.h | 49 +++++++++++++------------- 2 files changed, 82 insertions(+), 48 deletions(-) diff --git a/rtgui/controllines.cc b/rtgui/controllines.cc index 8d39c9d59..2fd446c56 100644 --- a/rtgui/controllines.cc +++ b/rtgui/controllines.cc @@ -43,10 +43,14 @@ ControlLineManager::ControlLineManager(): canvas_area->topLeft = Coord(0, 0); mouseOverGeometry.push_back(canvas_area.get()); - line_icon_h = Cairo::RefPtr(new RTSurface("bidirectional-arrow-horizontal-hicontrast.png")); - line_icon_v = Cairo::RefPtr(new RTSurface("bidirectional-arrow-vertical-hicontrast.png")); - line_icon_h_prelight = Cairo::RefPtr(new RTSurface("bidirectional-arrow-horizontal-prelight.png")); - line_icon_v_prelight = Cairo::RefPtr(new RTSurface("bidirectional-arrow-vertical-prelight.png")); + line_icon_h = Cairo::RefPtr(new RTSurface( + "bidirectional-arrow-horizontal-hicontrast.png")); + line_icon_v = Cairo::RefPtr(new RTSurface( + "bidirectional-arrow-vertical-hicontrast.png")); + line_icon_h_prelight = Cairo::RefPtr(new RTSurface( + "bidirectional-arrow-horizontal-prelight.png")); + line_icon_v_prelight = Cairo::RefPtr(new RTSurface( + "bidirectional-arrow-vertical-prelight.png")); } ControlLineManager::~ControlLineManager() = default; @@ -91,6 +95,7 @@ bool ControlLineManager::button1Pressed(int modifierKey) drag_delta = Coord(0, 0); const int object = dataProvider->getObject(); + if (object > 0) { // A control line. if (object % ::ControlLine::OBJ_COUNT == 2) { // Icon. action = Action::PICKING; @@ -111,9 +116,11 @@ bool ControlLineManager::button1Pressed(int modifierKey) bool ControlLineManager::button1Released(void) { action = Action::NONE; + if (selected_object > 0) { mouseOverGeometry[selected_object]->state = Geometry::NORMAL; } + edited = true; callbacks->lineChanged(); drawing_line = false; @@ -151,7 +158,8 @@ bool ControlLineManager::pick1(bool picked) // Change line type. int object_id = provider->getObject(); - ::ControlLine& line = *control_lines[(object_id - 1) / ::ControlLine::OBJ_COUNT]; + ::ControlLine& line = + *control_lines[(object_id - 1) / ::ControlLine::OBJ_COUNT]; if (line.type == rtengine::ControlLine::HORIZONTAL) { line.icon = line.icon_v; @@ -197,8 +205,10 @@ bool ControlLineManager::drag1(int modifierKey) return false; } - ::ControlLine& control_line = *control_lines[(selected_object - 1) / ::ControlLine::OBJ_COUNT]; - int component = selected_object % ::ControlLine::OBJ_COUNT; // 0 == end, 1 == line, 2 == icon, 3 == begin + ::ControlLine& control_line = + *control_lines[(selected_object - 1) / ::ControlLine::OBJ_COUNT]; + // 0 == end, 1 == line, 2 == icon, 3 == begin + int component = selected_object % ::ControlLine::OBJ_COUNT; Coord mouse = provider->posImage + provider->deltaImage; Coord delta = provider->deltaImage - drag_delta; int ih, iw; @@ -211,6 +221,7 @@ bool ControlLineManager::drag1(int modifierKey) control_line.line->end = control_line.end->center; control_line.end->state = Geometry::DRAGGED; break; + case (1): { // line // Constrain delta so the end stays above the image. Coord new_delta = control_line.end->center + delta; @@ -229,6 +240,7 @@ bool ControlLineManager::drag1(int modifierKey) control_line.line->state = Geometry::DRAGGED; break; } + case (3): // begin control_line.begin->center = mouse; control_line.begin->center.clip(iw, ih); @@ -237,8 +249,10 @@ bool ControlLineManager::drag1(int modifierKey) break; } - control_line.icon_h->position.x = (control_line.begin->center.x + control_line.end->center.x) / 2; - control_line.icon_h->position.y = (control_line.begin->center.y + control_line.end->center.y) / 2; + control_line.icon_h->position.x = (control_line.begin->center.x + + control_line.end->center.x) / 2; + control_line.icon_h->position.y = (control_line.begin->center.y + + control_line.end->center.y) / 2; control_line.icon_v->position.x = control_line.icon_h->position.x; control_line.icon_v->position.y = control_line.icon_h->position.y; @@ -288,6 +302,7 @@ bool ControlLineManager::mouseOver(int modifierKey) if (prev_obj != cur_obj && prev_obj > 0) { visibleGeometry[prev_obj - 1]->state = Geometry::NORMAL; } + prev_obj = cur_obj; return true; @@ -310,9 +325,11 @@ void ControlLineManager::setEditProvider(EditDataProvider* provider) EditSubscriber::setEditProvider(provider); } -void ControlLineManager::setLines(const std::vector& lines) +void ControlLineManager::setLines(const std::vector& + lines) { removeAll(); + for (auto&& line : lines) { Coord start(line.x1, line.y1); Coord end(line.x2, line.y2); @@ -320,7 +337,8 @@ void ControlLineManager::setLines(const std::vector& line } } -void ControlLineManager::addLine(Coord begin, Coord end, rtengine::ControlLine::Type type) +void ControlLineManager::addLine(Coord begin, Coord end, + rtengine::ControlLine::Type type) { constexpr int line_width = 2; constexpr int handle_radius = 6; @@ -334,14 +352,19 @@ void ControlLineManager::addLine(Coord begin, Coord end, rtengine::ControlLine:: line->begin = begin; line->end = end; - const Cairo::RefPtr null_surface = Cairo::RefPtr(nullptr); + const Cairo::RefPtr null_surface = + Cairo::RefPtr(nullptr); - icon_h = std::make_shared(line_icon_h, null_surface, line_icon_h_prelight, - null_surface, null_surface, Geometry::DP_CENTERCENTER); + icon_h = std::make_shared(line_icon_h, null_surface, + line_icon_h_prelight, + null_surface, null_surface, + Geometry::DP_CENTERCENTER); icon_h->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2); - icon_v = std::make_shared(line_icon_v, null_surface, line_icon_v_prelight, - null_surface, null_surface, Geometry::DP_CENTERCENTER); + icon_v = std::make_shared(line_icon_v, null_surface, + line_icon_v_prelight, + null_surface, null_surface, + Geometry::DP_CENTERCENTER); icon_v->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2); begin_c = std::unique_ptr(new Circle()); @@ -361,11 +384,13 @@ void ControlLineManager::addLine(Coord begin, Coord end, rtengine::ControlLine:: control_line->end = std::move(end_c); control_line->icon_h = icon_h; control_line->icon_v = icon_v; + if (type == rtengine::ControlLine::HORIZONTAL) { control_line->icon = icon_h; } else { control_line->icon = icon_v; } + control_line->line = std::move(line); control_line->type = type; @@ -393,6 +418,7 @@ void ControlLineManager::autoSetLineType(int object_id) if (dx < 0) { dx = -dx; } + if (dy < 0) { dy = -dy; } @@ -411,14 +437,16 @@ void ControlLineManager::autoSetLineType(int object_id) if (type != line.type) { // Need to update line type. line.type = type; line.icon = icon; - visibleGeometry[line_id * ::ControlLine::OBJ_COUNT + 1] = line.icon.get(); + visibleGeometry[line_id * ::ControlLine::OBJ_COUNT + 1] = + line.icon.get(); } } void ControlLineManager::removeAll(void) { visibleGeometry.clear(); - mouseOverGeometry.erase(mouseOverGeometry.begin() + 1, mouseOverGeometry.end()); + mouseOverGeometry.erase(mouseOverGeometry.begin() + 1, + mouseOverGeometry.end()); control_lines.clear(); prev_obj = -1; selected_object = -1; @@ -432,17 +460,24 @@ void ControlLineManager::removeLine(size_t line_id) return; } - visibleGeometry.erase(visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id, - visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + ::ControlLine::OBJ_COUNT); - mouseOverGeometry.erase(mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + 1, - mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + ::ControlLine::OBJ_COUNT + 1); + visibleGeometry.erase( + visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id, + visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + + ::ControlLine::OBJ_COUNT + ); + mouseOverGeometry.erase( + mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + 1, + mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + + ::ControlLine::OBJ_COUNT + 1 + ); control_lines.erase(control_lines.begin() + line_id); edited = true; callbacks->lineChanged(); } -void ControlLineManager::toControlLines(std::vector& converted) const +void ControlLineManager::toControlLines(std::vector& + converted) const { converted.clear(); converted.resize(control_lines.size()); diff --git a/rtgui/controllines.h b/rtgui/controllines.h index 3743ad5b0..0ff449092 100644 --- a/rtgui/controllines.h +++ b/rtgui/controllines.h @@ -29,8 +29,7 @@ class OPIcon; class Rectangle; class RTSurface; -struct ControlLine -{ +struct ControlLine { static constexpr int OBJ_COUNT = 4; std::unique_ptr line; std::shared_ptr icon; @@ -58,8 +57,8 @@ protected: int prev_obj; int selected_object; - void addLine (rtengine::Coord begin, rtengine::Coord end, - rtengine::ControlLine::Type type = rtengine::ControlLine::VERTICAL); + void addLine(rtengine::Coord begin, rtengine::Coord end, + rtengine::ControlLine::Type type = rtengine::ControlLine::VERTICAL); /** * Set the line type of the line containing the object according to the * line's angle. @@ -68,7 +67,7 @@ protected: * line, inclusive, the line type is set to vertical. Otherwise, horizontal. */ void autoSetLineType(int object_id); - void removeLine (size_t line_id); + void removeLine(size_t line_id); public: class Callbacks @@ -76,9 +75,9 @@ public: public: virtual ~Callbacks() {}; /** Called when a line changed (added, removed, moved, etc.). */ - virtual void lineChanged (void) {}; + virtual void lineChanged(void) {}; /** Called when the EditSubscriber's switchOffEditMode is called. */ - virtual void switchOffEditMode (void) {}; + virtual void switchOffEditMode(void) {}; }; /** Callbacks to invoke. */ @@ -87,30 +86,30 @@ public: ControlLineManager(); ~ControlLineManager(); - bool getEdited (void) const; - void removeAll (void); + bool getEdited(void) const; + void removeAll(void); /** Sets whether or not the lines are visible and interact-able. */ - void setActive (bool active); + void setActive(bool active); /** Set whether or not lines can be drawn and deleted. */ - void setDrawMode (bool draw); - void setEdited (bool edited); - void setEditProvider (EditDataProvider* provider); - void setLines (const std::vector& lines); + void setDrawMode(bool draw); + void setEdited(bool edited); + void setEditProvider(EditDataProvider* provider); + void setLines(const std::vector& lines); /** Returns the number of lines. */ - size_t size (void) const; + size_t size(void) const; /** * Allocates a new array and populates it with copies of the control lines. */ - void toControlLines (std::vector& converted) const; + void toControlLines(std::vector& converted) const; // EditSubscriber overrides - bool button1Pressed (int modifierKey) override; - bool button1Released (void) override; - bool button3Pressed (int modifierKey) override; - bool pick1 (bool picked) override; - bool pick3 (bool picked) override; - bool drag1 (int modifierKey) override; - CursorShape getCursor (int objectID) const override; - bool mouseOver (int modifierKey) override; - void switchOffEditMode (void) override; + bool button1Pressed(int modifierKey) override; + bool button1Released(void) override; + bool button3Pressed(int modifierKey) override; + bool pick1(bool picked) override; + bool pick3(bool picked) override; + bool drag1(int modifierKey) override; + CursorShape getCursor(int objectID) const override; + bool mouseOver(int modifierKey) override; + void switchOffEditMode(void) override; }; From 95141a943c1a84d9d9a11cd73e568b498dddc63d Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Mon, 20 Jul 2020 15:07:20 -0700 Subject: [PATCH 028/185] Make perspective icons consistent with other icons Ensure a one pixel padding on all sides of the bidirectional arrows and draw icons. --- ...irectional-arrow-horizontal-hicontrast.svg | 124 +++++++++--------- ...idirectional-arrow-horizontal-prelight.svg | 124 +++++++++--------- ...idirectional-arrow-vertical-hicontrast.svg | 124 +++++++++--------- .../bidirectional-arrow-vertical-prelight.svg | 124 +++++++++--------- rtdata/images/svg/draw.svg | 98 +++++++------- 5 files changed, 295 insertions(+), 299 deletions(-) diff --git a/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg b/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg index b41979c6a..f2712cee9 100644 --- a/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg +++ b/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg @@ -7,61 +7,61 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - sodipodi:docname="bidirectional-arrow-horizontal-hicontrast.svg" - inkscape:version="1.0 (4035a4fb49, 2020-05-01)" - inkscape:export-ydpi="96" - inkscape:export-xdpi="96" - inkscape:export-filename="/tmp/template.png" - id="SVGRoot" - version="1.1" - viewBox="0 0 24 24" + width="24px" height="24px" - width="24px"> + viewBox="0 0 24 24" + version="1.1" + id="SVGRoot" + inkscape:export-filename="/tmp/template.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:version="1.0 (4035a4fb49, 2020-05-01)" + sodipodi:docname="bidirectional-arrow-horizontal-hicontrast.svg"> + bordercolor="#666768" + borderopacity="1.0" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:zoom="29.288994" + inkscape:cx="11.864052" + inkscape:cy="11.292624" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:window-width="1920" + inkscape:window-height="1041" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:grid-bbox="true" + inkscape:pagecheckerboard="false" + inkscape:snap-bbox="true" + inkscape:bbox-nodes="true" + inkscape:snap-others="true" + inkscape:object-nodes="true" + inkscape:snap-grids="true" + inkscape:snap-bbox-midpoints="true" + inkscape:document-rotation="0" + inkscape:object-paths="true" + inkscape:snap-nodes="true" + inkscape:snap-smooth-nodes="true" + inkscape:bbox-paths="true" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:snap-intersection-paths="true" + inkscape:snap-midpoints="true" + inkscape:snap-object-midpoints="true" + inkscape:snap-center="true" + inkscape:snap-text-baseline="true" + inkscape:snap-page="true"> + originx="1" + originy="1" + empspacing="11" + dotted="false" /> @@ -73,7 +73,7 @@ image/svg+xml - + Lawrence @@ -106,22 +106,22 @@ + inkscape:label="Layer 1"> + sodipodi:nodetypes="ccccc" /> + sodipodi:nodetypes="ccccc" /> + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" + d="m 17.5,13.5 v 2.25 l 5,-3.75 -5,-3.75 v 2.25" + id="path855" /> diff --git a/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg b/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg index 0ad40b970..6382cc546 100644 --- a/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg +++ b/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg @@ -7,61 +7,61 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - sodipodi:docname="bidirectional-arrow-horizontal-prelight.svg" - inkscape:version="1.0 (4035a4fb49, 2020-05-01)" - inkscape:export-ydpi="96" - inkscape:export-xdpi="96" - inkscape:export-filename="/tmp/template.png" - id="SVGRoot" - version="1.1" - viewBox="0 0 24 24" + width="24px" height="24px" - width="24px"> + viewBox="0 0 24 24" + version="1.1" + id="SVGRoot" + inkscape:export-filename="/tmp/template.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:version="1.0 (4035a4fb49, 2020-05-01)" + sodipodi:docname="bidirectional-arrow-horizontal-prelight.svg"> + bordercolor="#666768" + borderopacity="1.0" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:zoom="29.288994" + inkscape:cx="11.864052" + inkscape:cy="11.292624" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:window-width="1920" + inkscape:window-height="1041" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:grid-bbox="true" + inkscape:pagecheckerboard="false" + inkscape:snap-bbox="true" + inkscape:bbox-nodes="true" + inkscape:snap-others="true" + inkscape:object-nodes="true" + inkscape:snap-grids="true" + inkscape:snap-bbox-midpoints="true" + inkscape:document-rotation="0" + inkscape:object-paths="true" + inkscape:snap-nodes="true" + inkscape:snap-smooth-nodes="true" + inkscape:bbox-paths="true" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:snap-intersection-paths="true" + inkscape:snap-midpoints="true" + inkscape:snap-object-midpoints="true" + inkscape:snap-center="true" + inkscape:snap-text-baseline="true" + inkscape:snap-page="true"> + originx="1" + originy="1" + empspacing="11" + dotted="false" /> @@ -73,7 +73,7 @@ image/svg+xml - + Lawrence @@ -106,22 +106,22 @@ + inkscape:label="Layer 1"> + sodipodi:nodetypes="ccccc" /> + sodipodi:nodetypes="ccccc" /> + style="fill:#ff6400;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" + d="m 17.5,13.5 v 2.25 l 5,-3.75 -5,-3.75 v 2.25" + id="path855" /> diff --git a/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg b/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg index 18d041279..93cb21a43 100644 --- a/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg +++ b/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg @@ -7,61 +7,61 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - sodipodi:docname="bidirectional-arrow-vertical-hicontrast.svg" - inkscape:version="1.0 (4035a4fb49, 2020-05-01)" - inkscape:export-ydpi="96" - inkscape:export-xdpi="96" - inkscape:export-filename="/tmp/template.png" - id="SVGRoot" - version="1.1" - viewBox="0 0 24 24" + width="24px" height="24px" - width="24px"> + viewBox="0 0 24 24" + version="1.1" + id="SVGRoot" + inkscape:export-filename="/tmp/template.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:version="1.0 (4035a4fb49, 2020-05-01)" + sodipodi:docname="bidirectional-arrow-vertical-hicontrast.svg"> + bordercolor="#666768" + borderopacity="1.0" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:zoom="29.288994" + inkscape:cx="11.864052" + inkscape:cy="11.292624" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:window-width="1920" + inkscape:window-height="1041" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:grid-bbox="true" + inkscape:pagecheckerboard="false" + inkscape:snap-bbox="true" + inkscape:bbox-nodes="true" + inkscape:snap-others="true" + inkscape:object-nodes="true" + inkscape:snap-grids="true" + inkscape:snap-bbox-midpoints="true" + inkscape:document-rotation="0" + inkscape:object-paths="true" + inkscape:snap-nodes="true" + inkscape:snap-smooth-nodes="true" + inkscape:bbox-paths="true" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:snap-intersection-paths="true" + inkscape:snap-midpoints="true" + inkscape:snap-object-midpoints="true" + inkscape:snap-center="true" + inkscape:snap-text-baseline="true" + inkscape:snap-page="true"> + originx="1" + originy="1" + empspacing="11" + dotted="false" /> @@ -73,7 +73,7 @@ image/svg+xml - + Lawrence @@ -106,22 +106,22 @@ + inkscape:label="Layer 1"> + sodipodi:nodetypes="ccccc" /> + sodipodi:nodetypes="ccccc" /> + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" + d="M 10.5,17.5 H 8.25 l 3.75,5 3.75,-5 H 13.5" + id="path855" /> diff --git a/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg b/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg index 3dc5034f4..76f4312cb 100644 --- a/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg +++ b/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg @@ -7,61 +7,61 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="24px" - height="24px" - viewBox="0 0 24 24" - version="1.1" - id="SVGRoot" - inkscape:export-filename="/tmp/template.png" - inkscape:export-xdpi="96" - inkscape:export-ydpi="96" + sodipodi:docname="bidirectional-arrow-vertical-prelight.svg" inkscape:version="1.0 (4035a4fb49, 2020-05-01)" - sodipodi:docname="bidirectional-arrow-vertical-prelight.svg"> + inkscape:export-ydpi="96" + inkscape:export-xdpi="96" + inkscape:export-filename="/tmp/template.png" + id="SVGRoot" + version="1.1" + viewBox="0 0 24 24" + height="24px" + width="24px"> + inkscape:snap-center="true" + inkscape:snap-object-midpoints="true" + inkscape:snap-midpoints="true" + inkscape:snap-intersection-paths="true" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:bbox-paths="true" + inkscape:snap-smooth-nodes="true" + inkscape:snap-nodes="true" + inkscape:object-paths="true" + inkscape:document-rotation="0" + inkscape:snap-bbox-midpoints="true" + inkscape:snap-grids="true" + inkscape:object-nodes="true" + inkscape:snap-others="true" + inkscape:bbox-nodes="true" + inkscape:snap-bbox="true" + inkscape:pagecheckerboard="false" + inkscape:grid-bbox="true" + inkscape:window-maximized="1" + inkscape:window-y="0" + inkscape:window-x="0" + inkscape:window-height="1041" + inkscape:window-width="1920" + showgrid="true" + inkscape:current-layer="layer1" + inkscape:document-units="px" + inkscape:cy="11.292624" + inkscape:cx="11.864052" + inkscape:zoom="29.288994" + inkscape:pageshadow="2" + inkscape:pageopacity="0" + borderopacity="1.0" + bordercolor="#666768" + pagecolor="#E0E1E2" + id="base"> + originy="1" + originx="1" + id="grid1374" + type="xygrid" /> @@ -73,7 +73,7 @@ image/svg+xml - + Lawrence @@ -106,22 +106,22 @@ + id="layer1"> + d="m 10.5,5.75 v 12.5 h 3 V 5.75 Z" + style="fill:#ff6400;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + d="m 10.49995,6.4999667 h -2.25 l 3.75,-5 3.75,5 h -2.25" + style="fill:#ff6400;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" /> + id="path855" + d="M 10.5,17.5 H 8.25 l 3.75,5 3.75,-5 H 13.5" + style="fill:#ff6400;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" /> diff --git a/rtdata/images/svg/draw.svg b/rtdata/images/svg/draw.svg index 308e15654..30ea04ea4 100644 --- a/rtdata/images/svg/draw.svg +++ b/rtdata/images/svg/draw.svg @@ -7,50 +7,50 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - sodipodi:docname="draw.svg" - inkscape:version="1.0 (4035a4fb49, 2020-05-01)" - inkscape:export-ydpi="96" - inkscape:export-xdpi="96" - inkscape:export-filename="/tmp/template.png" - id="SVGRoot" - version="1.1" - viewBox="0 0 24 24" + width="24px" height="24px" - width="24px"> + viewBox="0 0 24 24" + version="1.1" + id="SVGRoot" + inkscape:export-filename="/tmp/template.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + inkscape:version="1.0 (4035a4fb49, 2020-05-01)" + sodipodi:docname="draw.svg"> + bordercolor="#666768" + borderopacity="1.0" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:zoom="14.298358" + inkscape:cx="-1.7458856" + inkscape:cy="16.76612" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:window-width="1920" + inkscape:window-height="1041" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:grid-bbox="true" + inkscape:pagecheckerboard="false" + inkscape:snap-bbox="true" + inkscape:bbox-nodes="true" + inkscape:snap-others="true" + inkscape:object-nodes="false" + inkscape:snap-grids="true" + inkscape:snap-bbox-midpoints="false" + inkscape:document-rotation="0"> + originx="1" + originy="1" + empspacing="11" + dotted="false" /> @@ -62,7 +62,7 @@ image/svg+xml - + Lawrence @@ -95,18 +95,14 @@ + inkscape:label="Layer 1"> - + style="opacity:0.7;fill:#2a7fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00157;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 19.761765,1 c 1.135523,0 3.238095,2.1025723 3.238095,3.238095 0,1.1355228 -1.57952,1.57952 -1.57952,1.57952 L 18.182245,2.57952 c 0,0 0.443997,-1.57952 1.57952,-1.57952 z M 17.372721,3.3890438 20.610816,6.6271387 7.515719,19.722235 4.277625,16.484141 Z M 3.468101,17.293664 6.706195,20.531759 6.666665,20.571289 1,22.999859 3.42857,17.333193 Z" + id="path1658" + inkscape:connector-curvature="0" + sodipodi:nodetypes="zzcczccccccccccc" /> From a56c1fbb078e9ea25c74fd1ff694be6254e7bb77 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Mon, 20 Jul 2020 15:24:53 -0700 Subject: [PATCH 029/185] Add tooltips to control lines buttons --- rtdata/languages/default | 2 ++ rtgui/perspective.cc | 3 +++ 2 files changed, 5 insertions(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index 399d8f041..9a3402f5f 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -220,8 +220,10 @@ GENERAL_BEFORE;Before GENERAL_CANCEL;Cancel GENERAL_CLOSE;Close GENERAL_CURRENT;Current +GENERAL_DELETE_ALL;Delete all GENERAL_DISABLE;Disable GENERAL_DISABLED;Disabled +GENERAL_EDIT;Edit GENERAL_ENABLE;Enable GENERAL_ENABLED;Enabled GENERAL_FILE;File diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index ec86da161..395729adb 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -185,17 +185,20 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" // Begin control lines interface. lines_button_apply = Gtk::manage (new Gtk::Button()); lines_button_apply->set_image(*ipers_apply); + lines_button_apply->set_tooltip_text(M("GENERAL_APPLY")); lines_button_apply->set_sensitive(false); lines_button_apply->signal_pressed().connect(sigc::mem_fun( *this, &::PerspCorrection::linesApplyButtonPressed)); lines_button_edit = Gtk::manage (new Gtk::ToggleButton()); lines_button_edit->set_image(*ipers_draw); + lines_button_edit->set_tooltip_text(M("GENERAL_EDIT")); lines_button_edit->signal_toggled().connect(sigc::mem_fun( *this, &::PerspCorrection::linesEditButtonPressed)); lines_button_erase = Gtk::manage (new Gtk::Button()); lines_button_erase->set_image(*ipers_trash); + lines_button_erase->set_tooltip_text(M("GENERAL_DELETE_ALL")); lines_button_erase->set_sensitive(false); lines_button_erase->signal_pressed().connect(sigc::mem_fun( *this, &::PerspCorrection::linesEraseButtonPressed)); From 2804480585a371b21dd29de5455fea0cf217a852 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Mon, 20 Jul 2020 16:55:14 -0700 Subject: [PATCH 030/185] Change cursors used in control line edit mode Panning cursor is the open hand icon and draw cursor is the crosshair icon. --- rtgui/controllines.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtgui/controllines.cc b/rtgui/controllines.cc index 2fd446c56..573b3263f 100644 --- a/rtgui/controllines.cc +++ b/rtgui/controllines.cc @@ -32,7 +32,7 @@ using namespace rtengine; ControlLineManager::ControlLineManager(): EditSubscriber(ET_OBJECTS), canvas_area(new Rectangle()), - cursor(CSCrosshair), + cursor(CSHandOpen), draw_mode(false), drawing_line(false), edited(false), @@ -285,9 +285,9 @@ bool ControlLineManager::mouseOver(int modifierKey) if (cur_obj == 0) { // Canvas if (draw_mode && modifierKey & GDK_CONTROL_MASK) { - cursor = CSPlus; - } else { cursor = CSCrosshair; + } else { + cursor = CSHandOpen; } } else if (cur_obj < 0) { // Nothing cursor = CSArrow; From 4cbd622569e954f9cae8c2c8cc2cedbf6d80927a Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 21 Jul 2020 22:45:10 -0700 Subject: [PATCH 031/185] Add initial implementation of waveform --- rtdata/languages/default | 1 + rtengine/improccoordinator.cc | 64 +++++++++++++- rtengine/improccoordinator.h | 7 ++ rtengine/rtengine.h | 7 +- rtgui/editorpanel.cc | 9 +- rtgui/editorpanel.h | 7 +- rtgui/histogrampanel.cc | 154 ++++++++++++++++++++++++++++++---- rtgui/histogrampanel.h | 27 +++++- rtgui/options.cc | 6 ++ rtgui/options.h | 1 + 10 files changed, 257 insertions(+), 26 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index a5f77403e..307417524 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -249,6 +249,7 @@ HISTOGRAM_TOOLTIP_L;Show/Hide CIELab luminance histogram. HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. HISTOGRAM_TOOLTIP_R;Show/Hide red histogram. HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. +HISTOGRAM_TOOLTIP_TYPE;Toggle between histogram and waveform. HISTORY_CHANGED;Changed HISTORY_CUSTOMCURVE;Custom curve HISTORY_FROMCLIPBOARD;From clipboard diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index aa8770504..37a81f3d1 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -129,6 +129,8 @@ ImProcCoordinator::ImProcCoordinator() : histLRETI(256), + waveformWidth(0), + CAMBrightCurveJ(), CAMBrightCurveQ(), rCurve(), @@ -1639,7 +1641,30 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (hListener) { updateLRGBHistograms(); - hListener->histogramChanged(histRed, histGreen, histBlue, histLuma, histToneCurve, histLCurve, histCCurve, /*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRedRaw, histGreenRaw, histBlueRaw, histChroma, histLRETI); + updateWaveforms(); + hListener->histogramChanged( + histRed, + histGreen, + histBlue, + histLuma, + histToneCurve, + histLCurve, + histCCurve, + /*histCLurve, + * histLLCurve,*/ + histLCAM, + histCCAM, + histRedRaw, + histGreenRaw, + histBlueRaw, + histChroma, + histLRETI, + waveformScale, + waveformWidth, + waveformRed.get(), + waveformGreen.get(), + waveformBlue.get() + ); } } @@ -1801,6 +1826,43 @@ void ImProcCoordinator::updateLRGBHistograms() } +void ImProcCoordinator::updateWaveforms() +{ + if (!workimg) { + waveformWidth = 0; + return; + } + + if (waveformWidth != workimg->getWidth()) { + // Resize waveform arrays. + waveformWidth = workimg->getWidth(); + waveformRed.reset(new int[waveformWidth][256]); + waveformGreen.reset(new int[waveformWidth][256]); + waveformBlue.reset(new int[waveformWidth][256]); + } + + int (*red)[256] = waveformRed.get(); + int (*green)[256] = waveformGreen.get(); + int (*blue)[256] = waveformBlue.get(); + + // Start with zero. + const int waveformSize = 256 * waveformWidth; + memset(waveformRed.get(), 0, waveformSize * sizeof(red[0][0])); + memset(waveformGreen.get(), 0, waveformSize * sizeof(green[0][0])); + memset(waveformBlue.get(), 0, waveformSize * sizeof(blue[0][0])); + + const int img_height = workimg->getHeight(); + for (int col = 0; col < waveformWidth; col++) { + for (int row = 0; row < img_height; row++) { + red[col][workimg->r(row, col)]++; + green[col][workimg->g(row, col)]++; + blue[col][workimg->b(row, col)]++; + } + } + + waveformScale = img_height; +} + bool ImProcCoordinator::getAutoWB(double& temp, double& green, double equal, double tempBias) { diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index ab57a4419..367f12a43 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -126,6 +126,12 @@ protected: LUTu histBlue, histBlueRaw; LUTu histLuma, histToneCurve, histToneCurveBW, histLCurve, histCCurve; LUTu histLLCurve, histLCAM, histCCAM, histClad, bcabhist, histChroma, histLRETI; + /// Waveform's intensity. Same as height of reference image. + int waveformScale; + int waveformWidth; + std::unique_ptr waveformRed, waveformRedRaw; + std::unique_ptr waveformGreen, waveformGreenRaw; + std::unique_ptr waveformBlue, waveformBlueRaw; LUTf CAMBrightCurveJ, CAMBrightCurveQ; @@ -195,6 +201,7 @@ protected: void reallocAll(); void updateLRGBHistograms(); + void updateWaveforms(); void setScale(int prevscale); void updatePreviewImage (int todo, bool panningRelatedChange); diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 1671ae1f5..30fa2ec67 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -327,7 +327,12 @@ public: const LUTu& histGreenRaw, const LUTu& histBlueRaw, const LUTu& histChroma, - const LUTu& histLRETI + const LUTu& histLRETI, + int waveformScale, + int waveformWidth, + const int waveformRed[][256], + const int waveformGreen[][256], + const int waveformBlue[][256] ) = 0; }; diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 669dd491a..28747e063 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -2245,11 +2245,16 @@ void EditorPanel::histogramChanged( const LUTu& histGreenRaw, const LUTu& histBlueRaw, const LUTu& histChroma, - const LUTu& histLRETI + const LUTu& histLRETI, + int waveformScale, + int waveformWidth, + const int waveformRed[][256], + const int waveformGreen[][256], + const int waveformBlue[][256] ) { if (histogramPanel) { - histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw); + histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, waveformScale, waveformWidth, waveformRed, waveformGreen, waveformBlue); } tpc->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 826793507..6a1fb585f 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -126,7 +126,12 @@ public: const LUTu& histGreenRaw, const LUTu& histBlueRaw, const LUTu& histChroma, - const LUTu& histLRETI + const LUTu& histLRETI, + int waveformScale, + int waveformWidth, + const int waveformRed[][256], + const int waveformGreen[][256], + const int waveformBlue[][256] ) override; // event handlers diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index b1c0b62df..588d6642e 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -85,6 +85,7 @@ HistogramPanel::HistogramPanel () showChro = Gtk::manage (new Gtk::ToggleButton ()); showRAW = Gtk::manage (new Gtk::ToggleButton ()); showMode = Gtk::manage (new Gtk::Button ()); + scopeType = Gtk::manage (new Gtk::Button ()); showBAR = Gtk::manage (new Gtk::ToggleButton ()); showRed->set_name("histButton"); @@ -101,6 +102,8 @@ HistogramPanel::HistogramPanel () showRAW->set_can_focus(false); showMode->set_name("histButton"); showMode->set_can_focus(false); + scopeType->set_name("histButton"); + scopeType->set_can_focus(false); showBAR->set_name("histButton"); showBAR->set_can_focus(false); @@ -111,6 +114,7 @@ HistogramPanel::HistogramPanel () showChro->set_relief (Gtk::RELIEF_NONE); showRAW->set_relief (Gtk::RELIEF_NONE); showMode->set_relief (Gtk::RELIEF_NONE); + scopeType->set_relief (Gtk::RELIEF_NONE); showBAR->set_relief (Gtk::RELIEF_NONE); showRed->set_tooltip_text (M("HISTOGRAM_TOOLTIP_R")); @@ -120,6 +124,7 @@ HistogramPanel::HistogramPanel () showChro->set_tooltip_text (M("HISTOGRAM_TOOLTIP_CHRO")); showRAW->set_tooltip_text (M("HISTOGRAM_TOOLTIP_RAW")); showMode->set_tooltip_text (M("HISTOGRAM_TOOLTIP_MODE")); + scopeType->set_tooltip_text (M("HISTOGRAM_TOOLTIP_TYPE")); showBAR->set_tooltip_text (M("HISTOGRAM_TOOLTIP_BAR")); buttonGrid = Gtk::manage (new Gtk::Grid ()); @@ -145,9 +150,15 @@ HistogramPanel::HistogramPanel () showMode->set_image(*mode1Image); else showMode->set_image(*mode2Image); + if (options.histogramScopeType == 0) { + // TODO: scopeType->set_image(*histImage); + } else { + // TODO: scopeType->set_image(*waveImage); + } showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); raw_toggled(); // Make sure the luma/chroma toggles are enabled or disabled + type_changed(); setExpandAlignProperties(showRed , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showGreen, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); @@ -156,6 +167,7 @@ HistogramPanel::HistogramPanel () setExpandAlignProperties(showChro , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showRAW , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showMode , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(scopeType, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showBAR , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); showRed->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::red_toggled), showRed ); @@ -165,6 +177,7 @@ HistogramPanel::HistogramPanel () showChro->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::chro_toggled), showChro ); showRAW->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::raw_toggled), showRAW ); showMode->signal_released().connect( sigc::mem_fun(*this, &HistogramPanel::mode_released), showMode ); + scopeType->signal_pressed().connect( sigc::mem_fun(*this, &HistogramPanel::type_pressed), scopeType ); showBAR->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::bar_toggled), showBAR ); buttonGrid->add (*showRed); @@ -174,6 +187,7 @@ HistogramPanel::HistogramPanel () buttonGrid->add (*showChro); buttonGrid->add (*showRAW); buttonGrid->add (*showMode); + buttonGrid->add (*scopeType); buttonGrid->add (*showBAR); // Put the button vbox next to the window's border to be less disturbing @@ -266,8 +280,8 @@ void HistogramPanel::raw_toggled () showChro->set_sensitive(false); } else { showRAW->set_image(*rawImage_g); - showValue->set_sensitive(true); - showChro->set_sensitive(true); + showValue->set_sensitive(options.histogramScopeType != 1); + showChro->set_sensitive(options.histogramScopeType != 1); } rgbv_toggled(); @@ -285,6 +299,34 @@ void HistogramPanel::mode_released () rgbv_toggled(); } +void HistogramPanel::type_pressed() +{ + constexpr int TYPE_COUNT = 2; // Histogram and waveform. + options.histogramScopeType = (options.histogramScopeType + 1) % TYPE_COUNT; + if (options.histogramScopeType == 0) { + // TODO: showMode->set_image(*histImage); + } else { + // TODO: showMode->set_image(*waveImage); + } + type_changed(); + rgbv_toggled(); +} + +void HistogramPanel::type_changed() +{ + if (options.histogramScopeType == 0) { + showValue->set_sensitive(!showRAW->get_active()); + showChro->set_sensitive(!showRAW->get_active()); + showRAW->set_sensitive(); + showMode->set_sensitive(); + } else { + showValue->set_sensitive(false); + showChro->set_sensitive(false); + showRAW->set_sensitive(false); + showMode->set_sensitive(false); + } +} + void HistogramPanel::bar_toggled () { showBAR->set_image(showBAR->get_active() ? *barImage : *barImage_g); @@ -294,7 +336,7 @@ void HistogramPanel::bar_toggled () void HistogramPanel::rgbv_toggled () { // Update Display - histogramArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showChro->get_active(), showRAW->get_active(), options.histogramDrawMode); + histogramArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showChro->get_active(), showRAW->get_active(), options.histogramDrawMode, options.histogramScopeType); histogramArea->queue_draw (); histogramRGBArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showChro->get_active(), showRAW->get_active(), showBAR->get_active()); @@ -443,7 +485,7 @@ bool HistogramRGBArea::getShow() void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustring &profile, const Glib::ustring &profileW) { - if (!get_realized () || !showMode || rawMode) { + if (!get_realized () || !showMode || rawMode || options.histogramScopeType == 1) { return; } @@ -655,7 +697,9 @@ void HistogramRGBArea::factorChanged (double newFactor) // // HistogramArea HistogramArea::HistogramArea (DrawModeListener *fml) : + waveform_width(0), valid(false), drawMode(options.histogramDrawMode), myDrawModeListener(fml), + scopeType(options.histogramScopeType), oldwidth(-1), oldheight(-1), needRed(options.histogramRed), needGreen(options.histogramGreen), needBlue(options.histogramBlue), needLuma(options.histogramLuma), needChroma(options.histogramChroma), rawMode(options.histogramRAW), @@ -720,7 +764,7 @@ void HistogramArea::get_preferred_width_for_height_vfunc (int height, int &minim get_preferred_width_vfunc (minimum_width, natural_width); } -void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode) +void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, int type) { options.histogramRed = needRed = r; @@ -730,6 +774,7 @@ void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool options.histogramChroma = needChroma = c; options.histogramRAW = rawMode = raw; options.histogramDrawMode = drawMode = mode; + options.histogramScopeType = scopeType = type; updateBackBuffer (); } @@ -742,7 +787,12 @@ void HistogramArea::update( const LUTu& histChroma, const LUTu& histRedRaw, const LUTu& histGreenRaw, - const LUTu& histBlueRaw + const LUTu& histBlueRaw, + int waveformScale, + int waveformWidth, + const int waveformRed[][256], + const int waveformGreen[][256], + const int waveformBlue[][256] ) { if (histRed) { @@ -754,6 +804,19 @@ void HistogramArea::update( rhistRaw = histRedRaw; ghistRaw = histGreenRaw; bhistRaw = histBlueRaw; + waveform_scale = waveformScale; + if (waveform_width != waveformWidth) { + waveform_width = waveformWidth; + rwave.reset(new int[waveformWidth][256]); + gwave.reset(new int[waveformWidth][256]); + bwave.reset(new int[waveformWidth][256]); + } + int (* const rw)[256] = rwave.get(); + int (* const gw)[256] = gwave.get(); + int (* const bw)[256] = bwave.get(); + memcpy(rw, waveformRed, 256 * waveformWidth * sizeof(rw[0][0])); + memcpy(gw, waveformGreen, 256 * waveformWidth * sizeof(gw[0][0])); + memcpy(bw, waveformBlue, 256 * waveformWidth * sizeof(bw[0][0])); valid = true; } else { valid = false; @@ -826,20 +889,29 @@ void HistogramArea::updateBackBuffer () int nrOfVGridPartitions = 8; // always show 8 stops (lines at 1,3,7,15,31,63,127) // draw vertical gridlines - for (int i = 0; i <= nrOfVGridPartitions; i++) { - double xpos = padding + 0.5; - if (options.histogramDrawMode < 2) { - xpos += (pow(2.0,i) - 1) * (w - padding * 2.0) / 255.0; - } else { - xpos += HistogramScaling::log (255, pow(2.0,i) - 1) * (w - padding * 2.0) / 255.0; + if (options.histogramScopeType != 1) { + for (int i = 0; i <= nrOfVGridPartitions; i++) { + double xpos = padding + 0.5; + if (options.histogramDrawMode < 2) { + xpos += (pow(2.0,i) - 1) * (w - padding * 2.0) / 255.0; + } else { + xpos += HistogramScaling::log (255, pow(2.0,i) - 1) * (w - padding * 2.0) / 255.0; + } + cr->move_to (xpos, 0.); + cr->line_to (xpos, h); + cr->stroke (); } - cr->move_to (xpos, 0.); - cr->line_to (xpos, h); - cr->stroke (); } // draw horizontal gridlines - if (options.histogramDrawMode == 0) { + if (options.histogramScopeType == 1) { + for (int i = 0; i <= nrOfVGridPartitions; i++) { + const double ypos = h - 1 - (pow(2.0,i) - 1) * (h - 1) / 255.0; + cr->move_to(padding, ypos); + cr->line_to(w - padding, ypos); + cr->stroke(); + } + } else if (options.histogramDrawMode == 0) { for (int i = 1; i < nrOfHGridPartitions; i++) { cr->move_to (padding, i * (double)h / nrOfHGridPartitions + 0.5); cr->line_to (w - padding, i * (double)h / nrOfHGridPartitions + 0.5); @@ -855,7 +927,7 @@ void HistogramArea::updateBackBuffer () cr->unset_dash(); - if (valid) { + if (valid && scopeType == 0) { // For RAW mode use the other hists LUTu& rh = rawMode ? rhistRaw : rhist; LUTu& gh = rawMode ? ghistRaw : ghist; @@ -962,6 +1034,8 @@ void HistogramArea::updateBackBuffer () drawMarks(cr, bhchanged, realhistheight, w, ui, oi); } + } else if (scopeType == 1 && waveform_width > 0) { + drawWaveform(cr, w, h); } // Draw the frame's border @@ -1026,6 +1100,48 @@ void HistogramArea::drawMarks(Cairo::RefPtr &cr, cr->fill(); } +void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h) +{ + // Arbitrary scale factor divided by current scale. + const float scale = 32.f * 255.f / waveform_scale; + + // See Cairo documentation on stride. + const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, waveform_width); + std::unique_ptr buffer(new unsigned char[256 * cairo_stride]); + + // Clear waveform. + memset(buffer.get(), 0, 256 * cairo_stride); + + // TODO: Optimize. + for (int col = 0; col < waveform_width; col++) { + for (int val = 0; val < 256; val++) { + const float r = needRed ? scale * rwave[col][255 - val] : 0.f; + const float g = needGreen ? scale * gwave[col][255 - val] : 0.f; + const float b = needBlue ? scale * bwave[col][255 - val] : 0.f; + const float value = (r > g && r > b) ? r : ((g > b) ? g : b); + if (value <= 0) { + buffer[val * cairo_stride + col * 4 + 3] = 0; + } else { + buffer[val * cairo_stride + col * 4 + 3] = value; + buffer[val * cairo_stride + col * 4 + 2] = r; + buffer[val * cairo_stride + col * 4 + 1] = g; + buffer[val * cairo_stride + col * 4] = b; + } + } + } + + Cairo::RefPtr surface = Cairo::ImageSurface::create( + buffer.get(), Cairo::FORMAT_ARGB32, waveform_width, 256, cairo_stride); + auto orig_matrix = cr->get_matrix(); + cr->translate(padding, 0); + cr->scale(static_cast(w - 2 * padding) / waveform_width, h / 256.0); + cr->set_source(surface, 0, 0); + cr->set_operator(Cairo::OPERATOR_OVER); + cr->paint(); + surface->finish(); + cr->set_matrix(orig_matrix); +} + bool HistogramArea::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) { @@ -1070,6 +1186,10 @@ bool HistogramArea::on_button_release_event (GdkEventButton* event) bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) { + if (drawMode == 0 || scopeType == 1) { + return false; + } + if (isPressed) { double mod = 1 + (event->x - movingPosition) / get_width(); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 2a29ded9a..a8f5922ee 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -130,10 +130,14 @@ private: protected: LUTu rhist, ghist, bhist, lhist, chist; LUTu rhistRaw, ghistRaw, bhistRaw, lhistRaw; //lhistRaw is unused? + int waveform_scale; + int waveform_width; + std::unique_ptr rwave, gwave, bwave; bool valid; int drawMode; DrawModeListener *myDrawModeListener; + int scopeType; int oldwidth, oldheight; bool needRed, needGreen, needBlue, needLuma, needChroma; @@ -158,9 +162,14 @@ public: const LUTu& histChroma, const LUTu& histRedRaw, const LUTu& histGreenRaw, - const LUTu& histBlueRaw + const LUTu& histBlueRaw, + int waveformScale, + int waveformWidth, + const int waveformRed[][256], + const int waveformGreen[][256], + const int waveformBlue[][256] ); - void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode); + void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, int type); void on_realize() override; bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; bool on_button_press_event (GdkEventButton* event) override; @@ -171,6 +180,7 @@ public: private: void drawCurve(Cairo::RefPtr &cr, const LUTu & data, double scale, int hsize, int vsize); void drawMarks(Cairo::RefPtr &cr, const LUTu & data, double scale, int hsize, int & ui, int & oi); + void drawWaveform(Cairo::RefPtr &cr, int hsize, int vsize); Gtk::SizeRequestMode get_request_mode_vfunc () const override; void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const override; void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; @@ -195,6 +205,7 @@ protected: Gtk::ToggleButton* showBAR; Gtk::ToggleButton* showChro; Gtk::Button* showMode; + Gtk::Button* scopeType; Gtk::Image *redImage; Gtk::Image *greenImage; @@ -232,9 +243,15 @@ public: const LUTu& histChroma, const LUTu& histRedRaw, const LUTu& histGreenRaw, - const LUTu& histBlueRaw) + const LUTu& histBlueRaw, + int waveformScale, + int waveformWidth, + const int waveformRed[][256], + const int waveformGreen[][256], + const int waveformBlue[][256] + ) { - histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw); + histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, waveformScale, waveformWidth, waveformRed, waveformGreen, waveformBlue); } // pointermotionlistener interface void pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw = false) override; @@ -251,6 +268,8 @@ public: void chro_toggled (); void bar_toggled (); void mode_released (); + void type_pressed (); + void type_changed (); void rgbv_toggled (); void resized (Gtk::Allocation& req); diff --git a/rtgui/options.cc b/rtgui/options.cc index cc49f1fcd..b7eb9f810 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -450,6 +450,7 @@ void Options::setDefaults() histogramBar = true; histogramHeight = 200; histogramDrawMode = 0; + histogramScopeType = 0; curvebboxpos = 1; complexity = 1; prevdemo = PD_Sidecar; @@ -1426,6 +1427,10 @@ void Options::readFromFile(Glib::ustring fname) histogramDrawMode = keyFile.get_integer("GUI", "HistogramDrawMode"); } + if (keyFile.has_key("GUI", "HistogramScopeType")) { + histogramScopeType = keyFile.get_integer("GUI", "HistogramScopeType"); + } + if (keyFile.has_key("GUI", "NavigatorRGBUnit")) { navRGBUnit = (NavigatorUnit)keyFile.get_integer("GUI", "NavigatorRGBUnit"); } @@ -2233,6 +2238,7 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_boolean("GUI", "HistogramBar", histogramBar); keyFile.set_integer("GUI", "HistogramHeight", histogramHeight); keyFile.set_integer("GUI", "HistogramDrawMode", histogramDrawMode); + keyFile.set_integer("GUI", "HistogramScopeType", histogramScopeType); keyFile.set_integer("GUI", "NavigatorRGBUnit", (int)navRGBUnit); keyFile.set_integer("GUI", "NavigatorHSVUnit", (int)navHSVUnit); keyFile.set_boolean("GUI", "ShowFilmStripToolBar", showFilmStripToolBar); diff --git a/rtgui/options.h b/rtgui/options.h index 02d62292c..20678f2f9 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -312,6 +312,7 @@ public: bool histogramBar; int histogramHeight; int histogramDrawMode; + int histogramScopeType; bool FileBrowserToolbarSingleRow; bool hideTPVScrollbar; int whiteBalanceSpotSize; From 5eb6961049b89af23845eea428f4890505d07b99 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Fri, 24 Jul 2020 17:03:10 -0700 Subject: [PATCH 032/185] Adjust waveform padding Remove padding from left and right sides and add padding to top and bottom sides to improve visibility of extreme pixel values. --- rtgui/histogrampanel.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 588d6642e..9d6daf708 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -906,9 +906,9 @@ void HistogramArea::updateBackBuffer () // draw horizontal gridlines if (options.histogramScopeType == 1) { for (int i = 0; i <= nrOfVGridPartitions; i++) { - const double ypos = h - 1 - (pow(2.0,i) - 1) * (h - 1) / 255.0; - cr->move_to(padding, ypos); - cr->line_to(w - padding, ypos); + const double ypos = h - padding - (pow(2.0,i) - 1) * (h - 2 * padding - 1) / 255.0; + cr->move_to(0, ypos); + cr->line_to(w, ypos); cr->stroke(); } } else if (options.histogramDrawMode == 0) { @@ -1133,8 +1133,8 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h Cairo::RefPtr surface = Cairo::ImageSurface::create( buffer.get(), Cairo::FORMAT_ARGB32, waveform_width, 256, cairo_stride); auto orig_matrix = cr->get_matrix(); - cr->translate(padding, 0); - cr->scale(static_cast(w - 2 * padding) / waveform_width, h / 256.0); + cr->translate(0, padding); + cr->scale(static_cast(w) / waveform_width, (h - 2 * padding) / 256.0); cr->set_source(surface, 0, 0); cr->set_operator(Cairo::OPERATOR_OVER); cr->paint(); From 99b7a557c968240cb5593e645aef8426a2f3eac9 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sat, 25 Jul 2020 13:05:10 -0700 Subject: [PATCH 033/185] Enable RGB bars for waveform --- rtgui/histogrampanel.cc | 242 ++++++++++++++++++++++++++-------------- rtgui/histogrampanel.h | 31 ++++- 2 files changed, 190 insertions(+), 83 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 9d6daf708..8c2d971eb 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -40,22 +40,33 @@ HistogramPanel::HistogramPanel () histogramArea = Gtk::manage (new HistogramArea (this)); setExpandAlignProperties(histogramArea, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - histogramRGBArea = Gtk::manage (new HistogramRGBArea ()); - setExpandAlignProperties(histogramRGBArea, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_END); - histogramRGBArea->show(); + histogramRGBAreaHori.reset(new HistogramRGBAreaHori()); + setExpandAlignProperties(histogramRGBAreaHori.get(), true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_END); + histogramRGBAreaHori->show(); + + histogramRGBAreaVert.reset(new HistogramRGBAreaVert()); + setExpandAlignProperties(histogramRGBAreaVert.get(), false, true, Gtk::ALIGN_END, Gtk::ALIGN_FILL); + histogramRGBAreaVert->show(); + + if (options.histogramScopeType == 1) { + histogramRGBArea = histogramRGBAreaVert.get(); + } else { + histogramRGBArea = histogramRGBAreaHori.get(); + } // connecting the two childs - histogramArea->signal_factor_changed().connect( sigc::mem_fun(*histogramRGBArea, &HistogramRGBArea::factorChanged) ); + histogramArea->signal_factor_changed().connect( sigc::mem_fun(*histogramRGBAreaHori, &HistogramRGBArea::factorChanged) ); + histogramArea->signal_factor_changed().connect( sigc::mem_fun(*histogramRGBAreaVert, &HistogramRGBArea::factorChanged) ); gfxGrid = Gtk::manage (new Gtk::Grid ()); - gfxGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); gfxGrid->set_row_spacing(1); gfxGrid->set_column_spacing(1); - histogramRGBArea->setParent(gfxGrid); + histogramRGBAreaHori->setParent(gfxGrid); + histogramRGBAreaVert->setParent(gfxGrid); gfxGrid->add(*histogramArea); if (options.histogramBar) { - gfxGrid->add (*histogramRGBArea); + showRGBBar(); } redImage = new RTImage ("histogram-red-on-small.png"); @@ -227,6 +238,25 @@ HistogramPanel::~HistogramPanel () } +void HistogramPanel::showRGBBar() +{ + Gtk::PositionType pos; + + if (histogramRGBArea == histogramRGBAreaHori.get()) { + pos = Gtk::POS_BOTTOM; + } else { + if (options.histogramPosition == 1) { + pos = Gtk::POS_RIGHT; + } else { + pos = Gtk::POS_LEFT; + } + } + + gfxGrid->attach_next_to(*histogramRGBArea, *histogramArea, pos); + setHistRGBInvalid(); + histogramRGBArea->setShow(true); +} + void HistogramPanel::resized (Gtk::Allocation& req) { @@ -314,16 +344,27 @@ void HistogramPanel::type_pressed() void HistogramPanel::type_changed() { + if (showBAR->get_active()) { + histogramRGBArea->setShow(false); + gfxGrid->remove(*histogramRGBArea); + } + if (options.histogramScopeType == 0) { showValue->set_sensitive(!showRAW->get_active()); showChro->set_sensitive(!showRAW->get_active()); showRAW->set_sensitive(); showMode->set_sensitive(); + histogramRGBArea = histogramRGBAreaHori.get(); } else { showValue->set_sensitive(false); showChro->set_sensitive(false); showRAW->set_sensitive(false); showMode->set_sensitive(false); + histogramRGBArea = histogramRGBAreaVert.get(); + } + + if (showBAR->get_active()) { + showRGBBar(); } } @@ -331,6 +372,12 @@ void HistogramPanel::bar_toggled () { showBAR->set_image(showBAR->get_active() ? *barImage : *barImage_g); rgbv_toggled(); + + if (showBAR->get_active()) { + showRGBBar(); + } else { + gfxGrid->remove(*histogramRGBArea); + } } void HistogramPanel::rgbv_toggled () @@ -436,46 +483,41 @@ HistogramRGBArea::~HistogramRGBArea () } -Gtk::SizeRequestMode HistogramRGBArea::get_request_mode_vfunc () const +void HistogramRGBArea::getPreferredThickness(int& min_thickness, int& natural_thickness) const { - return Gtk::SIZE_REQUEST_HEIGHT_FOR_WIDTH; + int minimumLength = 0; + int naturalLength = 0; + getPreferredLength(minimumLength, naturalLength); + getPreferredThicknessForLength(minimumLength, min_thickness, natural_thickness); } -void HistogramRGBArea::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const -{ - int minimumWidth = 0; - int naturalWidth = 0; - get_preferred_width_vfunc(minimumWidth, naturalWidth); - get_preferred_height_for_width_vfunc (minimumWidth, minimum_height, natural_height); -} - -void HistogramRGBArea::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const +void HistogramRGBArea::getPreferredLength(int& min_length, int& natural_length) const { int s = RTScalable::getScale(); - minimum_width = 60 * s; - natural_width = 200 * s; + min_length = 60 * s; + natural_length = 200 * s; } -void HistogramRGBArea::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const +void HistogramRGBArea::getPreferredThicknessForLength(int length, int& min_thickness, int& natural_thickness) const { - int bHeight = width / 30; + int bThickness = length / 30; int s = RTScalable::getScale(); - if (bHeight > (10 * s)) { - bHeight = 10 * s; - } else if (bHeight < (5 * s)) { - bHeight = 5 * s; + if (bThickness > (10 * s)) { + bThickness = 10 * s; + } else if (bThickness < (5 * s)) { + bThickness = 5 * s; } - minimum_height = bHeight; - natural_height = bHeight; + min_thickness = bThickness; + natural_thickness = bThickness; } // unused? -void HistogramRGBArea::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const +void HistogramRGBArea::getPreferredLengthForThickness(int thickness, int& min_length, int& natural_length) const { - get_preferred_width_vfunc (minimum_width, natural_width); + getPreferredLength(min_length, natural_length); } bool HistogramRGBArea::getShow() @@ -483,9 +525,14 @@ bool HistogramRGBArea::getShow() return(showMode); } +void HistogramRGBArea::setShow(bool show) +{ + showMode = show; +} + void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustring &profile, const Glib::ustring &profileW) { - if (!get_realized () || !showMode || rawMode || options.histogramScopeType == 1) { + if (!get_realized () || !showMode || rawMode) { return; } @@ -513,75 +560,39 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustrin cc->set_line_width (1.0 * s); if ( r != -1 && g != -1 && b != -1 ) { - double xpos; if (needRed) { // Red cc->set_source_rgb(1.0, 0.0, 0.0); - if (options.histogramDrawMode < 2) { - xpos = padding + r * (winw - padding * 2.0) / 255.0 + 0.5*s; - } else { - xpos = padding + HistogramScaling::log (255, r) * (winw - padding * 2.0) / 255.0 + 0.5*s; - } - cc->move_to(xpos, 0.0); - cc->line_to(xpos, winh - 0.0); - cc->stroke(); + drawBar(cc, r, 255.0, winw, winh, s); } if (needGreen) { // Green cc->set_source_rgb(0.0, 1.0, 0.0); - if (options.histogramDrawMode < 2) { - xpos = padding + g * (winw - padding * 2.0) / 255.0 + 0.5*s; - } else { - xpos = padding + HistogramScaling::log (255, g) * (winw - padding * 2.0) / 255.0 + 0.5*s; - } - cc->move_to(xpos, 0.0); - cc->line_to(xpos, winh - 0.0); - cc->stroke(); + drawBar(cc, g, 255.0, winw, winh, s); } if (needBlue) { // Blue cc->set_source_rgb(0.0, 0.4, 1.0); - if (options.histogramDrawMode < 2) { - xpos = padding + b * (winw - padding * 2.0) / 255.0 + 0.5*s; - } else { - xpos = padding + HistogramScaling::log (255, b) * (winw - padding * 2.0) / 255.0 + 0.5*s; - } - cc->move_to(xpos, 0.0); - cc->line_to(xpos, winh - 0.0); - cc->stroke(); + drawBar(cc, b, 255.0, winw, winh, s); } - if(needLuma || needChroma) { + if((needLuma || needChroma) && options.histogramScopeType != 1) { float Lab_L, Lab_a, Lab_b; rtengine::Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, Lab_L, Lab_a, Lab_b, options.rtSettings.HistogramWorking); if (needLuma) { // Luma cc->set_source_rgb(1.0, 1.0, 1.0); - if (options.histogramDrawMode < 2) { - xpos = padding + static_cast(Lab_L) * (winw - padding * 2.0) / 100.0 + 0.5*s; - } else { - xpos = padding + HistogramScaling::log(100, Lab_L) * (winw - padding * 2.0) / 100.0 + 0.5*s; - } - cc->move_to(xpos, 0.0); - cc->line_to(xpos, winh - 0.0); - cc->stroke(); + drawBar(cc, Lab_L, 100.0, winw, winh, s); } if (needChroma) { // Chroma double chromaval = sqrt(Lab_a * Lab_a + Lab_b * Lab_b) / 1.8; cc->set_source_rgb(0.9, 0.9, 0.0); - if (options.histogramDrawMode < 2) { - xpos = padding + chromaval * (winw - padding * 2.0) / 100.0 + 0.5*s; - } else { - xpos = padding + HistogramScaling::log(100, chromaval) * (winw - padding * 2.0) / 100.0 + 0.5*s; - } - cc->move_to(xpos, 0.0); - cc->line_to(xpos, winh - 0.0); - cc->stroke(); + drawBar(cc, chromaval, 100.0, winw, winh, s); } } } @@ -639,15 +650,6 @@ void HistogramRGBArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bo options.histogramRAW = rawMode = raw; options.histogramBar = showMode = bar; - // Show/hide the RGB bar widget - if (bar && !barDisplayed) { - parent->add(*this); - barDisplayed = true; - } else if (!bar && barDisplayed) { - removeIfThere(parent, this, false); - barDisplayed = false; - } - } void HistogramRGBArea::on_realize () @@ -692,6 +694,82 @@ void HistogramRGBArea::factorChanged (double newFactor) factor = newFactor; } +void HistogramRGBAreaHori::drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) +{ + double pos; + if (options.histogramDrawMode < 2) { + pos = padding + value * (winw - padding * 2.0) / max_value + 0.5 * scale; + } else { + pos = padding + HistogramScaling::log (max_value, value) * (winw - padding * 2.0) / max_value + 0.5 * scale; + } + cc->move_to(pos, 0.0); + cc->line_to(pos, winh - 0.0); + cc->stroke(); +} + +Gtk::SizeRequestMode HistogramRGBAreaHori::get_request_mode_vfunc () const +{ + return Gtk::SIZE_REQUEST_HEIGHT_FOR_WIDTH; +} + +void HistogramRGBAreaHori::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const +{ + getPreferredThickness(minimum_height, natural_height); +} + +void HistogramRGBAreaHori::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const +{ + getPreferredLength(minimum_width, natural_width); +} + +void HistogramRGBAreaHori::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const +{ + getPreferredThicknessForLength(width, minimum_height, natural_height); +} + +void HistogramRGBAreaHori::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const +{ + getPreferredLengthForThickness(height, minimum_width, natural_width); +} + +void HistogramRGBAreaVert::drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) +{ + double pos; + if (options.histogramDrawMode < 2 || options.histogramScopeType == 1) { + pos = padding + value * (winh - padding * 2.0 - 1) / max_value + 0.5 * scale; + } else { + pos = padding + HistogramScaling::log (max_value, value) * (winh - padding * 2.0) / max_value + 0.5 * scale; + } + cc->move_to(0.0, winh - pos); + cc->line_to(winw, winh - pos); + cc->stroke(); +} + +Gtk::SizeRequestMode HistogramRGBAreaVert::get_request_mode_vfunc () const +{ + return Gtk::SIZE_REQUEST_WIDTH_FOR_HEIGHT; +} + +void HistogramRGBAreaVert::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const +{ + getPreferredLength(minimum_height, natural_height); +} + +void HistogramRGBAreaVert::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const +{ + getPreferredThickness(minimum_width, natural_width); +} + +void HistogramRGBAreaVert::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const +{ + getPreferredLengthForThickness(width, minimum_height, natural_height); +} + +void HistogramRGBAreaVert::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const +{ + getPreferredThicknessForLength(height, minimum_width, natural_width); +} + // // // diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index a8f5922ee..f97d5188b 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -53,7 +53,7 @@ public: double log (double vsize, double val); }; -class HistogramRGBArea final : public Gtk::DrawingArea, public BackBuffer, private HistogramScaling, public rtengine::NonCopyable +class HistogramRGBArea : public Gtk::DrawingArea, public BackBuffer, protected HistogramScaling, public rtengine::NonCopyable { private: typedef const double (*TMatrix)[3]; @@ -83,12 +83,21 @@ protected: HistogramRGBAreaIdleHelper* harih; + /** Draw an indicator bar for the value. */ + virtual void drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) = 0; + + void getPreferredThickness(int& min_thickness, int& natural_length) const; + void getPreferredLength(int& min_length, int& natural_length) const; + void getPreferredThicknessForLength(int length, int& min_thickness, int& natural_length) const; + void getPreferredLengthForThickness(int thickness, int& min_length, int& natural_length) const; + public: HistogramRGBArea(); ~HistogramRGBArea() override; void updateBackBuffer (int r, int g, int b, const Glib::ustring &profile = "", const Glib::ustring &profileW = ""); bool getShow (); + void setShow(bool show); void setParent (Gtk::Grid* p) { parent = p; @@ -102,13 +111,30 @@ public: bool on_button_press_event (GdkEventButton* event) override; void factorChanged (double newFactor); +}; + +class HistogramRGBAreaHori final : public HistogramRGBArea +{ private: + void drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) override; + Gtk::SizeRequestMode get_request_mode_vfunc () const override; void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const override; void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; void get_preferred_width_for_height_vfunc (int h, int &minimum_width, int &natural_width) const override; +}; +class HistogramRGBAreaVert final : public HistogramRGBArea +{ +private: + void drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) override; + + Gtk::SizeRequestMode get_request_mode_vfunc () const override; + void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; + void get_preferred_width_for_height_vfunc (int h, int &minimum_width, int &natural_width) const override; }; class DrawModeListener @@ -197,6 +223,8 @@ protected: Gtk::Grid* buttonGrid; HistogramArea* histogramArea; HistogramRGBArea* histogramRGBArea; + std::unique_ptr histogramRGBAreaHori; + std::unique_ptr histogramRGBAreaVert; Gtk::ToggleButton* showRed; Gtk::ToggleButton* showGreen; Gtk::ToggleButton* showBlue; @@ -229,6 +257,7 @@ protected: sigc::connection rconn; void setHistInvalid (); + void showRGBBar(); public: From 6df69b378623d4a96122f06d3d79f2bea69f9091 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sun, 26 Jul 2020 13:27:17 -0700 Subject: [PATCH 034/185] Improve performance of histogram/waveform updates Only perform calculations for the currently shown scope. Cache the waveform so it can be reused when the scope is resized. Increase speed of waveform rendering. --- rtengine/improccoordinator.cc | 75 +++++++++++++------- rtengine/improccoordinator.h | 9 ++- rtengine/rtengine.h | 17 +++++ rtgui/editorpanel.cc | 41 ++++++++++- rtgui/editorpanel.h | 10 +++ rtgui/histogrampanel.cc | 130 +++++++++++++++++++++++----------- rtgui/histogrampanel.h | 15 ++++ 7 files changed, 228 insertions(+), 69 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 37a81f3d1..4927c4e1f 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1640,31 +1640,13 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } if (hListener) { - updateLRGBHistograms(); - updateWaveforms(); - hListener->histogramChanged( - histRed, - histGreen, - histBlue, - histLuma, - histToneCurve, - histLCurve, - histCCurve, - /*histCLurve, - * histLLCurve,*/ - histLCAM, - histCCAM, - histRedRaw, - histGreenRaw, - histBlueRaw, - histChroma, - histLRETI, - waveformScale, - waveformWidth, - waveformRed.get(), - waveformGreen.get(), - waveformBlue.get() - ); + if (hListener->updateHistogram()) { + updateLRGBHistograms(); + } + if (hListener->updateWaveform()) { + updateWaveforms(); + } + notifyHistogramChanged(); } } @@ -1765,6 +1747,33 @@ void ImProcCoordinator::setScale(int prevscale) } +void ImProcCoordinator::notifyHistogramChanged() +{ + if (hListener) { + hListener->histogramChanged( + histRed, + histGreen, + histBlue, + histLuma, + histToneCurve, + histLCurve, + histCCurve, + histLCAM, + histCCAM, + histRedRaw, + histGreenRaw, + histBlueRaw, + histChroma, + histLRETI, + waveformScale, + waveformWidth, + waveformRed.get(), + waveformGreen.get(), + waveformBlue.get() + ); + } +} + void ImProcCoordinator::updateLRGBHistograms() { @@ -2305,4 +2314,20 @@ void ImProcCoordinator::setHighQualComputed() highQualityComputed = true; } +void ImProcCoordinator::updateWaveform() +{ + if (hListener) { + updateWaveforms(); + notifyHistogramChanged(); + } +} + +void ImProcCoordinator::updateHistogram() +{ + if (hListener) { + updateLRGBHistograms(); + notifyHistogramChanged(); + } +} + } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 367f12a43..92b5e9346 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -54,7 +54,7 @@ class Crop; * but using this class' LUT and other precomputed parameters. The main preview area is displaying a non framed Crop object, * while detail windows are framed Crop objects. */ -class ImProcCoordinator final : public StagedImageProcessor +class ImProcCoordinator final : public StagedImageProcessor, public HistogramObservable { friend class Crop; @@ -199,6 +199,7 @@ protected: MyMutex minit; // to gain mutually exclusive access to ... to what exactly? + void notifyHistogramChanged(); void reallocAll(); void updateLRGBHistograms(); void updateWaveforms(); @@ -454,7 +455,11 @@ public: } void setHistogramListener (HistogramListener *h) override { + if (hListener) { + hListener->setObservable(nullptr); + } hListener = h; + h->setObservable(this); } void setAutoCamListener (AutoCamListener* acl) override { @@ -555,6 +560,8 @@ public: } denoiseInfoStore; + void updateHistogram() override; + void updateWaveform() override; }; } diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 30fa2ec67..4121b4f49 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -302,6 +302,8 @@ public: virtual void sizeChanged(int w, int h, int ow, int oh) = 0; }; +class HistogramObservable; + /** This listener is used when the histogram of the final image has changed. */ class HistogramListener { @@ -334,6 +336,21 @@ public: const int waveformGreen[][256], const int waveformBlue[][256] ) = 0; + /** Tells which observable is notifying the listener. */ + virtual void setObservable(HistogramObservable* observable) = 0; + /** Returns if the listener wants the histogram to be updated. */ + virtual bool updateHistogram(void) = 0; + /** Returns if the listener wants the waveform to be updated. */ + virtual bool updateWaveform(void) = 0; +}; + +class HistogramObservable +{ +public: + /** Tells the observable to update the histogram data. */ + virtual void updateHistogram() = 0; + /** Tells the observable to update the waveform data. */ + virtual void updateWaveform() = 0; }; /** This listener is used when the auto exposure has been recomputed (e.g. when the clipping ratio changed). */ diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 28747e063..5bf3e54d8 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -470,7 +470,8 @@ EditorPanel::EditorPanel (FilePanel* filePanel) iBeforeLockON (nullptr), iBeforeLockOFF (nullptr), previewHandler (nullptr), beforePreviewHandler (nullptr), beforeIarea (nullptr), beforeBox (nullptr), afterBox (nullptr), beforeLabel (nullptr), afterLabel (nullptr), beforeHeaderBox (nullptr), afterHeaderBox (nullptr), parent (nullptr), parentWindow (nullptr), openThm (nullptr), - selectedFrame(0), isrc (nullptr), ipc (nullptr), beforeIpc (nullptr), err (0), isProcessing (false) + selectedFrame(0), isrc (nullptr), ipc (nullptr), beforeIpc (nullptr), err (0), isProcessing (false), + histogram_observable(nullptr), histogram_scope_type(HistogramPanelListener::NONE) { epih = new EditorPanelIdleHelper; @@ -2260,6 +2261,40 @@ void EditorPanel::histogramChanged( tpc->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); } +void EditorPanel::setObservable(rtengine::HistogramObservable* observable) +{ + histogram_observable = observable; +} + +bool EditorPanel::updateHistogram(void) +{ + return histogram_scope_type == HistogramPanelListener::HISTOGRAM + || histogram_scope_type == HistogramPanelListener::NONE; +} + +bool EditorPanel::updateWaveform(void) +{ + return histogram_scope_type == HistogramPanelListener::WAVEFORM + || histogram_scope_type == HistogramPanelListener::NONE; +} + +void EditorPanel::scopeTypeChanged(ScopeType new_type) +{ + histogram_scope_type = new_type; + + if (!histogram_observable) { + return; + } + + // Make sure the new scope is updated since we only actively update the + // current scope. + if (new_type == HistogramPanelListener::HISTOGRAM) { + histogram_observable->updateHistogram(); + } else if (new_type == HistogramPanelListener::WAVEFORM) { + histogram_observable->updateWaveform(); + } +} + bool EditorPanel::CheckSidePanelsVisibility() { if (tbTopPanel_1) { @@ -2376,6 +2411,10 @@ void EditorPanel::updateHistogramPosition (int oldPosition, int newPosition) break; } + if (histogramPanel) { + histogramPanel->setPanelListener(this); + } + iareapanel->imageArea->setPointerMotionHListener (histogramPanel); } diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 6a1fb585f..1794de11b 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -55,6 +55,7 @@ class EditorPanel final : public ThumbnailListener, public HistoryBeforeLineListener, public rtengine::HistogramListener, + public HistogramPanelListener, public rtengine::NonCopyable { public: @@ -133,6 +134,12 @@ public: const int waveformGreen[][256], const int waveformBlue[][256] ) override; + void setObservable(rtengine::HistogramObservable* observable) override; + bool updateHistogram(void) override; + bool updateWaveform(void) override; + + // HistogramPanelListener + void scopeTypeChanged(ScopeType new_type) override; // event handlers void info_toggled (); @@ -265,4 +272,7 @@ private: bool isProcessing; IdleRegister idle_register; + + rtengine::HistogramObservable* histogram_observable; + ScopeType histogram_scope_type; }; diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 8c2d971eb..d3d92880d 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -32,7 +32,7 @@ using namespace rtengine; // // // HistogramPanel -HistogramPanel::HistogramPanel () +HistogramPanel::HistogramPanel () : panel_listener(nullptr) { setExpandAlignProperties(this, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); set_name("HistogramPanel"); @@ -355,12 +355,20 @@ void HistogramPanel::type_changed() showRAW->set_sensitive(); showMode->set_sensitive(); histogramRGBArea = histogramRGBAreaHori.get(); + if (panel_listener) { + updateHistAreaOptions(); + panel_listener->scopeTypeChanged(HistogramPanelListener::HISTOGRAM); + } } else { showValue->set_sensitive(false); showChro->set_sensitive(false); showRAW->set_sensitive(false); showMode->set_sensitive(false); histogramRGBArea = histogramRGBAreaVert.get(); + if (panel_listener) { + updateHistAreaOptions(); + panel_listener->scopeTypeChanged(HistogramPanelListener::WAVEFORM); + } } if (showBAR->get_active()) { @@ -383,7 +391,8 @@ void HistogramPanel::bar_toggled () void HistogramPanel::rgbv_toggled () { // Update Display - histogramArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showChro->get_active(), showRAW->get_active(), options.histogramDrawMode, options.histogramScopeType); + updateHistAreaOptions(); + histogramArea->updateBackBuffer (); histogramArea->queue_draw (); histogramRGBArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showChro->get_active(), showRAW->get_active(), showBAR->get_active()); @@ -441,6 +450,35 @@ void HistogramPanel::toggleButtonMode () showMode->set_image(*mode2Image); } +void HistogramPanel::setPanelListener(HistogramPanelListener* listener) +{ + panel_listener = listener; + + if (listener) { + HistogramPanelListener::ScopeType type; + if (options.histogramScopeType == 0) { + type = HistogramPanelListener::HISTOGRAM; + } else { + type = HistogramPanelListener::WAVEFORM; + } + listener->scopeTypeChanged(type); + } +} + +void HistogramPanel::updateHistAreaOptions() +{ + histogramArea->updateOptions( + showRed->get_active(), + showGreen->get_active(), + showBlue->get_active(), + showValue->get_active(), + showChro->get_active(), + showRAW->get_active(), + options.histogramDrawMode, + options.histogramScopeType + ); +} + // // // @@ -775,7 +813,7 @@ void HistogramRGBAreaVert::get_preferred_width_for_height_vfunc (int height, int // // HistogramArea HistogramArea::HistogramArea (DrawModeListener *fml) : - waveform_width(0), + waveform_width(0), wave_buffer_dirty(true), valid(false), drawMode(options.histogramDrawMode), myDrawModeListener(fml), scopeType(options.histogramScopeType), oldwidth(-1), oldheight(-1), @@ -854,7 +892,7 @@ void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool options.histogramDrawMode = drawMode = mode; options.histogramScopeType = scopeType = type; - updateBackBuffer (); + wave_buffer_dirty = true; } void HistogramArea::update( @@ -874,27 +912,31 @@ void HistogramArea::update( ) { if (histRed) { - rhist = histRed; - ghist = histGreen; - bhist = histBlue; - lhist = histLuma; - chist = histChroma; - rhistRaw = histRedRaw; - ghistRaw = histGreenRaw; - bhistRaw = histBlueRaw; - waveform_scale = waveformScale; - if (waveform_width != waveformWidth) { - waveform_width = waveformWidth; - rwave.reset(new int[waveformWidth][256]); - gwave.reset(new int[waveformWidth][256]); - bwave.reset(new int[waveformWidth][256]); + if (scopeType == 0) { + rhist = histRed; + ghist = histGreen; + bhist = histBlue; + lhist = histLuma; + chist = histChroma; + rhistRaw = histRedRaw; + ghistRaw = histGreenRaw; + bhistRaw = histBlueRaw; + } else if (scopeType == 1) { + waveform_scale = waveformScale; + if (waveform_width != waveformWidth) { + waveform_width = waveformWidth; + rwave.reset(new int[waveformWidth][256]); + gwave.reset(new int[waveformWidth][256]); + bwave.reset(new int[waveformWidth][256]); + } + int (* const rw)[256] = rwave.get(); + int (* const gw)[256] = gwave.get(); + int (* const bw)[256] = bwave.get(); + memcpy(rw, waveformRed, 256 * waveformWidth * sizeof(rw[0][0])); + memcpy(gw, waveformGreen, 256 * waveformWidth * sizeof(gw[0][0])); + memcpy(bw, waveformBlue, 256 * waveformWidth * sizeof(bw[0][0])); + wave_buffer_dirty = true; } - int (* const rw)[256] = rwave.get(); - int (* const gw)[256] = gwave.get(); - int (* const bw)[256] = bwave.get(); - memcpy(rw, waveformRed, 256 * waveformWidth * sizeof(rw[0][0])); - memcpy(gw, waveformGreen, 256 * waveformWidth * sizeof(gw[0][0])); - memcpy(bw, waveformBlue, 256 * waveformWidth * sizeof(bw[0][0])); valid = true; } else { valid = false; @@ -1185,31 +1227,35 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h // See Cairo documentation on stride. const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, waveform_width); - std::unique_ptr buffer(new unsigned char[256 * cairo_stride]); - // Clear waveform. - memset(buffer.get(), 0, 256 * cairo_stride); + if (wave_buffer_dirty) { + wave_buffer.reset(new unsigned char[256 * cairo_stride]); - // TODO: Optimize. - for (int col = 0; col < waveform_width; col++) { - for (int val = 0; val < 256; val++) { - const float r = needRed ? scale * rwave[col][255 - val] : 0.f; - const float g = needGreen ? scale * gwave[col][255 - val] : 0.f; - const float b = needBlue ? scale * bwave[col][255 - val] : 0.f; - const float value = (r > g && r > b) ? r : ((g > b) ? g : b); - if (value <= 0) { - buffer[val * cairo_stride + col * 4 + 3] = 0; - } else { - buffer[val * cairo_stride + col * 4 + 3] = value; - buffer[val * cairo_stride + col * 4 + 2] = r; - buffer[val * cairo_stride + col * 4 + 1] = g; - buffer[val * cairo_stride + col * 4] = b; + // Clear waveform. + memset(wave_buffer.get(), 0, 256 * cairo_stride); + + // TODO: Optimize. + for (int col = 0; col < waveform_width; col++) { + for (int val = 0; val < 256; val++) { + const unsigned char r = needRed ? scale * rwave[col][val] : 0; + const unsigned char g = needGreen ? scale * gwave[col][val] : 0; + const unsigned char b = needBlue ? scale * bwave[col][val] : 0; + const unsigned char value = (r > g && r > b) ? r : ((g > b) ? g : b); + if (value <= 0) { + *(uint32_t*)&(wave_buffer[(255 - val) * cairo_stride + col * 4]) = 0; + } else { + // Speedup with one memory access instead of four. + *(uint32_t*)&(wave_buffer[(255 - val) * cairo_stride + col * 4]) = + b | (g << 8) | (r << 16) | (value << 24); + } } } + + wave_buffer_dirty = false; } Cairo::RefPtr surface = Cairo::ImageSurface::create( - buffer.get(), Cairo::FORMAT_ARGB32, waveform_width, 256, cairo_stride); + wave_buffer.get(), Cairo::FORMAT_ARGB32, waveform_width, 256, cairo_stride); auto orig_matrix = cr->get_matrix(); cr->translate(0, padding); cr->scale(static_cast(w) / waveform_width, (h - 2 * padding) / 256.0); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index f97d5188b..83099c68e 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -159,6 +159,8 @@ protected: int waveform_scale; int waveform_width; std::unique_ptr rwave, gwave, bwave; + std::unique_ptr wave_buffer; + bool wave_buffer_dirty; bool valid; int drawMode; @@ -214,6 +216,14 @@ private: void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; }; +class HistogramPanelListener +{ +public: + enum ScopeType {HISTOGRAM, WAVEFORM, NONE}; + + virtual void scopeTypeChanged(ScopeType new_type) = 0; +}; + class HistogramPanel final : public Gtk::Grid, public PointerMotionListener, public DrawModeListener, public rtengine::NonCopyable { @@ -255,9 +265,12 @@ protected: Gtk::Image *mode1Image; Gtk::Image *mode2Image; + HistogramPanelListener* panel_listener; + sigc::connection rconn; void setHistInvalid (); void showRGBBar(); + void updateHistAreaOptions(); public: @@ -304,4 +317,6 @@ public: // drawModeListener interface void toggleButtonMode () override; + + void setPanelListener(HistogramPanelListener* listener); }; From 1e73135d51938c5bc9731ab20ccc0a2124bfc523 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Fri, 31 Jul 2020 21:58:00 -0700 Subject: [PATCH 035/185] Add perspective edit button to toolbar The perspective control lines edit mode no longer piggybacks on the hand tool button on the toolbar. --- rtdata/languages/default | 1 + rtgui/cropwindow.cc | 7 ++-- rtgui/perspective.cc | 25 +++++++++++++ rtgui/perspective.h | 15 ++++++++ rtgui/toolbar.cc | 77 +++++++++++++++++++++++++++++++++++++++- rtgui/toolbar.h | 5 +++ rtgui/toolenum.h | 2 +- rtgui/toolpanelcoord.cc | 33 +++++++++++++++++ rtgui/toolpanelcoord.h | 5 +++ 9 files changed, 165 insertions(+), 5 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 9a3402f5f..08c74cc7a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1807,6 +1807,7 @@ THRESHOLDSELECTOR_TR;Top-right TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop using Shift+mouse drag. TOOLBAR_TOOLTIP_HAND;Hand tool.\nShortcut: h +TOOLBAR_TOOLTIP_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image preview. Angle of rotation will be shown next to the guide line. Center of rotation is the geometrical center of the image. TOOLBAR_TOOLTIP_WB;Spot white balance.\nShortcut: w TP_BWMIX_ALGO;Algorithm OYCPM diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index 975bac15c..a862ed122 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -414,7 +414,8 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) action_y = 0; needRedraw = true; } - } else if (iarea->getToolMode () == TMHand + } else if ((iarea->getToolMode () == TMHand + || iarea->getToolMode() == TMPerspective) && editSubscriber && cropgl && cropgl->inImageArea(iarea->posImage.x, iarea->posImage.y) @@ -429,7 +430,7 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) state = SEditPick1; pickedObject = iarea->getObject(); pickModifierKey = bstate; - } else { + } else if (iarea->getToolMode() == TMPerspective) { state = SCropImgMove; } press_x = x; @@ -594,7 +595,7 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) } } } else if (button == 3) { - if (iarea->getToolMode () == TMHand) { + if (iarea->getToolMode () == TMHand || iarea->getToolMode() == TMPerspective) { EditSubscriber *editSubscriber = iarea->getCurrSubscriber(); if (editSubscriber && editSubscriber->getEditingType() == ET_OBJECTS) { needRedraw = editSubscriber->button3Pressed(bstate); diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index 395729adb..55013ec4a 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -108,6 +108,7 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" EvPerspControlLines = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_CTRL_LINE"); lens_geom_listener = nullptr; + panel_listener = nullptr; metadata = nullptr; Gtk::Image* ipers_draw(new RTImage ("draw.png")); @@ -613,6 +614,17 @@ void PerspCorrection::setAdjusterBehavior (bool badd, bool camera_focal_length_a projection_yaw->setAddMode(projection_angle_add); } +void PerspCorrection::setControlLineEditMode(bool active) +{ + // Only camera-based mode supports control lines, so the mode must be + // switched if not in camera-based mode. + if (method->get_active_row_number() != 1) { + method->set_active(1); + } + + lines_button_edit->set_active(active); +} + void PerspCorrection::setMetadata (const rtengine::FramesMetaData* metadata) { this->metadata = metadata; @@ -748,6 +760,9 @@ void PerspCorrection::linesEditButtonPressed(void) lines_button_apply->set_sensitive(true); lines_button_erase->set_sensitive(true); setCamBasedEventsActive(false); + if (panel_listener) { + panel_listener->controlLineEditModeChanged(true); + } } else { // Leave edit mode. setCamBasedEventsActive(true); lines_button_apply->set_sensitive(false); @@ -758,6 +773,9 @@ void PerspCorrection::linesEditButtonPressed(void) } lines->setDrawMode(false); lines->setActive(false); + if (panel_listener) { + panel_listener->controlLineEditModeChanged(false); + } } } @@ -766,6 +784,13 @@ void PerspCorrection::linesEraseButtonPressed(void) lines->removeAll(); } +void PerspCorrection::requestApplyControlLines(void) +{ + if (lines_button_apply->is_sensitive()) { + linesApplyButtonPressed(); + } +} + void PerspCorrection::setCamBasedEventsActive(bool active) { if (active) { diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 0694ccb4e..6ba169b60 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -25,6 +25,14 @@ #include "lensgeomlistener.h" #include "toolpanel.h" +class PerspCorrectionPanelListener +{ +public: + virtual ~PerspCorrectionPanelListener() = default; + + virtual void controlLineEditModeChanged(bool active) = 0; +}; + class PerspCorrection final : public ToolParamBlock, public AdjusterListener, @@ -79,6 +87,7 @@ protected: rtengine::ProcEvent* event_persp_proj_rotate; rtengine::ProcEvent* event_persp_proj_angle; LensGeomListener* lens_geom_listener; + PerspCorrectionPanelListener* panel_listener; const rtengine::FramesMetaData* metadata; void applyControlLines (void); @@ -101,12 +110,18 @@ public: void linesEditButtonPressed (void); void linesEraseButtonPressed (void); void methodChanged (void); + void requestApplyControlLines(void); void setAdjusterBehavior (bool badd, bool camera_focal_length_add, bool camera_shift_add, bool camera_angle_add, bool projection_angle_add, bool projection_shift_add, bool projection_rotate_add); + void setControlLineEditMode(bool active); void setEditProvider (EditDataProvider* provider) override; void setLensGeomListener (LensGeomListener* listener) { lens_geom_listener = listener; } + void setPerspCorrectionPanelListener(PerspCorrectionPanelListener* listener) + { + panel_listener = listener; + } void setMetadata (const rtengine::FramesMetaData* metadata); void switchOffEditMode (void); void trimValues (rtengine::procparams::ProcParams* pp) override; diff --git a/rtgui/toolbar.cc b/rtgui/toolbar.cc index e642ae51b..5cdfc2787 100644 --- a/rtgui/toolbar.cc +++ b/rtgui/toolbar.cc @@ -77,6 +77,12 @@ ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(n pack_start (*straTool); + perspTool = Gtk::manage(new Gtk::ToggleButton()); + Gtk::Image* perspimg = Gtk::manage(new RTImage("perspective-vertical-bottom.png")); + perspTool->set_image(*perspimg); + perspTool->set_relief(Gtk::RELIEF_NONE); + pack_start(*perspTool); + handTool->set_active (true); current = TMHand; @@ -87,12 +93,14 @@ ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(n cpConn = colPickerTool->signal_button_press_event().connect_notify( sigc::mem_fun(*this, &ToolBar::colPicker_pressed)); cropConn = cropTool->signal_toggled().connect( sigc::mem_fun(*this, &ToolBar::crop_pressed)); straConn = straTool->signal_toggled().connect( sigc::mem_fun(*this, &ToolBar::stra_pressed)); + perspConn = perspTool->signal_toggled().connect( sigc::mem_fun(*this, &ToolBar::persp_pressed)); handTool->set_tooltip_markup (M("TOOLBAR_TOOLTIP_HAND")); wbTool->set_tooltip_markup (M("TOOLBAR_TOOLTIP_WB")); colPickerTool->set_tooltip_markup (M("TOOLBAR_TOOLTIP_COLORPICKER")); cropTool->set_tooltip_markup (M("TOOLBAR_TOOLTIP_CROP")); straTool->set_tooltip_markup (M("TOOLBAR_TOOLTIP_STRAIGHTEN")); + perspTool->set_tooltip_markup(M("TOOLBAR_TOOLTIP_PERSPECTIVE")); } // @@ -107,9 +115,10 @@ void ToolBar::setTool (ToolMode tool) ConnectionBlocker handBlocker(handConn); ConnectionBlocker straBlocker(straConn); ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); - stopEdit = tool == TMHand && handTool->get_active() && editingMode && !blockEdit; + stopEdit = tool == TMHand && (handTool->get_active() || (perspTool && perspTool->get_active())) && editingMode && !blockEdit; handTool->set_active (false); @@ -122,6 +131,9 @@ void ToolBar::setTool (ToolMode tool) if (colPickerTool) { colPickerTool->set_active (false); } + if (perspTool) { + perspTool->set_active(false); + } if (tool == TMHand) { handTool->set_active (true); @@ -138,6 +150,12 @@ void ToolBar::setTool (ToolMode tool) if (colPickerTool) { colPickerTool->set_active (true); } + } else if (tool == TMPerspective) { + if (perspTool) { + perspTool->set_active(true); + // Perspective is a hand tool, but has its own button. + handTool->set_image(*handimg); + } } current = tool; @@ -160,6 +178,7 @@ void ToolBar::startEditMode() ConnectionBlocker handBlocker(handConn); ConnectionBlocker straBlocker(straConn); ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); if (current != TMHand) { @@ -172,6 +191,9 @@ void ToolBar::startEditMode() cropTool->set_active (false); straTool->set_active (false); + if (perspTool) { + perspTool->set_active(false); + } current = TMHand; } handTool->set_active (true); @@ -204,6 +226,7 @@ void ToolBar::hand_pressed () ConnectionBlocker handBlocker(handConn); ConnectionBlocker straBlocker(straConn); ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); if (editingMode && !blockEdit) { @@ -222,6 +245,9 @@ void ToolBar::hand_pressed () cropTool->set_active (false); straTool->set_active (false); + if (perspTool) { + perspTool->set_active(false); + } handTool->set_active (true); if (current != TMHand) { @@ -244,6 +270,7 @@ void ToolBar::wb_pressed () ConnectionBlocker handBlocker(handConn); ConnectionBlocker straBlocker(straConn); ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); if (current != TMSpotWB) { @@ -256,6 +283,9 @@ void ToolBar::wb_pressed () handTool->set_active (false); cropTool->set_active (false); straTool->set_active (false); + if (perspTool) { + perspTool->set_active(false); + } if (colPickerTool) { colPickerTool->set_active(false); } @@ -288,6 +318,9 @@ void ToolBar::colPicker_pressed (GdkEventButton* event) wbTool->set_active (false); } straTool->set_active (false); + if (perspTool) { + perspTool->set_active(false); + } if (current != TMColorPicker) { // Disabling all other tools, enabling the Picker tool and entering the "visible pickers" mode @@ -359,6 +392,7 @@ void ToolBar::crop_pressed () ConnectionBlocker handBlocker(handConn); ConnectionBlocker straBlocker(straConn); ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); if (editingMode) { @@ -376,6 +410,9 @@ void ToolBar::crop_pressed () } straTool->set_active (false); + if (perspTool) { + perspTool->set_active(false); + } cropTool->set_active (true); if (current != TMCropSelect) { @@ -399,6 +436,7 @@ void ToolBar::stra_pressed () ConnectionBlocker handBlocker(handConn); ConnectionBlocker straBlocker(straConn); ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); if (editingMode) { @@ -416,6 +454,9 @@ void ToolBar::stra_pressed () } cropTool->set_active (false); + if (perspTool) { + perspTool->set_active(false); + } straTool->set_active (true); if (current != TMStraighten) { @@ -432,6 +473,35 @@ void ToolBar::stra_pressed () } } +void ToolBar::persp_pressed () +{ + if (listener && !perspTool->get_active()) { + listener->toolDeselected(TMPerspective); + return; + } + + // Unlike other modes, mode switching is handled by the perspective panel. + { + ConnectionBlocker handBlocker(handConn); + ConnectionBlocker straBlocker(straConn); + ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); + ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); + + if (editingMode) { + stopEditMode(); + if (listener) { + listener->editModeSwitchedOff(); + } + } + + } + + if (listener) { + listener->toolSelected(TMPerspective); + } +} + bool ToolBar::handleShortcutKey (GdkEventKey* event) { @@ -485,6 +555,11 @@ void ToolBar::setBatchMode() removeIfThere(this, colPickerTool, false); colPickerTool = nullptr; } + if (perspTool) { + perspConn.disconnect(); + removeIfThere(this, perspTool, false); + perspTool = nullptr; + } allowNoTool = true; switch (current) { diff --git a/rtgui/toolbar.h b/rtgui/toolbar.h index a4525019f..85a0c3345 100644 --- a/rtgui/toolbar.h +++ b/rtgui/toolbar.h @@ -30,6 +30,8 @@ class ToolBarListener public: virtual ~ToolBarListener() = default; + /// Callback when a tool is deselected. WARNING: Not yet called for most tools. + virtual void toolDeselected(ToolMode tool) = 0; /// Callback when a tool is selected virtual void toolSelected(ToolMode tool) = 0; @@ -51,6 +53,7 @@ private: void colPicker_pressed (GdkEventButton* event); void crop_pressed (); void stra_pressed (); + void persp_pressed (); bool showColorPickers(bool showCP); void switchColorPickersVisibility(); @@ -60,6 +63,7 @@ protected: Gtk::ToggleButton* colPickerTool; Gtk::ToggleButton* cropTool; Gtk::ToggleButton* straTool; + Gtk::ToggleButton* perspTool; ToolBarListener* listener; LockablePickerToolListener* pickerListener; ToolMode current; @@ -71,6 +75,7 @@ protected: sigc::connection cpConn; sigc::connection cropConn; sigc::connection straConn; + sigc::connection perspConn; public: ToolBar (); diff --git a/rtgui/toolenum.h b/rtgui/toolenum.h index c3bc873f1..424afca87 100644 --- a/rtgui/toolenum.h +++ b/rtgui/toolenum.h @@ -18,4 +18,4 @@ */ #pragma once -enum ToolMode {TMNone = -1, TMHand = 0, TMSpotWB = 1, TMCropSelect = 2, TMStraighten = 3, TMColorPicker = 4}; +enum ToolMode {TMNone = -1, TMHand = 0, TMSpotWB = 1, TMCropSelect = 2, TMStraighten = 3, TMColorPicker = 4, TMPerspective = 5}; diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index d25d6414d..1f4ccce06 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -282,6 +282,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favorit lensgeom->setLensGeomListener(this); rotate->setLensGeomListener(this); perspective->setLensGeomListener(this); + perspective->setPerspCorrectionPanelListener(this); distortion->setLensGeomListener(this); crop->setCropPanelListener(this); icm->setICMPanelListener(this); @@ -1045,6 +1046,17 @@ void ToolPanelCoordinator::cropSelectRequested() toolBar->setTool(TMCropSelect); } +void ToolPanelCoordinator::controlLineEditModeChanged(bool active) +{ + if (!ipc) { + return; + } + + if (active) { + toolBar->setTool(TMPerspective); + } +} + void ToolPanelCoordinator::saveInputICCReference(const Glib::ustring& fname, bool apply_wb) { if (ipc) { @@ -1172,6 +1184,13 @@ void ToolPanelCoordinator::updateTPVScrollbar(bool hide) updateVScrollbars(hide); } +void ToolPanelCoordinator::toolDeselected(ToolMode tool) +{ + if (tool == TMPerspective) { + perspective->requestApplyControlLines(); + } +} + void ToolPanelCoordinator::toolSelected(ToolMode tool) { GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected @@ -1216,6 +1235,20 @@ void ToolPanelCoordinator::toolSelected(ToolMode tool) break; } + case TMPerspective: { + toolBar->blockEditDeactivation(false); // To allow deactivating Locallab when switching to another tool using toolbar + perspective->setControlLineEditMode(true); + perspective->setExpanded(true); + bool isFavorite = checkFavorite(perspective); + if (!isFavorite) { + isFavorite = checkFavorite(lensgeom); + lensgeom->setExpanded(true); + } + toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(isFavorite ? *favoritePanelSW : *transformPanelSW)); + prevPage = toolPanelNotebook->get_nth_page(toolPanelNotebook->get_current_page()); // Updating prevPage as "signal_switch_page" event + break; + } + default: break; } diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 3889e786c..0dcee59eb 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -102,6 +102,7 @@ class ToolPanelCoordinator : public LensGeomListener, public SpotWBListener, public CropPanelListener, + public PerspCorrectionPanelListener, public ICMPanelListener, public ImageAreaToolListener, public rtengine::ImageTypeListener, @@ -323,6 +324,9 @@ public: // croppanellistener interface void cropSelectRequested () override; + // PerspCorrectionPanelListener interface + void controlLineEditModeChanged(bool active) override; + // icmpanellistener interface void saveInputICCReference(const Glib::ustring& fname, bool apply_wb) override; @@ -339,6 +343,7 @@ public: bool handleShortcutKey(GdkEventKey* event); // ToolBarListener interface + void toolDeselected(ToolMode tool) override; void toolSelected (ToolMode tool) override; void editModeSwitchedOff () final; From d4807891f0b506bd904637890ac86af712824af7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 1 Aug 2020 18:45:48 +0200 Subject: [PATCH 036/185] WIP: `DelayedConnection<>` --- rtgui/adjuster.cc | 114 ++++++++++++----------------- rtgui/adjuster.h | 7 +- rtgui/delayedconnection.h | 147 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 194 insertions(+), 74 deletions(-) create mode 100644 rtgui/delayedconnection.h diff --git a/rtgui/adjuster.cc b/rtgui/adjuster.cc index 142374213..bc02b0986 100644 --- a/rtgui/adjuster.cc +++ b/rtgui/adjuster.cc @@ -55,11 +55,12 @@ Adjuster::Adjuster ( imageIcon1(imgIcon1), automatic(nullptr), adjusterListener(nullptr), + spinChange(options.adjusterMinDelay, options.adjusterMaxDelay), + sliderChange(options.adjusterMinDelay, options.adjusterMaxDelay), editedCheckBox(nullptr), afterReset(false), blocked(false), addMode(false), - eventPending(false), vMin(vmin), vMax(vmax), vStep(vstep), @@ -155,8 +156,27 @@ Adjuster::Adjuster ( defaultVal = ctorDefaultVal = shapeValue(vdefault); editedState = defEditedState = Irrelevant; - sliderChange = slider->signal_value_changed().connect( sigc::mem_fun(*this, &Adjuster::sliderChanged) ); - spinChange = spin->signal_value_changed().connect( sigc::mem_fun(*this, &Adjuster::spinChanged), true); + spinChange.connect( + spin->signal_value_changed(), + sigc::mem_fun(*this, &Adjuster::spinChanged), + [this]() + { + sliderChange.block(true); + setSliderValue(addMode ? spin->get_value() : this->value2slider(spin->get_value())); + sliderChange.block(false); + } + ); + sliderChange.connect( + slider->signal_value_changed(), + sigc::mem_fun(*this, &Adjuster::sliderChanged), + [this]() + { + spinChange.block(); + const double v = shapeValue(getSliderValue()); + spin->set_value(addMode ? v : this->slider2value(v)); + spinChange.unblock(); + } + ); reset->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &Adjuster::resetPressed) ); show_all(); @@ -165,9 +185,8 @@ Adjuster::Adjuster ( Adjuster::~Adjuster () { - sliderChange.block(true); - spinChange.block(true); - delayConnection.block(true); + sliderChange.block(); + spinChange.block(); adjusterListener = nullptr; } @@ -211,8 +230,6 @@ void Adjuster::throwOnButtonRelease(bool throwOnBRelease) buttonReleaseSpin.disconnect(); } } - - eventPending = false; } void Adjuster::setDefault (double def) @@ -239,9 +256,7 @@ void Adjuster::sliderReleased (GdkEventButton* event) { if ((event != nullptr) && (event->button == 1)) { - if (delayConnection.connected()) { - delayConnection.disconnect(); - } + sliderChange.cancel(); notifyListener(); } @@ -251,9 +266,7 @@ void Adjuster::spinReleased (GdkEventButton* event) { if ((event != nullptr) && delay == 0) { - if (delayConnection.connected()) { - delayConnection.disconnect(); - } + spinChange.cancel(); notifyListener(); } @@ -308,7 +321,7 @@ double Adjuster::shapeValue (double a) const void Adjuster::setLimits (double vmin, double vmax, double vstep, double vdefault) { sliderChange.block(true); - spinChange.block(true); + spinChange.block(); double pow10 = vstep; for (digits = 0; std::fabs(pow10 - floor(pow10)) > 0.000000000001; digits++, pow10 *= 10.0); @@ -326,7 +339,7 @@ void Adjuster::setLimits (double vmin, double vmax, double vstep, double vdefaul setSliderValue(addMode ? shapeVal : value2slider(shapeVal)); sliderChange.block(false); - spinChange.block(false); + spinChange.unblock(); } void Adjuster::setAddMode(bool addM) @@ -353,29 +366,13 @@ void Adjuster::setAddMode(bool addM) void Adjuster::spinChanged () { - if (delayConnection.connected()) { - delayConnection.disconnect(); - } - - sliderChange.block(true); - setSliderValue(addMode ? spin->get_value() : value2slider(spin->get_value())); - sliderChange.block(false); - - if (delay == 0) { - if (adjusterListener && !blocked) { - if (!buttonReleaseSlider.connected() || afterReset) { - eventPending = false; - if (automatic) { - setAutoValue(false); - } - adjusterListener->adjusterChanged(this, spin->get_value()); - } else { - eventPending = true; + if (adjusterListener && !blocked) { + if (!buttonReleaseSlider.connected() || afterReset) { + if (automatic) { + setAutoValue(false); } + adjusterListener->adjusterChanged(this, spin->get_value()); } - } else { - eventPending = true; - delayConnection = Glib::signal_timeout().connect(sigc::mem_fun(*this, &Adjuster::notifyListener), delay); } if (editedState == UnEdited) { @@ -393,31 +390,13 @@ void Adjuster::spinChanged () void Adjuster::sliderChanged () { - - if (delayConnection.connected()) { - delayConnection.disconnect(); - } - - spinChange.block(true); - const double v = shapeValue(getSliderValue()); - spin->set_value(addMode ? v : slider2value(v)); - spinChange.block(false); - - if (delay == 0 || afterReset) { - if (adjusterListener && !blocked) { - if (!buttonReleaseSlider.connected() || afterReset) { - eventPending = false; - if (automatic) { - setAutoValue(false); - } - adjusterListener->adjusterChanged(this, spin->get_value()); - } else { - eventPending = true; + if (adjusterListener && !blocked) { + if (!buttonReleaseSlider.connected() || afterReset) { + if (automatic) { + setAutoValue(false); } + adjusterListener->adjusterChanged(this, spin->get_value()); } - } else { - eventPending = true; - delayConnection = Glib::signal_timeout().connect(sigc::mem_fun(*this, &Adjuster::notifyListener), delay); } if (!afterReset && editedState == UnEdited) { @@ -435,12 +414,12 @@ void Adjuster::sliderChanged () void Adjuster::setValue (double a) { - spinChange.block(true); + spinChange.block(); sliderChange.block(true); spin->set_value(shapeValue(a)); setSliderValue(addMode ? shapeValue(a) : value2slider(shapeValue(a))); sliderChange.block(false); - spinChange.block(false); + spinChange.unblock(); afterReset = false; } @@ -455,16 +434,13 @@ void Adjuster::setAutoValue (bool a) bool Adjuster::notifyListener () { - - if (eventPending && adjusterListener != nullptr && !blocked) { + if (adjusterListener != nullptr && !blocked) { if (automatic) { setAutoValue(false); } adjusterListener->adjusterChanged(this, spin->get_value()); } - eventPending = false; - return false; } @@ -555,8 +531,6 @@ void Adjuster::editedToggled () } adjusterListener->adjusterChanged(this, spin->get_value()); } - - eventPending = false; } void Adjuster::trimValue (double &val) const @@ -636,7 +610,7 @@ void Adjuster::setSliderValue(double val) void Adjuster::setLogScale(double base, double pivot, bool anchorMiddle) { - spinChange.block(true); + spinChange.block(); sliderChange.block(true); const double cur = getSliderValue(); @@ -646,7 +620,7 @@ void Adjuster::setLogScale(double base, double pivot, bool anchorMiddle) setSliderValue(cur); sliderChange.block(false); - spinChange.block(false); + spinChange.unblock(); } bool Adjuster::getAutoValue() const diff --git a/rtgui/adjuster.h b/rtgui/adjuster.h index 143268786..cb32ea515 100644 --- a/rtgui/adjuster.h +++ b/rtgui/adjuster.h @@ -19,6 +19,7 @@ #pragma once #include "editedstate.h" +#include "delayedconnection.h" #include "guiutils.h" class Adjuster; @@ -46,9 +47,8 @@ protected: Gtk::Button* reset; Gtk::CheckButton* automatic; AdjusterListener* adjusterListener; - sigc::connection delayConnection; - sigc::connection spinChange; - sigc::connection sliderChange; + DelayedConnection<> spinChange; + DelayedConnection<> sliderChange; sigc::connection editedChange; sigc::connection autoChange; sigc::connection buttonReleaseSlider; @@ -62,7 +62,6 @@ protected: bool afterReset; bool blocked; bool addMode; - bool eventPending; double vMin; double vMax; double vStep; diff --git a/rtgui/delayedconnection.h b/rtgui/delayedconnection.h new file mode 100644 index 000000000..1e4bb92b8 --- /dev/null +++ b/rtgui/delayedconnection.h @@ -0,0 +1,147 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (C) 2020 Flössie + * + * RawTherapee 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. + * + * RawTherapee 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 RawTherapee. If not, see . + */ + +#pragma once + +#include +#include + +#include +#include + +template +class DelayedConnection final +{ +public: + DelayedConnection(unsigned int _min_delay_ms, unsigned int _max_delay_ms = 0) : + min_delay_ms(_min_delay_ms), + max_delay_ms(_max_delay_ms) + { + } + + void connect(Glib::SignalProxy signal, const sigc::slot& slot, const sigc::slot& immediate_slot = {}) + { + this->slot = slot; + this->immediate_slot = immediate_slot; + this->signal = signal.connect(sigc::mem_fun(*this, &DelayedConnection::onSignal)); + } + + void block(bool value = true) + { + signal.block(value); + min_timeout.block(value); + max_timeout.block(value); + } + + void unblock() + { + signal.unblock(); + min_timeout.unblock(); + max_timeout.unblock(); + } + + void cancel() + { + min_timeout.disconnect(); + max_timeout.disconnect(); + } + +private: + void onSignal(Ts... ts) + { + if (immediate_slot) { + immediate_slot(ts...); + } + + if (!min_delay_ms) { + slot(ts...); + return; + } + + params = std::make_tuple(ts...); + + min_timeout.disconnect(); + min_timeout = Glib::signal_timeout().connect(sigc::mem_fun(*this, &DelayedConnection::onMinTimeout), min_delay_ms); + + if (max_delay_ms && !max_timeout.connected()) { + max_timeout = Glib::signal_timeout().connect(sigc::mem_fun(*this, &DelayedConnection::onMaxTimeout), max_delay_ms); + } + } + + bool onMinTimeout() + { + max_timeout.disconnect(); + apply(params, slot); + return false; + } + + bool onMaxTimeout() + { + min_timeout.disconnect(); + apply(params, slot); + return false; + } + + // C++14 + + // See https://gist.github.com/ntessore/dc17769676fb3c6daa1f + template + struct index_sequence + { + }; + + template + struct make_index_sequence : + make_index_sequence + { + }; + + template + struct make_index_sequence<0, Is...> : + index_sequence + { + }; + + // C++17 + + // See https://aherrmann.github.io/programming/2016/02/28/unpacking-tuples-in-cpp14/ + template + constexpr void apply_impl(T t, F f, index_sequence) + { + f(std::get(t)...); + } + + template + constexpr void apply(T t, F f) + { + apply_impl(t, f, make_index_sequence{}>{}); + } + + const unsigned int min_delay_ms; + const unsigned int max_delay_ms; + + sigc::connection signal; + sigc::connection min_timeout; + sigc::connection max_timeout; + + sigc::slot slot; + sigc::slot immediate_slot; + + std::tuple params; +}; From b7738afe2277c84bb54a460d645436c5feea4877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 2 Aug 2020 11:20:10 +0200 Subject: [PATCH 037/185] Replace `Adjuster::delay` by `Adjuster::setDelay()` --- rtgui/adjuster.cc | 29 ++++++------ rtgui/adjuster.h | 19 +++++--- rtgui/bayerpreprocess.cc | 8 +--- rtgui/bayerprocess.cc | 33 ++++---------- rtgui/bayerrawexposure.cc | 16 ++----- rtgui/colorappearance.cc | 60 +++++++------------------ rtgui/colortoning.cc | 10 ++--- rtgui/delayedconnection.h | 13 +++++- rtgui/filmnegative.cc | 4 +- rtgui/flatfield.cc | 8 +--- rtgui/iccprofilecreator.cc | 10 ++--- rtgui/icmpanel.cc | 8 +--- rtgui/pdsharpening.cc | 8 ++-- rtgui/preprocess.cc | 4 +- rtgui/rawcacorrection.cc | 12 ++--- rtgui/rawexposure.cc | 4 +- rtgui/retinex.cc | 90 ++++++++------------------------------ rtgui/sharpenedge.cc | 8 +--- rtgui/xtransprocess.cc | 12 ++--- rtgui/xtransrawexposure.cc | 12 ++--- 20 files changed, 117 insertions(+), 251 deletions(-) diff --git a/rtgui/adjuster.cc b/rtgui/adjuster.cc index bc02b0986..6f8c0e83a 100644 --- a/rtgui/adjuster.cc +++ b/rtgui/adjuster.cc @@ -36,7 +36,7 @@ double one2one(double val) } } -Adjuster::Adjuster ( +Adjuster::Adjuster( Glib::ustring vlabel, double vmin, double vmax, @@ -45,10 +45,8 @@ Adjuster::Adjuster ( Gtk::Image *imgIcon1, Gtk::Image *imgIcon2, double2double_fun slider2value, - double2double_fun value2slider) - - : - + double2double_fun value2slider +) : adjustmentName(std::move(vlabel)), grid(nullptr), label(nullptr), @@ -68,8 +66,7 @@ Adjuster::Adjuster ( logPivot(0), logAnchorMiddle(false), value2slider(value2slider ? value2slider : &one2one), - slider2value(slider2value ? slider2value : &one2one), - delay(options.adjusterMinDelay) + slider2value(slider2value ? slider2value : &one2one) { set_hexpand(true); @@ -265,7 +262,7 @@ void Adjuster::sliderReleased (GdkEventButton* event) void Adjuster::spinReleased (GdkEventButton* event) { - if ((event != nullptr) && delay == 0) { + if (event) { spinChange.cancel(); notifyListener(); @@ -321,7 +318,7 @@ double Adjuster::shapeValue (double a) const void Adjuster::setLimits (double vmin, double vmax, double vstep, double vdefault) { sliderChange.block(true); - spinChange.block(); + spinChange.block(true); double pow10 = vstep; for (digits = 0; std::fabs(pow10 - floor(pow10)) > 0.000000000001; digits++, pow10 *= 10.0); @@ -339,7 +336,7 @@ void Adjuster::setLimits (double vmin, double vmax, double vstep, double vdefaul setSliderValue(addMode ? shapeVal : value2slider(shapeVal)); sliderChange.block(false); - spinChange.unblock(); + spinChange.block(false); } void Adjuster::setAddMode(bool addM) @@ -364,7 +361,7 @@ void Adjuster::setAddMode(bool addM) } } -void Adjuster::spinChanged () +void Adjuster::spinChanged() { if (adjusterListener && !blocked) { if (!buttonReleaseSlider.connected() || afterReset) { @@ -610,7 +607,7 @@ void Adjuster::setSliderValue(double val) void Adjuster::setLogScale(double base, double pivot, bool anchorMiddle) { - spinChange.block(); + spinChange.block(true); sliderChange.block(true); const double cur = getSliderValue(); @@ -620,7 +617,7 @@ void Adjuster::setLogScale(double base, double pivot, bool anchorMiddle) setSliderValue(cur); sliderChange.block(false); - spinChange.unblock(); + spinChange.block(false); } bool Adjuster::getAutoValue() const @@ -680,3 +677,9 @@ bool Adjuster::getAddMode() const { return addMode; } + +void Adjuster::setDelay(unsigned int min_delay_ms, unsigned int max_delay_ms) +{ + spinChange.setDelay(min_delay_ms, max_delay_ms); + sliderChange.setDelay(min_delay_ms, max_delay_ms); +} diff --git a/rtgui/adjuster.h b/rtgui/adjuster.h index cb32ea515..f26137f71 100644 --- a/rtgui/adjuster.h +++ b/rtgui/adjuster.h @@ -36,7 +36,6 @@ typedef double(*double2double_fun)(double val); class Adjuster final : public Gtk::Grid { - protected: Glib::ustring adjustmentName; Gtk::Grid* grid; @@ -77,11 +76,18 @@ protected: void setSliderValue(double val); public: - - int delay; - - Adjuster (Glib::ustring vlabel, double vmin, double vmax, double vstep, double vdefault, Gtk::Image *imgIcon1 = nullptr, Gtk::Image *imgIcon2 = nullptr, double2double_fun slider2value = nullptr, double2double_fun value2slider = nullptr); - ~Adjuster () override; + Adjuster( + Glib::ustring vlabel, + double vmin, + double vmax, + double vstep, + double vdefault, + Gtk::Image *imgIcon1 = nullptr, + Gtk::Image *imgIcon2 = nullptr, + double2double_fun slider2value = nullptr, + double2double_fun value2slider = nullptr + ); + ~Adjuster() override; // Add an "Automatic" checkbox next to the reset button. void addAutoButton(const Glib::ustring &tooltip = ""); @@ -126,4 +132,5 @@ public: void trimValue (float &val) const; void trimValue (int &val) const; void setLogScale(double base, double pivot, bool anchorMiddle = false); + void setDelay(unsigned int min_delay_ms, unsigned int max_delay_ms = 0); }; diff --git a/rtgui/bayerpreprocess.cc b/rtgui/bayerpreprocess.cc index 0c01213e7..2a1896d80 100644 --- a/rtgui/bayerpreprocess.cc +++ b/rtgui/bayerpreprocess.cc @@ -37,18 +37,14 @@ BayerPreProcess::BayerPreProcess() : FoldableToolPanel(this, "bayerpreprocess", lineDenoise = Gtk::manage(new Adjuster(M("TP_PREPROCESS_LINEDENOISE"), 0, 1000, 1, 0)); lineDenoise->setAdjusterListener(this); - if (lineDenoise->delay < options.adjusterMaxDelay) { - lineDenoise->delay = options.adjusterMaxDelay; - } + lineDenoise->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); lineDenoise->show(); greenEqThreshold = Gtk::manage(new Adjuster(M("TP_PREPROCESS_GREENEQUIL"), 0, 100, 1, 0)); greenEqThreshold->setAdjusterListener(this); - if (greenEqThreshold->delay < options.adjusterMaxDelay) { - greenEqThreshold->delay = options.adjusterMaxDelay; - } + greenEqThreshold->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); greenEqThreshold->show(); diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index 66053a338..07c3a9970 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -60,9 +60,7 @@ BayerProcess::BayerProcess () : dualDemosaicContrast->setAdjusterListener(this); dualDemosaicContrast->addAutoButton(M("TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP")); dualDemosaicContrast->setAutoValue(true); - if (dualDemosaicContrast->delay < options.adjusterMaxDelay) { - dualDemosaicContrast->delay = options.adjusterMaxDelay; - } + dualDemosaicContrast->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); dualDemosaicContrast->show(); dualDemosaicOptions->pack_start(*dualDemosaicContrast); @@ -72,9 +70,7 @@ BayerProcess::BayerProcess () : border = Gtk::manage(new Adjuster(M("TP_RAW_BORDER"), 0, 16, 1, 4)); border->setAdjusterListener (this); - if (border->delay < options.adjusterMaxDelay) { - border->delay = options.adjusterMaxDelay; - } + border->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); border->show(); borderbox->pack_start(*border); @@ -96,22 +92,17 @@ BayerProcess::BayerProcess () : ccSteps = Gtk::manage (new Adjuster (M("TP_RAW_FALSECOLOR"), 0, 5, 1, 0 )); ccSteps->setAdjusterListener (this); - if (ccSteps->delay < options.adjusterMaxDelay) { - ccSteps->delay = options.adjusterMaxDelay; - } + ccSteps->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); ccSteps->show(); pack_start( *ccSteps, Gtk::PACK_SHRINK, 4); - dcbOptions = Gtk::manage (new Gtk::VBox ()); dcbIterations = Gtk::manage (new Adjuster (M("TP_RAW_DCBITERATIONS"), 0, 5, 1, 2)); dcbIterations->setAdjusterListener (this); - if (dcbIterations->delay < options.adjusterMaxDelay) { - dcbIterations->delay = options.adjusterMaxDelay; - } + dcbIterations->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); dcbIterations->show(); dcbEnhance = Gtk::manage (new CheckBox(M("TP_RAW_DCBENHANCE"), multiImage)); @@ -126,9 +117,7 @@ BayerProcess::BayerProcess () : lmmseIterations->setAdjusterListener (this); lmmseIterations->set_tooltip_markup (M("TP_RAW_LMMSE_TOOLTIP")); - if (lmmseIterations->delay < options.adjusterMaxDelay) { - lmmseIterations->delay = options.adjusterMaxDelay; - } + lmmseIterations->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); lmmseIterations->show(); lmmseOptions->pack_start(*lmmseIterations); @@ -209,9 +198,7 @@ BayerProcess::BayerProcess () : pixelShiftSigma->set_tooltip_text (M("TP_RAW_PIXELSHIFTSIGMA_TOOLTIP")); pixelShiftSigma->setAdjusterListener (this); - if (pixelShiftSigma->delay < options.adjusterMaxDelay) { - pixelShiftSigma->delay = options.adjusterMaxDelay; - } + pixelShiftSigma->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); pixelShiftSigma->show(); pixelShiftOptions->pack_start(*pixelShiftSigma); @@ -221,9 +208,7 @@ BayerProcess::BayerProcess () : pixelShiftSmooth->set_tooltip_text (M("TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP")); pixelShiftSmooth->setAdjusterListener (this); - if (pixelShiftSmooth->delay < options.adjusterMaxDelay) { - pixelShiftSmooth->delay = options.adjusterMaxDelay; - } + pixelShiftSmooth->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); pixelShiftSmooth->show(); pixelShiftOptions->pack_start(*pixelShiftSmooth); @@ -232,9 +217,7 @@ BayerProcess::BayerProcess () : pixelShiftEperIso->set_tooltip_text(M("TP_RAW_PIXELSHIFTEPERISO_TOOLTIP")); pixelShiftEperIso->setAdjusterListener (this); - if (pixelShiftEperIso->delay < options.adjusterMaxDelay) { - pixelShiftEperIso->delay = options.adjusterMaxDelay; - } + pixelShiftEperIso->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); pixelShiftEperIso->show(); pixelShiftOptions->pack_start(*pixelShiftEperIso); diff --git a/rtgui/bayerrawexposure.cc b/rtgui/bayerrawexposure.cc index 9d8f9fff8..bb3c3a48a 100644 --- a/rtgui/bayerrawexposure.cc +++ b/rtgui/bayerrawexposure.cc @@ -31,33 +31,25 @@ BayerRAWExposure::BayerRAWExposure () : FoldableToolPanel(this, "bayerrawexposur PexBlack1 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_1"), -2048, 2048, 1.0, 0)); //black level PexBlack1->setAdjusterListener (this); - if (PexBlack1->delay < options.adjusterMaxDelay) { - PexBlack1->delay = options.adjusterMaxDelay; - } + PexBlack1->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlack1->show(); PexBlack2 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_2"), -2048, 2048, 1.0, 0)); //black level PexBlack2->setAdjusterListener (this); - if (PexBlack2->delay < options.adjusterMaxDelay) { - PexBlack2->delay = options.adjusterMaxDelay; - } + PexBlack2->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlack2->show(); PexBlack3 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_3"), -2048, 2048, 1.0, 0)); //black level PexBlack3->setAdjusterListener (this); - if (PexBlack3->delay < options.adjusterMaxDelay) { - PexBlack3->delay = options.adjusterMaxDelay; - } + PexBlack3->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlack3->show(); PexBlack0 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_0"), -2048, 2048, 1.0, 0)); //black level PexBlack0->setAdjusterListener (this); - if (PexBlack0->delay < options.adjusterMaxDelay) { - PexBlack0->delay = options.adjusterMaxDelay; - } + PexBlack0->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlack0->show(); PextwoGreen = Gtk::manage(new CheckBox(M("TP_RAWEXPOS_TWOGREEN"), multiImage));// two green diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index bdbe3de3a..934f922ae 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -244,9 +244,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" degree = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CIECAT_DEGREE"), 0., 100., 1., 90.)); - if (degree->delay < options.adjusterMaxDelay) { - degree->delay = options.adjusterMaxDelay; - } + degree->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); degree->throwOnButtonRelease(); degree->addAutoButton (M ("TP_COLORAPP_CAT02ADAPTATION_TOOLTIP")); @@ -325,9 +323,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" // adapscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ABSOLUTELUMINANCE"), 0.01, 16384., 0.001, 2000.)); // EV -7 ==> EV 17 adapscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ABSOLUTELUMINANCE"), MINLA0, MAXLA0, 0.01, 1997.4, NULL, NULL, &wbSlider2la, &wbla2Slider)); - if (adapscen->delay < options.adjusterMaxDelay) { - adapscen->delay = options.adjusterMaxDelay; - } + adapscen->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); adapscen->throwOnButtonRelease(); adapscen->addAutoButton(); @@ -335,9 +331,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" ybscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_MEANLUMINANCE"), 1, 90, 1, 18)); - if (ybscen->delay < options.adjusterMaxDelay) { - ybscen->delay = options.adjusterMaxDelay; - } + ybscen->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); ybscen->throwOnButtonRelease(); ybscen->addAutoButton(); @@ -386,9 +380,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" jlight = Gtk::manage (new Adjuster (M ("TP_COLORAPP_LIGHT"), -100.0, 100.0, 0.1, 0.)); - if (jlight->delay < options.adjusterMaxDelay) { - jlight->delay = options.adjusterMaxDelay; - } + jlight->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); jlight->throwOnButtonRelease(); jlight->set_tooltip_markup (M ("TP_COLORAPP_LIGHT_TOOLTIP")); @@ -396,9 +388,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" qbright = Gtk::manage (new Adjuster (M ("TP_COLORAPP_BRIGHT"), -100.0, 100.0, 0.1, 0.)); - if (qbright->delay < options.adjusterMaxDelay) { - qbright->delay = options.adjusterMaxDelay; - } + qbright->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); qbright->throwOnButtonRelease(); qbright->set_tooltip_markup (M ("TP_COLORAPP_BRIGHT_TOOLTIP")); @@ -406,9 +396,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" chroma = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CHROMA"), -100.0, 100.0, 0.1, 0.)); - if (chroma->delay < options.adjusterMaxDelay) { - chroma->delay = options.adjusterMaxDelay; - } + chroma->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); chroma->throwOnButtonRelease(); chroma->set_tooltip_markup (M ("TP_COLORAPP_CHROMA_TOOLTIP")); @@ -417,9 +405,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" schroma = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CHROMA_S"), -100.0, 100.0, 0.1, 0.)); - if (schroma->delay < options.adjusterMaxDelay) { - schroma->delay = options.adjusterMaxDelay; - } + schroma->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); schroma->throwOnButtonRelease(); schroma->set_tooltip_markup (M ("TP_COLORAPP_CHROMA_S_TOOLTIP")); @@ -427,9 +413,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" mchroma = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CHROMA_M"), -100.0, 100.0, 0.1, 0.)); - if (mchroma->delay < options.adjusterMaxDelay) { - mchroma->delay = options.adjusterMaxDelay; - } + mchroma->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); mchroma->throwOnButtonRelease(); mchroma->set_tooltip_markup (M ("TP_COLORAPP_CHROMA_M_TOOLTIP")); @@ -437,9 +421,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" rstprotection = Gtk::manage ( new Adjuster (M ("TP_COLORAPP_RSTPRO"), 0., 100., 0.1, 0.) ); - if (rstprotection->delay < options.adjusterMaxDelay) { - rstprotection->delay = options.adjusterMaxDelay; - } + rstprotection->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); rstprotection->throwOnButtonRelease(); rstprotection->set_tooltip_markup (M ("TP_COLORAPP_RSTPRO_TOOLTIP")); @@ -447,9 +429,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" contrast = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CONTRAST"), -100.0, 100.0, 0.1, 0.)); - if (contrast->delay < options.adjusterMaxDelay) { - contrast->delay = options.adjusterMaxDelay; - } + contrast->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); contrast->throwOnButtonRelease(); contrast->set_tooltip_markup (M ("TP_COLORAPP_CONTRAST_TOOLTIP")); @@ -457,9 +437,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" qcontrast = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CONTRAST_Q"), -100.0, 100.0, 0.1, 0.)); - if (qcontrast->delay < options.adjusterMaxDelay) { - qcontrast->delay = options.adjusterMaxDelay; - } + qcontrast->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); qcontrast->throwOnButtonRelease(); qcontrast->set_tooltip_markup (M ("TP_COLORAPP_CONTRAST_Q_TOOLTIP")); @@ -468,9 +446,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" colorh = Gtk::manage (new Adjuster (M ("TP_COLORAPP_HUE"), -100.0, 100.0, 0.1, 0.)); - if (colorh->delay < options.adjusterMaxDelay) { - colorh->delay = options.adjusterMaxDelay; - } + colorh->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); colorh->throwOnButtonRelease(); colorh->set_tooltip_markup (M ("TP_COLORAPP_HUE_TOOLTIP")); @@ -618,9 +594,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" // adaplum = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ABSOLUTELUMINANCE"), 0.1, 16384., 0.1, 16.)); adaplum = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ABSOLUTELUMINANCE"), MINLA0, MAXLA0, 0.01, 16, NULL, NULL, &wbSlider2la, &wbla2Slider)); - if (adaplum->delay < options.adjusterMaxDelay) { - adaplum->delay = options.adjusterMaxDelay; - } + adaplum->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); adaplum->throwOnButtonRelease(); adaplum->set_tooltip_markup (M ("TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP")); @@ -631,9 +605,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" degreeout = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CIECAT_DEGREE"), 0., 100., 1., 90.)); - if (degreeout->delay < options.adjusterMaxDelay) { - degreeout->delay = options.adjusterMaxDelay; - } + degreeout->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); degreeout->throwOnButtonRelease(); degreeout->addAutoButton (M ("TP_COLORAPP_CAT02ADAPTATION_TOOLTIP")); @@ -694,9 +666,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" */ badpixsl = Gtk::manage (new Adjuster (M ("TP_COLORAPP_BADPIXSL"), 0, 2, 1, 0)); - if (badpixsl->delay < options.adjusterMaxDelay) { - badpixsl->delay = options.adjusterMaxDelay; - } + badpixsl->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); badpixsl->throwOnButtonRelease(); badpixsl->set_tooltip_markup (M ("TP_COLORAPP_BADPIXSL_TOOLTIP")); diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index ddf917149..77bc31638 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -488,11 +488,11 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR pack_start(*labRegionBox, Gtk::PACK_EXPAND_WIDGET, 4); - labRegionSaturation->delay = options.adjusterMaxDelay; - labRegionSlope->delay = options.adjusterMaxDelay; - labRegionOffset->delay = options.adjusterMaxDelay; - labRegionPower->delay = options.adjusterMaxDelay; - labRegionMaskBlur->delay = options.adjusterMaxDelay; + labRegionSaturation->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + labRegionSlope->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + labRegionOffset->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + labRegionPower->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + labRegionMaskBlur->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); //------------------------------------------------------------------------ show_all(); diff --git a/rtgui/delayedconnection.h b/rtgui/delayedconnection.h index 1e4bb92b8..28c5f0421 100644 --- a/rtgui/delayedconnection.h +++ b/rtgui/delayedconnection.h @@ -62,6 +62,15 @@ public: max_timeout.disconnect(); } + void setDelay(unsigned int min_delay_ms, unsigned int max_delay_ms = 0) + { + this->min_delay_ms = min_delay_ms; + this->max_delay_ms = max_delay_ms; + + min_timeout.disconnect(); + max_timeout.disconnect(); + } + private: void onSignal(Ts... ts) { @@ -133,8 +142,8 @@ private: apply_impl(t, f, make_index_sequence{}>{}); } - const unsigned int min_delay_ms; - const unsigned int max_delay_ms; + unsigned int min_delay_ms; + unsigned int max_delay_ms; sigc::connection signal; sigc::connection min_timeout; diff --git a/rtgui/filmnegative.cc b/rtgui/filmnegative.cc index 1b105a3ec..d70c2a067 100644 --- a/rtgui/filmnegative.cc +++ b/rtgui/filmnegative.cc @@ -36,9 +36,7 @@ Adjuster* createExponentAdjuster(AdjusterListener* listener, const Glib::ustring adj->setAdjusterListener(listener); adj->setLogScale(6, 1, true); - if (adj->delay < options.adjusterMaxDelay) { - adj->delay = options.adjusterMaxDelay; - } + adj->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); adj->show(); return adj; diff --git a/rtgui/flatfield.cc b/rtgui/flatfield.cc index 7433fd4de..69d14c463 100644 --- a/rtgui/flatfield.cc +++ b/rtgui/flatfield.cc @@ -47,9 +47,7 @@ FlatField::FlatField () : FoldableToolPanel(this, "flatfield", M("TP_FLATFIELD_L flatFieldBlurRadius = Gtk::manage(new Adjuster (M("TP_FLATFIELD_BLURRADIUS"), 0, 200, 2, 32)); flatFieldBlurRadius->setAdjusterListener (this); - if (flatFieldBlurRadius->delay < options.adjusterMaxDelay) { - flatFieldBlurRadius->delay = options.adjusterMaxDelay; - } + flatFieldBlurRadius->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); flatFieldBlurRadius->show(); @@ -67,9 +65,7 @@ FlatField::FlatField () : FoldableToolPanel(this, "flatfield", M("TP_FLATFIELD_L flatFieldClipControl->setAdjusterListener(this); flatFieldClipControl->addAutoButton(""); - if (flatFieldClipControl->delay < options.adjusterMaxDelay) { - flatFieldClipControl->delay = options.adjusterMaxDelay; - } + flatFieldClipControl->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); flatFieldClipControl->show(); flatFieldClipControl->set_tooltip_markup (M("TP_FLATFIELD_CLIPCONTROL_TOOLTIP")); diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index c9639f70b..3f1ed4089 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -151,9 +151,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) aGamma = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_GAMMA"), 1, 3.5, 0.00001, 2.4)); setExpandAlignProperties(aGamma, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - if (aGamma->delay < options.adjusterMaxDelay) { - aGamma->delay = options.adjusterMaxDelay; - } + aGamma->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); aGamma->show(); mainGrid->attach(*aGamma, 1, 3, 1, 1); //gamma @@ -161,9 +159,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) aSlope = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_SLOPE"), 0, 15, 0.00001, 12.92310)); setExpandAlignProperties(aSlope, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - if (aSlope->delay < options.adjusterMaxDelay) { - aSlope->delay = options.adjusterMaxDelay; - } + aSlope->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); aSlope->show(); mainGrid->attach(*aSlope, 1, 4, 1, 1); //slope @@ -328,7 +324,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) close->signal_clicked().connect(sigc::mem_fun(*this, &ICCProfileCreator::closePressed)); get_action_area()->pack_start(*close); - //--------------- Show childrens + //--------------- Show children show_all_children(); diff --git a/rtgui/icmpanel.cc b/rtgui/icmpanel.cc index 3e3c0508c..920924c6c 100644 --- a/rtgui/icmpanel.cc +++ b/rtgui/icmpanel.cc @@ -214,13 +214,9 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha wGamma->setAdjusterListener(this); wSlope->setAdjusterListener(this); - if (wGamma->delay < options.adjusterMaxDelay) { - wGamma->delay = options.adjusterMaxDelay; - } + wGamma->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - if (wSlope->delay < options.adjusterMaxDelay) { - wSlope->delay = options.adjusterMaxDelay; - } + wSlope->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); wFrame->add(*wProfVBox); diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index 8bbf19620..1b98fd3ac 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -81,10 +81,10 @@ PdSharpening::PdSharpening() : dradiusOffset->setAdjusterListener(this); diter->setAdjusterListener(this); - contrast->delay = std::max(contrast->delay, options.adjusterMaxDelay); - dradius->delay = std::max(dradius->delay, options.adjusterMaxDelay); - dradiusOffset->delay = std::max(dradiusOffset->delay, options.adjusterMaxDelay); - diter->delay = std::max(diter->delay, options.adjusterMaxDelay); + contrast->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + dradius->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + dradiusOffset->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + diter->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); } PdSharpening::~PdSharpening() diff --git a/rtgui/preprocess.cc b/rtgui/preprocess.cc index 4a663ad07..f33a87a28 100644 --- a/rtgui/preprocess.cc +++ b/rtgui/preprocess.cc @@ -46,9 +46,7 @@ PreProcess::PreProcess () : FoldableToolPanel(this, "preprocess", M("TP_PREPROCE hdThreshold->set_tooltip_markup (M("TP_RAW_HD_TOOLTIP")); hdThreshold->setAdjusterListener (this); - if (hdThreshold->delay < options.adjusterMaxDelay) { - hdThreshold->delay = options.adjusterMaxDelay; - } + hdThreshold->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); hdThreshold->show(); pack_start( *hdThreshold, Gtk::PACK_SHRINK, 4); diff --git a/rtgui/rawcacorrection.cc b/rtgui/rawcacorrection.cc index 9e5c592ef..58c7995f9 100644 --- a/rtgui/rawcacorrection.cc +++ b/rtgui/rawcacorrection.cc @@ -47,24 +47,18 @@ RAWCACorr::RAWCACorr () : FoldableToolPanel(this, "rawcacorrection", M("TP_RAWCA caAutoiterations->setAdjusterListener (this); caAutoiterations->set_tooltip_markup(M("TP_RAWCACORR_AUTOIT_TOOLTIP")); - if (caAutoiterations->delay < options.adjusterMaxDelay) { - caAutoiterations->delay = options.adjusterMaxDelay; - } + caAutoiterations->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); caRed = Gtk::manage(new Adjuster (M("TP_RAWCACORR_CARED"), -4.0, 4.0, 0.1, 0, icaredL, icaredR)); caRed->setAdjusterListener (this); - if (caRed->delay < options.adjusterMaxDelay) { - caRed->delay = options.adjusterMaxDelay; - } + caRed->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); caRed->show(); caBlue = Gtk::manage(new Adjuster (M("TP_RAWCACORR_CABLUE"), -8.0, 8.0, 0.1, 0, icablueL, icablueR)); caBlue->setAdjusterListener (this); - if (caBlue->delay < options.adjusterMaxDelay) { - caBlue->delay = options.adjusterMaxDelay; - } + caBlue->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); caBlue->show(); diff --git a/rtgui/rawexposure.cc b/rtgui/rawexposure.cc index 7548bf4be..7b5ecabc9 100644 --- a/rtgui/rawexposure.cc +++ b/rtgui/rawexposure.cc @@ -33,9 +33,7 @@ RAWExposure::RAWExposure () : FoldableToolPanel(this, "rawexposure", M("TP_EXPOS PexPos = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_LINEAR"), 0.1, 16.0, 0.01, 1)); PexPos->setAdjusterListener (this); - if (PexPos->delay < options.adjusterMaxDelay) { - PexPos->delay = options.adjusterMaxDelay; - } + PexPos->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexPos->show(); pack_start( *PexPos, Gtk::PACK_SHRINK, 4);//exposi diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc index 2fdd8f319..48ec18cb2 100644 --- a/rtgui/retinex.cc +++ b/rtgui/retinex.cc @@ -488,112 +488,58 @@ Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL") str->setAdjusterListener (this); - - if (str->delay < 200) { - str->delay = 200; - } + str->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); scal->setAdjusterListener (this); - - if (scal->delay < 200) { - scal->delay = 200; - } + scal->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); iter->setAdjusterListener (this); - - if (iter->delay < 200) { - iter->delay = 200; - } + iter->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); grad->setAdjusterListener (this); - - if (grad->delay < 200) { - grad->delay = 200; - } + grad->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); grads->setAdjusterListener (this); - - if (grads->delay < 200) { - grads->delay = 200; - } + grads->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); gam->setAdjusterListener (this); - - if (gam->delay < 500) { - gam->delay = 500; - } + gam->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay) * 2.5f); slope->setAdjusterListener (this); - - if (slope->delay < 500) { - slope->delay = 500; - } + slope->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay) * 2.5f); neigh->setAdjusterListener (this); - - if (neigh->delay < 200) { - neigh->delay = 200; - } + neigh->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); offs->setAdjusterListener (this); - - if (offs->delay < 200) { - offs->delay = 200; - } + offs->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); vart->setAdjusterListener (this); - - if (vart->delay < 200) { - vart->delay = 200; - } + offs->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); limd->setAdjusterListener (this); - - if (limd->delay < 200) { - limd->delay = 200; - } + limd->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); highl->setAdjusterListener (this); - - if (highl->delay < 200) { - highl->delay = 200; - } + highl->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); radius->setAdjusterListener (this); - - if (radius->delay < 200) { - radius->delay = 200; - } + radius->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); highlights->setAdjusterListener (this); - - if (highlights->delay < 200) { - highlights->delay = 200; - } + highlights->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); h_tonalwidth->setAdjusterListener (this); - - if (h_tonalwidth->delay < 200) { - h_tonalwidth->delay = 200; - } + h_tonalwidth->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); shadows->setAdjusterListener (this); - - if (shadows->delay < 200) { - shadows->delay = 200; - } + shadows->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); s_tonalwidth->setAdjusterListener (this); - - if (s_tonalwidth->delay < 200) { - s_tonalwidth->delay = 200; - } + s_tonalwidth->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); skal->setAdjusterListener (this); - - if (skal->delay < 200) { - skal->delay = 200; - } + skal->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); disableListener(); retinexColorSpaceChanged(); diff --git a/rtgui/sharpenedge.cc b/rtgui/sharpenedge.cc index f4415bb15..552169fc1 100644 --- a/rtgui/sharpenedge.cc +++ b/rtgui/sharpenedge.cc @@ -36,16 +36,12 @@ SharpenEdge::SharpenEdge () : FoldableToolPanel(this, "sharpenedge", M("TP_SHARP passes = Gtk::manage(new Adjuster (M("TP_SHARPENEDGE_PASSES"), 1, 4, 1, 2)); passes->setAdjusterListener (this); - if (passes->delay < options.adjusterMaxDelay) { - passes->delay = options.adjusterMaxDelay; - } + passes->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); amount = Gtk::manage(new Adjuster (M("TP_SHARPENEDGE_AMOUNT"), 0, 100, 1, 50)); amount->setAdjusterListener (this); - if (amount->delay < options.adjusterMaxDelay) { - amount->delay = options.adjusterMaxDelay; - } + amount->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); threechannels = Gtk::manage(new Gtk::CheckButton((M("TP_SHARPENEDGE_THREE"))));// L + a + b threechannels->set_active (false); diff --git a/rtgui/xtransprocess.cc b/rtgui/xtransprocess.cc index a371bad88..db63c68be 100644 --- a/rtgui/xtransprocess.cc +++ b/rtgui/xtransprocess.cc @@ -79,9 +79,7 @@ XTransProcess::XTransProcess () : FoldableToolPanel(this, "xtransprocess", M("TP dualDemosaicContrast->addAutoButton(M("TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP")); dualDemosaicContrast->setAutoValue(true); - if (dualDemosaicContrast->delay < options.adjusterMaxDelay) { - dualDemosaicContrast->delay = options.adjusterMaxDelay; - } + dualDemosaicContrast->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); dualDemosaicContrast->show(); dualDemosaicOptions->pack_start(*dualDemosaicContrast); @@ -91,9 +89,7 @@ XTransProcess::XTransProcess () : FoldableToolPanel(this, "xtransprocess", M("TP border = Gtk::manage(new Adjuster(M("TP_RAW_BORDER"), 0, 16, 1, 7)); border->setAdjusterListener (this); - if (border->delay < options.adjusterMaxDelay) { - border->delay = options.adjusterMaxDelay; - } + border->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); border->show(); borderbox->pack_start(*border); @@ -103,9 +99,7 @@ XTransProcess::XTransProcess () : FoldableToolPanel(this, "xtransprocess", M("TP ccSteps = Gtk::manage (new Adjuster (M("TP_RAW_FALSECOLOR"), 0, 5, 1, 0 )); ccSteps->setAdjusterListener (this); - if (ccSteps->delay < options.adjusterMaxDelay) { - ccSteps->delay = options.adjusterMaxDelay; - } + ccSteps->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); ccSteps->show(); pack_start( *ccSteps, Gtk::PACK_SHRINK, 4); diff --git a/rtgui/xtransrawexposure.cc b/rtgui/xtransrawexposure.cc index 28059e69c..655a036c7 100644 --- a/rtgui/xtransrawexposure.cc +++ b/rtgui/xtransrawexposure.cc @@ -33,25 +33,19 @@ XTransRAWExposure::XTransRAWExposure () : FoldableToolPanel(this, "xtransrawexpo PexBlackRed = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_RED"), -2048, 2048, 1.0, 0)); //black level PexBlackRed->setAdjusterListener (this); - if (PexBlackRed->delay < options.adjusterMaxDelay) { - PexBlackRed->delay = options.adjusterMaxDelay; - } + PexBlackRed->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlackRed->show(); PexBlackGreen = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_GREEN"), -2048, 2048, 1.0, 0)); //black level PexBlackGreen->setAdjusterListener (this); - if (PexBlackGreen->delay < options.adjusterMaxDelay) { - PexBlackGreen->delay = options.adjusterMaxDelay; - } + PexBlackGreen->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlackGreen->show(); PexBlackBlue = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_BLUE"), -2048, 2048, 1.0, 0)); //black level PexBlackBlue->setAdjusterListener (this); - if (PexBlackBlue->delay < options.adjusterMaxDelay) { - PexBlackBlue->delay = options.adjusterMaxDelay; - } + PexBlackBlue->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlackBlue->show(); From fbe73614c3c3ab888c2db9fd92e1fed4b8617b70 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Mon, 3 Aug 2020 18:23:25 -0700 Subject: [PATCH 038/185] Add H-S and H-C vectorscopes --- rtdata/languages/default | 2 +- rtengine/improccoordinator.cc | 66 ++++++++++++- rtengine/improccoordinator.h | 8 +- rtengine/rtengine.h | 14 ++- rtgui/editorpanel.cc | 32 +++++- rtgui/editorpanel.h | 4 + rtgui/histogrampanel.cc | 177 ++++++++++++++++++++++++++++++++-- rtgui/histogrampanel.h | 18 +++- 8 files changed, 299 insertions(+), 22 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 307417524..069c87050 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -249,7 +249,7 @@ HISTOGRAM_TOOLTIP_L;Show/Hide CIELab luminance histogram. HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. HISTOGRAM_TOOLTIP_R;Show/Hide red histogram. HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. -HISTOGRAM_TOOLTIP_TYPE;Toggle between histogram and waveform. +HISTOGRAM_TOOLTIP_TYPE;Toggle between histogram, waveform, Hue-Saturation vectorscope, and Hue-Chroma vectorscope. HISTORY_CHANGED;Changed HISTORY_CUSTOMCURVE;Custom curve HISTORY_FROMCLIPBOARD;From clipboard diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 4927c4e1f..f19eff54d 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1643,6 +1643,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (hListener->updateHistogram()) { updateLRGBHistograms(); } + if (hListener->updateVectorscope()) { + updateVectorscope(); + } if (hListener->updateWaveform()) { updateWaveforms(); } @@ -1765,6 +1768,8 @@ void ImProcCoordinator::notifyHistogramChanged() histBlueRaw, histChroma, histLRETI, + vectorscopeScale, + vectorscope, waveformScale, waveformWidth, waveformRed.get(), @@ -1835,6 +1840,55 @@ void ImProcCoordinator::updateLRGBHistograms() } +void ImProcCoordinator::updateVectorscope() +{ + if (!workimg) { + return; + } + + int x1, y1, x2, y2; + params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); + + constexpr int size = HistogramListener::vectorscope_size; + memset(vectorscope, 0, size * size * sizeof(vectorscope[0][0])); + + for (int i = y1; i < y2; i++) { + int ofs = (i * pW + x1) * 3; + + for (int j = x1; j < x2; j++) { + switch (hListener->vectorscopeType()) { + case 0: { + // HS + int r = 256 * workimg->data[ofs++]; + int g = 256 * workimg->data[ofs++]; + int b = 256 * workimg->data[ofs++]; + float h, s, l; + Color::rgb2hsl(r, g, b, h, s, l); + const int col = s * cos(2 * RT_PI * h) * (size / 2) + size / 2; + const int row = s * sin(2 * RT_PI * h) * (size / 2) + size / 2; + if (col >= 0 && col < size && row >= 0 && row < size) { + vectorscope[row][col]++; + } + break; + } + + case 1: { + // CH + const int col = (size / 96000.0) * nprevl->a[i][j] + size / 2; + const int row = (size / 96000.0) * nprevl->b[i][j] + size / 2; + + if (col >= 0 && col < size && row >= 0 && row < size) { + vectorscope[row][col]++; + } + break; + } + } + } + } + + vectorscopeScale = workimg->getWidth() * workimg->getHeight(); +} + void ImProcCoordinator::updateWaveforms() { if (!workimg) { @@ -2314,7 +2368,7 @@ void ImProcCoordinator::setHighQualComputed() highQualityComputed = true; } -void ImProcCoordinator::updateWaveform() +void ImProcCoordinator::requestUpdateWaveform() { if (hListener) { updateWaveforms(); @@ -2322,7 +2376,7 @@ void ImProcCoordinator::updateWaveform() } } -void ImProcCoordinator::updateHistogram() +void ImProcCoordinator::requestUpdateHistogram() { if (hListener) { updateLRGBHistograms(); @@ -2330,4 +2384,12 @@ void ImProcCoordinator::updateHistogram() } } +void ImProcCoordinator::requestUpdateVectorscope() +{ + if (hListener) { + updateVectorscope(); + notifyHistogramChanged(); + } +} + } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 92b5e9346..14ee81934 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -126,6 +126,8 @@ protected: LUTu histBlue, histBlueRaw; LUTu histLuma, histToneCurve, histToneCurveBW, histLCurve, histCCurve; LUTu histLLCurve, histLCAM, histCCAM, histClad, bcabhist, histChroma, histLRETI; + int vectorscopeScale; + int vectorscope[HistogramListener::vectorscope_size][HistogramListener::vectorscope_size]; /// Waveform's intensity. Same as height of reference image. int waveformScale; int waveformWidth; @@ -202,6 +204,7 @@ protected: void notifyHistogramChanged(); void reallocAll(); void updateLRGBHistograms(); + void updateVectorscope(); void updateWaveforms(); void setScale(int prevscale); void updatePreviewImage (int todo, bool panningRelatedChange); @@ -560,8 +563,9 @@ public: } denoiseInfoStore; - void updateHistogram() override; - void updateWaveform() override; + void requestUpdateHistogram() override; + void requestUpdateVectorscope() override; + void requestUpdateWaveform() override; }; } diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 4121b4f49..49f858cdc 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -308,6 +308,8 @@ class HistogramObservable; class HistogramListener { public: + static constexpr int vectorscope_size = 128; + virtual ~HistogramListener() = default; /** This member function is called when the histogram of the final image has changed. * @param histRed is the array of size 256 containing the histogram of the red channel @@ -330,6 +332,8 @@ public: const LUTu& histBlueRaw, const LUTu& histChroma, const LUTu& histLRETI, + int vectorscopeScale, + const int vectorscope[vectorscope_size][vectorscope_size], int waveformScale, int waveformWidth, const int waveformRed[][256], @@ -340,17 +344,23 @@ public: virtual void setObservable(HistogramObservable* observable) = 0; /** Returns if the listener wants the histogram to be updated. */ virtual bool updateHistogram(void) = 0; + /** Returns if the listener wants the vectorscope to be updated. */ + virtual bool updateVectorscope(void) = 0; /** Returns if the listener wants the waveform to be updated. */ virtual bool updateWaveform(void) = 0; + /** Returns the vectorscope type: 0 for H-S and 1 for H-C. */ + virtual int vectorscopeType(void) = 0; }; class HistogramObservable { public: /** Tells the observable to update the histogram data. */ - virtual void updateHistogram() = 0; + virtual void requestUpdateHistogram() = 0; + /** Tells the observable to update the vectorscope data. */ + virtual void requestUpdateVectorscope() = 0; /** Tells the observable to update the waveform data. */ - virtual void updateWaveform() = 0; + virtual void requestUpdateWaveform() = 0; }; /** This listener is used when the auto exposure has been recomputed (e.g. when the clipping ratio changed). */ diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 5bf3e54d8..e52c9f47a 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -2247,6 +2247,8 @@ void EditorPanel::histogramChanged( const LUTu& histBlueRaw, const LUTu& histChroma, const LUTu& histLRETI, + int vectorscopeScale, + const int vectorscope[HistogramListener::vectorscope_size][HistogramListener::vectorscope_size], int waveformScale, int waveformWidth, const int waveformRed[][256], @@ -2255,7 +2257,7 @@ void EditorPanel::histogramChanged( ) { if (histogramPanel) { - histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, waveformScale, waveformWidth, waveformRed, waveformGreen, waveformBlue); + histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscope, waveformScale, waveformWidth, waveformRed, waveformGreen, waveformBlue); } tpc->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); @@ -2272,12 +2274,32 @@ bool EditorPanel::updateHistogram(void) || histogram_scope_type == HistogramPanelListener::NONE; } +bool EditorPanel::updateVectorscope(void) +{ + return + histogram_scope_type == HistogramPanelListener::VECTORSCOPE_HS + || histogram_scope_type == HistogramPanelListener::VECTORSCOPE_CH + || histogram_scope_type == HistogramPanelListener::NONE; +} + bool EditorPanel::updateWaveform(void) { return histogram_scope_type == HistogramPanelListener::WAVEFORM || histogram_scope_type == HistogramPanelListener::NONE; } +int EditorPanel::vectorscopeType(void) +{ + switch (histogram_scope_type) { + case HistogramPanelListener::VECTORSCOPE_HS: + return 0; + case HistogramPanelListener::VECTORSCOPE_CH: + return 1; + default: + return -1; + } +} + void EditorPanel::scopeTypeChanged(ScopeType new_type) { histogram_scope_type = new_type; @@ -2289,9 +2311,13 @@ void EditorPanel::scopeTypeChanged(ScopeType new_type) // Make sure the new scope is updated since we only actively update the // current scope. if (new_type == HistogramPanelListener::HISTOGRAM) { - histogram_observable->updateHistogram(); + histogram_observable->requestUpdateHistogram(); + } else if (new_type == HistogramPanelListener::VECTORSCOPE_HS) { + histogram_observable->requestUpdateVectorscope(); + } else if (new_type == HistogramPanelListener::VECTORSCOPE_CH) { + histogram_observable->requestUpdateVectorscope(); } else if (new_type == HistogramPanelListener::WAVEFORM) { - histogram_observable->updateWaveform(); + histogram_observable->requestUpdateWaveform(); } } diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 1794de11b..b9d196ccd 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -128,6 +128,8 @@ public: const LUTu& histBlueRaw, const LUTu& histChroma, const LUTu& histLRETI, + int vectorscopeScale, + const int vectorscope[HistogramListener::vectorscope_size][HistogramListener::vectorscope_size], int waveformScale, int waveformWidth, const int waveformRed[][256], @@ -136,7 +138,9 @@ public: ) override; void setObservable(rtengine::HistogramObservable* observable) override; bool updateHistogram(void) override; + bool updateVectorscope(void) override; bool updateWaveform(void) override; + int vectorscopeType(void) override; // HistogramPanelListener void scopeTypeChanged(ScopeType new_type) override; diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index d3d92880d..0967212d0 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -163,8 +163,12 @@ HistogramPanel::HistogramPanel () : panel_listener(nullptr) showMode->set_image(*mode2Image); if (options.histogramScopeType == 0) { // TODO: scopeType->set_image(*histImage); - } else { + } else if (options.histogramScopeType == 1) { // TODO: scopeType->set_image(*waveImage); + } else if (options.histogramScopeType == 2) { + // TODO: scopeType->set_image(*vectHsImage); + } else if (options.histogramScopeType == 3) { + // TODO: scopeType->set_image(*vectHcImage); } showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); @@ -254,7 +258,7 @@ void HistogramPanel::showRGBBar() gfxGrid->attach_next_to(*histogramRGBArea, *histogramArea, pos); setHistRGBInvalid(); - histogramRGBArea->setShow(true); + histogramRGBArea->setShow(options.histogramScopeType < 2); } void HistogramPanel::resized (Gtk::Allocation& req) @@ -331,12 +335,16 @@ void HistogramPanel::mode_released () void HistogramPanel::type_pressed() { - constexpr int TYPE_COUNT = 2; // Histogram and waveform. + constexpr int TYPE_COUNT = 4; // Histogram, waveform, and 2 vectorscopes. options.histogramScopeType = (options.histogramScopeType + 1) % TYPE_COUNT; if (options.histogramScopeType == 0) { // TODO: showMode->set_image(*histImage); - } else { + } else if (options.histogramScopeType == 1) { // TODO: showMode->set_image(*waveImage); + } else if (options.histogramScopeType == 2) { + // TODO: showMode->set_image(*vectHsImage); + } else if (options.histogramScopeType == 3) { + // TODO: showMode->set_image(*vectHcImage); } type_changed(); rgbv_toggled(); @@ -350,6 +358,9 @@ void HistogramPanel::type_changed() } if (options.histogramScopeType == 0) { + showRed->set_sensitive(); + showGreen->set_sensitive(); + showBlue->set_sensitive(); showValue->set_sensitive(!showRAW->get_active()); showChro->set_sensitive(!showRAW->get_active()); showRAW->set_sensitive(); @@ -359,7 +370,10 @@ void HistogramPanel::type_changed() updateHistAreaOptions(); panel_listener->scopeTypeChanged(HistogramPanelListener::HISTOGRAM); } - } else { + } else if (options.histogramScopeType == 1) { + showRed->set_sensitive(); + showGreen->set_sensitive(); + showBlue->set_sensitive(); showValue->set_sensitive(false); showChro->set_sensitive(false); showRAW->set_sensitive(false); @@ -369,6 +383,28 @@ void HistogramPanel::type_changed() updateHistAreaOptions(); panel_listener->scopeTypeChanged(HistogramPanelListener::WAVEFORM); } + } else { + showRed->set_sensitive(false); + showGreen->set_sensitive(false); + showBlue->set_sensitive(false); + showValue->set_sensitive(false); + showChro->set_sensitive(false); + showRAW->set_sensitive(false); + showMode->set_sensitive(false); + histogramRGBArea = histogramRGBAreaHori.get(); + if (panel_listener) { + updateHistAreaOptions(); + HistogramPanelListener::ScopeType type; + switch (options.histogramScopeType) { + case 2: + type = HistogramPanelListener::VECTORSCOPE_HS; + break; + case 3: + type = HistogramPanelListener::VECTORSCOPE_CH; + break; + } + panel_listener->scopeTypeChanged(type); + } } if (showBAR->get_active()) { @@ -395,7 +431,7 @@ void HistogramPanel::rgbv_toggled () histogramArea->updateBackBuffer (); histogramArea->queue_draw (); - histogramRGBArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showChro->get_active(), showRAW->get_active(), showBAR->get_active()); + histogramRGBArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showChro->get_active(), showRAW->get_active(), showBAR->get_active() && options.histogramScopeType < 2); histogramRGBArea->updateBackBuffer (0, 0, 0); histogramRGBArea->queue_draw (); } @@ -458,8 +494,14 @@ void HistogramPanel::setPanelListener(HistogramPanelListener* listener) HistogramPanelListener::ScopeType type; if (options.histogramScopeType == 0) { type = HistogramPanelListener::HISTOGRAM; - } else { + } else if (options.histogramScopeType == 1) { type = HistogramPanelListener::WAVEFORM; + } else if (options.histogramScopeType == 2) { + type = HistogramPanelListener::VECTORSCOPE_HS; + } else if (options.histogramScopeType == 3) { + type = HistogramPanelListener::VECTORSCOPE_CH; + } else { + type = HistogramPanelListener::NONE; } listener->scopeTypeChanged(type); } @@ -616,7 +658,7 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustrin drawBar(cc, b, 255.0, winw, winh, s); } - if((needLuma || needChroma) && options.histogramScopeType != 1) { + if((needLuma || needChroma) && options.histogramScopeType == 0) { float Lab_L, Lab_a, Lab_b; rtengine::Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, Lab_L, Lab_a, Lab_b, options.rtSettings.HistogramWorking); @@ -828,6 +870,9 @@ HistogramArea::HistogramArea (DrawModeListener *fml) : lhist(256); chist(256); + const int vect_size = VECTORSCOPE_SIZE * Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, VECTORSCOPE_SIZE); + vect_buffer.reset(new unsigned char[vect_size]); + get_style_context()->add_class("drawingarea"); set_name("HistogramArea"); @@ -904,6 +949,8 @@ void HistogramArea::update( const LUTu& histRedRaw, const LUTu& histGreenRaw, const LUTu& histBlueRaw, + int vectorscopeScale, + const int vectorscope[VECTORSCOPE_SIZE][VECTORSCOPE_SIZE], int waveformScale, int waveformWidth, const int waveformRed[][256], @@ -936,6 +983,11 @@ void HistogramArea::update( memcpy(gw, waveformGreen, 256 * waveformWidth * sizeof(gw[0][0])); memcpy(bw, waveformBlue, 256 * waveformWidth * sizeof(bw[0][0])); wave_buffer_dirty = true; + } else if (scopeType >= 2) { + vectorscope_scale = vectorscopeScale; + memcpy(vect, vectorscope, VECTORSCOPE_SIZE * VECTORSCOPE_SIZE * + sizeof(vect[0][0])); + vect_buffer_dirty = true; } valid = true; } else { @@ -1009,7 +1061,7 @@ void HistogramArea::updateBackBuffer () int nrOfVGridPartitions = 8; // always show 8 stops (lines at 1,3,7,15,31,63,127) // draw vertical gridlines - if (options.histogramScopeType != 1) { + if (options.histogramScopeType == 0) { for (int i = 0; i <= nrOfVGridPartitions; i++) { double xpos = padding + 0.5; if (options.histogramDrawMode < 2) { @@ -1031,6 +1083,8 @@ void HistogramArea::updateBackBuffer () cr->line_to(w, ypos); cr->stroke(); } + } else if (options.histogramScopeType >= 2) { + // Vectorscope has no gridlines. } else if (options.histogramDrawMode == 0) { for (int i = 1; i < nrOfHGridPartitions; i++) { cr->move_to (padding, i * (double)h / nrOfHGridPartitions + 0.5); @@ -1156,6 +1210,8 @@ void HistogramArea::updateBackBuffer () } else if (scopeType == 1 && waveform_width > 0) { drawWaveform(cr, w, h); + } else if (scopeType >= 2) { + drawVectorscope(cr, w, h); } // Draw the frame's border @@ -1220,6 +1276,107 @@ void HistogramArea::drawMarks(Cairo::RefPtr &cr, cr->fill(); } +void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, int h) +{ + // Arbitrary scale factor multiplied by vectorscope area and divided by + // current scale. + const float scale = 16.f * VECTORSCOPE_SIZE * VECTORSCOPE_SIZE / vectorscope_scale; + + // See Cairo documentation on stride. + const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, VECTORSCOPE_SIZE); + + if (vect_buffer_dirty && vectorscope_scale > 0) { + // TODO: Optimize. + for (int u = 0; u < VECTORSCOPE_SIZE; u++) { + for (int v = 0; v < VECTORSCOPE_SIZE; v++) { + const unsigned char value = LIM(scale * vect[u][v], 0, 0xff); + *(uint32_t*)&(vect_buffer[(VECTORSCOPE_SIZE - 1 - u) * cairo_stride + v * 4]) = + value | (value << 8) | (value << 16) | (value << 24); + } + } + + vect_buffer_dirty = false; + } + + const float scope_size = min(w, h) - 2 * padding; + const float o_x = (w - scope_size) / 2; + const float o_y = (h - scope_size) / 2; + const double s = RTScalable::getScale(); + auto orig_matrix = cr->get_matrix(); + const double line_spacing = 4.0 * s; + const double line_length = scope_size / 2.0 - 2.0 * line_spacing; + std::valarray ch_ds(1); + + cr->translate(w / 2.0, h / 2.0); + cr->set_source_rgba (1., 1., 1., 0.25); + cr->set_line_width (1.0 * s); + cr->set_antialias(Cairo::ANTIALIAS_SUBPIXEL); + ch_ds[0] = 4; + + if (scopeType == 2) { // Hue-Saturation. + // RYGCBM lines. + for (int i = 0; i < 6; i++) { + cr->move_to(line_spacing, 0); + cr->line_to(line_spacing + line_length, 0); + cr->rotate_degrees(60); + } + cr->stroke(); + // 100% saturation circle. + cr->arc(0, 0, scope_size / 2.0, 0, 2 * RT_PI); + cr->stroke(); + // 25%, 50%, and 75% saturation. + cr->set_dash(ch_ds, 0); + for (int i = 1; i < 4; i++) { + cr->arc(0, 0, i * scope_size / 8.0, 0, 2 * RT_PI); + cr->stroke(); + } + // HSV skin tone line derived from -I axis of YIQ. + cr->rotate(-0.134900 * RT_PI); + cr->move_to(line_spacing, 0); + cr->line_to(line_spacing + line_length, 0); + cr->stroke(); + cr->unset_dash(); + } else if (scopeType == 3) { // Hue-Chroma. + // a and b axes. + cr->move_to(0, line_spacing); + cr->line_to(0, line_spacing + line_length); + cr->move_to(0, -line_spacing); + cr->line_to(0, -line_spacing - line_length); + cr->move_to(line_spacing, 0); + cr->line_to(line_spacing + line_length, 0); + cr->move_to(-line_spacing, 0); + cr->line_to(-line_spacing - line_length, 0); + cr->stroke(); + // 25%, 50%, 75%, and 100% of standard chroma range. + cr->set_dash(ch_ds, 0); + for (int i = 1; i <= 4; i++) { + cr->arc(0, 0, i * scope_size / 8.0, 0, 2 * RT_PI); + cr->stroke(); + } + // CIELAB skin tone line, approximated by 50% saturation and + // value along the HSV skin tone line. + cr->rotate(-0.321713 * RT_PI); + cr->move_to(line_spacing, 0); + cr->line_to(line_spacing + line_length, 0); + cr->stroke(); + cr->unset_dash(); + } + cr->set_matrix(orig_matrix); + + // Vectorscope trace. + if (vectorscope_scale > 0) { + Cairo::RefPtr surface = Cairo::ImageSurface::create( + vect_buffer.get(), Cairo::FORMAT_ARGB32, VECTORSCOPE_SIZE, VECTORSCOPE_SIZE, cairo_stride); + cr->translate(o_x, o_y); + cr->scale(scope_size / VECTORSCOPE_SIZE, scope_size / VECTORSCOPE_SIZE); + cr->set_source(surface, 0, 0); + cr->set_operator(Cairo::OPERATOR_OVER); + cr->paint(); + surface->finish(); + cr->set_matrix(orig_matrix); + } +} + void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h) { // Arbitrary scale factor divided by current scale. @@ -1310,7 +1467,7 @@ bool HistogramArea::on_button_release_event (GdkEventButton* event) bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) { - if (drawMode == 0 || scopeType == 1) { + if (drawMode == 0 || scopeType >= 1) { return false; } diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 83099c68e..a3d29bdd3 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -32,6 +32,11 @@ class HistogramArea; +namespace +{ +constexpr int VECTORSCOPE_SIZE = 128; +} + struct HistogramAreaIdleHelper { HistogramArea* harea; bool destroyed; @@ -156,6 +161,10 @@ private: protected: LUTu rhist, ghist, bhist, lhist, chist; LUTu rhistRaw, ghistRaw, bhistRaw, lhistRaw; //lhistRaw is unused? + int vectorscope_scale; + int vect[VECTORSCOPE_SIZE][VECTORSCOPE_SIZE]; + std::unique_ptr vect_buffer; + bool vect_buffer_dirty; int waveform_scale; int waveform_width; std::unique_ptr rwave, gwave, bwave; @@ -191,6 +200,8 @@ public: const LUTu& histRedRaw, const LUTu& histGreenRaw, const LUTu& histBlueRaw, + int vectorscopeScale, + const int vectorscope[VECTORSCOPE_SIZE][VECTORSCOPE_SIZE], int waveformScale, int waveformWidth, const int waveformRed[][256], @@ -208,6 +219,7 @@ public: private: void drawCurve(Cairo::RefPtr &cr, const LUTu & data, double scale, int hsize, int vsize); void drawMarks(Cairo::RefPtr &cr, const LUTu & data, double scale, int hsize, int & ui, int & oi); + void drawVectorscope(Cairo::RefPtr &cr, int hsize, int vsize); void drawWaveform(Cairo::RefPtr &cr, int hsize, int vsize); Gtk::SizeRequestMode get_request_mode_vfunc () const override; void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const override; @@ -219,7 +231,7 @@ private: class HistogramPanelListener { public: - enum ScopeType {HISTOGRAM, WAVEFORM, NONE}; + enum ScopeType {HISTOGRAM, VECTORSCOPE_CH, VECTORSCOPE_HS, WAVEFORM, NONE}; virtual void scopeTypeChanged(ScopeType new_type) = 0; }; @@ -286,6 +298,8 @@ public: const LUTu& histRedRaw, const LUTu& histGreenRaw, const LUTu& histBlueRaw, + int vectorscopeScale, + const int vectorscope[VECTORSCOPE_SIZE][VECTORSCOPE_SIZE], int waveformScale, int waveformWidth, const int waveformRed[][256], @@ -293,7 +307,7 @@ public: const int waveformBlue[][256] ) { - histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, waveformScale, waveformWidth, waveformRed, waveformGreen, waveformBlue); + histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscope, waveformScale, waveformWidth, waveformRed, waveformGreen, waveformBlue); } // pointermotionlistener interface void pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw = false) override; From 603cd6ea3d0bc1f1c84ca73a24ef4f6f13fc712a Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 4 Aug 2020 12:09:33 -0700 Subject: [PATCH 039/185] Clip waveform display values to 255 --- rtgui/histogrampanel.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 0967212d0..a821f9f98 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1289,7 +1289,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in // TODO: Optimize. for (int u = 0; u < VECTORSCOPE_SIZE; u++) { for (int v = 0; v < VECTORSCOPE_SIZE; v++) { - const unsigned char value = LIM(scale * vect[u][v], 0, 0xff); + const unsigned char value = min(scale * vect[u][v], 0xff); *(uint32_t*)&(vect_buffer[(VECTORSCOPE_SIZE - 1 - u) * cairo_stride + v * 4]) = value | (value << 8) | (value << 16) | (value << 24); } @@ -1394,9 +1394,9 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h // TODO: Optimize. for (int col = 0; col < waveform_width; col++) { for (int val = 0; val < 256; val++) { - const unsigned char r = needRed ? scale * rwave[col][val] : 0; - const unsigned char g = needGreen ? scale * gwave[col][val] : 0; - const unsigned char b = needBlue ? scale * bwave[col][val] : 0; + const unsigned char r = needRed ? min(scale * rwave[col][val], 0xff) : 0; + const unsigned char g = needGreen ? min(scale * gwave[col][val], 0xff) : 0; + const unsigned char b = needBlue ? min(scale * bwave[col][val], 0xff) : 0; const unsigned char value = (r > g && r > b) ? r : ((g > b) ? g : b); if (value <= 0) { *(uint32_t*)&(wave_buffer[(255 - val) * cairo_stride + col * 4]) = 0; From c9bf58a7a0fdd624c56d94a1d55a31dfba9dd471 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 4 Aug 2020 18:38:59 -0700 Subject: [PATCH 040/185] Add scope type icons --- .../svg/histogram-type-histogram-small.svg | 122 ++++++++++++++++ .../histogram-type-vectorscope-hc-small.svg | 131 +++++++++++++++++ .../histogram-type-vectorscope-hs-small.svg | 135 ++++++++++++++++++ .../svg/histogram-type-waveform-small.svg | 122 ++++++++++++++++ rtgui/histogrampanel.cc | 21 +-- rtgui/histogrampanel.h | 5 + 6 files changed, 528 insertions(+), 8 deletions(-) create mode 100644 rtdata/images/svg/histogram-type-histogram-small.svg create mode 100644 rtdata/images/svg/histogram-type-vectorscope-hc-small.svg create mode 100644 rtdata/images/svg/histogram-type-vectorscope-hs-small.svg create mode 100644 rtdata/images/svg/histogram-type-waveform-small.svg diff --git a/rtdata/images/svg/histogram-type-histogram-small.svg b/rtdata/images/svg/histogram-type-histogram-small.svg new file mode 100644 index 000000000..1d2f6547e --- /dev/null +++ b/rtdata/images/svg/histogram-type-histogram-small.svg @@ -0,0 +1,122 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-type-vectorscope-hc-small.svg b/rtdata/images/svg/histogram-type-vectorscope-hc-small.svg new file mode 100644 index 000000000..ef2e8b51f --- /dev/null +++ b/rtdata/images/svg/histogram-type-vectorscope-hc-small.svg @@ -0,0 +1,131 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-type-vectorscope-hs-small.svg b/rtdata/images/svg/histogram-type-vectorscope-hs-small.svg new file mode 100644 index 000000000..62bbf9586 --- /dev/null +++ b/rtdata/images/svg/histogram-type-vectorscope-hs-small.svg @@ -0,0 +1,135 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-type-waveform-small.svg b/rtdata/images/svg/histogram-type-waveform-small.svg new file mode 100644 index 000000000..5147ab2fc --- /dev/null +++ b/rtdata/images/svg/histogram-type-waveform-small.svg @@ -0,0 +1,122 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index a821f9f98..4519bd438 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -89,6 +89,11 @@ HistogramPanel::HistogramPanel () : panel_listener(nullptr) mode1Image = new RTImage ("histogram-mode-logx-small.png"); mode2Image = new RTImage ("histogram-mode-logxy-small.png"); + histImage.reset(new RTImage("histogram-type-histogram-small.png")); + waveImage.reset(new RTImage("histogram-type-waveform-small.png")); + vectHcImage.reset(new RTImage("histogram-type-vectorscope-hc-small.png")); + vectHsImage.reset(new RTImage("histogram-type-vectorscope-hs-small.png")); + showRed = Gtk::manage (new Gtk::ToggleButton ()); showGreen = Gtk::manage (new Gtk::ToggleButton ()); showBlue = Gtk::manage (new Gtk::ToggleButton ()); @@ -162,13 +167,13 @@ HistogramPanel::HistogramPanel () : panel_listener(nullptr) else showMode->set_image(*mode2Image); if (options.histogramScopeType == 0) { - // TODO: scopeType->set_image(*histImage); + scopeType->set_image(*histImage); } else if (options.histogramScopeType == 1) { - // TODO: scopeType->set_image(*waveImage); + scopeType->set_image(*waveImage); } else if (options.histogramScopeType == 2) { - // TODO: scopeType->set_image(*vectHsImage); + scopeType->set_image(*vectHsImage); } else if (options.histogramScopeType == 3) { - // TODO: scopeType->set_image(*vectHcImage); + scopeType->set_image(*vectHcImage); } showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); @@ -338,13 +343,13 @@ void HistogramPanel::type_pressed() constexpr int TYPE_COUNT = 4; // Histogram, waveform, and 2 vectorscopes. options.histogramScopeType = (options.histogramScopeType + 1) % TYPE_COUNT; if (options.histogramScopeType == 0) { - // TODO: showMode->set_image(*histImage); + scopeType->set_image(*histImage); } else if (options.histogramScopeType == 1) { - // TODO: showMode->set_image(*waveImage); + scopeType->set_image(*waveImage); } else if (options.histogramScopeType == 2) { - // TODO: showMode->set_image(*vectHsImage); + scopeType->set_image(*vectHsImage); } else if (options.histogramScopeType == 3) { - // TODO: showMode->set_image(*vectHcImage); + scopeType->set_image(*vectHcImage); } type_changed(); rgbv_toggled(); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index a3d29bdd3..864fc3fb6 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -273,6 +273,11 @@ protected: Gtk::Image *barImage_g; Gtk::Image *chroImage_g; + std::unique_ptr histImage; + std::unique_ptr waveImage; + std::unique_ptr vectHcImage; + std::unique_ptr vectHsImage; + Gtk::Image *mode0Image; Gtk::Image *mode1Image; Gtk::Image *mode2Image; From ba57a6c6803984a7b7a6a8d48df61a2c36d779af Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 4 Aug 2020 23:07:03 -0700 Subject: [PATCH 041/185] Fix waveform and vectorscope crop behavior Properly scale values for the vectorscopes and only show the crop region for the waveform. --- rtengine/improccoordinator.cc | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index f19eff54d..9c18d0fa2 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1886,7 +1886,7 @@ void ImProcCoordinator::updateVectorscope() } } - vectorscopeScale = workimg->getWidth() * workimg->getHeight(); + vectorscopeScale = (x2 - x1) * (y2 - y1); } void ImProcCoordinator::updateWaveforms() @@ -1896,9 +1896,12 @@ void ImProcCoordinator::updateWaveforms() return; } - if (waveformWidth != workimg->getWidth()) { + int x1, y1, x2, y2; + params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); + + if (waveformWidth != x2 - x1) { // Resize waveform arrays. - waveformWidth = workimg->getWidth(); + waveformWidth = x2 - x1; waveformRed.reset(new int[waveformWidth][256]); waveformGreen.reset(new int[waveformWidth][256]); waveformBlue.reset(new int[waveformWidth][256]); @@ -1914,16 +1917,17 @@ void ImProcCoordinator::updateWaveforms() memset(waveformGreen.get(), 0, waveformSize * sizeof(green[0][0])); memset(waveformBlue.get(), 0, waveformSize * sizeof(blue[0][0])); - const int img_height = workimg->getHeight(); - for (int col = 0; col < waveformWidth; col++) { - for (int row = 0; row < img_height; row++) { - red[col][workimg->r(row, col)]++; - green[col][workimg->g(row, col)]++; - blue[col][workimg->b(row, col)]++; + for (int i = y1; i < y2; i++) { + int ofs = (i * pW + x1) * 3; + + for (int j = 0; j < waveformWidth; j++) { + red[j][workimg->data[ofs++]]++; + green[j][workimg->data[ofs++]]++; + blue[j][workimg->data[ofs++]]++; } } - waveformScale = img_height; + waveformScale = y2 - y1; } bool ImProcCoordinator::getAutoWB(double& temp, double& green, double equal, double tempBias) From 9382306fedf4a6db74bfce4a134ae1831531a4f8 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 5 Aug 2020 11:57:34 -0700 Subject: [PATCH 042/185] Add CIELAB lightness to waveform --- rtengine/improccoordinator.cc | 8 +++++++- rtengine/improccoordinator.h | 1 + rtengine/rtengine.h | 3 ++- rtgui/editorpanel.cc | 5 +++-- rtgui/editorpanel.h | 3 ++- rtgui/histogrampanel.cc | 31 +++++++++++++++++++++++++++---- rtgui/histogrampanel.h | 11 +++++++---- 7 files changed, 49 insertions(+), 13 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 9c18d0fa2..a1648aeb4 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1774,7 +1774,8 @@ void ImProcCoordinator::notifyHistogramChanged() waveformWidth, waveformRed.get(), waveformGreen.get(), - waveformBlue.get() + waveformBlue.get(), + waveformLuma.get() ); } } @@ -1905,18 +1906,22 @@ void ImProcCoordinator::updateWaveforms() waveformRed.reset(new int[waveformWidth][256]); waveformGreen.reset(new int[waveformWidth][256]); waveformBlue.reset(new int[waveformWidth][256]); + waveformLuma.reset(new int[waveformWidth][256]); } int (*red)[256] = waveformRed.get(); int (*green)[256] = waveformGreen.get(); int (*blue)[256] = waveformBlue.get(); + int (*luma)[256] = waveformLuma.get(); // Start with zero. const int waveformSize = 256 * waveformWidth; memset(waveformRed.get(), 0, waveformSize * sizeof(red[0][0])); memset(waveformGreen.get(), 0, waveformSize * sizeof(green[0][0])); memset(waveformBlue.get(), 0, waveformSize * sizeof(blue[0][0])); + memset(waveformLuma.get(), 0, waveformSize * sizeof(luma[0][0])); + constexpr float luma_factor = 255.f / 32768.f; for (int i = y1; i < y2; i++) { int ofs = (i * pW + x1) * 3; @@ -1924,6 +1929,7 @@ void ImProcCoordinator::updateWaveforms() red[j][workimg->data[ofs++]]++; green[j][workimg->data[ofs++]]++; blue[j][workimg->data[ofs++]]++; + luma[j][(int)(nprevl->L[i][j + x1] * luma_factor)]++; } } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 14ee81934..5eeef3e9e 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -134,6 +134,7 @@ protected: std::unique_ptr waveformRed, waveformRedRaw; std::unique_ptr waveformGreen, waveformGreenRaw; std::unique_ptr waveformBlue, waveformBlueRaw; + std::unique_ptr waveformLuma; LUTf CAMBrightCurveJ, CAMBrightCurveQ; diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 49f858cdc..aa5e6aed7 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -338,7 +338,8 @@ public: int waveformWidth, const int waveformRed[][256], const int waveformGreen[][256], - const int waveformBlue[][256] + const int waveformBlue[][256], + const int waveformLuma[][256] ) = 0; /** Tells which observable is notifying the listener. */ virtual void setObservable(HistogramObservable* observable) = 0; diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index e52c9f47a..2d3099727 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -2253,11 +2253,12 @@ void EditorPanel::histogramChanged( int waveformWidth, const int waveformRed[][256], const int waveformGreen[][256], - const int waveformBlue[][256] + const int waveformBlue[][256], + const int waveformLuma[][256] ) { if (histogramPanel) { - histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscope, waveformScale, waveformWidth, waveformRed, waveformGreen, waveformBlue); + histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscope, waveformScale, waveformWidth, waveformRed, waveformGreen, waveformBlue, waveformLuma); } tpc->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index b9d196ccd..ed34c1931 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -134,7 +134,8 @@ public: int waveformWidth, const int waveformRed[][256], const int waveformGreen[][256], - const int waveformBlue[][256] + const int waveformBlue[][256], + const int waveformLuma[][256] ) override; void setObservable(rtengine::HistogramObservable* observable) override; bool updateHistogram(void) override; diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 4519bd438..3c5fd4719 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -379,7 +379,7 @@ void HistogramPanel::type_changed() showRed->set_sensitive(); showGreen->set_sensitive(); showBlue->set_sensitive(); - showValue->set_sensitive(false); + showValue->set_sensitive(); showChro->set_sensitive(false); showRAW->set_sensitive(false); showMode->set_sensitive(false); @@ -663,7 +663,7 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustrin drawBar(cc, b, 255.0, winw, winh, s); } - if((needLuma || needChroma) && options.histogramScopeType == 0) { + if((needLuma || needChroma) && options.histogramScopeType <= 1) { float Lab_L, Lab_a, Lab_b; rtengine::Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, Lab_L, Lab_a, Lab_b, options.rtSettings.HistogramWorking); @@ -673,7 +673,7 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustrin drawBar(cc, Lab_L, 100.0, winw, winh, s); } - if (needChroma) { + if (needChroma && options.histogramScopeType == 0) { // Chroma double chromaval = sqrt(Lab_a * Lab_a + Lab_b * Lab_b) / 1.8; cc->set_source_rgb(0.9, 0.9, 0.0); @@ -960,7 +960,8 @@ void HistogramArea::update( int waveformWidth, const int waveformRed[][256], const int waveformGreen[][256], - const int waveformBlue[][256] + const int waveformBlue[][256], + const int waveformLuma[][256] ) { if (histRed) { @@ -980,13 +981,16 @@ void HistogramArea::update( rwave.reset(new int[waveformWidth][256]); gwave.reset(new int[waveformWidth][256]); bwave.reset(new int[waveformWidth][256]); + lwave.reset(new int[waveformWidth][256]); } int (* const rw)[256] = rwave.get(); int (* const gw)[256] = gwave.get(); int (* const bw)[256] = bwave.get(); + int (* const lw)[256] = lwave.get(); memcpy(rw, waveformRed, 256 * waveformWidth * sizeof(rw[0][0])); memcpy(gw, waveformGreen, 256 * waveformWidth * sizeof(gw[0][0])); memcpy(bw, waveformBlue, 256 * waveformWidth * sizeof(bw[0][0])); + memcpy(lw, waveformLuma, 256 * waveformWidth * sizeof(lw[0][0])); wave_buffer_dirty = true; } else if (scopeType >= 2) { vectorscope_scale = vectorscopeScale; @@ -1392,9 +1396,11 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h if (wave_buffer_dirty) { wave_buffer.reset(new unsigned char[256 * cairo_stride]); + wave_buffer_luma.reset(new unsigned char[256 * cairo_stride]); // Clear waveform. memset(wave_buffer.get(), 0, 256 * cairo_stride); + memset(wave_buffer_luma.get(), 0, 256 * cairo_stride); // TODO: Optimize. for (int col = 0; col < waveform_width; col++) { @@ -1413,6 +1419,16 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h } } + if (needLuma) { + for (int col = 0; col < waveform_width; col++) { + for (int val = 0; val < 256; val++) { + const unsigned char l = min(scale * lwave[col][val], 0xff); + *(uint32_t*)&(wave_buffer_luma[(255 - val) * cairo_stride + col * 4]) = + l | (l << 8) | (l << 16) | (l << 24); + } + } + } + wave_buffer_dirty = false; } @@ -1424,6 +1440,13 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h cr->set_source(surface, 0, 0); cr->set_operator(Cairo::OPERATOR_OVER); cr->paint(); + if (needLuma) { + surface = Cairo::ImageSurface::create( + wave_buffer_luma.get(), Cairo::FORMAT_ARGB32, waveform_width, 256, cairo_stride); + cr->set_source(surface, 0, 0); + cr->set_operator(Cairo::OPERATOR_OVER); + cr->paint(); + } surface->finish(); cr->set_matrix(orig_matrix); } diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 864fc3fb6..227001845 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -167,8 +167,9 @@ protected: bool vect_buffer_dirty; int waveform_scale; int waveform_width; - std::unique_ptr rwave, gwave, bwave; + std::unique_ptr rwave, gwave, bwave, lwave; std::unique_ptr wave_buffer; + std::unique_ptr wave_buffer_luma; bool wave_buffer_dirty; bool valid; @@ -206,7 +207,8 @@ public: int waveformWidth, const int waveformRed[][256], const int waveformGreen[][256], - const int waveformBlue[][256] + const int waveformBlue[][256], + const int waveformLuma[][256] ); void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, int type); void on_realize() override; @@ -309,10 +311,11 @@ public: int waveformWidth, const int waveformRed[][256], const int waveformGreen[][256], - const int waveformBlue[][256] + const int waveformBlue[][256], + const int waveformLuma[][256] ) { - histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscope, waveformScale, waveformWidth, waveformRed, waveformGreen, waveformBlue); + histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscope, waveformScale, waveformWidth, waveformRed, waveformGreen, waveformBlue, waveformLuma); } // pointermotionlistener interface void pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw = false) override; From 9a89eb545494d6f83ffedf1fcabea3f43a792ff5 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 5 Aug 2020 12:05:58 -0700 Subject: [PATCH 043/185] Fix RGB bars not showing for waveform The bars were not showing if the raw histogram button was activated. --- rtgui/histogrampanel.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 3c5fd4719..d9f369509 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -617,7 +617,7 @@ void HistogramRGBArea::setShow(bool show) void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustring &profile, const Glib::ustring &profileW) { - if (!get_realized () || !showMode || rawMode) { + if (!get_realized () || !showMode || (rawMode && options.histogramScopeType != 1)) { return; } From 426162f269fc1066052c6a5a6dd2bacd87bb4534 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Wed, 5 Aug 2020 12:23:34 -0700 Subject: [PATCH 044/185] Move lightness waveform behind RGB waveform --- rtgui/histogrampanel.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index d9f369509..b87d58d89 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1432,14 +1432,10 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h wave_buffer_dirty = false; } - Cairo::RefPtr surface = Cairo::ImageSurface::create( - wave_buffer.get(), Cairo::FORMAT_ARGB32, waveform_width, 256, cairo_stride); + Cairo::RefPtr surface; auto orig_matrix = cr->get_matrix(); cr->translate(0, padding); cr->scale(static_cast(w) / waveform_width, (h - 2 * padding) / 256.0); - cr->set_source(surface, 0, 0); - cr->set_operator(Cairo::OPERATOR_OVER); - cr->paint(); if (needLuma) { surface = Cairo::ImageSurface::create( wave_buffer_luma.get(), Cairo::FORMAT_ARGB32, waveform_width, 256, cairo_stride); @@ -1447,6 +1443,11 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h cr->set_operator(Cairo::OPERATOR_OVER); cr->paint(); } + surface = Cairo::ImageSurface::create( + wave_buffer.get(), Cairo::FORMAT_ARGB32, waveform_width, 256, cairo_stride); + cr->set_source(surface, 0, 0); + cr->set_operator(Cairo::OPERATOR_OVER); + cr->paint(); surface->finish(); cr->set_matrix(orig_matrix); } From 698b2e18426df61b25aaf5e74a2055e7417088de Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Fri, 7 Aug 2020 15:18:02 -0700 Subject: [PATCH 045/185] Finish Cairo surface used for waveform --- rtgui/histogrampanel.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index b87d58d89..b6a27a3c1 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1442,6 +1442,7 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h cr->set_source(surface, 0, 0); cr->set_operator(Cairo::OPERATOR_OVER); cr->paint(); + surface->finish(); } surface = Cairo::ImageSurface::create( wave_buffer.get(), Cairo::FORMAT_ARGB32, waveform_width, 256, cairo_stride); From f353df3d053c442639209d23fba1c3fdf53c4afa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 8 Aug 2020 11:18:56 +0200 Subject: [PATCH 046/185] Add `DelayedCall` and integrate it into navigator and histogram - Rename `delayedconnection.h` to `delayed.h` - Align `delayed_helper::apply()` with `std::apply()` --- rtgui/adjuster.h | 2 +- rtgui/{delayedconnection.h => delayed.h} | 168 +++++++++++++++++------ rtgui/histogrampanel.cc | 30 ++-- rtgui/histogrampanel.h | 3 + rtgui/navigator.cc | 85 +++++++----- rtgui/navigator.h | 6 +- 6 files changed, 203 insertions(+), 91 deletions(-) rename rtgui/{delayedconnection.h => delayed.h} (60%) diff --git a/rtgui/adjuster.h b/rtgui/adjuster.h index f26137f71..abafbd730 100644 --- a/rtgui/adjuster.h +++ b/rtgui/adjuster.h @@ -19,7 +19,7 @@ #pragma once #include "editedstate.h" -#include "delayedconnection.h" +#include "delayed.h" #include "guiutils.h" class Adjuster; diff --git a/rtgui/delayedconnection.h b/rtgui/delayed.h similarity index 60% rename from rtgui/delayedconnection.h rename to rtgui/delayed.h index 28c5f0421..cf4f22bf8 100644 --- a/rtgui/delayedconnection.h +++ b/rtgui/delayed.h @@ -20,13 +20,136 @@ #pragma once #include +#include #include #include #include +#include "../rtengine/noncopyable.h" + +namespace delayed_helper +{ + + // C++14 + + // See https://gist.github.com/ntessore/dc17769676fb3c6daa1f + template + struct index_sequence + { + }; + + template + struct make_index_sequence : + make_index_sequence + { + }; + + template + struct make_index_sequence<0, Is...> : + index_sequence + { + }; + + // C++17 + + // See https://aherrmann.github.io/programming/2016/02/28/unpacking-tuples-in-cpp14/ + template + constexpr void apply_impl(F f, T t, index_sequence) + { + f(std::get(t)...); + } + + template + constexpr void apply(F f, T t) + { + apply_impl(f, t, make_index_sequence{}>{}); + } + +} + template -class DelayedConnection final +class DelayedCall final : + public rtengine::NonCopyable +{ +public: + DelayedCall(std::function _function, unsigned int _min_delay_ms, unsigned int _max_delay_ms = 0) : + function(_function), + min_delay_ms(_min_delay_ms), + max_delay_ms(_max_delay_ms) + { + } + + DelayedCall(unsigned int _min_delay_ms, unsigned int _max_delay_ms = 0) : + DelayedCall({}, _min_delay_ms, _max_delay_ms) + { + } + + void setFunction(std::function function) + { + this->function = function; + } + + void operator ()(Ts... ts) + { + if (!function) { + return; + } + + if (!min_delay_ms) { + function(ts...); + return; + } + + params = std::make_tuple(ts...); + + min_timeout.disconnect(); + min_timeout = Glib::signal_timeout().connect(sigc::mem_fun(*this, &DelayedCall::onMinTimeout), min_delay_ms); + + if (max_delay_ms && !max_timeout.connected()) { + max_timeout = Glib::signal_timeout().connect(sigc::mem_fun(*this, &DelayedCall::onMaxTimeout), max_delay_ms); + } + } + + void cancel() + { + min_timeout.disconnect(); + max_timeout.disconnect(); + } + +private: + bool onMinTimeout() + { + max_timeout.disconnect(); + if (function) { + delayed_helper::apply(function, params); + } + return false; + } + + bool onMaxTimeout() + { + min_timeout.disconnect(); + if (function) { + delayed_helper::apply(function, params); + } + return false; + } + + std::function function; + + unsigned int min_delay_ms; + unsigned int max_delay_ms; + + sigc::connection min_timeout; + sigc::connection max_timeout; + + std::tuple params; +}; + +template +class DelayedConnection final : + public rtengine::NonCopyable { public: DelayedConnection(unsigned int _min_delay_ms, unsigned int _max_delay_ms = 0) : @@ -45,15 +168,11 @@ public: void block(bool value = true) { signal.block(value); - min_timeout.block(value); - max_timeout.block(value); } void unblock() { signal.unblock(); - min_timeout.unblock(); - max_timeout.unblock(); } void cancel() @@ -96,52 +215,17 @@ private: bool onMinTimeout() { max_timeout.disconnect(); - apply(params, slot); + delayed_helper::apply(slot, params); return false; } bool onMaxTimeout() { min_timeout.disconnect(); - apply(params, slot); + delayed_helper::apply(slot, params); return false; } - // C++14 - - // See https://gist.github.com/ntessore/dc17769676fb3c6daa1f - template - struct index_sequence - { - }; - - template - struct make_index_sequence : - make_index_sequence - { - }; - - template - struct make_index_sequence<0, Is...> : - index_sequence - { - }; - - // C++17 - - // See https://aherrmann.github.io/programming/2016/02/28/unpacking-tuples-in-cpp14/ - template - constexpr void apply_impl(T t, F f, index_sequence) - { - f(std::get(t)...); - } - - template - constexpr void apply(T t, F f) - { - apply_impl(t, f, make_index_sequence{}>{}); - } - unsigned int min_delay_ms; unsigned int max_delay_ms; diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index b1c0b62df..62be4c1f4 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -32,7 +32,22 @@ using namespace rtengine; // // // HistogramPanel -HistogramPanel::HistogramPanel () +HistogramPanel::HistogramPanel() : + pointer_moved_delayed_call( + [this](bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int r, int g, int b) + { + if (!validPos) { + // do something to un-show vertical bars + histogramRGBArea->updateBackBuffer(-1, -1, -1); + } else { + // do something to show vertical bars + histogramRGBArea->updateBackBuffer(r, g, b, profile, profileW); + } + histogramRGBArea->queue_draw (); + }, + 50, + 100 + ) { setExpandAlignProperties(this, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); set_name("HistogramPanel"); @@ -192,6 +207,8 @@ HistogramPanel::HistogramPanel () HistogramPanel::~HistogramPanel () { + pointer_moved_delayed_call.cancel(); + delete redImage; delete greenImage; delete blueImage; @@ -311,15 +328,7 @@ void HistogramPanel::setHistRGBInvalid () void HistogramPanel::pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw) { - - if (!validPos) { - // do something to un-show vertical bars - histogramRGBArea->updateBackBuffer(-1, -1, -1); - } else { - // do something to show vertical bars - histogramRGBArea->updateBackBuffer(r, g, b, profile, profileW); - } - histogramRGBArea->queue_draw (); + pointer_moved_delayed_call(validPos, profile, profileW, r, g, b); } /* @@ -372,7 +381,6 @@ HistogramRGBArea::HistogramRGBArea () : needLuma(options.histogramLuma), needChroma(options.histogramChroma), rawMode(options.histogramRAW), showMode(options.histogramBar), barDisplayed(options.histogramBar), parent(nullptr) { - get_style_context()->add_class("drawingarea"); set_name("HistogramRGBArea"); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 2a29ded9a..740b0a12c 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -24,6 +24,7 @@ #include +#include "delayed.h" #include "guiutils.h" #include "pointermotionlistener.h" @@ -180,6 +181,8 @@ private: class HistogramPanel final : public Gtk::Grid, public PointerMotionListener, public DrawModeListener, public rtengine::NonCopyable { +private: + DelayedCall pointer_moved_delayed_call; protected: diff --git a/rtgui/navigator.cc b/rtgui/navigator.cc index 619ea0cfd..9397cfc67 100644 --- a/rtgui/navigator.cc +++ b/rtgui/navigator.cc @@ -26,8 +26,50 @@ using namespace rtengine; -Navigator::Navigator () : currentRGBUnit(options.navRGBUnit), currentHSVUnit(options.navHSVUnit) +Navigator::Navigator() : + pointer_moved_delayed_call(50, 100), + currentRGBUnit(options.navRGBUnit), + currentHSVUnit(options.navHSVUnit) { + pointer_moved_delayed_call.setFunction( + [this](bool validPos, Glib::ustring profile, Glib::ustring profileW, int x, int y, int r, int g, int b, bool isRaw) + { + if (!validPos) { + setInvalid (x, y); + } else { + Glib::ustring s1, s2, s3; + + position->set_text (Glib::ustring::compose ("x: %1, y: %2", x, y)); + + getRGBText (r, g, b, s1, s2, s3, isRaw); + R->set_text (s1); + G->set_text (s2); + B->set_text (s3); + if (isRaw) { + H->set_text ("--"); + S->set_text ("--"); + V->set_text ("--"); + LAB_L->set_text ("--"); + LAB_A->set_text ("--"); + LAB_B->set_text ("--"); + } else { + float h, s, v; + float LAB_a, LAB_b, LAB_l; + Color::rgb2hsv01(r / 255.f, g / 255.f, b / 255.f, h, s, v); + getHSVText (h, s, v, s1, s2, s3); + H->set_text (s1); + S->set_text (s2); + V->set_text (s3); + + Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, LAB_l, LAB_a, LAB_b, options.rtSettings.HistogramWorking); // TODO: Really sure this function works? + getLABText (LAB_l, LAB_a, LAB_b, s1, s2, s3); + LAB_L->set_text (s1); + LAB_A->set_text (s2); + LAB_B->set_text (s3); + } + } + } + ); set_label (M("MAIN_MSG_NAVIGATOR")); Gtk::VBox* mbox = Gtk::manage (new Gtk::VBox ()); @@ -202,6 +244,11 @@ Navigator::Navigator () : currentRGBUnit(options.navRGBUnit), currentHSVUnit(opt show_all (); } +Navigator::~Navigator() +{ + pointer_moved_delayed_call.cancel(); +} + void Navigator::setInvalid (int fullWidth, int fullHeight) { if (fullWidth > 0 && fullHeight > 0) { @@ -278,41 +325,7 @@ void Navigator::getLABText (float l, float a, float b, Glib::ustring &sL, Glib:: // if !validPos then x/y contain the full image size void Navigator::pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw) { - - if (!validPos) { - setInvalid (x, y); - } else { - Glib::ustring s1, s2, s3; - - position->set_text (Glib::ustring::compose ("x: %1, y: %2", x, y)); - - getRGBText (r, g, b, s1, s2, s3, isRaw); - R->set_text (s1); - G->set_text (s2); - B->set_text (s3); - if (isRaw) { - H->set_text ("--"); - S->set_text ("--"); - V->set_text ("--"); - LAB_L->set_text ("--"); - LAB_A->set_text ("--"); - LAB_B->set_text ("--"); - } else { - float h, s, v; - float LAB_a, LAB_b, LAB_l; - Color::rgb2hsv01(r / 255.f, g / 255.f, b / 255.f, h, s, v); - getHSVText (h, s, v, s1, s2, s3); - H->set_text (s1); - S->set_text (s2); - V->set_text (s3); - - Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, LAB_l, LAB_a, LAB_b, options.rtSettings.HistogramWorking); // TODO: Really sure this function works? - getLABText (LAB_l, LAB_a, LAB_b, s1, s2, s3); - LAB_L->set_text (s1); - LAB_A->set_text (s2); - LAB_B->set_text (s3); - } - } + pointer_moved_delayed_call(validPos, profile, profileW, x, y, r, g, b, isRaw); } void Navigator::cycleUnitsRGB (GdkEventButton *event) { diff --git a/rtgui/navigator.h b/rtgui/navigator.h index e9d40e309..4c2a3fd32 100644 --- a/rtgui/navigator.h +++ b/rtgui/navigator.h @@ -20,6 +20,7 @@ #include +#include "delayed.h" #include "options.h" #include "pointermotionlistener.h" @@ -33,6 +34,8 @@ class Navigator final : typedef const double (*TMatrix)[3]; private: + DelayedCall pointer_moved_delayed_call; + Options::NavigatorUnit currentRGBUnit; Options::NavigatorUnit currentHSVUnit; void cycleUnitsRGB (GdkEventButton *event); @@ -53,7 +56,8 @@ protected: public: PreviewWindow* previewWindow; - Navigator (); + Navigator(); + ~Navigator() override; // pointermotionlistener interface // void pointerMoved (bool validPos, int x, int y, int r, int g, int b); From f7795278335f0bb5d58e8a5915a2e60b80377a0b Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Fri, 7 Aug 2020 17:26:22 -0700 Subject: [PATCH 047/185] Clip H-C vectorscope according to color profile --- rtengine/improccoordinator.cc | 12 +++- rtengine/improcfun.cc | 124 ++++++++++++++++++++++++++++++++++ rtengine/improcfun.h | 1 + 3 files changed, 135 insertions(+), 2 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index a1648aeb4..82527d530 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1853,6 +1853,13 @@ void ImProcCoordinator::updateVectorscope() constexpr int size = HistogramListener::vectorscope_size; memset(vectorscope, 0, size * size * sizeof(vectorscope[0][0])); + const int lab_img_size = (hListener->vectorscopeType() == 1) ? (x2 - x1) * (y2 - y1) : 0; + float L[lab_img_size], a[lab_img_size], b[lab_img_size]; + if (lab_img_size) { + ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L, a, b, params->icm); + } + + int ofs_lab = 0; for (int i = y1; i < y2; i++) { int ofs = (i * pW + x1) * 3; @@ -1875,12 +1882,13 @@ void ImProcCoordinator::updateVectorscope() case 1: { // CH - const int col = (size / 96000.0) * nprevl->a[i][j] + size / 2; - const int row = (size / 96000.0) * nprevl->b[i][j] + size / 2; + const int col = (size / 96000.0) * a[ofs_lab] + size / 2; + const int row = (size / 96000.0) * b[ofs_lab] + size / 2; if (col >= 0 && col < size && row >= 0 && row < size) { vectorscope[row][col]++; } + ofs_lab++; break; } } diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 6051b6b0b..7e13fd214 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -5716,6 +5716,130 @@ void ImProcFunctions::rgb2lab(const Imagefloat &src, LabImage &dst, const Glib:: } } +void ImProcFunctions::rgb2lab(const Image8 &src, int x, int y, int w, int h, float L[], float a[], float b[], const procparams::ColorManagementParams &icm, bool consider_histogram_settings) const +{ // Adapted from ImProcFunctions::lab2rgb + const int src_width = src.getWidth(); + const int src_height = src.getHeight(); + + if (x < 0) { + x = 0; + } + + if (y < 0) { + y = 0; + } + + if (x + w > src_width) { + w = src_width - x; + } + + if (y + h > src_height) { + h = src_height - y; + } + + Glib::ustring profile; + + bool standard_gamma; + + if (settings->HistogramWorking && consider_histogram_settings) { + profile = icm.workingProfile; + standard_gamma = true; + } else { + profile = icm.outputProfile; + + if (icm.outputProfile.empty() || icm.outputProfile == ColorManagementParams::NoICMString) { + profile = "sRGB"; + } + + standard_gamma = false; + } + + cmsHPROFILE oprof = ICCStore::getInstance()->getProfile(profile); + + if (oprof) { + cmsHPROFILE oprofG = oprof; + + if (standard_gamma) { + oprofG = ICCStore::makeStdGammaProfile(oprof); + } + + cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; + + if (icm.outputBPC) { + flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; + } + + lcmsMutex->lock(); + cmsHPROFILE LabIProf = cmsCreateLab4Profile(nullptr); + cmsHTRANSFORM hTransform = cmsCreateTransform (oprofG, TYPE_RGB_8, LabIProf, TYPE_Lab_FLT, icm.outputIntent, flags); // NOCACHE is important for thread safety + cmsCloseProfile(LabIProf); + lcmsMutex->unlock(); + + // cmsDoTransform is relatively expensive +#ifdef _OPENMP + #pragma omp parallel +#endif + { + AlignedBuffer oBuf(3 * w); + float *outbuffer = oBuf.data; + int condition = y + h; + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int i = y; i < condition; i++) { + const int ix = 3 * (x + i * src_width); + int iy = 0; + float* rL = L + (i - y) * w; + float* ra = a + (i - y) * w; + float* rb = b + (i - y) * w; + + cmsDoTransform (hTransform, src.data + ix, outbuffer, w); + + for (int j = 0; j < w; j++) { + rL[j] = outbuffer[iy++] * 327.68f; + ra[j] = outbuffer[iy++] * 327.68f; + rb[j] = outbuffer[iy++] * 327.68f; + } + } + } // End of parallelization + + cmsDeleteTransform(hTransform); + + if (oprofG != oprof) { + cmsCloseProfile(oprofG); + } + } else { + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(profile); + const float wp[3][3] = { + {static_cast(wprof[0][0]), static_cast(wprof[0][1]), static_cast(wprof[0][2])}, + {static_cast(wprof[1][0]), static_cast(wprof[1][1]), static_cast(wprof[1][2])}, + {static_cast(wprof[2][0]), static_cast(wprof[2][1]), static_cast(wprof[2][2])} + }; + + const int x2 = x + w; + const int y2 = y + h; + constexpr float rgb_factor = 65355.f / 255.f; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + + for (int i = y; i < y2; i++) { + int offset = (i - y) * w; + for (int j = x; j < x2; j++) { + float X, Y, Z; + // lab2rgb uses gamma2curve, which is gammatab_srgb. + const auto& igamma = Color::igammatab_srgb; + Color::rgbxyz(igamma[rgb_factor * src.r(i, j)], igamma[rgb_factor * src.g(i, j)], igamma[rgb_factor * src.b(i, j)], X, Y, Z, wp); + Color::XYZ2Lab(X, Y, Z, L[offset], a[offset], b[offset]); + offset++; + } + } + } +} + void ImProcFunctions::lab2rgb(const LabImage &src, Imagefloat &dst, const Glib::ustring &workingSpace) { TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(workingSpace); diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 113667262..48f2cbc92 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -449,6 +449,7 @@ public: void labColorCorrectionRegions(LabImage *lab); Image8* lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool consider_histogram_settings = true); + void rgb2lab(const Image8 &src, int x, int y, int w, int h, float L[], float a[], float b[], const procparams::ColorManagementParams &icm, bool consider_histogram_settings = true) const; Imagefloat* lab2rgbOut(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm); // CieImage *ciec; void workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, int ch, int mul, const Glib::ustring &profile, double gampos, double slpos, cmsHTRANSFORM &transform, bool normalizeIn = true, bool normalizeOut = true, bool keepTransForm = false) const; From 6c53317ac1364753571d4e575c8a809d8db667ae Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sat, 8 Aug 2020 12:57:38 -0700 Subject: [PATCH 048/185] Add pointer indicator for vectorscopes --- rtgui/histogrampanel.cc | 100 ++++++++++++++++++++++++++++++++-------- rtgui/histogrampanel.h | 8 +++- 2 files changed, 89 insertions(+), 19 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index b6a27a3c1..1a9782f98 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -48,10 +48,16 @@ HistogramPanel::HistogramPanel () : panel_listener(nullptr) setExpandAlignProperties(histogramRGBAreaVert.get(), false, true, Gtk::ALIGN_END, Gtk::ALIGN_FILL); histogramRGBAreaVert->show(); - if (options.histogramScopeType == 1) { - histogramRGBArea = histogramRGBAreaVert.get(); - } else { - histogramRGBArea = histogramRGBAreaHori.get(); + switch (options.histogramScopeType) { + case 2: + case 3: + histogramRGBArea = nullptr; + break; + case 1: + histogramRGBArea = histogramRGBAreaVert.get(); + break; + default: + histogramRGBArea = histogramRGBAreaHori.get(); } // connecting the two childs @@ -253,6 +259,8 @@ void HistogramPanel::showRGBBar() if (histogramRGBArea == histogramRGBAreaHori.get()) { pos = Gtk::POS_BOTTOM; + } else if (histogramRGBArea == nullptr) { + return; } else { if (options.histogramPosition == 1) { pos = Gtk::POS_RIGHT; @@ -273,8 +281,10 @@ void HistogramPanel::resized (Gtk::Allocation& req) histogramArea->queue_draw (); // set histogramRGBArea invalid; - histogramRGBArea->updateBackBuffer(-1, -1, -1); - histogramRGBArea->queue_draw (); + if (histogramRGBArea) { + histogramRGBArea->updateBackBuffer(-1, -1, -1); + histogramRGBArea->queue_draw (); + } // Store current height of the histogram options.histogramHeight = get_height(); @@ -357,7 +367,7 @@ void HistogramPanel::type_pressed() void HistogramPanel::type_changed() { - if (showBAR->get_active()) { + if (showBAR->get_active() && histogramRGBArea) { histogramRGBArea->setShow(false); gfxGrid->remove(*histogramRGBArea); } @@ -396,7 +406,7 @@ void HistogramPanel::type_changed() showChro->set_sensitive(false); showRAW->set_sensitive(false); showMode->set_sensitive(false); - histogramRGBArea = histogramRGBAreaHori.get(); + histogramRGBArea = nullptr; if (panel_listener) { updateHistAreaOptions(); HistogramPanelListener::ScopeType type; @@ -424,7 +434,7 @@ void HistogramPanel::bar_toggled () if (showBAR->get_active()) { showRGBBar(); - } else { + } else if (histogramRGBArea) { gfxGrid->remove(*histogramRGBArea); } } @@ -436,9 +446,11 @@ void HistogramPanel::rgbv_toggled () histogramArea->updateBackBuffer (); histogramArea->queue_draw (); - histogramRGBArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showChro->get_active(), showRAW->get_active(), showBAR->get_active() && options.histogramScopeType < 2); - histogramRGBArea->updateBackBuffer (0, 0, 0); - histogramRGBArea->queue_draw (); + if (histogramRGBArea) { + histogramRGBArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showChro->get_active(), showRAW->get_active(), showBAR->get_active() && options.histogramScopeType < 2); + histogramRGBArea->updateBackBuffer (0, 0, 0); + histogramRGBArea->queue_draw (); + } } void HistogramPanel::setHistRGBInvalid () @@ -450,15 +462,27 @@ void HistogramPanel::setHistRGBInvalid () void HistogramPanel::pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw) { + bool update_hist_area; if (!validPos) { // do something to un-show vertical bars - histogramRGBArea->updateBackBuffer(-1, -1, -1); + if (histogramRGBArea) { + histogramRGBArea->updateBackBuffer(-1, -1, -1); + } + update_hist_area = histogramArea->updatePointer(-1, -1, -1); } else { // do something to show vertical bars - histogramRGBArea->updateBackBuffer(r, g, b, profile, profileW); + if (histogramRGBArea) { + histogramRGBArea->updateBackBuffer(r, g, b, profile, profileW); + } + update_hist_area = histogramArea->updatePointer(r, g, b, profile, profileW); + } + if (histogramRGBArea) { + histogramRGBArea->queue_draw(); + } + if (update_hist_area) { + histogramArea->queue_draw(); } - histogramRGBArea->queue_draw (); } /* @@ -522,7 +546,8 @@ void HistogramPanel::updateHistAreaOptions() showChro->get_active(), showRAW->get_active(), options.histogramDrawMode, - options.histogramScopeType + options.histogramScopeType, + showBAR->get_active() ); } @@ -866,7 +891,8 @@ HistogramArea::HistogramArea (DrawModeListener *fml) : oldwidth(-1), oldheight(-1), needRed(options.histogramRed), needGreen(options.histogramGreen), needBlue(options.histogramBlue), needLuma(options.histogramLuma), needChroma(options.histogramChroma), rawMode(options.histogramRAW), - isPressed(false), movingPosition(0.0) + isPressed(false), movingPosition(0.0), + pointer_red(-1), pointer_green(-1), pointer_blue(-1) { rhist(256); @@ -930,7 +956,7 @@ void HistogramArea::get_preferred_width_for_height_vfunc (int height, int &minim get_preferred_width_vfunc (minimum_width, natural_width); } -void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, int type) +void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, int type, bool pointer) { options.histogramRed = needRed = r; @@ -941,6 +967,7 @@ void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool options.histogramRAW = rawMode = raw; options.histogramDrawMode = drawMode = mode; options.histogramScopeType = scopeType = type; + options.histogramBar = needPointer = pointer; wave_buffer_dirty = true; } @@ -1232,6 +1259,24 @@ void HistogramArea::updateBackBuffer () setDirty(false); } +bool HistogramArea::updatePointer(int r, int g, int b, const Glib::ustring &profile, const Glib::ustring &profileW) +{ + if (!needPointer || scopeType < 2) { + return false; + } + if (pointer_red == r && pointer_green == g && pointer_blue == b) { + return false; + } + + float L; + pointer_red = r; + pointer_green = g; + pointer_blue = b; + Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, L, pointer_a, pointer_b, options.rtSettings.HistogramWorking); + updateBackBuffer(); + return true; +} + void HistogramArea::on_realize () { @@ -1383,6 +1428,25 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in cr->paint(); surface->finish(); cr->set_matrix(orig_matrix); + + if (needPointer && pointer_red >= 0 && pointer_green >= 0 && pointer_blue >= 0) { + float cx, cy; + if (scopeType == 2) { + float H, S, L; + Color::rgb2hsl(pointer_red * 256.f, pointer_green * 256.f, pointer_blue * 256.f, H, S, L); + cx = (w + scope_size * S * cos(H * 2 * RT_PI)) / 2; + cy = (h - scope_size * S * sin(H * 2 * RT_PI)) / 2; + } else { + constexpr float ab_factor = 327.68f / 96000.f; + cx = w / 2.f + scope_size * pointer_a * ab_factor; + cy = h / 2.f - scope_size * pointer_b * ab_factor; + } + cr->arc(cx, cy, 2 * s, 0, 2 * RT_PI); + cr->set_source_rgb(0, 0, 0); + cr->fill_preserve(); + cr->set_source_rgb(1, 1, 1); + cr->stroke(); + } } } diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 227001845..75930db9b 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -182,16 +182,22 @@ protected: bool rawMode; bool isPressed; double movingPosition; + bool needPointer; double padding = 5.0; HistogramAreaIdleHelper* haih; + int pointer_red, pointer_green, pointer_blue; + float pointer_a, pointer_b; + public: explicit HistogramArea(DrawModeListener *fml = nullptr); ~HistogramArea() override; void updateBackBuffer (); + /// Update pointer values. Returns true if widget needs redrawing. + bool updatePointer(int r, int g, int b, const Glib::ustring &profile = "", const Glib::ustring &profileW = ""); void update( const LUTu& histRed, const LUTu& histGreen, @@ -210,7 +216,7 @@ public: const int waveformBlue[][256], const int waveformLuma[][256] ); - void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, int type); + void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, int type, bool pointer); void on_realize() override; bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; bool on_button_press_event (GdkEventButton* event) override; From ec27ad4abc21ff97333fbc7d9657b75b8c259462 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sat, 8 Aug 2020 17:11:18 -0700 Subject: [PATCH 049/185] Add waveform/vectorscope brightness feature --- rtgui/histogrampanel.cc | 28 +++++++++++++++++++++++----- rtgui/histogrampanel.h | 2 ++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 1a9782f98..06a0b912c 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -889,6 +889,7 @@ HistogramArea::HistogramArea (DrawModeListener *fml) : valid(false), drawMode(options.histogramDrawMode), myDrawModeListener(fml), scopeType(options.histogramScopeType), oldwidth(-1), oldheight(-1), + trace_brightness(1.0), needRed(options.histogramRed), needGreen(options.histogramGreen), needBlue(options.histogramBlue), needLuma(options.histogramLuma), needChroma(options.histogramChroma), rawMode(options.histogramRAW), isPressed(false), movingPosition(0.0), @@ -1334,7 +1335,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in { // Arbitrary scale factor multiplied by vectorscope area and divided by // current scale. - const float scale = 16.f * VECTORSCOPE_SIZE * VECTORSCOPE_SIZE / vectorscope_scale; + const float scale = trace_brightness * 8.f * VECTORSCOPE_SIZE * VECTORSCOPE_SIZE / vectorscope_scale; // See Cairo documentation on stride. const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, VECTORSCOPE_SIZE); @@ -1453,7 +1454,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h) { // Arbitrary scale factor divided by current scale. - const float scale = 32.f * 255.f / waveform_scale; + const float scale = trace_brightness * 32.f * 255.f / waveform_scale; // See Cairo documentation on stride. const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, waveform_width); @@ -1561,12 +1562,15 @@ bool HistogramArea::on_button_release_event (GdkEventButton* event) bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) { - if (drawMode == 0 || scopeType >= 1) { + if (drawMode == 0 && scopeType == 0) { return false; } - if (isPressed) - { + if (!isPressed) { + return true; + } + + if (scopeType == 0) { // Adjust log scale. double mod = 1 + (event->x - movingPosition) / get_width(); factor /= mod; @@ -1579,6 +1583,20 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) setDirty(true); queue_draw (); + } else if (scopeType >= 1 && scopeType <= 3) { // Adjust brightness. + constexpr float MIN_BRIGHT = 0.1; + constexpr float MAX_BRIGHT = 3; + constexpr float RANGE = MAX_BRIGHT / MIN_BRIGHT; + double dx = (event->x - movingPosition) / get_width(); + float new_brightness = LIM(trace_brightness * pow(RANGE, dx), MIN_BRIGHT, MAX_BRIGHT); + if (new_brightness != trace_brightness) { + wave_buffer_dirty = true; + vect_buffer_dirty = true; + trace_brightness = new_brightness; + setDirty(true); + queue_draw(); + } + movingPosition = event->x; } return true; diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 75930db9b..fb38ee757 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -177,6 +177,8 @@ protected: DrawModeListener *myDrawModeListener; int scopeType; int oldwidth, oldheight; + /// Intensity of waveform and vectorscope trace. + float trace_brightness; bool needRed, needGreen, needBlue, needLuma, needChroma; bool rawMode; From 6cd87ad975d4be08a77b418ce44c905da2180656 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sun, 9 Aug 2020 16:49:28 -0700 Subject: [PATCH 050/185] Use array2D for waveform and vectorscopes --- rtengine/improccoordinator.cc | 68 +++++++++-------- rtengine/improccoordinator.h | 8 +- rtengine/rtengine.h | 16 ++-- rtgui/editorpanel.cc | 14 ++-- rtgui/editorpanel.h | 17 +++-- rtgui/histogrampanel.cc | 139 +++++++++++++++++++--------------- rtgui/histogrampanel.h | 36 ++++----- 7 files changed, 160 insertions(+), 138 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 82527d530..3609617be 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -23,6 +23,7 @@ #include "improccoordinator.h" +#include "array2D.h" #include "cieimage.h" #include "color.h" #include "colortemp.h" @@ -47,6 +48,9 @@ namespace { + +constexpr int VECTORSCOPE_SIZE = 128; + using rtengine::Coord2D; Coord2D translateCoord(const rtengine::ImProcFunctions& ipf, int fw, int fh, int x, int y) { @@ -129,7 +133,11 @@ ImProcCoordinator::ImProcCoordinator() : histLRETI(256), - waveformWidth(0), + vectorscope(VECTORSCOPE_SIZE, VECTORSCOPE_SIZE), + waveformRed(0, 0), + waveformGreen(0, 0), + waveformBlue(0, 0), + waveformLuma(0, 0), CAMBrightCurveJ(), CAMBrightCurveQ(), @@ -1771,11 +1779,10 @@ void ImProcCoordinator::notifyHistogramChanged() vectorscopeScale, vectorscope, waveformScale, - waveformWidth, - waveformRed.get(), - waveformGreen.get(), - waveformBlue.get(), - waveformLuma.get() + waveformRed, + waveformGreen, + waveformBlue, + waveformLuma ); } } @@ -1850,8 +1857,8 @@ void ImProcCoordinator::updateVectorscope() int x1, y1, x2, y2; params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); - constexpr int size = HistogramListener::vectorscope_size; - memset(vectorscope, 0, size * size * sizeof(vectorscope[0][0])); + constexpr int size = VECTORSCOPE_SIZE; + memset((int*)vectorscope, 0, size * size * sizeof(vectorscope[0][0])); const int lab_img_size = (hListener->vectorscopeType() == 1) ? (x2 - x1) * (y2 - y1) : 0; float L[lab_img_size], a[lab_img_size], b[lab_img_size]; @@ -1901,43 +1908,44 @@ void ImProcCoordinator::updateVectorscope() void ImProcCoordinator::updateWaveforms() { if (!workimg) { - waveformWidth = 0; + // Resize to zero. + waveformRed(0, 0); + waveformGreen(0, 0); + waveformBlue(0, 0); + waveformLuma(0, 0); return; } int x1, y1, x2, y2; params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); + int waveform_width = waveformRed.getWidth(); - if (waveformWidth != x2 - x1) { + if (waveform_width != x2 - x1) { // Resize waveform arrays. - waveformWidth = x2 - x1; - waveformRed.reset(new int[waveformWidth][256]); - waveformGreen.reset(new int[waveformWidth][256]); - waveformBlue.reset(new int[waveformWidth][256]); - waveformLuma.reset(new int[waveformWidth][256]); + waveform_width = x2 - x1; + waveformRed(waveform_width, 256); + waveformGreen(waveform_width, 256); + waveformBlue(waveform_width, 256); + waveformLuma(waveform_width, 256); } - int (*red)[256] = waveformRed.get(); - int (*green)[256] = waveformGreen.get(); - int (*blue)[256] = waveformBlue.get(); - int (*luma)[256] = waveformLuma.get(); - // Start with zero. - const int waveformSize = 256 * waveformWidth; - memset(waveformRed.get(), 0, waveformSize * sizeof(red[0][0])); - memset(waveformGreen.get(), 0, waveformSize * sizeof(green[0][0])); - memset(waveformBlue.get(), 0, waveformSize * sizeof(blue[0][0])); - memset(waveformLuma.get(), 0, waveformSize * sizeof(luma[0][0])); + const int waveformSize = 256 * waveform_width; + memset((int*)waveformRed, 0, waveformSize * sizeof(waveformRed[0][0])); + memset((int*)waveformGreen, 0, waveformSize * sizeof(waveformGreen[0][0])); + memset((int*)waveformBlue, 0, waveformSize * sizeof(waveformBlue[0][0])); + memset((int*)waveformLuma, 0, waveformSize * sizeof(waveformLuma[0][0])); constexpr float luma_factor = 255.f / 32768.f; for (int i = y1; i < y2; i++) { int ofs = (i * pW + x1) * 3; + float* L_row = nprevl->L[i] + x1; - for (int j = 0; j < waveformWidth; j++) { - red[j][workimg->data[ofs++]]++; - green[j][workimg->data[ofs++]]++; - blue[j][workimg->data[ofs++]]++; - luma[j][(int)(nprevl->L[i][j + x1] * luma_factor)]++; + for (int j = 0; j < waveform_width; j++) { + waveformRed[workimg->data[ofs++]][j]++; + waveformGreen[workimg->data[ofs++]][j]++; + waveformBlue[workimg->data[ofs++]][j]++; + waveformLuma[LIM(L_row[j] * luma_factor, 0, 255)][j]++; } } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 5eeef3e9e..8a112b270 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -127,14 +127,10 @@ protected: LUTu histLuma, histToneCurve, histToneCurveBW, histLCurve, histCCurve; LUTu histLLCurve, histLCAM, histCCAM, histClad, bcabhist, histChroma, histLRETI; int vectorscopeScale; - int vectorscope[HistogramListener::vectorscope_size][HistogramListener::vectorscope_size]; + array2D vectorscope; /// Waveform's intensity. Same as height of reference image. int waveformScale; - int waveformWidth; - std::unique_ptr waveformRed, waveformRedRaw; - std::unique_ptr waveformGreen, waveformGreenRaw; - std::unique_ptr waveformBlue, waveformBlueRaw; - std::unique_ptr waveformLuma; + array2D waveformRed, waveformGreen, waveformBlue, waveformLuma; LUTf CAMBrightCurveJ, CAMBrightCurveQ; diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index aa5e6aed7..9c4092f2b 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -42,6 +42,9 @@ * */ +template +class array2D; + template class LUT; @@ -308,8 +311,6 @@ class HistogramObservable; class HistogramListener { public: - static constexpr int vectorscope_size = 128; - virtual ~HistogramListener() = default; /** This member function is called when the histogram of the final image has changed. * @param histRed is the array of size 256 containing the histogram of the red channel @@ -333,13 +334,12 @@ public: const LUTu& histChroma, const LUTu& histLRETI, int vectorscopeScale, - const int vectorscope[vectorscope_size][vectorscope_size], + const array2D& vectorscope, int waveformScale, - int waveformWidth, - const int waveformRed[][256], - const int waveformGreen[][256], - const int waveformBlue[][256], - const int waveformLuma[][256] + const array2D& waveformRed, + const array2D& waveformGreen, + const array2D& waveformBlue, + const array2D& waveformLuma ) = 0; /** Tells which observable is notifying the listener. */ virtual void setObservable(HistogramObservable* observable) = 0; diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 2d3099727..7f5c99997 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -21,6 +21,7 @@ #include +#include "../rtengine/array2D.h" #include "../rtengine/imagesource.h" #include "../rtengine/iccstore.h" #include "batchqueue.h" @@ -2248,17 +2249,16 @@ void EditorPanel::histogramChanged( const LUTu& histChroma, const LUTu& histLRETI, int vectorscopeScale, - const int vectorscope[HistogramListener::vectorscope_size][HistogramListener::vectorscope_size], + const array2D& vectorscope, int waveformScale, - int waveformWidth, - const int waveformRed[][256], - const int waveformGreen[][256], - const int waveformBlue[][256], - const int waveformLuma[][256] + const array2D& waveformRed, + const array2D& waveformGreen, + const array2D& waveformBlue, + const array2D& waveformLuma ) { if (histogramPanel) { - histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscope, waveformScale, waveformWidth, waveformRed, waveformGreen, waveformBlue, waveformLuma); + histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscope, waveformScale, waveformRed, waveformGreen, waveformBlue, waveformLuma); } tpc->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index ed34c1931..2916dc822 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -32,6 +32,12 @@ #include "../rtengine/noncopyable.h" #include "../rtengine/rtengine.h" +namespace rtengine +{ +template +class array2D; +} + class BatchQueueEntry; class EditorPanel; class FilePanel; @@ -129,13 +135,12 @@ public: const LUTu& histChroma, const LUTu& histLRETI, int vectorscopeScale, - const int vectorscope[HistogramListener::vectorscope_size][HistogramListener::vectorscope_size], + const array2D& vectorscope, int waveformScale, - int waveformWidth, - const int waveformRed[][256], - const int waveformGreen[][256], - const int waveformBlue[][256], - const int waveformLuma[][256] + const array2D& waveformRed, + const array2D& waveformGreen, + const array2D& waveformBlue, + const array2D& waveformLuma ) override; void setObservable(rtengine::HistogramObservable* observable) override; bool updateHistogram(void) override; diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 06a0b912c..416a114fd 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -22,6 +22,7 @@ #include "options.h" #include #include +#include "../rtengine/array2D.h" #include "../rtengine/LUT.h" #include "rtimage.h" #include "../rtengine/color.h" @@ -885,7 +886,10 @@ void HistogramRGBAreaVert::get_preferred_width_for_height_vfunc (int height, int // // HistogramArea HistogramArea::HistogramArea (DrawModeListener *fml) : - waveform_width(0), wave_buffer_dirty(true), + vect(0, 0), + vect_buffer_dirty(true), vect_buffer_size(0), + rwave(0, 0), gwave(0, 0),bwave(0, 0), lwave(0, 0), + wave_buffer_dirty(true), valid(false), drawMode(options.histogramDrawMode), myDrawModeListener(fml), scopeType(options.histogramScopeType), oldwidth(-1), oldheight(-1), @@ -902,9 +906,6 @@ HistogramArea::HistogramArea (DrawModeListener *fml) : lhist(256); chist(256); - const int vect_size = VECTORSCOPE_SIZE * Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, VECTORSCOPE_SIZE); - vect_buffer.reset(new unsigned char[vect_size]); - get_style_context()->add_class("drawingarea"); set_name("HistogramArea"); @@ -983,13 +984,12 @@ void HistogramArea::update( const LUTu& histGreenRaw, const LUTu& histBlueRaw, int vectorscopeScale, - const int vectorscope[VECTORSCOPE_SIZE][VECTORSCOPE_SIZE], + const array2D& vectorscope, int waveformScale, - int waveformWidth, - const int waveformRed[][256], - const int waveformGreen[][256], - const int waveformBlue[][256], - const int waveformLuma[][256] + const array2D& waveformRed, + const array2D& waveformGreen, + const array2D& waveformBlue, + const array2D& waveformLuma ) { if (histRed) { @@ -1003,27 +1003,26 @@ void HistogramArea::update( ghistRaw = histGreenRaw; bhistRaw = histBlueRaw; } else if (scopeType == 1) { + const int wave_width = waveformRed.getWidth(); + const int wave_height = waveformRed.getHeight(); waveform_scale = waveformScale; - if (waveform_width != waveformWidth) { - waveform_width = waveformWidth; - rwave.reset(new int[waveformWidth][256]); - gwave.reset(new int[waveformWidth][256]); - bwave.reset(new int[waveformWidth][256]); - lwave.reset(new int[waveformWidth][256]); + if (wave_width != rwave.getWidth() || wave_height != rwave.getHeight()) { + rwave(wave_width, wave_height); + gwave(wave_width, wave_height); + bwave(wave_width, wave_height); + lwave(wave_width, wave_height); } - int (* const rw)[256] = rwave.get(); - int (* const gw)[256] = gwave.get(); - int (* const bw)[256] = bwave.get(); - int (* const lw)[256] = lwave.get(); - memcpy(rw, waveformRed, 256 * waveformWidth * sizeof(rw[0][0])); - memcpy(gw, waveformGreen, 256 * waveformWidth * sizeof(gw[0][0])); - memcpy(bw, waveformBlue, 256 * waveformWidth * sizeof(bw[0][0])); - memcpy(lw, waveformLuma, 256 * waveformWidth * sizeof(lw[0][0])); + memcpy((int*)rwave, (const int*)waveformRed, wave_height * wave_width * sizeof(rwave[0][0])); + memcpy((int*)gwave, (const int*)waveformGreen, wave_height * wave_width * sizeof(gwave[0][0])); + memcpy((int*)bwave, (const int*)waveformBlue, wave_height * wave_width * sizeof(bwave[0][0])); + memcpy((int*)lwave, (const int*)waveformLuma, wave_height * wave_width * sizeof(lwave[0][0])); wave_buffer_dirty = true; } else if (scopeType >= 2) { vectorscope_scale = vectorscopeScale; - memcpy(vect, vectorscope, VECTORSCOPE_SIZE * VECTORSCOPE_SIZE * - sizeof(vect[0][0])); + if (vect.getWidth() != vectorscope.getWidth() || vect.getHeight() != vectorscope.getHeight()) { + vect(vectorscope.getWidth(), vectorscope.getHeight()); + } + memcpy((int*)vect, (const int*)vectorscope, vect.getHeight() * vect.getWidth() * sizeof(vect[0][0])); vect_buffer_dirty = true; } valid = true; @@ -1245,7 +1244,7 @@ void HistogramArea::updateBackBuffer () drawMarks(cr, bhchanged, realhistheight, w, ui, oi); } - } else if (scopeType == 1 && waveform_width > 0) { + } else if (scopeType == 1 && rwave.getWidth() > 0) { drawWaveform(cr, w, h); } else if (scopeType >= 2) { drawVectorscope(cr, w, h); @@ -1333,29 +1332,42 @@ void HistogramArea::drawMarks(Cairo::RefPtr &cr, void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, int h) { + const int vect_width = vect.getWidth(); + const int vect_height = vect.getHeight(); // Arbitrary scale factor multiplied by vectorscope area and divided by // current scale. - const float scale = trace_brightness * 8.f * VECTORSCOPE_SIZE * VECTORSCOPE_SIZE / vectorscope_scale; + const float scale = trace_brightness * 8.f * vect_width * vect_height / vectorscope_scale; // See Cairo documentation on stride. - const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, VECTORSCOPE_SIZE); + const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, vect_width); if (vect_buffer_dirty && vectorscope_scale > 0) { + if (vect_buffer_size != cairo_stride * vect_height) { + vect_buffer_size = cairo_stride * vect_height; + vect_buffer.reset(new unsigned char[vect_buffer_size]); + } + // TODO: Optimize. - for (int u = 0; u < VECTORSCOPE_SIZE; u++) { - for (int v = 0; v < VECTORSCOPE_SIZE; v++) { - const unsigned char value = min(scale * vect[u][v], 0xff); - *(uint32_t*)&(vect_buffer[(VECTORSCOPE_SIZE - 1 - u) * cairo_stride + v * 4]) = - value | (value << 8) | (value << 16) | (value << 24); + for (int y = 0; y < vect_height; y++) { + int* vect_row = vect[y]; + uint32_t* buffer_row = + (uint32_t*)&(vect_buffer[(vect_height - 1 - y) * cairo_stride]); + for (int x = 0; x < vect_width; x++) { + const unsigned char value = min(scale * vect_row[x], 0xff); + buffer_row[x] = value | (value << 8) | (value << 16) | (value << 24); } } vect_buffer_dirty = false; } - const float scope_size = min(w, h) - 2 * padding; - const float o_x = (w - scope_size) / 2; - const float o_y = (h - scope_size) / 2; + const bool fit_width = + vect_width * (h - 2 * padding) > vect_height * (w - 2 * padding); + const float scope_scale = fit_width ? + (w - 2 * padding) / vect_width : (h - 2 * padding) / vect_height; + const float scope_size = scope_scale * max(vect_width, vect_height); + const float o_x = (w - scope_scale * vect_width) / 2; + const float o_y = (h - scope_scale * vect_height) / 2; const double s = RTScalable::getScale(); auto orig_matrix = cr->get_matrix(); const double line_spacing = 4.0 * s; @@ -1421,9 +1433,9 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in // Vectorscope trace. if (vectorscope_scale > 0) { Cairo::RefPtr surface = Cairo::ImageSurface::create( - vect_buffer.get(), Cairo::FORMAT_ARGB32, VECTORSCOPE_SIZE, VECTORSCOPE_SIZE, cairo_stride); + vect_buffer.get(), Cairo::FORMAT_ARGB32, vect_width, vect_height, cairo_stride); cr->translate(o_x, o_y); - cr->scale(scope_size / VECTORSCOPE_SIZE, scope_size / VECTORSCOPE_SIZE); + cr->scale(scope_scale, scope_scale); cr->set_source(surface, 0, 0); cr->set_operator(Cairo::OPERATOR_OVER); cr->paint(); @@ -1455,41 +1467,48 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h { // Arbitrary scale factor divided by current scale. const float scale = trace_brightness * 32.f * 255.f / waveform_scale; + const int wave_width = rwave.getWidth(); + const int wave_height = rwave.getHeight(); // See Cairo documentation on stride. - const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, waveform_width); + const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, rwave.getWidth()); if (wave_buffer_dirty) { - wave_buffer.reset(new unsigned char[256 * cairo_stride]); - wave_buffer_luma.reset(new unsigned char[256 * cairo_stride]); + wave_buffer.reset(new unsigned char[wave_height * cairo_stride]); + wave_buffer_luma.reset(new unsigned char[wave_height * cairo_stride]); // Clear waveform. - memset(wave_buffer.get(), 0, 256 * cairo_stride); - memset(wave_buffer_luma.get(), 0, 256 * cairo_stride); + memset(wave_buffer.get(), 0, wave_height * cairo_stride); + memset(wave_buffer_luma.get(), 0, wave_height * cairo_stride); // TODO: Optimize. - for (int col = 0; col < waveform_width; col++) { - for (int val = 0; val < 256; val++) { - const unsigned char r = needRed ? min(scale * rwave[col][val], 0xff) : 0; - const unsigned char g = needGreen ? min(scale * gwave[col][val], 0xff) : 0; - const unsigned char b = needBlue ? min(scale * bwave[col][val], 0xff) : 0; + for (int val = 0; val < wave_height; val++) { + int* r_row = rwave[val]; + int* g_row = gwave[val]; + int* b_row = bwave[val]; + uint32_t* buffer_row = (uint32_t*)&(wave_buffer[(255 - val) * cairo_stride]); + for (int col = 0; col < wave_width; col++) { + const unsigned char r = needRed ? min(scale * r_row[col], 0xff) : 0; + const unsigned char g = needGreen ? min(scale * g_row[col], 0xff) : 0; + const unsigned char b = needBlue ? min(scale * b_row[col], 0xff) : 0; const unsigned char value = (r > g && r > b) ? r : ((g > b) ? g : b); if (value <= 0) { - *(uint32_t*)&(wave_buffer[(255 - val) * cairo_stride + col * 4]) = 0; + buffer_row[col] = 0; } else { // Speedup with one memory access instead of four. - *(uint32_t*)&(wave_buffer[(255 - val) * cairo_stride + col * 4]) = - b | (g << 8) | (r << 16) | (value << 24); + buffer_row[col] = b | (g << 8) | (r << 16) | (value << 24); } } } if (needLuma) { - for (int col = 0; col < waveform_width; col++) { - for (int val = 0; val < 256; val++) { - const unsigned char l = min(scale * lwave[col][val], 0xff); - *(uint32_t*)&(wave_buffer_luma[(255 - val) * cairo_stride + col * 4]) = - l | (l << 8) | (l << 16) | (l << 24); + for (int val = 0; val < wave_height; val++) { + int* l_row = lwave[val]; + uint32_t* buffer_row = + (uint32_t*)&(wave_buffer_luma[(255 - val) * cairo_stride]); + for (int col = 0; col < wave_width; col++) { + const unsigned char l = min(scale * l_row[col], 0xff); + buffer_row[col] = l | (l << 8) | (l << 16) | (l << 24); } } } @@ -1500,17 +1519,17 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h Cairo::RefPtr surface; auto orig_matrix = cr->get_matrix(); cr->translate(0, padding); - cr->scale(static_cast(w) / waveform_width, (h - 2 * padding) / 256.0); + cr->scale(static_cast(w) / wave_width, (h - 2 * padding) / wave_height); if (needLuma) { surface = Cairo::ImageSurface::create( - wave_buffer_luma.get(), Cairo::FORMAT_ARGB32, waveform_width, 256, cairo_stride); + wave_buffer_luma.get(), Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); cr->set_source(surface, 0, 0); cr->set_operator(Cairo::OPERATOR_OVER); cr->paint(); surface->finish(); } surface = Cairo::ImageSurface::create( - wave_buffer.get(), Cairo::FORMAT_ARGB32, waveform_width, 256, cairo_stride); + wave_buffer.get(), Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); cr->set_source(surface, 0, 0); cr->set_operator(Cairo::OPERATOR_OVER); cr->paint(); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index fb38ee757..bda65df0c 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -27,16 +27,12 @@ #include "guiutils.h" #include "pointermotionlistener.h" +#include "../rtengine/array2D.h" #include "../rtengine/LUT.h" #include "../rtengine/noncopyable.h" class HistogramArea; -namespace -{ -constexpr int VECTORSCOPE_SIZE = 128; -} - struct HistogramAreaIdleHelper { HistogramArea* harea; bool destroyed; @@ -162,12 +158,12 @@ protected: LUTu rhist, ghist, bhist, lhist, chist; LUTu rhistRaw, ghistRaw, bhistRaw, lhistRaw; //lhistRaw is unused? int vectorscope_scale; - int vect[VECTORSCOPE_SIZE][VECTORSCOPE_SIZE]; + array2D vect; std::unique_ptr vect_buffer; bool vect_buffer_dirty; + int vect_buffer_size; int waveform_scale; - int waveform_width; - std::unique_ptr rwave, gwave, bwave, lwave; + array2D rwave, gwave, bwave, lwave; std::unique_ptr wave_buffer; std::unique_ptr wave_buffer_luma; bool wave_buffer_dirty; @@ -210,13 +206,12 @@ public: const LUTu& histGreenRaw, const LUTu& histBlueRaw, int vectorscopeScale, - const int vectorscope[VECTORSCOPE_SIZE][VECTORSCOPE_SIZE], + const array2D& vectorscope, int waveformScale, - int waveformWidth, - const int waveformRed[][256], - const int waveformGreen[][256], - const int waveformBlue[][256], - const int waveformLuma[][256] + const array2D& waveformRed, + const array2D& waveformGreen, + const array2D& waveformBlue, + const array2D& waveformLuma ); void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, int type, bool pointer); void on_realize() override; @@ -314,16 +309,15 @@ public: const LUTu& histGreenRaw, const LUTu& histBlueRaw, int vectorscopeScale, - const int vectorscope[VECTORSCOPE_SIZE][VECTORSCOPE_SIZE], + const array2D& vectorscope, int waveformScale, - int waveformWidth, - const int waveformRed[][256], - const int waveformGreen[][256], - const int waveformBlue[][256], - const int waveformLuma[][256] + const array2D& waveformRed, + const array2D& waveformGreen, + const array2D& waveformBlue, + const array2D& waveformLuma ) { - histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscope, waveformScale, waveformWidth, waveformRed, waveformGreen, waveformBlue, waveformLuma); + histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscope, waveformScale, waveformRed, waveformGreen, waveformBlue, waveformLuma); } // pointermotionlistener interface void pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw = false) override; From 8b3af4c520eb2fcbcf413019bee0ede637a16875 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sun, 9 Aug 2020 16:59:27 -0700 Subject: [PATCH 051/185] Fix some cppcheck warnings --- rtengine/improccoordinator.cc | 13 ++++++++----- rtgui/histogrampanel.cc | 4 +++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 3609617be..7ae814f8c 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -133,7 +133,9 @@ ImProcCoordinator::ImProcCoordinator() : histLRETI(256), + vectorscopeScale(0), vectorscope(VECTORSCOPE_SIZE, VECTORSCOPE_SIZE), + waveformScale(0), waveformRed(0, 0), waveformGreen(0, 0), waveformBlue(0, 0), @@ -1861,8 +1863,9 @@ void ImProcCoordinator::updateVectorscope() memset((int*)vectorscope, 0, size * size * sizeof(vectorscope[0][0])); const int lab_img_size = (hListener->vectorscopeType() == 1) ? (x2 - x1) * (y2 - y1) : 0; - float L[lab_img_size], a[lab_img_size], b[lab_img_size]; + float a[lab_img_size], b[lab_img_size]; if (lab_img_size) { + float L[lab_img_size]; ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L, a, b, params->icm); } @@ -1874,11 +1877,11 @@ void ImProcCoordinator::updateVectorscope() switch (hListener->vectorscopeType()) { case 0: { // HS - int r = 256 * workimg->data[ofs++]; - int g = 256 * workimg->data[ofs++]; - int b = 256 * workimg->data[ofs++]; + int red = 256 * workimg->data[ofs++]; + int green = 256 * workimg->data[ofs++]; + int blue = 256 * workimg->data[ofs++]; float h, s, l; - Color::rgb2hsl(r, g, b, h, s, l); + Color::rgb2hsl(red, green, blue, h, s, l); const int col = s * cos(2 * RT_PI * h) * (size / 2) + size / 2; const int row = s * sin(2 * RT_PI * h) * (size / 2) + size / 2; if (col >= 0 && col < size && row >= 0 && row < size) { diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 416a114fd..65e2acfdf 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -886,8 +886,10 @@ void HistogramRGBAreaVert::get_preferred_width_for_height_vfunc (int height, int // // HistogramArea HistogramArea::HistogramArea (DrawModeListener *fml) : + vectorscope_scale(0), vect(0, 0), vect_buffer_dirty(true), vect_buffer_size(0), + waveform_scale(0), rwave(0, 0), gwave(0, 0),bwave(0, 0), lwave(0, 0), wave_buffer_dirty(true), valid(false), drawMode(options.histogramDrawMode), myDrawModeListener(fml), @@ -1492,7 +1494,7 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h const unsigned char g = needGreen ? min(scale * g_row[col], 0xff) : 0; const unsigned char b = needBlue ? min(scale * b_row[col], 0xff) : 0; const unsigned char value = (r > g && r > b) ? r : ((g > b) ? g : b); - if (value <= 0) { + if (value == 0) { buffer_row[col] = 0; } else { // Speedup with one memory access instead of four. From f7c02af1849eb73b6abdebfd742b75a319f704f4 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sun, 9 Aug 2020 17:22:23 -0700 Subject: [PATCH 052/185] Fix rendering of blank vectorscope --- rtgui/histogrampanel.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 65e2acfdf..ec8f9a326 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1367,7 +1367,8 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in vect_width * (h - 2 * padding) > vect_height * (w - 2 * padding); const float scope_scale = fit_width ? (w - 2 * padding) / vect_width : (h - 2 * padding) / vect_height; - const float scope_size = scope_scale * max(vect_width, vect_height); + const float scope_size = (vectorscope_scale > 0) ? + scope_scale * max(vect_width, vect_height) : min(w, h) - 2 * padding; const float o_x = (w - scope_scale * vect_width) / 2; const float o_y = (h - scope_scale * vect_height) / 2; const double s = RTScalable::getScale(); From e247a1e08655dbbd00f98d55fcdad7cd53b38200 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sun, 9 Aug 2020 18:00:12 -0700 Subject: [PATCH 053/185] Increase visibility of vectorscope pointer --- rtgui/histogrampanel.cc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index ec8f9a326..236f5af02 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1457,10 +1457,19 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in cx = w / 2.f + scope_size * pointer_a * ab_factor; cy = h / 2.f - scope_size * pointer_b * ab_factor; } - cr->arc(cx, cy, 2 * s, 0, 2 * RT_PI); - cr->set_source_rgb(0, 0, 0); - cr->fill_preserve(); + cr->set_source_rgba(1, 1, 1, 0.5); + cr->set_dash(ch_ds, 0); + cr->move_to(0, cy); + cr->line_to(w, cy); + cr->move_to(cx, 0); + cr->line_to(cx, h); + cr->stroke(); + cr->unset_dash(); + cr->arc(cx, cy, 3 * s, 0, 2 * RT_PI); cr->set_source_rgb(1, 1, 1); + cr->fill_preserve(); + cr->set_source_rgb(0, 0, 0); + cr->set_line_width (1.0 * s); cr->stroke(); } } From a55e06c6768a402a94928470feac2aa39b3585da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 10 Aug 2020 13:55:45 +0200 Subject: [PATCH 054/185] Remove C++14isms from `delayed_helper::apply()` Clang to the rescue: - `void` isn't a literal type in C++11 - calling `f()` from `constexpr` isn't allowed in C++11 So, remove `constexpr` to simplify things. --- rtgui/delayed.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtgui/delayed.h b/rtgui/delayed.h index cf4f22bf8..b57d7300b 100644 --- a/rtgui/delayed.h +++ b/rtgui/delayed.h @@ -55,13 +55,13 @@ namespace delayed_helper // See https://aherrmann.github.io/programming/2016/02/28/unpacking-tuples-in-cpp14/ template - constexpr void apply_impl(F f, T t, index_sequence) + void apply_impl(F f, T t, index_sequence) { f(std::get(t)...); } template - constexpr void apply(F f, T t) + void apply(F f, T t) { apply_impl(f, t, make_index_sequence{}>{}); } From a5c7713042d73a4887c4deda451a6659467cedcb Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 13 Aug 2020 13:10:33 +0200 Subject: [PATCH 055/185] Cleanup: removed unused function; also murder instead of call for suicide (delete this) --- rtengine/iimage.h | 5 +- rtengine/image16.cc | 23 ++----- rtengine/image16.h | 11 ---- rtengine/image8.h | 10 --- rtengine/imagefloat.cc | 119 ++++------------------------------ rtengine/imagefloat.h | 12 ---- rtengine/improccoordinator.cc | 2 - rtgui/batchqueue.cc | 2 +- rtgui/bqentryupdater.cc | 2 +- rtgui/editorpanel.cc | 8 +-- rtgui/filebrowserentry.cc | 4 +- rtgui/main-cli.cc | 2 +- rtgui/previewhandler.cc | 2 +- 13 files changed, 29 insertions(+), 173 deletions(-) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index cd8aa9a9e..65c3a641e 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -1809,9 +1809,6 @@ public: * @return The mutex */ virtual MyMutex& getMutex () = 0; virtual cmsHPROFILE getProfile () const = 0; - /** @brief Returns the bits per pixel of the image. - * @return The bits per pixel of the image */ - virtual int getBitsPerPixel () const = 0; /** @brief Saves the image to file. It autodetects the format (jpg, tif, png are supported). * @param fname is the name of the file @return the error code, 0 if none */ @@ -1837,7 +1834,7 @@ public: * @param pl is the pointer to the class implementing the ProgressListener interface */ virtual void setSaveProgressListener (ProgressListener* pl) = 0; /** @brief Free the image */ - virtual void free () = 0; +// virtual void free () = 0; }; /** @brief This class represents an image having a float pixel planar representation. diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 07fc66fad..1a9130b5d 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -258,10 +258,10 @@ void Image16::getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, P lineB[dst_x] = CLIP(bm * btot); } else { // computing a special factor for this incomplete sub-region - float area = src_sub_width * src_sub_height; - lineR[dst_x] = CLIP(rm2 * rtot / area); - lineG[dst_x] = CLIP(gm2 * gtot / area); - lineB[dst_x] = CLIP(bm2 * btot / area); + float larea = src_sub_width * src_sub_height; + lineR[dst_x] = CLIP(rm2 * rtot / larea); + lineG[dst_x] = CLIP(gm2 * gtot / larea); + lineB[dst_x] = CLIP(bm2 * btot / larea); } } } @@ -295,21 +295,6 @@ void Image16::getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, P #undef GCLIP } -Image8* Image16::to8() const -{ - Image8* img8 = new Image8(width, height); - - for (int h = 0; h < height; ++h) { - for (int w = 0; w < width; ++w) { - img8->r(h, w) = uint16ToUint8Rounded(r(h, w)); - img8->g(h, w) = uint16ToUint8Rounded(g(h, w)); - img8->b(h, w) = uint16ToUint8Rounded(b(h, w)); - } - } - - return img8; -} - // Parallelized transformation; create transform with cmsFLAGS_NOCACHE! void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform) { diff --git a/rtengine/image16.h b/rtengine/image16.h index de9288f2d..de9718708 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -40,8 +40,6 @@ public: Image16* copy() const; - Image8* to8() const; - void getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const override; const char* getType() const override @@ -67,11 +65,6 @@ public: return getEmbeddedProfile(); } - int getBitsPerPixel() const override - { - return 8 * sizeof(unsigned short); - } - int saveToFile(const Glib::ustring &fname) const override { return save(fname); @@ -97,10 +90,6 @@ public: setProgressListener(pl); } - void free() override - { - delete this; - } void ExecCMSTransform(cmsHTRANSFORM hTransform); /* void ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy); */ diff --git a/rtengine/image8.h b/rtengine/image8.h index c11d9d7fc..dd3be5d9b 100644 --- a/rtengine/image8.h +++ b/rtengine/image8.h @@ -64,11 +64,6 @@ public: return getEmbeddedProfile (); } - int getBitsPerPixel () const override - { - return 8 * sizeof(unsigned char); - } - int saveToFile (const Glib::ustring &fname) const override { return save (fname); @@ -94,11 +89,6 @@ public: setProgressListener (pl); } - void free () override - { - delete this; - } - }; } diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index f905134a0..d9ac841eb 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -288,10 +288,10 @@ void Imagefloat::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* imag lineB[dst_x] = CLIP0(bm * btot); } else { // computing a special factor for this incomplete sub-region - float area = src_sub_width * src_sub_height; - lineR[dst_x] = CLIP0(rm2 * rtot / area); - lineG[dst_x] = CLIP0(gm2 * gtot / area); - lineB[dst_x] = CLIP0(bm2 * btot / area); + float larea = src_sub_width * src_sub_height; + lineR[dst_x] = CLIP0(rm2 * rtot / larea); + lineG[dst_x] = CLIP0(gm2 * gtot / larea); + lineB[dst_x] = CLIP0(bm2 * btot / larea); } } } @@ -327,53 +327,15 @@ void Imagefloat::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* imag #endif } -Image8* -Imagefloat::to8() const -{ - Image8* img8 = new Image8(width, height); -#ifdef _OPENMP - #pragma omp parallel for schedule(static) -#endif - - for (int h = 0; h < height; ++h) { - for (int w = 0; w < width; ++w) { - img8->r(h, w) = uint16ToUint8Rounded(CLIP(r(h, w))); - img8->g(h, w) = uint16ToUint8Rounded(CLIP(g(h, w))); - img8->b(h, w) = uint16ToUint8Rounded(CLIP(b(h, w))); - } - } - - return img8; -} - -Image16* -Imagefloat::to16() const -{ - Image16* img16 = new Image16(width, height); -#ifdef _OPENMP - #pragma omp parallel for schedule(static) -#endif - - for (int h = 0; h < height; ++h) { - for (int w = 0; w < width; ++w) { - img16->r(h, w) = CLIP(r(h, w)); - img16->g(h, w) = CLIP(g(h, w)); - img16->b(h, w) = CLIP(b(h, w)); - } - } - - return img16; -} - void Imagefloat::normalizeFloat(float srcMinVal, float srcMaxVal) { - float scale = MAXVALF / (srcMaxVal - srcMinVal); - int w = width; - int h = height; + const float scale = MAXVALF / (srcMaxVal - srcMinVal); + const int w = width; + const int h = height; #ifdef _OPENMP - #pragma omp parallel for firstprivate(w, h, srcMinVal, scale) schedule(dynamic, 5) + #pragma omp parallel for schedule(dynamic, 5) #endif for (int y = 0; y < h; y++) { @@ -389,11 +351,11 @@ void Imagefloat::normalizeFloat(float srcMinVal, float srcMaxVal) void Imagefloat::normalizeFloatTo1() { - int w = width; - int h = height; + const int w = width; + const int h = height; #ifdef _OPENMP - #pragma omp parallel for firstprivate(w, h) schedule(dynamic, 5) + #pragma omp parallel for schedule(dynamic, 5) #endif for (int y = 0; y < h; y++) { @@ -409,11 +371,11 @@ void Imagefloat::normalizeFloatTo1() void Imagefloat::normalizeFloatTo65535() { - int w = width; - int h = height; + const int w = width; + const int h = height; #ifdef _OPENMP - #pragma omp parallel for firstprivate(w, h) schedule(dynamic, 5) + #pragma omp parallel for schedule(dynamic, 5) #endif for (int y = 0; y < h; y++) { @@ -425,59 +387,6 @@ void Imagefloat::normalizeFloatTo65535() } } -void Imagefloat::calcCroppedHistogram(const ProcParams ¶ms, float scale, LUTu & hist) -{ - - hist.clear(); - - // Set up factors to calc the lightness - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.workingProfile); - - float facRed = wprof[1][0]; - float facGreen = wprof[1][1]; - float facBlue = wprof[1][2]; - - - // calc pixel size - int x1, x2, y1, y2; - params.crop.mapToResized(width, height, scale, x1, x2, y1, y2); - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - LUTu histThr(65536); - histThr.clear(); -#ifdef _OPENMP - #pragma omp for nowait -#endif - - for (int y = y1; y < y2; y++) { - for (int x = x1; x < x2; x++) { - int i = (int)(facRed * r(y, x) + facGreen * g(y, x) + facBlue * b(y, x)); - - if (i < 0) { - i = 0; - } else if (i > 65535) { - i = 65535; - } - - histThr[i]++; - } - } - -#ifdef _OPENMP - #pragma omp critical -#endif - { - for(int i = 0; i <= 0xffff; i++) { - hist[i] += histThr[i]; - } - } - } - -} - // Parallelized transformation; create transform with cmsFLAGS_NOCACHE! void Imagefloat::ExecCMSTransform(cmsHTRANSFORM hTransform) { diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h index c7000d4b8..3362afcda 100644 --- a/rtengine/imagefloat.h +++ b/rtengine/imagefloat.h @@ -45,9 +45,6 @@ public: Imagefloat* copy () const; - Image8* to8() const; - Image16* to16() const; - void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const override; const char* getType () const override @@ -72,10 +69,6 @@ public: { return getEmbeddedProfile (); } - int getBitsPerPixel () const override - { - return 8 * sizeof(float); - } int saveToFile (const Glib::ustring &fname) const override { return save (fname); @@ -96,10 +89,6 @@ public: { setProgressListener (pl); } - void free () override - { - delete this; - } inline uint16_t DNG_FloatToHalf(float f) const { @@ -220,7 +209,6 @@ public: void normalizeFloat(float srcMinVal, float srcMaxVal) override; void normalizeFloatTo1(); void normalizeFloatTo65535(); - void calcCroppedHistogram(const ProcParams ¶ms, float scale, LUTu & hist); void ExecCMSTransform(cmsHTRANSFORM hTransform); void ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy); }; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index aa8770504..fc9d215b7 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -852,8 +852,6 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if ((todo & M_RGBCURVE) || (todo & M_CROP)) { - // if (hListener) oprevi->calcCroppedHistogram(params, scale, histCropped); - //complexCurve also calculated pre-curves histogram depending on crop CurveFactory::complexCurve(params->toneCurve.expcomp, params->toneCurve.black / 65535.0, params->toneCurve.hlcompr, params->toneCurve.hlcomprthresh, diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 8b4583877..3b6bb73ed 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -699,7 +699,7 @@ rtengine::ProcessingJob* BatchQueue::imageReady(rtengine::IImagefloat* img) err = img->saveAsJPEG (fname, saveFormat.jpegQuality, saveFormat.jpegSubSamp); } - img->free (); + delete img; if (err) { throw Glib::FileError(Glib::FileError::FAILED, M("MAIN_MSG_CANNOTSAVE") + "\n" + fname); diff --git a/rtgui/bqentryupdater.cc b/rtgui/bqentryupdater.cc index 61683e158..7115447c2 100644 --- a/rtgui/bqentryupdater.cc +++ b/rtgui/bqentryupdater.cc @@ -146,7 +146,7 @@ void BatchQueueEntryUpdater::processThread () } memcpy(current.oimg, img->getData(), prevw * prevh * 3); - img->free(); + delete img; } } diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 669dd491a..9d6860e0f 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -1795,7 +1795,7 @@ bool EditorPanel::idle_saveImage (ProgressConnector *pc, bool EditorPanel::idle_imageSaved (ProgressConnector *pc, rtengine::IImagefloat* img, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams) { - img->free (); + delete img; if (! pc->returnValue() ) { openThm->imageDeveloped (); @@ -1995,7 +1995,7 @@ bool EditorPanel::saveImmediately (const Glib::ustring &filename, const SaveForm err = 1; } - img->free(); + delete img; return !err; } @@ -2057,7 +2057,7 @@ bool EditorPanel::idle_sendToGimp ( ProgressConnector *p } if (tries == 1000) { - img->free (); + delete img; return false; } @@ -2078,7 +2078,7 @@ bool EditorPanel::idle_sendToGimp ( ProgressConnector *p bool EditorPanel::idle_sentToGimp (ProgressConnector *pc, rtengine::IImagefloat* img, Glib::ustring filename) { - img->free (); + delete img; int errore = pc->returnValue(); setProgressState(false); delete pc; diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index 3129e93e2..cbe31726d 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -230,7 +230,7 @@ void FileBrowserEntry::updateImage(rtengine::IImage8* img, double scale, const r --feih->pending; } - img->free(); + delete img; return false; } @@ -276,7 +276,7 @@ void FileBrowserEntry::_updateImage(rtengine::IImage8* img, double s, const rten landscape = newLandscape; - img->free(); + delete img; if (parent) { if (rotated) { diff --git a/rtgui/main-cli.cc b/rtgui/main-cli.cc index c60cba070..feef93564 100644 --- a/rtgui/main-cli.cc +++ b/rtgui/main-cli.cc @@ -832,7 +832,7 @@ int processLineParams ( int argc, char **argv ) } ii->decreaseRef(); - resultImage->free(); + delete resultImage; } if (imgParams) { diff --git a/rtgui/previewhandler.cc b/rtgui/previewhandler.cc index 1dad0676e..76def26b4 100644 --- a/rtgui/previewhandler.cc +++ b/rtgui/previewhandler.cc @@ -110,7 +110,7 @@ void PreviewHandler::delImage(IImage8* i) oldImg->getMutex().unlock(); } - i->free(); + delete i; pih->phandler->previewImgMutex.lock(); pih->phandler->previewImg.clear(); pih->phandler->previewImgMutex.unlock(); From 1419a0194002cc37f8e6b39245b6cb0838cf3669 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 13 Aug 2020 13:26:27 +0200 Subject: [PATCH 056/185] Further cleanup --- rtengine/iimage.h | 1 - 1 file changed, 1 deletion(-) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index 65c3a641e..a9415269e 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -1834,7 +1834,6 @@ public: * @param pl is the pointer to the class implementing the ProgressListener interface */ virtual void setSaveProgressListener (ProgressListener* pl) = 0; /** @brief Free the image */ -// virtual void free () = 0; }; /** @brief This class represents an image having a float pixel planar representation. From e19321982c88da9b00223da025124063c2b82716 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 13 Aug 2020 13:27:01 +0200 Subject: [PATCH 057/185] Further cleanup --- rtengine/iimage.h | 1 - 1 file changed, 1 deletion(-) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index a9415269e..663795238 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -1833,7 +1833,6 @@ public: /** @brief Sets the progress listener if you want to follow the progress of the image saving operations (optional). * @param pl is the pointer to the class implementing the ProgressListener interface */ virtual void setSaveProgressListener (ProgressListener* pl) = 0; - /** @brief Free the image */ }; /** @brief This class represents an image having a float pixel planar representation. From a4813ac256804460a32694c7a918514063e74cf0 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 14 Aug 2020 12:22:08 +0200 Subject: [PATCH 058/185] RT build on non-Apple systems using clang shows wrong compiler info in AboutThisBuild.txt, fixes #5864 --- CMakeLists.txt | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6de75e748..d673f8e8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -637,14 +637,8 @@ else() endif() # Get compiler name and version. - get_filename_component(COMPILER_INFO ${CMAKE_C_COMPILER} NAME_WE) - set(COMPILER_INFO "${COMPILER_INFO} ${CMAKE_C_COMPILER_VERSION}") -if(NOT APPLE) - execute_process( - COMMAND gcc -dumpversion - OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) - set(COMPILER_INFO "gcc ${GCC_VERSION}") -endif() +get_filename_component(COMPILER_INFO ${CMAKE_C_COMPILER} NAME_WE) +set(COMPILER_INFO "${COMPILER_INFO} ${CMAKE_C_COMPILER_VERSION}") # Get C++ and linker flags for rtengine (the GUI's C++ flags may have fewer # flags): From 1aa3b5c52b1a158566d26ef0a8ecbe9c8056e99e Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 14 Aug 2020 13:37:59 +0200 Subject: [PATCH 059/185] dcraw.cc: fix some warnings --- rtengine/dcraw.cc | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index a166ecf15..ffd4f89ed 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -273,11 +273,7 @@ void CLASS derror() if (feof(ifp)) fprintf (stderr,_("Unexpected end of file\n")); else -#ifdef WIN32 - fprintf (stderr,_("Corrupt data near 0x%I64x\n"), (INT64) ftello(ifp)); -#else fprintf (stderr,_("Corrupt data near 0x%llx\n"), (INT64) ftello(ifp)); -#endif } data_error++; /*RT Issue 2467 longjmp (failure, 1);*/ @@ -2050,9 +2046,8 @@ void CLASS phase_one_load_raw_c() } else if ((col & 7) == 0) { for (int i = 0; i < 2; i++) { int j; - for (j = 0; j < 5 && !ph1_bits(1); j++) - ; - if (j--) { + for (j = 0; j < 5 && !ph1_bits(1); j++) ; + if (j--) { len[i] = length[j * 2 + ph1_bits(1)]; } } @@ -6207,8 +6202,8 @@ void CLASS parse_exif (int base) case 36867: case 36868: get_timestamp(0); break; case 37377: if ((expo = -getreal(type)) < 128) - tiff_ifd[tiff_nifds-1].shutter = - shutter = pow (2, expo); break; + tiff_ifd[tiff_nifds-1].shutter = shutter = pow (2, expo); + break; case 37378: aperture = pow (2, getreal(type)/2); break; case 37386: focal_len = getreal(type); break; case 37500: parse_makernote (base, 0); break; @@ -7093,7 +7088,8 @@ void CLASS apply_tiff() load_flags = 24; if (!strcmp(make,"SONY") && tiff_bps < 14 && tiff_ifd[raw].bytes == raw_width*raw_height*2) - tiff_bps = 14; if (tiff_ifd[raw].bytes*5 == raw_width*raw_height*8) { + tiff_bps = 14; + if (tiff_ifd[raw].bytes*5 == raw_width*raw_height*8) { load_flags = 81; tiff_bps = 12; } slr: @@ -7166,7 +7162,8 @@ void CLASS apply_tiff() // load_raw = &CLASS packed_load_raw; load_raw = &CLASS nikon_14bit_load_raw; } else - load_raw = &CLASS nikon_load_raw; break; + load_raw = &CLASS nikon_load_raw; + break; case 65535: load_raw = &CLASS pentax_load_raw; break; case 65000: From 07d26c16edca47fd2ac0b8b1c3eaf47cbed8d197 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 15 Aug 2020 17:35:24 +0200 Subject: [PATCH 060/185] ImProcCoordinator::updateVectorscope(): fix crash caused by large stack allocation, speedup, fixed scaling from [0;255] to [0;65535] range --- rtengine/improccoordinator.cc | 73 +++++++++++++++++------------------ rtengine/rtengine.h | 2 +- rtgui/editorpanel.cc | 2 +- rtgui/editorpanel.h | 2 +- 4 files changed, 38 insertions(+), 41 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 7ae814f8c..0a752784a 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -45,7 +45,8 @@ #ifdef _OPENMP #include #endif - +#define BENCHMARK +#include "StopWatch.h" namespace { @@ -1855,57 +1856,53 @@ void ImProcCoordinator::updateVectorscope() if (!workimg) { return; } - +BENCHFUN int x1, y1, x2, y2; params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); constexpr int size = VECTORSCOPE_SIZE; memset((int*)vectorscope, 0, size * size * sizeof(vectorscope[0][0])); - const int lab_img_size = (hListener->vectorscopeType() == 1) ? (x2 - x1) * (y2 - y1) : 0; - float a[lab_img_size], b[lab_img_size]; + vectorscopeScale = (x2 - x1) * (y2 - y1); + const int lab_img_size = (hListener->vectorscopeType() == 1) ? vectorscopeScale : 0; + + std::unique_ptr a; + std::unique_ptr b; if (lab_img_size) { - float L[lab_img_size]; - ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L, a, b, params->icm); + a.reset(new float[lab_img_size]); + b.reset(new float[lab_img_size]); + std::unique_ptr L(new float[lab_img_size]); + ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L.get(), a.get(), b.get(), params->icm); } - int ofs_lab = 0; - for (int i = y1; i < y2; i++) { - int ofs = (i * pW + x1) * 3; - - for (int j = x1; j < x2; j++) { - switch (hListener->vectorscopeType()) { - case 0: { - // HS - int red = 256 * workimg->data[ofs++]; - int green = 256 * workimg->data[ofs++]; - int blue = 256 * workimg->data[ofs++]; - float h, s, l; - Color::rgb2hsl(red, green, blue, h, s, l); - const int col = s * cos(2 * RT_PI * h) * (size / 2) + size / 2; - const int row = s * sin(2 * RT_PI * h) * (size / 2) + size / 2; - if (col >= 0 && col < size && row >= 0 && row < size) { - vectorscope[row][col]++; - } - break; + if (hListener->vectorscopeType() == 0) { // HS + for (int i = y1; i < y2; ++i) { + int ofs = (i * pW + x1) * 3; + for (int j = x1; j < x2; ++j) { + const float red = 257.f * workimg->data[ofs++]; + const float green = 257.f * workimg->data[ofs++]; + const float blue = 257.f * workimg->data[ofs++]; + float h, s, l; + Color::rgb2hslfloat(red, green, blue, h, s, l); + const auto sincosval = xsincosf(2.f * RT_PI_F * h); + const int col = s * sincosval.y * (size / 2) + size / 2; + const int row = s * sincosval.x * (size / 2) + size / 2; + if (col >= 0 && col < size && row >= 0 && row < size) { + vectorscope[row][col]++; } - - case 1: { - // CH - const int col = (size / 96000.0) * a[ofs_lab] + size / 2; - const int row = (size / 96000.0) * b[ofs_lab] + size / 2; - - if (col >= 0 && col < size && row >= 0 && row < size) { - vectorscope[row][col]++; - } - ofs_lab++; - break; + } + } + } else if (hListener->vectorscopeType() == 1) { // CH + for (int i = y1; i < y2; ++i) { + for (int j = x1, ofs_lab = (i - y1) * (x2 - x1); j < x2; ++j, ++ofs_lab) { + const int col = (size / 96000.f) * a[ofs_lab] + size / 2; + const int row = (size / 96000.f) * b[ofs_lab] + size / 2; + if (col >= 0 && col < size && row >= 0 && row < size) { + vectorscope[row][col]++; } } } } - - vectorscopeScale = (x2 - x1) * (y2 - y1); } void ImProcCoordinator::updateWaveforms() diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 9c4092f2b..be33ea41e 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -350,7 +350,7 @@ public: /** Returns if the listener wants the waveform to be updated. */ virtual bool updateWaveform(void) = 0; /** Returns the vectorscope type: 0 for H-S and 1 for H-C. */ - virtual int vectorscopeType(void) = 0; + virtual int vectorscopeType(void) const = 0; }; class HistogramObservable diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 7f5c99997..d80da8ef2 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -2289,7 +2289,7 @@ bool EditorPanel::updateWaveform(void) || histogram_scope_type == HistogramPanelListener::NONE; } -int EditorPanel::vectorscopeType(void) +int EditorPanel::vectorscopeType(void) const { switch (histogram_scope_type) { case HistogramPanelListener::VECTORSCOPE_HS: diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 2916dc822..93e373924 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -146,7 +146,7 @@ public: bool updateHistogram(void) override; bool updateVectorscope(void) override; bool updateWaveform(void) override; - int vectorscopeType(void) override; + int vectorscopeType(void) const override; // HistogramPanelListener void scopeTypeChanged(ScopeType new_type) override; From e67b02da8ba629b58b95e86c316822313dbc50fc Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 15 Aug 2020 22:36:10 +0200 Subject: [PATCH 061/185] further cleanups --- rtengine/array2D.h | 1 + rtengine/improccoordinator.cc | 25 +++++++++---------------- rtengine/rtengine.h | 6 +++--- rtgui/editorpanel.cc | 6 +++--- rtgui/editorpanel.h | 6 +++--- 5 files changed, 19 insertions(+), 25 deletions(-) diff --git a/rtengine/array2D.h b/rtengine/array2D.h index 512f7bcc1..e55326ef4 100644 --- a/rtengine/array2D.h +++ b/rtengine/array2D.h @@ -140,6 +140,7 @@ public: { buffer.clear(); rows.clear(); + width = 0; } // use with indices diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 0a752784a..a7f73a19a 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1864,17 +1864,6 @@ BENCHFUN memset((int*)vectorscope, 0, size * size * sizeof(vectorscope[0][0])); vectorscopeScale = (x2 - x1) * (y2 - y1); - const int lab_img_size = (hListener->vectorscopeType() == 1) ? vectorscopeScale : 0; - - std::unique_ptr a; - std::unique_ptr b; - if (lab_img_size) { - a.reset(new float[lab_img_size]); - b.reset(new float[lab_img_size]); - std::unique_ptr L(new float[lab_img_size]); - ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L.get(), a.get(), b.get(), params->icm); - } - if (hListener->vectorscopeType() == 0) { // HS for (int i = y1; i < y2; ++i) { int ofs = (i * pW + x1) * 3; @@ -1893,6 +1882,10 @@ BENCHFUN } } } else if (hListener->vectorscopeType() == 1) { // CH + const std::unique_ptr a(new float[vectorscopeScale]); + const std::unique_ptr b(new float[vectorscopeScale]); + const std::unique_ptr L(new float[vectorscopeScale]); + ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L.get(), a.get(), b.get(), params->icm); for (int i = y1; i < y2; ++i) { for (int j = x1, ofs_lab = (i - y1) * (x2 - x1); j < x2; ++j, ++ofs_lab) { const int col = (size / 96000.f) * a[ofs_lab] + size / 2; @@ -1908,11 +1901,11 @@ BENCHFUN void ImProcCoordinator::updateWaveforms() { if (!workimg) { - // Resize to zero. - waveformRed(0, 0); - waveformGreen(0, 0); - waveformBlue(0, 0); - waveformLuma(0, 0); + // free memory + waveformRed.free(); + waveformGreen.free(); + waveformBlue.free(); + waveformLuma.free(); return; } diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index be33ea41e..e6749a9f0 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -344,11 +344,11 @@ public: /** Tells which observable is notifying the listener. */ virtual void setObservable(HistogramObservable* observable) = 0; /** Returns if the listener wants the histogram to be updated. */ - virtual bool updateHistogram(void) = 0; + virtual bool updateHistogram(void) const = 0; /** Returns if the listener wants the vectorscope to be updated. */ - virtual bool updateVectorscope(void) = 0; + virtual bool updateVectorscope(void) const = 0; /** Returns if the listener wants the waveform to be updated. */ - virtual bool updateWaveform(void) = 0; + virtual bool updateWaveform(void) const = 0; /** Returns the vectorscope type: 0 for H-S and 1 for H-C. */ virtual int vectorscopeType(void) const = 0; }; diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index d80da8ef2..594965ee6 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -2269,13 +2269,13 @@ void EditorPanel::setObservable(rtengine::HistogramObservable* observable) histogram_observable = observable; } -bool EditorPanel::updateHistogram(void) +bool EditorPanel::updateHistogram(void) const { return histogram_scope_type == HistogramPanelListener::HISTOGRAM || histogram_scope_type == HistogramPanelListener::NONE; } -bool EditorPanel::updateVectorscope(void) +bool EditorPanel::updateVectorscope(void) const { return histogram_scope_type == HistogramPanelListener::VECTORSCOPE_HS @@ -2283,7 +2283,7 @@ bool EditorPanel::updateVectorscope(void) || histogram_scope_type == HistogramPanelListener::NONE; } -bool EditorPanel::updateWaveform(void) +bool EditorPanel::updateWaveform(void) const { return histogram_scope_type == HistogramPanelListener::WAVEFORM || histogram_scope_type == HistogramPanelListener::NONE; diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 93e373924..9f0ebf8cb 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -143,9 +143,9 @@ public: const array2D& waveformLuma ) override; void setObservable(rtengine::HistogramObservable* observable) override; - bool updateHistogram(void) override; - bool updateVectorscope(void) override; - bool updateWaveform(void) override; + bool updateHistogram(void) const override; + bool updateVectorscope(void) const override; + bool updateWaveform(void) const override; int vectorscopeType(void) const override; // HistogramPanelListener From 231c5e2c993cc40af6ab446ec9d1afd3ccfe5649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 16 Aug 2020 10:25:22 +0200 Subject: [PATCH 062/185] Apply clang-tidy's `google-readability-casting` ``` clang-tidy-10 -header-filter=.* -p=build -fix -checks=google-readability-casting rtgui/histogrampanel.cc ``` --- rtgui/histogrampanel.cc | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index e589ed9ba..32bc7c603 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -945,7 +945,7 @@ Gtk::SizeRequestMode HistogramArea::get_request_mode_vfunc () const void HistogramArea::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const { - int s = (int)RTScalable::getScale(); + int s = RTScalable::getScale(); minimum_height = 100 * s; natural_height = 200 * s; } @@ -953,7 +953,7 @@ void HistogramArea::get_preferred_height_vfunc (int &minimum_height, int &natura void HistogramArea::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - int s = (int)RTScalable::getScale(); + int s = RTScalable::getScale(); minimum_width = 200 * s; natural_width = 400 * s; } @@ -1105,7 +1105,7 @@ void HistogramArea::updateBackBuffer () cr->set_dash (ch_ds, 0); // determine the number of h-gridlines based on current h - int nrOfHGridPartitions = (int)rtengine::min (16.0, pow (2.0, floor ((h - 100) / 250) + 2)); + int nrOfHGridPartitions = static_cast(rtengine::min (16.0, pow (2.0, floor ((h - 100) / 250) + 2))); int nrOfVGridPartitions = 8; // always show 8 stops (lines at 1,3,7,15,31,63,127) // draw vertical gridlines @@ -1135,14 +1135,14 @@ void HistogramArea::updateBackBuffer () // Vectorscope has no gridlines. } else if (options.histogramDrawMode == 0) { for (int i = 1; i < nrOfHGridPartitions; i++) { - cr->move_to (padding, i * (double)h / nrOfHGridPartitions + 0.5); - cr->line_to (w - padding, i * (double)h / nrOfHGridPartitions + 0.5); + cr->move_to (padding, i * static_cast(h) / nrOfHGridPartitions + 0.5); + cr->line_to (w - padding, i * static_cast(h) / nrOfHGridPartitions + 0.5); cr->stroke (); } } else { for (int i = 1; i < nrOfHGridPartitions; i++) { - cr->move_to (padding, h - HistogramScaling::log (h, i * (double)h / nrOfHGridPartitions) + 0.5); - cr->line_to (w - padding, h - HistogramScaling::log (h, i * (double)h / nrOfHGridPartitions) + 0.5); + cr->move_to (padding, h - HistogramScaling::log (h, i * static_cast(h) / nrOfHGridPartitions) + 0.5); + cr->line_to (w - padding, h - HistogramScaling::log (h, i * static_cast(h) / nrOfHGridPartitions) + 0.5); cr->stroke (); } } @@ -1306,15 +1306,15 @@ void HistogramArea::drawCurve(Cairo::RefPtr &cr, scale = scale <= 0.0 ? 0.001 : scale; // avoid division by zero and negative values for (int i = 0; i < 256; i++) { - double val = data[i] * (double)vsize / scale; + double val = data[i] * static_cast(vsize) / scale; if (drawMode > 0) { // scale y for single and double log-scale - val = HistogramScaling::log ((double)vsize, val); + val = HistogramScaling::log (static_cast(vsize), val); } double iscaled = i; if (drawMode == 2) { // scale x for double log-scale - iscaled = HistogramScaling::log (255.0, (double)i); + iscaled = HistogramScaling::log (255.0, static_cast(i)); } double posX = padding + iscaled * (hsize - padding * 2.0) / 255.0; @@ -1363,7 +1363,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in for (int y = 0; y < vect_height; y++) { int* vect_row = vect[y]; uint32_t* buffer_row = - (uint32_t*)&(vect_buffer[(vect_height - 1 - y) * cairo_stride]); + reinterpret_cast(&(vect_buffer[(vect_height - 1 - y) * cairo_stride])); for (int x = 0; x < vect_width; x++) { const unsigned char value = min(scale * vect_row[x], 0xff); buffer_row[x] = value | (value << 8) | (value << 16) | (value << 24); @@ -1508,7 +1508,7 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h int* r_row = rwave[val]; int* g_row = gwave[val]; int* b_row = bwave[val]; - uint32_t* buffer_row = (uint32_t*)&(wave_buffer[(255 - val) * cairo_stride]); + uint32_t* buffer_row = reinterpret_cast(&(wave_buffer[(255 - val) * cairo_stride])); for (int col = 0; col < wave_width; col++) { const unsigned char r = needRed ? min(scale * r_row[col], 0xff) : 0; const unsigned char g = needGreen ? min(scale * g_row[col], 0xff) : 0; @@ -1527,7 +1527,7 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h for (int val = 0; val < wave_height; val++) { int* l_row = lwave[val]; uint32_t* buffer_row = - (uint32_t*)&(wave_buffer_luma[(255 - val) * cairo_stride]); + reinterpret_cast(&(wave_buffer_luma[(255 - val) * cairo_stride])); for (int col = 0; col < wave_width; col++) { const unsigned char l = min(scale * l_row[col], 0xff); buffer_row[col] = l | (l << 8) | (l << 16) | (l << 24); From 3af822b6f7627773ec009861123f59054b200cea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 16 Aug 2020 11:22:10 +0200 Subject: [PATCH 063/185] Fix abuse of `array2D<>` - Add copy c'tor and assignment to `array2D<>` - Use `std::vector<>` instead of smart pointer to array - Constify a bit - Make use of `rtengine::max(...)` --- rtengine/array2D.h | 22 ++++++++++-- rtgui/histogrampanel.cc | 80 ++++++++++++++++++----------------------- rtgui/histogrampanel.h | 8 +++-- 3 files changed, 59 insertions(+), 51 deletions(-) diff --git a/rtengine/array2D.h b/rtengine/array2D.h index e55326ef4..a8eebde54 100644 --- a/rtengine/array2D.h +++ b/rtengine/array2D.h @@ -64,8 +64,7 @@ constexpr unsigned int ARRAY2D_BYREFERENCE = 2; template -class array2D : - public rtengine::NonCopyable +class array2D { private: @@ -125,6 +124,25 @@ public: } } + array2D(const array2D& other) : + width(other.width), + buffer(other.buffer) + { + initRows(other.rows.size()); + } + + array2D& operator =(const array2D& other) + { + if (this != &other) { + free(); + width = other.width; + buffer = other.buffer; + initRows(other.rows.size()); + } + + return *this; + } + void fill(const T val, bool multiThread = false) { const ssize_t height = rows.size(); diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 32bc7c603..96aa37d72 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -441,7 +441,7 @@ void HistogramPanel::type_changed() histogramRGBArea = nullptr; if (panel_listener) { updateHistAreaOptions(); - HistogramPanelListener::ScopeType type; + HistogramPanelListener::ScopeType type = HistogramPanelListener::NONE; switch (options.histogramScopeType) { case 2: type = HistogramPanelListener::VECTORSCOPE_HS; @@ -1015,26 +1015,14 @@ void HistogramArea::update( ghistRaw = histGreenRaw; bhistRaw = histBlueRaw; } else if (scopeType == 1) { - const int wave_width = waveformRed.getWidth(); - const int wave_height = waveformRed.getHeight(); waveform_scale = waveformScale; - if (wave_width != rwave.getWidth() || wave_height != rwave.getHeight()) { - rwave(wave_width, wave_height); - gwave(wave_width, wave_height); - bwave(wave_width, wave_height); - lwave(wave_width, wave_height); - } - memcpy((int*)rwave, (const int*)waveformRed, wave_height * wave_width * sizeof(rwave[0][0])); - memcpy((int*)gwave, (const int*)waveformGreen, wave_height * wave_width * sizeof(gwave[0][0])); - memcpy((int*)bwave, (const int*)waveformBlue, wave_height * wave_width * sizeof(bwave[0][0])); - memcpy((int*)lwave, (const int*)waveformLuma, wave_height * wave_width * sizeof(lwave[0][0])); + rwave = waveformRed; + gwave = waveformGreen; + bwave = waveformBlue; + lwave = waveformLuma; wave_buffer_dirty = true; } else if (scopeType >= 2) { - vectorscope_scale = vectorscopeScale; - if (vect.getWidth() != vectorscope.getWidth() || vect.getHeight() != vectorscope.getHeight()) { - vect(vectorscope.getWidth(), vectorscope.getHeight()); - } - memcpy((int*)vect, (const int*)vectorscope, vect.getHeight() * vect.getWidth() * sizeof(vect[0][0])); + vect = vectorscope; vect_buffer_dirty = true; } valid = true; @@ -1354,18 +1342,19 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, vect_width); if (vect_buffer_dirty && vectorscope_scale > 0) { - if (vect_buffer_size != cairo_stride * vect_height) { - vect_buffer_size = cairo_stride * vect_height; - vect_buffer.reset(new unsigned char[vect_buffer_size]); + if (vect_buffer.size() != static_cast(cairo_stride) * vect_height) { + vect_buffer.resize(cairo_stride * vect_height); } + assert(vect_buffer.size() % 4 == 0); + // TODO: Optimize. for (int y = 0; y < vect_height; y++) { - int* vect_row = vect[y]; - uint32_t* buffer_row = - reinterpret_cast(&(vect_buffer[(vect_height - 1 - y) * cairo_stride])); + const int* const vect_row = vect[y]; + std::uint32_t* const buffer_row = + reinterpret_cast(vect_buffer.data() + (vect_height - 1 - y) * cairo_stride); for (int x = 0; x < vect_width; x++) { - const unsigned char value = min(scale * vect_row[x], 0xff); + const unsigned char value = std::min(scale * vect_row[x], 0xff); buffer_row[x] = value | (value << 8) | (value << 16) | (value << 24); } } @@ -1378,7 +1367,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in const float scope_scale = fit_width ? (w - 2 * padding) / vect_width : (h - 2 * padding) / vect_height; const float scope_size = (vectorscope_scale > 0) ? - scope_scale * max(vect_width, vect_height) : min(w, h) - 2 * padding; + scope_scale * std::max(vect_width, vect_height) : std::min(w, h) - 2 * padding; const float o_x = (w - scope_scale * vect_width) / 2; const float o_y = (h - scope_scale * vect_height) / 2; const double s = RTScalable::getScale(); @@ -1446,7 +1435,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in // Vectorscope trace. if (vectorscope_scale > 0) { Cairo::RefPtr surface = Cairo::ImageSurface::create( - vect_buffer.get(), Cairo::FORMAT_ARGB32, vect_width, vect_height, cairo_stride); + vect_buffer.data(), Cairo::FORMAT_ARGB32, vect_width, vect_height, cairo_stride); cr->translate(o_x, o_y); cr->scale(scope_scale, scope_scale); cr->set_source(surface, 0, 0); @@ -1496,24 +1485,23 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, rwave.getWidth()); if (wave_buffer_dirty) { - wave_buffer.reset(new unsigned char[wave_height * cairo_stride]); - wave_buffer_luma.reset(new unsigned char[wave_height * cairo_stride]); + wave_buffer.assign(wave_height * cairo_stride, 0); + wave_buffer_luma.assign(wave_height * cairo_stride, 0); - // Clear waveform. - memset(wave_buffer.get(), 0, wave_height * cairo_stride); - memset(wave_buffer_luma.get(), 0, wave_height * cairo_stride); + assert(wave_buffer.size() % 4 == 0); + assert(wave_buffer_luma.size() % 4 == 0); // TODO: Optimize. for (int val = 0; val < wave_height; val++) { - int* r_row = rwave[val]; - int* g_row = gwave[val]; - int* b_row = bwave[val]; - uint32_t* buffer_row = reinterpret_cast(&(wave_buffer[(255 - val) * cairo_stride])); + const int* const r_row = rwave[val]; + const int* const g_row = gwave[val]; + const int* const b_row = bwave[val]; + std::uint32_t* const buffer_row = reinterpret_cast(wave_buffer.data() + (255 - val) * cairo_stride); for (int col = 0; col < wave_width; col++) { - const unsigned char r = needRed ? min(scale * r_row[col], 0xff) : 0; - const unsigned char g = needGreen ? min(scale * g_row[col], 0xff) : 0; - const unsigned char b = needBlue ? min(scale * b_row[col], 0xff) : 0; - const unsigned char value = (r > g && r > b) ? r : ((g > b) ? g : b); + const unsigned char r = needRed ? std::min(scale * r_row[col], 0xff) : 0; + const unsigned char g = needGreen ? std::min(scale * g_row[col], 0xff) : 0; + const unsigned char b = needBlue ? std::min(scale * b_row[col], 0xff) : 0; + const unsigned char value = rtengine::max(r, g, b); if (value == 0) { buffer_row[col] = 0; } else { @@ -1525,11 +1513,11 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h if (needLuma) { for (int val = 0; val < wave_height; val++) { - int* l_row = lwave[val]; - uint32_t* buffer_row = - reinterpret_cast(&(wave_buffer_luma[(255 - val) * cairo_stride])); + const int* const l_row = lwave[val]; + std::uint32_t* const buffer_row = + reinterpret_cast(wave_buffer_luma.data() + (255 - val) * cairo_stride); for (int col = 0; col < wave_width; col++) { - const unsigned char l = min(scale * l_row[col], 0xff); + const unsigned char l = std::min(scale * l_row[col], 0xff); buffer_row[col] = l | (l << 8) | (l << 16) | (l << 24); } } @@ -1544,14 +1532,14 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h cr->scale(static_cast(w) / wave_width, (h - 2 * padding) / wave_height); if (needLuma) { surface = Cairo::ImageSurface::create( - wave_buffer_luma.get(), Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); + wave_buffer_luma.data(), Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); cr->set_source(surface, 0, 0); cr->set_operator(Cairo::OPERATOR_OVER); cr->paint(); surface->finish(); } surface = Cairo::ImageSurface::create( - wave_buffer.get(), Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); + wave_buffer.data(), Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); cr->set_source(surface, 0, 0); cr->set_operator(Cairo::OPERATOR_OVER); cr->paint(); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index b2a656161..6cdb77c18 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -18,6 +18,8 @@ */ #pragma once +#include + #include #include @@ -160,13 +162,13 @@ protected: LUTu rhistRaw, ghistRaw, bhistRaw, lhistRaw; //lhistRaw is unused? int vectorscope_scale; array2D vect; - std::unique_ptr vect_buffer; + std::vector vect_buffer; bool vect_buffer_dirty; int vect_buffer_size; int waveform_scale; array2D rwave, gwave, bwave, lwave; - std::unique_ptr wave_buffer; - std::unique_ptr wave_buffer_luma; + std::vector wave_buffer; + std::vector wave_buffer_luma; bool wave_buffer_dirty; bool valid; From 9e040b3bc297530c80723e500ede6cd618c471af Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 16 Aug 2020 11:46:17 +0200 Subject: [PATCH 064/185] ImProcCoordinator::updateVectorscope(): parallelize loops --- rtengine/array2D.h | 18 ++++++++++ rtengine/improccoordinator.cc | 68 +++++++++++++++++++++++++---------- 2 files changed, 67 insertions(+), 19 deletions(-) diff --git a/rtengine/array2D.h b/rtengine/array2D.h index a8eebde54..ca4db3d06 100644 --- a/rtengine/array2D.h +++ b/rtengine/array2D.h @@ -211,6 +211,24 @@ public: } } + array2D& operator+=(const array2D& rhs) + { + if (rhs.getWidth() == this->getWidth() && rhs.getHeight() == this->getHeight()) { + for (int i = 0; i < getHeight(); ++i) { +#ifdef _OPENMP + #pragma omp simd +#endif + + for (int j = 0; j < getWidth(); ++j) { + rows[i][j] += rhs[i][j]; + } + } + } + + return *this; + } + + int getWidth() const { return width; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 1da11ab4e..e3882785c 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1863,35 +1863,65 @@ BENCHFUN vectorscopeScale = (x2 - x1) * (y2 - y1); if (hListener->vectorscopeType() == 0) { // HS - for (int i = y1; i < y2; ++i) { - int ofs = (i * pW + x1) * 3; - for (int j = x1; j < x2; ++j) { - const float red = 257.f * workimg->data[ofs++]; - const float green = 257.f * workimg->data[ofs++]; - const float blue = 257.f * workimg->data[ofs++]; - float h, s, l; - Color::rgb2hslfloat(red, green, blue, h, s, l); - const auto sincosval = xsincosf(2.f * RT_PI_F * h); - const int col = s * sincosval.y * (size / 2) + size / 2; - const int row = s * sincosval.x * (size / 2) + size / 2; - if (col >= 0 && col < size && row >= 0 && row < size) { - vectorscope[row][col]++; +#ifdef _OPENMP + #pragma omp parallel +#endif + { + array2D vectorscopeThr(size, size, ARRAY2D_CLEAR_DATA); +#ifdef _OPENMP + #pragma omp for nowait +#endif + for (int i = y1; i < y2; ++i) { + int ofs = (i * pW + x1) * 3; + for (int j = x1; j < x2; ++j) { + const float red = 257.f * workimg->data[ofs++]; + const float green = 257.f * workimg->data[ofs++]; + const float blue = 257.f * workimg->data[ofs++]; + float h, s, l; + Color::rgb2hslfloat(red, green, blue, h, s, l); + const auto sincosval = xsincosf(2.f * RT_PI_F * h); + const int col = s * sincosval.y * (size / 2) + size / 2; + const int row = s * sincosval.x * (size / 2) + size / 2; + if (col >= 0 && col < size && row >= 0 && row < size) { + vectorscopeThr[row][col]++; + } } } +#ifdef _OPENMP + #pragma omp critical +#endif + { + vectorscope += vectorscopeThr; + } } } else if (hListener->vectorscopeType() == 1) { // CH const std::unique_ptr a(new float[vectorscopeScale]); const std::unique_ptr b(new float[vectorscopeScale]); const std::unique_ptr L(new float[vectorscopeScale]); ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L.get(), a.get(), b.get(), params->icm); - for (int i = y1; i < y2; ++i) { - for (int j = x1, ofs_lab = (i - y1) * (x2 - x1); j < x2; ++j, ++ofs_lab) { - const int col = (size / 96000.f) * a[ofs_lab] + size / 2; - const int row = (size / 96000.f) * b[ofs_lab] + size / 2; - if (col >= 0 && col < size && row >= 0 && row < size) { - vectorscope[row][col]++; +#ifdef _OPENMP + #pragma omp parallel +#endif + { + array2D vectorscopeThr(size, size, ARRAY2D_CLEAR_DATA); +#ifdef _OPENMP + #pragma omp for nowait +#endif + for (int i = y1; i < y2; ++i) { + for (int j = x1, ofs_lab = (i - y1) * (x2 - x1); j < x2; ++j, ++ofs_lab) { + const int col = (size / 96000.f) * a[ofs_lab] + size / 2; + const int row = (size / 96000.f) * b[ofs_lab] + size / 2; + if (col >= 0 && col < size && row >= 0 && row < size) { + vectorscopeThr[row][col]++; + } } } +#ifdef _OPENMP + #pragma omp critical +#endif + { + vectorscope += vectorscopeThr; + } } } } From a11d41b41a239afad56f9123b34e021b50e03e8f Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 16 Aug 2020 12:19:52 +0200 Subject: [PATCH 065/185] Enable dd contrast threshold adjuster for Amaze+bilinear and DCB+bilinear --- rtgui/bayerprocess.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index a1aa3f01e..f678c858b 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -366,7 +366,9 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params dcbOptions->set_visible(pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCB) || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4)); lmmseOptions->set_visible(pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::LMMSE)); dualDemosaicOptions->set_visible(pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) + || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEBILINEAR) || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) + || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBBILINEAR) || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4)); if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::PIXELSHIFT)) { @@ -576,7 +578,12 @@ void BayerProcess::methodChanged () lmmseOptions->hide(); } - if (currentMethod == procparams::RAWParams::BayerSensor::Method::AMAZEVNG4 || currentMethod == procparams::RAWParams::BayerSensor::Method::DCBVNG4 || currentMethod == procparams::RAWParams::BayerSensor::Method::RCDVNG4 || currentMethod == procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) { + if (currentMethod == procparams::RAWParams::BayerSensor::Method::AMAZEVNG4 || + currentMethod == procparams::RAWParams::BayerSensor::Method::DCBVNG4 || + currentMethod == procparams::RAWParams::BayerSensor::Method::RCDVNG4 || + currentMethod == procparams::RAWParams::BayerSensor::Method::AMAZEBILINEAR || + currentMethod == procparams::RAWParams::BayerSensor::Method::DCBBILINEAR || + currentMethod == procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) { dualDemosaicOptions->show(); } else { dualDemosaicOptions->hide(); From d59f488aea7ba286072490a35b181460488e6d13 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 16 Aug 2020 14:07:25 +0200 Subject: [PATCH 066/185] minor fixes --- rtgui/histogrampanel.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 96aa37d72..57bb9b4d0 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1448,9 +1448,9 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in float cx, cy; if (scopeType == 2) { float H, S, L; - Color::rgb2hsl(pointer_red * 256.f, pointer_green * 256.f, pointer_blue * 256.f, H, S, L); - cx = (w + scope_size * S * cos(H * 2 * RT_PI)) / 2; - cy = (h - scope_size * S * sin(H * 2 * RT_PI)) / 2; + Color::rgb2hslfloat(pointer_red * 257.f, pointer_green * 257.f, pointer_blue * 257.f, H, S, L); + cx = (w + scope_size * S * std::cos(H * 2 * RT_PI_F)) / 2; + cy = (h - scope_size * S * std::sin(H * 2 * RT_PI_F)) / 2; } else { constexpr float ab_factor = 327.68f / 96000.f; cx = w / 2.f + scope_size * pointer_a * ab_factor; From 7aa6b713c6c40cfe0f417ab27ed349011d22038b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 16 Aug 2020 16:01:29 +0200 Subject: [PATCH 067/185] Fix vectorscope --- rtgui/histogrampanel.cc | 5 +++-- rtgui/histogrampanel.h | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 57bb9b4d0..4dffc80ac 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -898,7 +898,7 @@ void HistogramRGBAreaVert::get_preferred_width_for_height_vfunc (int height, int HistogramArea::HistogramArea (DrawModeListener *fml) : vectorscope_scale(0), vect(0, 0), - vect_buffer_dirty(true), vect_buffer_size(0), + vect_buffer_dirty(true), waveform_scale(0), rwave(0, 0), gwave(0, 0),bwave(0, 0), lwave(0, 0), wave_buffer_dirty(true), @@ -1022,6 +1022,7 @@ void HistogramArea::update( lwave = waveformLuma; wave_buffer_dirty = true; } else if (scopeType >= 2) { + vectorscope_scale = vectorscopeScale; vect = vectorscope; vect_buffer_dirty = true; } @@ -1343,7 +1344,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in if (vect_buffer_dirty && vectorscope_scale > 0) { if (vect_buffer.size() != static_cast(cairo_stride) * vect_height) { - vect_buffer.resize(cairo_stride * vect_height); + vect_buffer.resize(static_cast(cairo_stride) * vect_height); } assert(vect_buffer.size() % 4 == 0); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 6cdb77c18..935a30bfd 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -164,7 +164,6 @@ protected: array2D vect; std::vector vect_buffer; bool vect_buffer_dirty; - int vect_buffer_size; int waveform_scale; array2D rwave, gwave, bwave, lwave; std::vector wave_buffer; From 2858876f4485f9ad200b0d05421be0c1222b23c7 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 16 Aug 2020 17:19:59 +0200 Subject: [PATCH 068/185] use array2D.fill() instead of memset() --- rtengine/improccoordinator.cc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index e3882785c..b1e7c8776 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1859,7 +1859,7 @@ BENCHFUN params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); constexpr int size = VECTORSCOPE_SIZE; - memset((int*)vectorscope, 0, size * size * sizeof(vectorscope[0][0])); + vectorscope.fill(0); vectorscopeScale = (x2 - x1) * (y2 - y1); if (hListener->vectorscopeType() == 0) { // HS @@ -1951,11 +1951,10 @@ void ImProcCoordinator::updateWaveforms() } // Start with zero. - const int waveformSize = 256 * waveform_width; - memset((int*)waveformRed, 0, waveformSize * sizeof(waveformRed[0][0])); - memset((int*)waveformGreen, 0, waveformSize * sizeof(waveformGreen[0][0])); - memset((int*)waveformBlue, 0, waveformSize * sizeof(waveformBlue[0][0])); - memset((int*)waveformLuma, 0, waveformSize * sizeof(waveformLuma[0][0])); + waveformRed.fill(0); + waveformGreen.fill(0); + waveformBlue.fill(0); + waveformLuma.fill(0); constexpr float luma_factor = 255.f / 32768.f; for (int i = y1; i < y2; i++) { From e667e3dce7fc80e659e7c5dd8ec651ae0a81ceab Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 16 Aug 2020 21:34:11 +0200 Subject: [PATCH 069/185] Removed timing code and some includes --- rtengine/improccoordinator.cc | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index b1e7c8776..f25395c2d 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -17,8 +17,6 @@ * along with RawTherapee. If not, see . */ #include -#include -#include #include #include "improccoordinator.h" @@ -27,7 +25,6 @@ #include "cieimage.h" #include "color.h" #include "colortemp.h" -#include "jaggedarray.h" #include "curves.h" #include "dcp.h" #include "iccstore.h" @@ -45,8 +42,7 @@ #ifdef _OPENMP #include #endif -#define BENCHMARK -#include "StopWatch.h" + namespace { @@ -1854,7 +1850,7 @@ void ImProcCoordinator::updateVectorscope() if (!workimg) { return; } -BENCHFUN + int x1, y1, x2, y2; params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); From 371fc65416b19c19ba8a706bd5318c91680cca3a Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sun, 16 Aug 2020 16:10:46 -0700 Subject: [PATCH 070/185] Improve type conversions --- rtgui/histogrampanel.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 4dffc80ac..60df46e34 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1368,7 +1368,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in const float scope_scale = fit_width ? (w - 2 * padding) / vect_width : (h - 2 * padding) / vect_height; const float scope_size = (vectorscope_scale > 0) ? - scope_scale * std::max(vect_width, vect_height) : std::min(w, h) - 2 * padding; + scope_scale * std::max(vect_width, vect_height) : std::min(w, h) - 2 * padding; const float o_x = (w - scope_scale * vect_width) / 2; const float o_y = (h - scope_scale * vect_height) / 2; const double s = RTScalable::getScale(); @@ -1486,8 +1486,9 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, rwave.getWidth()); if (wave_buffer_dirty) { - wave_buffer.assign(wave_height * cairo_stride, 0); - wave_buffer_luma.assign(wave_height * cairo_stride, 0); + const auto buffer_size = static_cast::size_type>(wave_height) * cairo_stride; + wave_buffer.assign(buffer_size, 0); + wave_buffer_luma.assign(buffer_size, 0); assert(wave_buffer.size() % 4 == 0); assert(wave_buffer_luma.size() % 4 == 0); From 350324affc4c75e29a55e4197c839344786a4bdd Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sun, 16 Aug 2020 18:08:26 -0700 Subject: [PATCH 071/185] Disable double-clicking of waveform & vectorscopes --- rtgui/histogrampanel.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 60df46e34..142bafb43 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1569,7 +1569,7 @@ bool HistogramArea::on_button_press_event (GdkEventButton* event) isPressed = true; movingPosition = event->x; - if (event->type == GDK_2BUTTON_PRESS && event->button == 1) { + if (event->type == GDK_2BUTTON_PRESS && event->button == 1 && scopeType == 0) { drawMode = (drawMode + 1) % 3; options.histogramDrawMode = (options.histogramDrawMode + 1) % 3; From cfc1e66024684da5b48a43ee11f20ae52802a4ea Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 19 Aug 2020 14:00:09 +0200 Subject: [PATCH 072/185] CH vectorscope: speedup by avoiding conversions --- rtengine/improccoordinator.cc | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index f25395c2d..accff6377 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -42,7 +42,8 @@ #ifdef _OPENMP #include #endif - +#define BENCHMARK +#include "StopWatch.h" namespace { @@ -1850,7 +1851,7 @@ void ImProcCoordinator::updateVectorscope() if (!workimg) { return; } - +BENCHFUN int x1, y1, x2, y2; params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); @@ -1891,10 +1892,6 @@ void ImProcCoordinator::updateVectorscope() } } } else if (hListener->vectorscopeType() == 1) { // CH - const std::unique_ptr a(new float[vectorscopeScale]); - const std::unique_ptr b(new float[vectorscopeScale]); - const std::unique_ptr L(new float[vectorscopeScale]); - ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L.get(), a.get(), b.get(), params->icm); #ifdef _OPENMP #pragma omp parallel #endif @@ -1904,9 +1901,11 @@ void ImProcCoordinator::updateVectorscope() #pragma omp for nowait #endif for (int i = y1; i < y2; ++i) { - for (int j = x1, ofs_lab = (i - y1) * (x2 - x1); j < x2; ++j, ++ofs_lab) { - const int col = (size / 96000.f) * a[ofs_lab] + size / 2; - const int row = (size / 96000.f) * b[ofs_lab] + size / 2; + const float* const a = nprevl->a[i] + x1; + const float* const b = nprevl->b[i] + x1; + for (int j = x1; j < x2; ++j) { + const int col = (size / 96000.f) * a[j] + size / 2; + const int row = (size / 96000.f) * b[j] + size / 2; if (col >= 0 && col < size && row >= 0 && row < size) { vectorscopeThr[row][col]++; } From 6c2463889b1f761afc5039e31a0f93f1520b0c0a Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 20 Aug 2020 12:31:37 +0200 Subject: [PATCH 073/185] Revert "CH vectorscope: speedup by avoiding conversions" This reverts commit cfc1e66024684da5b48a43ee11f20ae52802a4ea. --- rtengine/improccoordinator.cc | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index accff6377..f25395c2d 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -42,8 +42,7 @@ #ifdef _OPENMP #include #endif -#define BENCHMARK -#include "StopWatch.h" + namespace { @@ -1851,7 +1850,7 @@ void ImProcCoordinator::updateVectorscope() if (!workimg) { return; } -BENCHFUN + int x1, y1, x2, y2; params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); @@ -1892,6 +1891,10 @@ BENCHFUN } } } else if (hListener->vectorscopeType() == 1) { // CH + const std::unique_ptr a(new float[vectorscopeScale]); + const std::unique_ptr b(new float[vectorscopeScale]); + const std::unique_ptr L(new float[vectorscopeScale]); + ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L.get(), a.get(), b.get(), params->icm); #ifdef _OPENMP #pragma omp parallel #endif @@ -1901,11 +1904,9 @@ BENCHFUN #pragma omp for nowait #endif for (int i = y1; i < y2; ++i) { - const float* const a = nprevl->a[i] + x1; - const float* const b = nprevl->b[i] + x1; - for (int j = x1; j < x2; ++j) { - const int col = (size / 96000.f) * a[j] + size / 2; - const int row = (size / 96000.f) * b[j] + size / 2; + for (int j = x1, ofs_lab = (i - y1) * (x2 - x1); j < x2; ++j, ++ofs_lab) { + const int col = (size / 96000.f) * a[ofs_lab] + size / 2; + const int row = (size / 96000.f) * b[ofs_lab] + size / 2; if (col >= 0 && col < size && row >= 0 && row < size) { vectorscopeThr[row][col]++; } From 8a4d12c8584226572168faa9154398492d80d2fb Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 21 Aug 2020 00:28:26 +0200 Subject: [PATCH 074/185] Improved Canon EOS 90D dual-illuminant DCP Significant improvements in incandescent tungsten light. --- rtdata/dcpprofiles/Canon EOS 90D.dcp | Bin 1045662 -> 1102958 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rtdata/dcpprofiles/Canon EOS 90D.dcp b/rtdata/dcpprofiles/Canon EOS 90D.dcp index b65a8e7ac6aa6feba90351b612d63ebc101ac1f6..e50e677b1192e354135395f638da986638300664 100644 GIT binary patch literal 1102958 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

PCl~ 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

Q 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�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

Jo2`A-~joWYMB29;n9pZ_PB9U- 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%0A_H)D|zIWSM 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 z%0A301GI_`#$aOZJGE&FI|uG(_Gjj+J@K3~Zm@4Wd-f=N;Guy*?Up#S=AqH{&e+i$E*5h22)_pz0}KSj%Gt28<@4^9{&7G8`s$j3j?^%x7z8>Uk$)5 z_7IFCGIVaw0$|M?wac@ux{Kz47+0Bo^pno&x?c`NGxiqzyg%x;%?m;z`?tp4wNMZh zOuY_jueEKDy3Fx*9Z$rEGZr|<8r<=4}X&g z{1d?Ych?H^wW9yYEcRrUuEuuuQU+2t<80P)9OwP><|X|fiBa8`=ZE3UlReG{qx2;? zCKuvx^}$fsEu!uUHQ8qC>!FRe3pJc#QO9(z?$1O=e0U#=rLohr<1_3K{E*(JJ=O@* ziBqv|CcU@T>f|5ZSy|r1msVOP<6Q0FLv6k6>wD$%Ui7V-5rK}?dg^|D^rg=I-*G+Jcz3l?g;|jgEzZU7Pp9(~umDHSX`cYSTNf1s%v2RwpHZtY~ z;~o3Doj-JdnjL}#GZK;9ZYa8+3Plyx$ldEwzo#?|{mqgvv&l4Kf5TauCsEgFF_Om8 zH`$4pge_~az&;$W<5f-{jkNiHLSgfnlAGMZIceHjaYJIJYrzwuO91_cYzd{$9V~1HzaR|sU(>q&F zh5927Wm}6yuiZA-L(InZf~j&*7dxDo7K1sDR>>LW?x?4P(M!9#uFDoz%n1BD&K{G` zC_kFn;1Tci>lZ)ibIw`AXc@hRt%hs*JeUIaM~Qei=7qL>5p^EABoTKsS~p>O0RFM0 zM`3Q7uH5DTye5Y5Q@QoJ9rXjTb4?;@ygRNNb|MhRoT&9Q`n7J#rXZyDqd!PW4H)I| z9^?%AbLI9Jd@Tgg!xG`E8-g=NVe};+-+r10mUH&!zohp^j6m+rBy2NTiW%PY zqylw#)~$m(y$Bm>lMznrsw?LyKA}k%8J2^w^XS3do;YXUWtdJasOL_^FxQ-o8uz_$ zEISr~dm?f7lRG`5V=!=`E&ZQeQMG;y_IheKYji>{?-RP z4V4^=@3$UkfA6xvpS|?jTfRjEUb00xJ)7SbJIF_g)RwFjjPF(Kb>&%)$HxDyLuC!}ZFL)~3#dz4L&hB-BG)`t_n^(h99{5}Js=Hr@wEPj{K z?7Ra^y9LqvvZ47^N9xbd3qbU}EM32=lbN4WfBQfG{kI;p z99^s|YBvR|CnV$Krv}QON!EBZm;8%3O~K05QxJTS+>PpUwHwMj;nOe)9#_ljn*E}` zeRpa^pYEuu>Jo?_XA*H?+$5b_6W&3gjL)Q0U9@p9Ds*BmvGQu2a123mDK*f%kLd2Q zZ@lSQ0_Jrq(Z$EI|HEG5#f%Ctv5drN9X0<0njn<=7%L_9rHAxpJ{p53zDd*{rnZnl z942EdAR0bTx#!ITSkF<<@&TXSzjal!FjV(Xz?WP*+iWOVvP?dPqm6BgLwq%(WPwFB_vVLeUB9#70J_jjD53{EQ# zO?W2r+^E*Fz0zglWK>#2PU&qsefK}s7|OZNpVmg&fi|8fWSn#EEYp_E3V?4n)_U3^ zZL_Zd*u*#wvM8q;L!H?Doa2|aX|8iE2trT?_79gqxAAu{CVWo7BR@}F$5__aB?Mu8b>KfFJgERB? zY=q26dOR{O_3mJd>^{+GB9idV#27u;yWX~*+H1=jVqtD5KDJE2 z(q^?$-GIJH#EVugt^!v}=B14J0^f=_hX5(l~em zMzR-l@TFGSYf2sOB+hUTU(nwjHW9h|6S1yUO>^xh7kKcFTe3{A*;BdJbbxctmrZ>8)@aU6g>rrvr6?oDVLjpNKurr|7mPM&lWC zm9|&Ibi=8Y8_b;ZYVmCD%@0#Xh2V$lENsZ}fyJ#L#6QT#7monsy9Hq1mD!qoJpZhkxcwF9 zRV?^cGLknOp0~R!^~>q+aM?KlJ9n7rv&(tm(i8R@@AuSujrPX7*m$&f+eJV0 zf)DDpjmMjYUG%n5)b69U-ud|M`Ws^c(D_^(f*1AGw;#@4{oOdQm7u>oBm|op#H06I zD}ClG_9dL-5p8axU-3SS-l4>_xH{>BmWIKKv(G>Mo%CKGL$H}13J>Sn=<}Zh!M_i6 zjQ5Svx7`&0^A*wfyH+E$f7__nKf`cMn*#_J`LFV!$KauzZ#;UY?RDqEFmJofm>f%+pLi zMXhn+{8yX@E60?Hk1P>mN?g{9A<9l?OKhc%V!LAo%D2syXv!RH+PO3)DnO@No9-Zh> z{&1smlJDE@5Lbr+_)dP=@Hia5P);;{=Z}2zICO2?K&*Zoh>nxu zP}HrnFisA}s)#roGS`a!o*~F&p0;%M2(kWhFui=~TiR%($Y@X9xqC4%+&oCEZ5n|4 ze$fcAG!>to@x5CfiGp>l#i0-0SeO!yk+w!+0`Wg7A)yF}KC9Sq<`OYA80)Hx&;)h# zM2abK#-+1#>r&h?AcV2)H~`anP@iWI`J9V4!adjp^{Kb+TXF(fy}ika_e6Tx0?jzH z1Z=$F_*a~3cRQdws%eFk{>0ht=&$??u|x=KZM3YY4Bu~whH;!x!c^HFVS|1X6H&9x zOr=t5S6rNsh?}mfmGjrAb$OKjq&*KRi?XRx*OzDD+N;V1VvnEgrPqAVQl&Tdc~|pz z47gB7Om(Fe)-~3@FFK0BKfJMddK^~18Y=9L`{MjK`qcP(iu#=K={0e%TRvTw@yyc= zj$=-fC2Ic+!pTu_nBkQxe&1#uZbohSDf@-fXL12pU+ny>iawP?P?{5qa~&>UcwKuYTG4)C)d-K7)G2*Rv8a(jrdD+Gc~Y zphT37zpCsUPAy{caEFxsR%X3+#mI*V*x#s;*tpRR9c&Y@!>G6TM6JbpoZ>rJLrwx#K9iXZxTCv+4J#>L$}9L7<8aN?~piLzI9s| zVu2y1k}Uz6F2N3s=84JQ7<(MZ`XEKw_(b#D4wePi-jtT!bh{dR`(UA2K* zVj}j(eNs}VxWY3!5s@|OiSVzkSoS^vE!6H}DbHsE=Bu5Xj}?EYsWR;~IWkJ9C|~G- z6*2Ls(|Mj~&3dP0UHXXGZxjYuygLfw@cFI~sq~n58%uro8Fz%iB|o$qMi2DLrQ$qu zQiB?C*f_U}Ogqe+>LB-Ije64MT>uta#9~2db6MAioWYwh%!9kjCjmU4m&cI9HAEIv z4?&d$F|3hn{wd{X!TH`Nu#%EJBXI6NcQ2(eTQ3m%qG2kyH?cz1@4u zb8$hKu__WTn-qwE{jA@YQd>JeQ`^+T8^I03G3Z@m#LySj=Y0?i$T78`mt2^?C$_eC z(YV)-LmT3%|F=#Vb~HliN3NDSoO&|#D=B}@TT&`D3F9t2)<0`th3os+i|Cf6m|nAi zn8Vq@rOG1F(-q~X6Sou4Mx6WOir3_xPm35VvbPaqoIrk)jiqFJmvgem<9UbJ>&e?rm`I1 z=a0GHV&T!SuB>q0A4kYBRyUc*i5=*7Tq_pOQ#;D4>?Ne7#h^utKJpQt#qo#H@J=5n ztycu#J-PICE&I#+`Tkh4DH2E3j?$^j7k4g&!+1y?*`&l9p7hOho_k5u9pH(|uYz&8 zMlXRf-t`ND@X)fZuCnTch53Pazx}6fY%NC&V~=R#9r}TcbfT{TXI73_{CVr}=eN^{Pz zjMx`Cl4K-)hPz@V@vbg~J;l_jZm_7$e9vd1xVqB~2j+8LRw+h^EaHvpCm^onLa~xO z^b71Omiw?p)Fc=6JaLt`UK|rg?Y(jRF?lrO9*V+Z9~AJcuKwY-Nc-uFTFgDHPS=oz z?72PStn=ZV#?q{gKe2wX7}=<;?Cs+ZyC*Sd?$cc!S?7;mLt-$cc|X~7wLe@!qj5R3 zpL{}ZZEsB!4%>H?{*JzAvN!@it2C3XR(m67PZ+$z4P*{AIUf~=U`CY_B7;4*`h$pL zo2M212DorW6odw|=2CLV5knd0K}!zkh+0R3F98^6&>5GGI%2(_ANm_wv1Z~0jKn)7#@Pp%lKr0%yu>DXkL&%LD2er1Vp)`P2Ei}Y>-tWfC^&x$Xblx1Z$ zn7btrhwnELqtjerpG~YOcr9FGdoqOpESs@19ruUM~Tl-E-V;l6D@H*&DV-? z%RTV$d^|2pKO~M^^2BJrc%1jVDnvtX{HzfVmv8UIz=1w^yNA4DX&~Ky(6^EK+mk0o zvPrBjQrOGLFfoxAF8N~Cs94;8)lMds_+ssv7(D*kNtOls;&vWABhI#yjw5_<*)3oO(LgvBdg`8iazFsznRDOH=`Qs0 z!c)$@+MV|@e?*`3*foF0+1LH2e&uN^OtK|UQ@29jx11HR*z9@M-=Wt{v4Zh?YUcOe zsmwE(iWck-FKg3Q#IJS5d}7+opNFq@pi&-=OY&MPu2FzQ(@VSn4~plt*s);45qIv+Y|*%`N&(OpQjyje2r;ZTili zCCKAcjz8enS4k4%Xz1T#YK*o+>B+hy+hU7Y< z>5m|4{hSvqEF3Y2J))v5o5c8j_ArbHLg0hR;u`zX`y@5c^RDa5Z*)K_>PlP8Y^VEL z(+d`Nsn1?vwb?`GXpDIJcbvsNRp0ZX6T4O)lQH zTRRnx9#e7gI(za1+ly|ysIz^Ne6dJN5!BlakH!(hwmd|HpKwEq+vMysuMo@JvCt<0 zsckokE(<(x5a4{Rit%<)DD&t#ozZQ1f4a+JPAVf^fJQu~U1 z;PLc0j(Z~-^10926^_)N&xJ{QH(X#(_GjNW;y(NEMn_nmulXVRpW!^^XfXP;s32Rt zyqEnx&XV8vx+|Xbv7;_Du|dUI;(>z$y6^Uf8m201 zUwh(;JN2LsYmV5Qj>4Hyf9D%LcKGXS2`f}2UaL~YcKXcUJfAuHJ9WTQzhSf$hA_^j z1LrA?^)`6U9_gpPRYhtIS4=oeU9IR2VoahdZfID8n~e}fUtD1;6EM9Y{e5^Rx(rRg ziIM4I>uh(}^W3>_CTs*JZAseCq86)qU<&OqraaKMRs0jLoV?2e)q(VdtPY7 z`CU`P4??f=#y&6lURC=oHum%;XD|je&y$%}8aW@=s?6=zaaMzWOe) z>HvL<#(E;kJ454jlXM z)miDwIYN8hiO-zxC=0(4_rN$GdS@V>dQdNjajxszLJVcEqn4n*m9M#YPoMg!g)yg6!=fa6EET7}azkjwTqVZ7a%+L!7Y7 zkQm>^&1JbC_QY2b57Ed>j_p94b3zab{Km-k$80fO4TQG)2x&qNk&b!K)7!PANfS?) zcH+KqnXGO1Itul#{(Ww&Ssh~@#5j8q+xBl>J&19>$v7Ltt|@3`X+;kr_M&feR2t>j zpc~`7#&wJ0`Pk(@=kvV$bBZr{rdr||V!nJxk?AZtOAheE!)%)BycE zPRHYL)?nc zqoHRk4(6{DH|ls}&5;;Xys=T(FY`i`N72alTPwEOQTOR^6qY$J5SfAQSlT}l3tLPV zqnUHY>S)756(I!+7VYUi~J>LZ8`bmrz1jo1VdhI zFT3udb_DOlo3Z0%&;?uAa+VzK7%uxe+v3;ZKp0Pmm%;Y-=w<1TaRx(VUJZJmUG>0# zge-0UiqTlw;O{t3%$=ZdVVoZ`&UY%WHTPkhr|eHc#rsu{TpVeIKa6t=^EdhxOa8l` zOJ0R5#uur#zFvqqd$HkC61%VpB8vtUZWB>AC)5XsIXhGVEvewh~5(+|U2SqD@67G4{0= zF1xX&9vvXEf3nWi$DnFjxR}NL9QrC6+b;%)s;tA}ilgAN-CB%GcE=0iRF+mAE^hvI z#iHVHym>TM6mt$Z$36_MrxHZ_02jnmWWEu(OAHQkrXDi!#4e>`!y-p)9vzI#i(TbL zQ+s&+!@fy>cll+QE%I5j*dRkrl2b8ZLm=uzER|2^+To^=KU$2Al7(#I&Y$do`sHo4 za~kt|{hsnyonlZoPm{_xJGv2%^v*=1GR_wn=d-4M=2^_^f{CxFVZ2yhm~KN&=|ngU zX{89o1xuLYS*H(EKF}L{+Ca{@7x^nMX1n6(;RG0*%20mwpntlCdPKF>D^1JXu>B}K zj_d1{J)hkXGBzHQV{R%pzcSxrpV`Rii!%Q@?-6Q`^!mq8SU6K_>jis3dG$pbYTcJ} ziABRh&Bei|UWjI#&HA(z-`HEY`aT*30WHP-a8Jy*9fi!nMxyUrchvDEUu$<2apt`% zZa)o2g4$3Ry`&B{@gR>kTZ#vbT=1@4D8dU?iY>pK5Zi!yRfX@wb^}M8aSBGik-g;F z1$H>bd$5QYq@L+hVLmMgCFhpQKlg3$Fg_5@Zrf$61Y4{sWKKU|skG{1xqhbA5oC{8sX&y4pw;1O(>-;pmnb(azK%exoPv)`1t#F@lUb?i3J~Q#Z`}y&a zefr5eT+oeizCEf$zq+O?jt}6xX?P{2Fw~WE&IAl>)lB)oJE%MRuopA?DNk>?p@B-C zZ}-Vc`HSxOX&Fy{;Rxj>^#p$3jKhY~3}q2@iW+&czht>mF&XT|oH3UA$Xk>iJG^kn zfqFQH_ABGg(x--T9u!uf{NSGV{lZ!7x_qTwq$f^1i(-zLtGEz*_d0=C#<&g2#e1&s zBF6Mqa*?ua7d`tji3>T_T&&wi-8o`{P26XT#9+?2iD5N7^<3PT?0~_Z>~Wtll?R0_ zGC5PMJ3K}HTx5e&UO{-UbdxMsFa?tb2Vz#DlwDg8Z(#3-gAaDg(ymS@eddO5Yn;US z_96IudD35TeiPM78>L!d3h~VU6s*+jV4Tk|&cl8CYGQ|3VPZw{xu$p=z8YqOKHSen z!Cwm=u5!VRgPemuHP(BUxxkol9=BJce?dPc59$T23~uxUCB|5B0U%5fjT=yKv4|eKqD4 zU2S90>PAH+YL6G*^L(BdRYke!$2zw(8XsR*QXT}+XY+j&eoX(Q&nE_EB zaemb{(A;}2b56!ND<#F;?u85W`8g|mxWGJYm@9pd=!sUk-rVGYEB^FLz|r4_&A+k# zKeK>d1$VEQ`_G{l-cWk)w)kj1K7;4RCH6EHRMo5sVUOIAJ?EgNnu~_?Nx2`3t(!Y* z&Uq2nXC2E~s+nf$A}_Q*Ob>d^NKN5H`aFK;9BS`4&1V;Si+qhjLQjq6ICIDcD24%RS1Qt4xhZ>5&bQdw2Sg%^0L-3DsM>x#0!^%;? z$Os!KomUW(%sM5{I77B1XD5Vu0Tm`3meq15VdlaBJobMe%e0fxdbBT+hCPx4t4zf- zV^;*34w6mRxe>=P{;xRa=lf`<9i>N`2kY*|k2F&m=L?MUqFDpK; zY(w65B8D&PuX&Z|0)NK2S>wr?J~z0Z8Rv~FBQ>VIT#>~YRzlzT8Z+*tot&*WCT`U9 zPh)L+n0i@96wO9|@+Ake9t^y#@%Hh6Jpb$~PLbI+A_)WnFbu62LuiRP?L9!E6M zZsi%WlKuI~;qA4%LcLIQFa|fi_R!w$OOHIp`PhbD+E!MaE&qr@x9ry1M$ztYCl+L3 z`TLrE><=V&iohX*bp=H)ogwnc8CajCEV6RKe)~|o96w&Hc65My+YoG+dR?5`X^UJ_ z-id<;%E7ayz<_7+f#!3`>7IlwM*@+&M@ZKi6H%jI0QC+3kq`S%M9c{vw9Ni2*EX<* zp&h-eXNJq#pY73P&)C1>Jm}pFt>-afBN%6GXa(&u#(7{q`Tn+>HC-9!eT;L^e0R;S zDK=QnI1lI&sqqSN!AQor=7YH!pHsw9^<(cecD<&1b5}ejN5(3rK(lBsb&^dP^Q|{E zFWE!*md{!0sqdP^G47~nL7u{y+FCin18<7sFv_s4_GLFuEU<}#&&&SWfBi``DFT7)&l0VW%+rGXR`taPCVe6-rT|F`IXB5)g+i08G@}Aus ziLA9Pw1b0Ov730NZCy^Ar|fjbWa6@F*d{9_kBOsWoYRelh^{B>(bgn{+~e~i{l!#_ zZyAhwKTYM}rPjDc4EJ>Z3~9HRv7JuL_i7;|bId{A}iFZnEH zBHWHRBm7dT47Qzu4rj;w73VKD%e3owZiF(g8){HbJDd525%Z0vOO9xcf;Bkvy5|Q% zHHKqska9i|K_0=HY&RFQVPD#E*$mCxd>2IaNyOI9%QVxfyTX|qy?#@7XzHzYMNvtbMn6$Bm>jFRAxP~~ zC`xrx$%CMGj;^!pbz(C1XoGmBOq17EOu(@T)XnibC|d`Q!(jGaYd3u^Ctn$h9WT5w zV0WpE?l>M3dr?34lBY~OIsxvQzvFyw@fNM$VJjF-_Cv7ISPT4}0Ia)H;@M6A-b*8JS;f*zd`;aXJGWgp4fSySA=9Syq?R~W)De5rN!XsY z!#5d>#@%;{M!DoKK||T2?qsZd9|(sOA6fIvc--N>VfBl+0AI{R2mo3)6 zJWJh%*2KcuZPOoOKW5nKScJ|N`tkH@dtZ@r(&m@+-x>4o_A%)FyhNWd-xCFMqS5O3 zJ$=vB?E6MWAvXWAzV3c{nGuJ4!TFiK@I3SUKw{x+dn$`wu%cm z@3a&#W_ILl1mV2dVo~+S6zp~nL_)1E;=Rozv`ZuYxYj^I`b_h!CC}wA!k?#_qOZLO?N?OVvuSs zdaU1h*##Qv#ntOqTWRaWJCQxQYYloRhgtt-C2(#vcB1m}5qoGqiE~ShRcdnna3d)W z3sM&<`ONVS{fdR(j!nvAohOcl#NyAuL(2ISVj|9QPI};sa)>y?YYk#hZPIn+5dG78 z^oYi~yEl~JDIQQuBdIlXTB%1p#?KDqDvv5q9HaPttqdbhPf>9^ z&1g*f<%Q3y+sn`Itk8!2-;V>Ii=sNCVZ6{DPTTgv?C>b8Bv#;m=YzZV-_|xCtp3j z4IeDnLqGJe3L>2z(1*xhc(tp(Xt%~22X(O+klS9&44_Z6R}5zC=q27#S1Q;s8n#ir z#FK{}$h%Js;zKP&XDc^Mc@_@C36(|vC(cNxo=fcLw@QU;^g%NUMyKBAl|yG85#KTZ z>lSQMu6sMcQt`nM^Wn-ZBjWaZ@R{|QUeK1f+4^r-(++Ua*7leLe@ADGxL-%Nr|oz= zNpwW|qs6+J&&Oc!1$)GzJ`BCa;G?@Op48oiHC-nl#(x547;duo-i~v$4fre0t-?#R z=X$!rlz9HqspGYg*PQY74|PJ;ztW7I>5PXafS`H=P1jFX~`h|ZQI4#oVKwv#7kl8_sF5a0rYRlYG3f z=TZztm!^s1o4s)1MKrzyril*&J)zkV1-sAw;$Ag(%>5OCnq|Yp-LEdN`V@vw`tIUg zM;A0Y8Giff~sV70>@N1RhA|r;zjK$wHLcR zSU-hPJL{NMeA~g<>-%_oGqn+0IJdeVLL36ZMOk$pJoy?2ZKc^_dOaUBOd$qo@e0wP zpAQyS4WU{!`f?RlA5ZniK5aaXQ@%1fdjcS(C z-=12#r_{m4+_BQv#iJIDy*eP_8&*$JR^sRc%FHG zi1*lQ>M9P=V|3?C&cyd8iLvzD+0~rdv#l2h-&sBw#`^I@_&O2J`RsGf1^R~U6W{WD zU`E}u6%S8|jz8(yeS~Mb`yG)_?f1K!znC9*E}U-gS=^(C$LkkjczOQLHnDg%;FieY zeYL4x3>-%0i)r-v^;sVUn_(-(_a+`#V-Sfy>*k7naUO8$7LFknE5!Lm^klCT3U{kq zajqJ5Vtt5nF3J~wwo|ZVp+9_vqe#B%P9mYjK+95^WSwS95QB!Pa}#o|mK zU-T)7$HW?s#N0Gr%-hWUpI#r*zRd0i+gY;&N)KX)OxaQ zt}h<2u0Q>>x@fFOyoWtq~+aO<&4nAdm-vT6!LBIg!Mn82yj~4|( z^7-BqVblsgCnooxZ^DHT+;bYNyqe&Tu8%{IJ)tvpQ2%o<^Yd{(I#^U3$~%YJ@&9`d z4)J@XwWR*l^F55MtF1P4zcc3gCqtfosJT<OIQr4I2tlR=7jw=h}GALk7XbGQNck`%$U^sMcw9>kLP>>8uxB24ZiyE{iSy6jP|l}gg;WLVKP0dr~I1f zk5RAUVOHEnJ|51$C5hV3L0x5Fh97zmzq;&s18GG4^9M^~VfC|AY`N+K*D5ibd)^d< zF}@hyGz!1QuM!8iPp(ocp}cIVTSe^Ua)(I7)(XVsF8!}3 z34E=+8qd01O~(4Rc3Lm?0S2Z~C(WWnGv%8z{eId1FKDYI-SfxGanx-5_)rpJFKQW%{8R^Y;Fq>dTY7qqCV?_S@4&o(T2F-SXrXo$4cvYmlSFwVl%l*_nJL zmFv+@9psIt)Ytu&N04kQm&gD#YRs`GU8frfppy%)2PXzvSeL*i6>&a^nakC;jCzj+gnqTgyW z_q$;AIdUF<*l8^qx?n{X^)Z}pX?)w!8;d-$#uWxAI_5-YxX%qdzbMzpHEWnc-O*+y z!trA$u8pUrM5#^~UJAx$a`5+e@)4aPh+cuPXpw~M zx3lEMo7{iDh|k=cEDtpg!YQ6LqC|IRiZ?8IMk&qqV)J}roDAb(Qg4Yx`4&MK;qkX#?%_G_we26d zpzBTIMT-WjkI567`J3FUmi^S~8ZR__%6*>NO&!%T6g8`)prTu6wPUkrlr~F2^FS2c9^zq$zY=I+}|o!6KclTXBzx%XFZeh7fgTY6YH zYE_r!0eH#v-F}1B2aD<3^^vtw{o$&Q8RJGhtCDJ?R5Tzij@ozoWpA}THCm@!As731 zQ?($Pe%#Bb%QUo->O-yNO?K>qHFzLb+XldpXIu3ATKBkz&g zQ&z|e#5%gFNoe+Az7#)$&}~@~t}mD=ue1+FzAgzBzDCROm*`EuI1yI@EabN~#5fb9 zU#lA5$CtkNO>EmDlV7^Jv*p1KP8hv#aUQ?eFr*`W^3Q`@U8ccrBxcw=J`Lk6mmluF4{GENa zEK`#!lWQ|81$Q%MsdnqBI~PKpd)F{^9`VmUw)AxsHflSb1G@&Lkjn`bd=`nF==XiA zgL>>1KVOHs4IV~nHEjTvz2R9W*{M(hF!?Z_ox@dW&bsO0eCjIHJ1jpK1YvCud%x+M zQa&K9d(DgUY=a|c!>`(wxl3($kamPu7Rlgg)#int+04vBtomF;z^oO;a6g_ z=l)4SziDOaH-G93zfZxp(Rb8x@#Hexr#DBFqv}3#>JOZ!hCtn&YDa@W*emqUt+GlT z>kxol+f#6|>m0TD55{%{eLZf+s-23-o0yq`8~M&^t#kfp9-e{~Lr17T$*0)qMD4+k zJ=D1V0jM`B1s4Z3Q3F?T5BKKhUsX{1Hw#3YCMl5V_hqlVK=|`r2(c@aVIDy!5T=!= zQxs_@rV?*CXZ^og_dj$E%RJB~nXx*&7mtfQP+>Cn-p`d5|8($13U!G7H{YmS^_$k) z!WG?KQCDY4KiboO$7H)rVFtMupY!NV`F?8Qi79~?@;e2$_jfPMPh)?#UMd<| z)h)cgKOFC>rBXlYr+R!xD2f>K@OC9?>b%wgaNJ3)%Ss+<)%F2czM6hZW>)HK%K(IC z(0ALZkJ@u_0FtAqYj@jNeO)mSD_!V+99Bs^No|nzBl&!bAIPJ`|93Q{$8>0+oJJi~ z({|MBuCiU;n?M~K>hX3r&X!SA$eZBbyQAh3sUzoW4WG-r#xrG=e?pMQm{j;}C2Ra* zkDs6EIDEJGw!s&PS==XiX}aydIBRoH#mXO>QSFdB7Sr$h>7K3(X$Cx4vhe(3kkuJEXdFM_!D3gZacfET|$G=+AamU zyc+7$r$Kl{t&E-dFJ$2^`Xg{p?$~)$e$ETR>((ha9=b`s=gj#`!xZ!u3*=|(V9c(? z_5Kuj^l31bR->LtTCjYuECjQwQvc~x2M204HY=>OQZx%B)^yg*Cp^S|pO6+|PlTM7b9tmMBO zwLA^q*<0??xl#-w$I?S#YLb+(^bvETPqE)Tx#TDD(Q(w2KDSyXrpIFKVy?^Wl*Luz zaE$NEp2|n$%pb%osMN>nr2_z2(uVUTweh>GXHyS8+OcUTo|z9annLKWQkLwC!%3cZ+$m={$NawB`aHy=^^Xj_qd!kljR zH+mPoJ11+AC%X72&o1+0ve&T~gmMq58Czro{pgD-P{SuXO-3wY?qHva#|7PGLJG0O zP13N&W~O+u!VST1)37!Cw(k6Q7r0+Y!wz+vMNi`JkN)`Ehc~*_D`ECL2Tu&R4+ptQ z+lwkn8N--dS6RV*ANsVRr|nHQS+X>jo*pUq@yA0JTdYB6o_m$%_{qgN%V4EV!5a54 zS-*G@%tlZn>utQe(sKcIT)0oXr;$H07g>%eSm-%hcI%yiT7LAezrR5K^h$?!bPDPh zXUWpnGqGm|_if8Ha>w2oxV?nuPst`}v1vL!Zlot~`CamgIt`T%^2}LqQ2zRv2E)_b z8*`-0nwW;0x4Aznosn@e71Q7HOsINAmJCY8X2z;+`@7P04|B{0^nJzy*({8nBrQ^r z9Dhgd@lGJWo_^fDie&E+>PS)hXrRX~xwsPb*}A1-!IDhbow?0}71Tr;;VE_BJu%%o z4c{s?;oZtP@8D^OG+nRHsNw<>(`hKU(9)vXXjhyM`jSm4?%DFrGQH z>-BbO(xGB(=KpKcwv*cA=sDEkIS~7}zIrMmAHTUa{Z(1j&fbbS-2cUc%jCSTYq6c{ zdgWfrneA5~gljeXp)@pFf(l$WG`=lgw8=yifA;IStMXpedC23raoFOL44;vK^W}LS zwz?ocM5oh_gXgO0dAUfPi7tQWNi_aEHH2rN>rd*4PPricjHlyFDYd_PUy^GY&_nh! zHDj+{k+N?Z!rrle-tUI29hZvpFX%%t`i^vA>^CuA?X>%z?A)1qmbv!?T*-E7-BYg^c~R_t(_b}vpPW-I6j4=}!%WDLli5#p%cM{0-bFHah9|xx zq+-^FL>ZwaHga|vY@F)J6nkp$K1{>B4@F2^;)*Tn{)<=qe{s&sY^ypj&MkO8e{4BZ zU3ak<`M=0XU%ptKTmBwaGFG#*lhlPxj=`2^>Gj*r>Z96u|Iy}sGZ})%n9*?C0;y z8dFL2NX)o0_8g1@fdu@Zb2K{amiRk9r|K2mQY$!)4N8 z_4(0a3}DQcT|K4delNiz{*Ax1yVTQ#CoqyR>@_P(eN(az&#Tf8Z1{9_a7ivUR^#5@ z;IHbYu0=N26Z=nAwdGg9o9mlTE!6cUOE8>kwV+ zVI05PhVbh$xHJ{nd|uz3&&lkrsl=`QtD}Bg&g{#dSu>7ui9}NudYY8mD1TGC`$Z7X{ry{H(L_Jw@orkWQ`wc^|zwEw_+= zJ>+I8iYhAd&>|Of;xo1kZzP7+azo>D@z1apHCM{`vBGr8!){KVOIzWRFbTJl%; zei|jJk6$gvV}54;IXAUuKeP-8EhpdRcHu>l-c?MVMf!HEPo-ty6HG^KF zxvOMmy$FP~XMfBrTN+-c&ZHr|=bCPp1?(9*WhUd#;8SwfCJ$_6ZSpY`M9JP<7%IY(RBoBXo>iF3=Ke6>bM4q9?Q+m+NV9KW*|2e_YCnKmxm z{k8-Z`8_)=tx&jl%?a4@`v(@4s4Wlg!(8U5)}y4Fbs!fT>T)l=->epNTZ{Ev+g4kw zhF@I{7p~hxrl~1!7sH?HA6Inv9y4(y5ZJdI_on_KnnTDE8c}6`V=4x9Sf>?K$b~z{O z6*9KXxF3oS%aNy8yYTb1FKm_htfyD-J<5yDmijgE*n5Yb&UQ=Xqd01+#L%l^!D5*{ zD-4>SNpN_*LV6M7{DAt#VXJn@i{E_kzIig@4_}qGwjSgVrQq?f@~TI9?&q5HZr9XO zYut9hc;2TUmp_o3X1bx{+`scWw>G!bdVV=L$vCfz?o=4Lz8D4U;p}tiT{!h+36dDw zj*}V}zL|RhlNpod1@!LOybpI6hq&8!)j#WUVbX|xC`+Y!q|sV*<+^B1uG&#qj(->* z>s5=@^Vb$r^NnXqcA6Sfx&WD6uPOCbN8Xr=IgCSxsIlsrQ5pEcJm=Dn{%Xrk>A1|e z<@{))?sl7re@u8+R<5hIe=;4}EqNauFR#|gnTCCB`1>C|mG9@J;Zge(OutejEtaR^ zeMjCG-}XsEZ|Yg{GwUqY%Rqf1j&sk?8kr@3kSmaWiyA2}Gvy4{DSBdrE;m^yV~9Op zd5s*^J1b<(bpgnl$)3i-Jh>o%yrerx=&szC-z|t$B%{Rv0C{w-MbLd@29j&@U3g>1O!-e;|!@|*pbsm@C zJonz5y4?#$#hpM0#%I^!x`k&J?L(!1_fkZeYC9(vfsDzO5jRzfa%&OIb;tDLvHtLucYdTi%JanyR%e$bx8`J3`%njnu0&3CHao$v7UkSeg>c ze`sYA3iYdGJ@R{Yj7-ADeg|Y?M;}~ROHKIn=dy6T2Xb%oZnbQnYRJD1IFy2aih8SK zSyOk&Voxk*toowV4bAe|Yx|!#7Ywac_{2U3O&DkQ9S((Jb}>#d&WR_z3hUo3L3!@U zYFCC7=6RjKea1EcM*m#o}0!`mnXlOPaRg~ipJJ*t4{OKhIRYZc^%}oxoM0^3TpK+mT!8^ zK{D^Q=;j}!?gMAz)Zi2}`{%q=|6~eAu(mg@dsqt6PeL#LTbl>xN-gR8+Vc~+KutDF zQz|w8>E8Efwn2(53q|66&N^3RNu3S^A%=B=edz|NocMOPpNY_QDU^JPTRxhWgyJKw zq?naHsJoipi>0Qr!(mU%UrS%$nnUDmdp*%DAO)tYE zr3U!OC?z1i9D1yaYNezoi>}=L5BpNDbX3A7mm-a^{XS-(;uKH-Bldj;_e_;fE_pc2 zceC}=8p?%p*~sN{gCkGnd%;-%pLfhVCI6ni0_l7naB;7^cS{D67*DhHYvk0##hA$V z-Mm|xobh%czVfW5z4w)Sl+Pz0f||EIM#kW?%J+bz=P?U2f6>d>;)Rqz zF5j-9#Lo*`$y?04Fd>{?pVjQ;Va>e&{%qyenevrs-dIHKi2ps$Yd`f;-j3da%QHPKY6dfcs}p-)XM!+>FdpS{@$A-TevJnNLS_x zlcln2`9cKsU~hOWQm(dRK9(`IF>9yDf%oTPCx8B42l~s3TN;Kjwgrb;$oh9?V=7V* z(4~glsCFtQ^KLr2^@UW8vyr~MI}Q!KDjj4WJy53S!qajob}7ADy3vo%vP3c@mQ{y( zlDGC0NcBH3w&W1@)NYa{{N_v{HW7MOYowa*1F?QE`I(kGrA4P_!G295?xx+BoEKB4 z^db4Qbxq|i#oV(V&O2qhgB-Ti3-4K{%`wT9t*AdU{!>+4G{1C+a@u+e5*X)3d_Zq*^_;=ah7~8 zcOkYgwg-RDma}KihvmQLc9MtO@W@;=wBhHU3bKFmH0&F~I&fo0d4BKNcs7Xd*Eth; zAN!9So`>;rHF-Q|sykS-tsU`6a_$w0jRN(+yFHb(A)zoNZ}9Y_D^k8q5RO($LfnI6 z(#tC-sN*KyiH_I_*5)^$nu6oLRCNd$*U(ReS2&{7sk1K-WDa>?*HN} zKF(8?7vF^=&+vlaCCaLLr2u35^SMe1=vaV5JbQV*qm)9EJnUi4{MezZ5*nS2(R}XT zs-e=aVHUy|Lyv!c$|u{cz$!lP&%Y@jw93FSe&&aXR=(J9Fp7pEt1;8LT0iGv{CE*2id$_Y>w?tpI9Y>$~ z0@mdm)i-M5gIASF=z6kD-o48ky@;j$Z{Dy8^-}70--2BBDPyMYQ??8)hXK#?41+@D z{(-y1boo1u%Tg9soF_s0*F-?49a$h$i%ueaRBAr?ou_hG-< zOs+PP-eh}|@b^?R`8~Oc6PQ#T&OFX(PoFld4EOI;RYy&A#TGAj8tM#ehVzpkXxyv6%-Kd*taYq_%?~4;H z>2-d(tNfXH`@BEr`wMQ%JBazqQ>*Hk*Yu50D(ttQj6JE+<(OhJrX0&zZ;a|*qRc3~ ziw69?mYe4&yPu!HSDr)T^7+crZwK*{ce=Zgud?t~E*kUwHTpD68Do~W7Ow{Ic-TL35V_0`UClSh zh4<&7;lFWyI!~TEJPl=h7y7jhl21)YMJaKB!}Qy&sF{ExaA@Qac2RBM59#MxsB?0br3Z=e%ec|dr z-TS0kvey_t%(_I*+t}CgInf&f{y#s>+J3W@fcaZ+7w##*g z%tIl+$9l%g<=pmjaGU+bo9(G`+9YCc8|X{>JxEUFPTPd*NwBeYlIMzHm|{p?fjnGp z<{N~Q6Nq0l?;$U^7Dzpl1ZXXr$#X3Nh<8zk@LLVJ=N*5fkBvualaJC-?g;qg#9{4% zC(;cabxOz|^O^ogqURGta#?GczmUR)x}tI|Ioo4DNRj89=rxdlg1gn^MU$N{Eg}&) zEn3N$Gu+UKTHNhVR?1&ad1D{vtpA%gR_|V>41c*62N>tylkO_7j+7vrIpmnbQ{{H> zH5_7`kJ>1T@gf~e8E2EIElNfwJG->Ag)&O{;OJSXC#va;b(6ul=-=>9|L{pdU* z8Rzn#%gUI6hhf1uM_k^ooYidm?|rYaa+UJTI}1M;lY)B5ibp{PCi1!3Iwz%Iz(Uk# zJiENMR&Mu7gC3tR9cr%_F=zMUXExO|QvN)rz7cc9kd$}w8_uoz3{8RI#&hyxyC~Q& zZ}@I4ke^s-@QO9I&*Dw;)bpWO|125fb}WOLtoJJky zQ;QSfyU$rZxPUu%c?szIc!WIui5oU>_qog9e)2h6R~-Htht}mC<)TK;Snow&<8e*p zM?Gia@aQ;rJu#45q)$b033m;CeUgH+Cn9`bJbZ^%NL^b}2R1zcZ(Ht>hHo4LZ+F%t zAM>OyIrjA4ia~^pjXb9L7_8ee zgZVk!?}@VT`abkyoJTJcmB3ybQOfffzj(9KrT=ma<(VvNyFgi(yZ|MPVgG&pN}J!Q z*u&UvQIAmKAH<@9&*OJ>QB<5+^yBBxn>0{rF67<=bH%V7KjfjBXe=DYJGAts9N8io zY(p8Z?&oE}nv`0rVlQ@mE^4Y67~CjK_)M^HPD415((-o7UYRjh#5J5Q z>O5QOSvVT1>C_q9)mWY}m|6rc)K&7vKWq0XLk`TwKF0Z{ol(iJ^qr{Adi2|e`X#o@ zMI2?lv8?j5a!s8FOU8L|V3`tlcNMv={N20nR5HIU#5~4L{dtLEG%*$Z`8@nYu+rp3 zEG9ALWAw)=6(3{%%Pot%dn*69aG#ZDc-Q-;%KQc~SjcmG)k$A5A@0(LHUF9yPvr*G zd-yPt-)~U4JlQXb8r|%jg~Rd`^7eS1B5lO>DC~*aIQO^%{fXM#x zXnK3Stf0|Z((sDXI&CRx@qGH%$yeg|9hEb-hyPioL{@MH#OKWx8YN|F z9Q66TDRZLoiMkHk`0UrbzmiLxxs|Nb^iH)>oL0r4BXdRJWJ4u&Sq!={wimvCl+~%+ zM;XJv-}}0pHar@K`Mo$kQ{=@*>CfAY{r=AV^19!lC?igkQa^`&scQ5fMiKmewS1i# zV&~pamux}0yxHCxdv8*wA}2*YYvcic?l9)NtL44@Tv4051Cv_Kl-pW5VJP=Cs%P5C z;{NFvT28(F6W!%8Cnuv$e`++k-U zZ?v>~%oxc?rkv6X+2w(cuN#*9PF$4iyr!xCV|=kC2ClxwHs zpkr+RF`cYv?$XcU-#_0qNI5=*TFuNA8HODclP0lv%Un^{s-CjBX)JLC-j&aP%Q3BE zkw1=@oBd)@_kQD&d5db+MOO)O%0H8y<|Cbt1HfyGWSjnkS*6Z!J`@X_ghVo zJ2jaBZ{8VYyR2k+=oGY}e(deYHuAxh6ELWAJZet)DUI6afc?Brf7&0APTO$*eLHuk zO{YkMUN~UZwk|MR?k$&mC+G1#{F%*45-}JxV_3X+o^oAIz`6#{@=PP8(z$nDPnqWZxYYeK%O#csJacLW-f z-@c;BX8GtXY6z3Bn>K8v?C9l*@W=7Ett^mVJG#MvddN?5;^Zgp&d8u9p=y}7-0trT zxS7#2{iVHZ;4u}MYvZt}M-MsTH}_tn<5Bp>NFJ6n9u77MxYY5i^zq0zY~g;B_$*GE zAx%UV-h;NA=Sb1JTu_!&^&T|ta!7g49f#%r#(7KU5~~5}^u9<&z}6Neh2C>f_Bt8i zF;A6m&h%U0I~$TxpnPTw)-%qllQWfRU&)JLJiq^nR9vkSF@y1JTQON_UqX*mKKmyR zQcm3D-OfB5vah{TeHt}fc|QGa)l)jOp`IvXI6%L;qUK$6foHfw^Ov%UGrPR0#Fq-L z$o9iyabhg%#(F2@4z;5(jXi0`*28j5>I&O&mi_p{Zg~jxbu8N^1IxC`TI#L2^r83A z*0pl+dg@XVm*Aq7oN4WaAFQ9p=`E1$o!k-Dl0Ncl6XYS8F5KgzXU!5n*;?(0*0bZ# zb+v;W(U=|(M57hn}RI%i6zgB*w;@&`wH%#K0Pl@;d9KT1jLrCkp5XP4Qr^) zvQOM74Y^tE=D|~nMKk(} zH|Otoe1np+n)5xzdECqt+hINxx!C^>bM+BS@{@xpsb&O_?fGS1t(ZByP{ zh=f15_uy9UaTcr#ZOfZJ*I9n<7q#ypR&D4(trJO*>zK84EGye{aXX?sjcYm zh{r6R;ZwyQSnkNskrKjWo;xj)IJ@ znB|AZ&eSNo;U(v6_C|BJ1XSismF=xP(T3V?VW)@7@vq(RT8PKA$i8x|!7gy{ipQ6G ztz@fNjtDT}zD%_m^5r@+@V8weHdebRy?8}0gTCac!NH4MxgiCK9pk&F0ySNG)HBx$xBR*!l! zGkCV!MaTtfqA`^HyI-u2+~$4+suPoW5-?M?YY~DSR^%ADjFTHJ38a5Dckwn3lk-mc zAup2q6yFEQ6C3-W%Od8D_1)!3m7dsmKOQZvww0$ma!2OIc&zzWU*6^Ain5#WIQZ<3 zWLDvXh3gWaSA0#HcXTFBD)i3Su}eDsZU&Th+#M-rG}+2*x=-PE>qasBoEi@1|FR(vq6qK8&;9Gi&AjAMRPQ z_HYrJC<0QcSIR!|{Wtj{^Xmql+m&429?{stx_wT=KJwdz)R$tMQzmtheYNEM+R&S_S35a{dpf82eHRMN?uF;v@!vM(m*lg<1MxrO5q|oqDDq-TCx-VIOzBP9JIbKyUQp*-nbuAT{nE zi}mNK&Qm(jkN*5DH5?h|b7GpZq?o#QjPsG|eUwcLg0O;djtH)yOyhUep(W>iBQMKO zJyKDPci)fLe0i963cPuS9dE6YJKy0Pp84U-+S#&|1NXvthHv)wmrqV7mcyE@Z;uIb zAJ+I!#&d3!U@d2Iw?2wzHNv=?Jc}5lw--4Zfvx4;+!y?J)^^>qq3lC#(WA^E?lFe) zmcLQh%{Z%O=*bVO(KF~H=cm0YrQP(3X~^^Z)#sfwmpg6>_eNWsc`Ws$_S*Yw&YK$C zl!6j{kbWxx6;sbi-@bVfBTYaT3t4L4hnj(t5)f6kUwWkPj-}Kq3#-VM)?9Kyp75DdxKi43?1d_PCAIxzGn~*f-_>3X*g|aVQv2 zbq<^UD^K~pN{vsPQCgdHSDN=zqbK8RHSoFo@KzA~80Rk6_R7b2$N4bM(*~!@yJJ#e z&p6NSGD}_=MgL*O+3NX7x#@4-^E|`VFZGb;5X*Tvf;B^5Q`tHq0a>isYR;-7yFQCY zAn&`1@*mOxVg_YAt2@3vk(`cD`^1m;X06MT|Hyb;Q*n>r#tF$ZB^Iw4=dSmUNFw*f z+6^SuedK^te?&OSh;=N>*)5IY&d$$X^sITZU1~Tf;6J}JrTJ#*I`?a?0q?Rk)Kz$pnLzKeIZ}5ocU-8Kh~Kdh(zvOv7|i{ndQV-Y ztCyT1dC_aNXrv@9amHExoUi2`QVWTiKevgeJu{K=iAC??EXlu93u!xRL#wc={AXIQ zC=Y|U$HBAl_0=i)*JA32-=o*n;ra5X#=-Re;dwsmAQwL5y~;QnxR}Z77o<`%jWZ@^ zL%Hr8Vw{Zgsg=)hbd`^=T1PsU>@&v3<0jbuRGi0Nu_YhUPzN942du{o z?4;PQUTDhsNRknxzvKffq;}T%E7npgH+RT(JRkK2OP>Q=vEDujvEc)yUd$o-+^x7+ zzn`?|s54xb^PSq(S-Ms3iniqNj~-h~s$IhumZAS*W%I?j@E9zhPuBnD=UM zs72?JOwY%AtHpcNW_G0Z>{5@d;$pz6}P?cCcfAkU#jkvMLK8de**j}{yuo^G0eV>MFnHK2oNd7XV>SJobLAL?v) zCm8a5vAMTI*L@Fl*DT1>D58ObA^Y$MyN@x5shhNm{N2@ILVew_LCqn^&{2>no)vxFAw zb?-NNqh%X%zwXo$-41vn;!GS~RC5&9N4X=4cxl+Qt)l*5R}A5u{r1O0v01t^4(aIk z{kxtt)WR7(`S+U%9i={vU2(*aeVj#Y>7Tkjhk&9(bUelMI!gXRfPwmOiX!K~Eis9n}+2nA1&IXGLGOqw%nwcfqz1 z^=CSZafoWY-sb)&FO0T`gWecfm;J^akJzK$dLJYHn(vAWYvSOr@0xgKr!yKQ)8}zw zb1A>EGxqLGKs|FyY4$@GELzR_pj8{GCAAn|%}Kzn+!DbpQ-hRKRqKtn^YU~Rb?HG# zo~rNOr&>?ux;4xpuejfPsARc=agUif)P3IiHxUNW=CP{HNGo6 zt1mX$3I1yn>4ilOp0kf&&D=YZIpOTv*}~?uIP`7Gn%Q)vaP3emVwx~Ni`#{%ma(YG zn!MSgBB4HaNxa(;&tFQ9NbVV>^Y3rud{>Yf#uA?-=lRP^A<{Dj^>_~^1-}vMZ;8U( zx~wg$KNjT25insLyQ%S6VS+XNOuUkaQ|%V!3{m68FYZnro+s=tn}q|5;?cIzK;e3k zFJh+0A$Mzr?FH5zaSLN{aaE@7h>HgXS`lYiF-J7J>5BT%u}GW!Sq$bqxTr%MT72#+ zO{ngS5M$Pz9$(fXrZ(Ia^!+2?KfG%F{Bh|{U2g4QEUw_* z+=koQ@I*D5Z=rv;=?m*c+z|_84opZtU~Bk{8kW__C*0ap`0$B2iD$C&DJ$XN9P*}F z=j>YHE)))+PZ{IZV>7+F#<1S!d2{`~N^tuVOO7k+?3+6UXJT&yNq5G%5qtaRe}%szV(9V9INvgardbR=@ZZf`V}j#vqj0bx zdzpvE2xhHXz`5a!wfgvcA`G>5CZX+&C&JjjL9nr9uHJe?u%m~?#J%)z`8Zo>U&|jJ zoSPI>|7LsiF*W2za!1I;PnY_^10{!IpgdSAt{Lfux4AKBbf%6pq`3>6Yf!ts-z4cy z6Y9oiu|DpdCgsj{!E9pJry|0oQ6H%9!5#2fy61xV_HZQaui6h%y;OIUd(BhM(NFpH zCGCY^?gEo{?RLAf&Dzu;1o51FNjz!0bYB9Jf0DoVth11JnS4p+fw|5Tg}?nd8|OKk zmLDrDy~cfL{_eKMnL_hh)WKyuM?K0Df)Zjeigjb*EKx8`r=BA5?ZXGI3VYu~V+ecC zHx+LM{fuZ7vQA6&)kl_pG**(o6%tV&49W^FKf2Q_;b^COSCQl}vr6+GK# zqygj)M#G)CedY&Sl$k~2mL>l@av0o*?@emVGx2o@^biUCt;z6mA3(o^2)u62+WU|x z7BmdQ?9E9iT6aS@_L>?CHmpr|n+xYW0};g<>%yomV(>TaUvJ|~Fu_oIMjx?C&IIdq zm?d@C?u8TVE73hpGFs(}5PnCGZ@dy#SI`@-QB{0H>bOt$;%5*ZmC?J|;H!7NIs)EYsgY>A^bUYeOT}H%vm6G<7YZC zhkvcNS%{#w&o9mydkMwD&z~{a$-H#N?xN6@KA0go?loAx781us|Hm`=)Lb8@??mAe z@89X;8X$XL6xMUz+In0&7?5|_jvSahe|y32Q4}69=BFfJ1Ml-zJll4c#v!C$G<6lo zjU*;vd?pH$iTj0(CTG@$e8g0$k+S_d?{7iqewz4($0_YuVoEC)B_noRtj+pS zLHOaAjO!UMZ1aZFJK`B_H!c6k~i^%tSO&ttx#(BbQpkXAkd7pl9r*=JWC_0)i{syIqJ90bis$6m;!9%MBOe5?A8XvwR|=+P?7@NrG;Xj~ z>e$H_?oXod^ui&b4ZXB({(t!Mc%?vhn0k0trF@V4O0_X|YIx2j{`_d6&7f{Uh#keE!AVrQjH}-bo%EWA%df^XVK71~dLP zdaR#zhr?qb@dRpksP={6Jh=xQrrKi9QtDQEC!ls>rQojbk9jM}-#B9}xKwz-(Tjb4 z>L78nfjh?QV(@lk3#qua3!aUNfqn5jsWjLLQf4%kKRzaP^KphpKon9uBuPWQ=x=Hu zyKUblcs&Wj){?686ul-zIz#5A1|`&CSa?$FL`{+>vB{{kUv3j+5`-v$yZi~iZ2ft! z=HE^R9Ht94?1SxElOuX~uCR_AW6^*$aEC2|)`gfZ&v5JYIzi%nSG0n)Ugojq|+AM|De|l0PYOMsHoNH8*Fy5ypPdDAUIEllnj0pv95Dww1Z@c+8yk z=e47-jK5Vk))n=JE)XUkNyKgD3Mp}$(54#sILDHa`A89d=EtB(a5Ac|dmz*z{u>q`FT8hRC;BoB@tQ9yYwpHxKS$x) z7(MCD7-w|s9gRUZBBbK}PTbv##+nWXB-aDZ*wr8k8&$GoxXKG#eIwv%K35oUAPk#{ z$Ng{LUEf&Jt-en$MaJjP$IIHMP02r*m5g=c(rrwxsnL>s)}I5vZAWsh8*qyIU%rk) z9CLFfbJy-63xvlZ)Wsp*{{7-Mq3Jf(_}Romww4GRSf`z5PPkg{kq|LI3L8EoVb35v zqy18u{w z|7`^BAErJ=t9Z0B499~W)FS&5jc%49@T^Z9mhJ3+L^;aH}SNzA?*%TTqjYkcVk$vi`?VDl5cC^U|95huhXDvLJ zIeD4)Tw$eoA`g3qWpv`k6HSPx0~e1)DH&6tM=-xsE}qJMD_bHe!QsHho< zErCg>-LDC@L}Rl?qeok@*#iRBzNUzK|k(I`l2`Q z%X-nRFoNEQ9lavaYo!5oD43J2BQc`JMPYd=`;-{^#&#GYeE8`K|Lu`zKJk@q&L(Fp zrN@x__@AOC+zI>mnd5VVB>4(;E(dCGsVg}%H@x86Aq?`;SiyGxy14l8_s5T`gMeC&eAPk?}VCdBe1>MS8+-qb>^u*|4-mdNip$8f?Y6Y|Cz#|k<@I|R@I^U=v<+b z<^o$% z!v5$){9)bu`u9?y#a4RG*f1yC?-H6h$8hH;36I6o!WrH(&xRyX+xoTeYbJByBkFps zG=yprYY*bX+n2Y4y+q$6Vg(IGSs|HyN=kkrvX)MTnH&vO8M(E|{wU3lf|eZSXwEp_ zjMv}^wbX`g3PKMf`XH~5gQb-#n$!uxl%6p#su+!gT>-d%G7@+CTVm=W>S{iZz^-b& z(2f4ZMTOxwX4)H#KKNm{O*pc)cE#SQen^W9L)VGzk$%_*9|J;R6;&Tb4qh;w9)h%6 zmxX5e#Pk&I7Ir*iJJ{6?J-U;peyZ5!bYB;Y|Exy;D~E*SE!61lQ#H<^-OF`0C)H@f zSRJZpqKl%w)8~oA{lYAdSxi^My)p@xN2J@H;mppPakgkxO_`9YlR z93-}IX0*^HI}RqS&B)0TCQggNUEXUh6>LHDEl@G6RGK$aLE`E%K{*N4#n?ddbnW~2q}o(w8meBPj-Ru zy-001Q6KlW1mJUzKyScYJQQ!6uwZxWhWISK4vOUiGuze-@^h;0JcC5>JaxUw= zL0@crCQ)y!KWC%Q8w!R^VqjOmd+kpTVO2pC@@)C+=pfwDkHXvAiRg1BSQzjs5*xT* zbEsRoP-`UXqnJcgKek1ft{;tu^NC5VIx6(N7>&lq=&kH~S-3NVe&%nf!L{b8aF2QE z=}zj`IlLE^Cr19~Uv@I}gD{W$nWBaCEDL-tIF(XMYA5~O9$Xh5o>jweA!~*y<$~^U zAm&MtFsODyxKM+8RSp_-dR`*fHVTB*KjECQo)YFipf3uw1iuOuhCK+Trus4A z4so{Mg(~!F+8VVRtLW1hh~DFuAbUHt5Uc&G%_rC#Kb43{6;<^Z-)}G1J=o)qtnI9m z+Y7qEU;Qv|AkX&w3hi}zsI4xeM(&eZ*2~YZN3f?(-M}L@Pydj|$GYN}ejVE{v#5b> zos5r%2ilfbMBx}~1NTaATh)FI_pp+1wc{e&m#lXjHYdXV!8Y5=XTssuH4##^Mw zEd`Gr^sVL|tnu1G!ibVUm~_>yaMdT}0&VqAG71U?;AoCQD}m~&2-=`EscEqE)#QZ1K(DhmC3B$QbFn_pLdnlAzWQ_Un9don;zDFXeAu*Y?UfKyO zB9OQ$3GKt|wXw!wC}a5J~9zQ_I1;CI~+uP@&sstJ8DO@2!iila&BI< z(SBkdR2t3RrmVF#E;p3EsTU!QcdmIIsVkS zjex<&SH~=k$e;0~W>)Km#~#xk$8<6E4L8=%R&xH*t{@1L2HPAnIpvRqCspWbc*b@R z_hD121;QZYvS2aK54SlROQ_^LnY-RTmHt@!?idCoh~1w;Of**0L{1>8{%!5P{&E z)IuC#t9#cY43^W9h!IWFB^L*ylrxoPnpryU!)kbcB?o(Vs_qLl=xP!l*^;wdXK*zT z*Vb@>tnk3o+|8`%~{6ftGX-SRk%;Q_gV30-QdS+d?hEZ$pr)P z>1z6gX2jyql!oHnUO{N}oV?PRjm4e3y9b_N4^nI*9^Vmwqg|sAG_9JrsX0C38?a^= zb5mz}&G9&O7bYJ&o|j(WOB+@_d`_UZ@W?rt|k~-%RHe=L^HK z0IWQ0EVLi!i+A*uSiH@EyVl-Vlj@H~w#yLRmYT+q{`gRO0@-!_QHOf#1{t9?*0uPK z>bqBo^H8BsCq;R{nz+rdJA-sqDtF}QC*yA)eVw+aJ4S1WnZN3%`|hhk+iYqNHJPhR z4~;;>Tg(rA*6NxK4ny)x&MUv}(>**B45LGdxOD5J&gUGpIyuX@JLREHHCIJ#7|y*e z{nc$|-Yee8*+gywu}4`Tnl+Bc^H6i~WJeXXoH-9j6T~5RR7mL=ho0RW#ea1LH{Fg! z<{ga~6%&NGOvXHOzWCxx5Zc+&`}o~TF;_)zz_&374bKrT{0+wT1Jqv)JRpvs-sx8F z7b5y9o83#&lc00u3ap;)-DsrQ&%(X486H`-4``)sbje!27?>@6rWp#VnJpM zQlslirn)f9-5i5+r`t*^{>AGy#^83Z-qM{s4Y7_Gtnln3ZCj?nC@~5zA2yc8p9sg! z3JnGXWQk5eA<%mn4!wt#LJdz9(nG=^xsHeTUw=4V4Th=FP8<)W2IFLMukU-=EOc6_A zJGnUm`^f9==JrF^D<}-ByxD^kH4xovg`g|%+O7LKi!1BX@49s&G<_hxP^i_fVSZlf zC>k28aN!d7arQ-v7ChTFh=-;560uhs6&$sk$1U9~_F|pm?+}NR!wSVuBh*koiN%a< zXT;__Z&zYs(R$iF@lO9Bc-M`^gz;a+pgTb*Cx7>Cv4Q0EEExadu+!(akd6!q#Rj(+ zyjHqP9^4_)TF1b0`Y>rCwd{I-! z8f48sDeg`W#-Cl`7}zA=R<$q?wdtomNYfi1{r#!g91I8REJUjUsE6v0uEmpWhK=X! zagKA9IQQ?eP*>-k2fTO>&QQ~je!n{!H)7tH|4yrpbVp6D zlpx+@emMS|v-`anqAhjV^QV!sJvv8x%st<-i*fLKSu8HhRN%om))FowP-DU;(0!+iot~Dy`|TqskPoC z21iOqNP{kf!RvN3^0Qo|i}n$i><|t8#6T&4wf6&J-`SNu(%m)@SWnz)+zFOL=R)y* zLIkF?ekxk@4uW}`aD*5YT78%nfQx!zxF6pT7D;}n$2#O?yZJa-Jpe;i`{BE_jZGtM zEJCh3Rf%)$%Nm`-M-Qx8K`gXY4c%qQ9iE)&%qn}Vt;-xzu$nyiHmh~6=ehgL{;pS# zTB75b2+Vn!#QA=E@#gw4R0OjQSz#l7vxN&S<>BY?e zG#yXxV`n{S&wyEI*f|0nI(`%%aP}R1KNOA=ZiqW#{m^$$Fj`;RE1pTCkKqk!p8gQT z@$bFSWsi!VTW+hr-4oM^1O6FsL#Wv5jx+Umf4rFhrxWhf7-oE@%!OJ-ucEI$Snb`$ z=DY=c1N^GSxyA4qx*LBzaCsH=oZG+EEd{}m*BtUk6OW4v+tO$CH@(p(+!k~FnL|>^=UDq$%sQmP zJH0r3om5jA|6GMd%o}m@>q@z-Z)<8}aAI@=$>3HXZXM$uS7Q@tl_mfd6N$M^){{n2 z)32I~2C?dQVx8`sD-8_C9_6msikbs%MxijDUM?Q&=nIpU)ZSmUTYMhvgSK1L>=P!5 z@+&X2)3NvXnQL=A+XK4-RZ!(`6?B)~=-o%(C0}!FvUA50dTI19c7`1}X7-JJq00DT zePCq_wP~xyxg=+>Zi0~~24^Ls)0&G~_v`Mk>PQ^PyG&cT%^j9IlF-~ZSJ&h#wdjcz z4^+1hHSZ$G|E2Gh@nCTn^WME!Vw+>GeyBUs7qw>P zTHoM&+0ndeoTbk#bw1=iwOyZ#AzKTz{U5qxs0HUBw~lFRA0&U0Ik{5VrL(S0P4Ds~ zIMElzv6==Q$e(QVafsN4vx8sB>=}!^#6OEd$YV{!-llWJ`+3x`CFXNy*DCR_zZzHB z_stuyQ?$zBKD#Zw#+HlXL>m`sb(u6Uyrd1Dy^i^as2-bgJ~V`tB4)T=d0y^&smd zcF~yPP&Ljkf`4g$HuppU`{+&+)@rxDbjN4TiB9y{qn*iIz4jPu3DsU*7XO{XOYBo# zcNEXC_Mb)^uf~v(^kC(ThI&ok>jj9fx6`|?8g;df&l81HigUuzDD#uKKMjj*uxhQUd$EyPl&qLUiiCEgMg$1V(Cv$ zygopml%Ra^a6=tB_YTKsa;57oV;Cuwc5Y zRg1Mzuw7L(&KXZ+?c_F|NZQKT{iIlJ{wH_bB);(|e!bR{x%zZz63}*^ZZW@GU-l*o z+L?<X~aFgBMZb=&w|h`g?)Z=gCG5{4t^9hmMWaP%igf-Z}H4{>f!S| z@2>t+j9M`Z`K@Cycm6XmtI`*Lk4B?KMTxlLj~DX)M56z-JaO|dPhr?2O%a2-7njT&z?|+pIp8_hrPs#k7}HCq&LdkRPp;3>X4sE zz>A6n9 zu2}4ct761{f8-oyU9sS#Xzu2VeBWr;cHAL8UPR3tT_g@1%n%P;@}T~NhWK8ZxIp6p zcaLyrzAX|bP4z^iHWX&Vvqcv_FT5KPf)NuBicQJwfAJ;={^L%G`!;$~dq)iym%C!e zFrpyb%vN1 z;(_7R{u@@;Lp8;>$5d^oTY7#iLvCIPih^+*~ByP z)=K)R?IUOCfU)GWjI+W5HQw2Eq$jTn+&8GvcU3njKF$^FT=4j_v2>CiLuT{+5Z7n2 ztq1uM7ow}i*}rkD_1-$3n7i%&IHI+mGjA}?Te@vJ)`UGvwNpvB+s{Jxd^vju#@Wni zhi(+>{637cXW&`gdGe;(MH6?r`9b%Ub!g6O;`S?z#Iyry?u8^`{Gqm@%v$cAn1CAB z`irYV>6yZMBQovx z#4HqJ9{6MAS@zdWXNx)IzUa6-8aZWdqSY@id?bdr>9@7$Xu#ch_INQaUBuP?9{50< z(`;RLaVvkvCbh|l(To!<^}Vo@7~PspsbWZLFEr~<9qr;h;=q=kILF;uUGQu1d_Q;G zE>z>6L#?D+9bD0Kn;OH9+DRENoY8PL=cXr}r5em3>sXtrPYsnC)8nsGXFnuAUSyj| zuEC_;j#c`UYv(7~Y-C;ci*XKnmu-E7ah@`meYZuuqq+Os5yCh(y!uvK$~p2C#@YKr zgs$&^2yA&yzSp3YI-_5qu;83@@3DQlZNy~Sykeh{SEdsamMuHftc_+QVJdB1(P+t=vudd zZC(2)#HG%x66Z-42W>Kpxsywr|K_XKHlZ)vQO-Cwsuo~9bFVw@GR_Crtk9arsBoHb z)^}{LbL~JJfN>t}KU_EUSty1_CgBSeKiy)3ari|dQc~v8W084oQXee0_+9s&{zpGJdm6Z>rdVna zfbl%f!E+47PM?S$++>`G)DVw0Al94D9s5mBbNU7&TKC&J!m>;Ze-(H36}MGX5v_kMc1{hq-HdrqHvw`RKIPTWbHkccBkdg#u7 zr!Ugs1oU?spPhEu*bK`UoRspd85QmG#i*=^f0f=6y{TCng{7u0I)|a2@LsJ! zyR}w2CtKn+-@>tB#2}sZR1f46TYONlShxAQ2dbY8LEr)du`JmG(u81a+b~c3-N+q# zI8)5E{Umm(aKUwQXaAWvR4Q|KqRuL3|CS3S8{JIUGKaozuvdEdeI{Zr1>o?+1Jd$B zSEznbe`@*)@$f}@G_;ylCC-Lv?QNGa&Yrp4bClQFEMc5w#`#h20XFfwS#SJ5s=hib z%I*7J6i`$I#8y;9><$cOW@8sBC?ZIAOPAyfT?VL#fQ6`l1&9Unp7WyEU0`9?Rl)A~ zt$V-E?|DAlzs}_uC-!^JK0DT43wBoPmw3z^^}tK8^T(>M)v~`qWClAQP3c|JP6(hg z!Li6=r`CL(kJ{Dq7&1F%U9%Gy@3RYIP`iw(8I8Pn&LQY&ny#sdeC$P@J<*@C*imzI zF=|}#Q8c2>k($=JUbOc$ctwmZ*6amuN%s}2=xx@+nzY-VbgwFsDyF@v+4jnV9zKYm z)5VW#_KgFk3$=Y^zf(2S!58;(K6>Zdx72i=??irkLXdmL)l>|1q%h*vf z)nPHlRb>HW1Up-u$u!jeXyGQVi-ynPzPz<6nBxm}SVd-|I@Mp)VR*iTZO$Z%H2b zqn131ARDh>XVu6|0X zvHZ9Ly+I9kR{6G??UnG2=+RDJuT*wHy~1u7zW4MuqbJecv}xvLHZjhE%Dp_Pr}lF;ZOn3TvN-{RYR__-oyfDF zc?&xyp74}9vkG1P|Nm>)xzatkEdMc(xF0CK>jgOcay zw?Ef~_O!<-NpS}+%<6$N?B<{+MPaL4yR+oTS>d_ccHGx2fd`XC6{M9(R~s9YoimAUVjjm4uWoM z?>tFQ)OeeL&3M;KrDoO;>>uP*$A;`xeo(O|J>8Y0S{x=gT)=$mZs-gh{VV8Sw4ylF zF@B71V2M9Z!N8P;YoTcqo6h3Svs@GllI(NMcT6lN_TJaq;=E59j7%>`Z^jK zTSd_1Jt>nuJAioOCThzgq|(lP-O1!sIE^|sOd7J&g+gtB3puJK9XsBMdewx`0?8lA z9^?WvFqryXJte7}>_AHbQ6q4$tUiChp8g#22UkLolFzrJ)8G7P`;$Q7bHfT+jQ)-8 zvfqOBw&k=JcT&Xd70l7tf&vP?X_i4TdlhO<>yo|byw3x6O4p1$`*_gU-6~u$$Q=6B zjx=WQI@WpaGCEzosD+)o+U82Tsya~{)J5|<>PjEqb|53vk@VA#OAJvLeGA;6TS}m0 z)es*_WwW1v&A zqDE5e2#!9?oa%JAF1c^(MOq&*C$jX7#EW^-5!Crpd{m{IBRnat8aU*uy3zqYp47`= z74Z)Pr2EZ1X?9#By=)#Xy_4oaF8d;A)s11&9)H}ZFZ$Z+yn0F3r2#Kz7)Fk(RirOE zLoXMYy!ZZ3C0|dWR(vCfoLBFb9R6lc(VBtu`$coLnh|hB=%XK7#e>N_O7<1>}%d+qHfL>{#`-|&;hE=-ojj=<*jJzMGLPruyp z*s^n`#LV0%#qcTfOf{vi_wA|2emz#O#*}<_FKn@&PZS=L)_-(_KL!rmYMgXxjRQT> z02X)q9f=xzS~mJAs>cRMW_<&v7W&;82Omv|4MUF-*xEpw9@X=p>%M**dI4)URX@)6 zBhv!lg;F0@*C#{I@h4)rO}aJC*b9TK(6=(3R1>C-Irjrm6fN4;YmQ~kmTjPehZx|iS zDXj_a=|WQ{g;Im>nwpo}94Q9*>g_urH6Pp@=ZX@d6Xs-3dwU=UZ0e?LJ=%_T zBB!Rd2b9O*OM4r8)0gwc!fSmiN*UluNulL}Ji&tUfXDdOz6)D<#f)_KxzUo}cC4vt zA!Puga6>hh?XFxv*_Z_?{8PeY-4~GYT3ec`e?uAtzO`C+(-wBF4>~6mUO7@H4{&Zk zkG>eW$@%Z-366L!addT{he@a-T~QbZpl3>`%k9l_t=VM-o%Fm|Qn_AIlhYb`N}pId z_wIg;P8j@#B8F02HI%O%eK3z7O^t^JD*ax1QQ;)y+DoS?WzdHjm=;C*7CS0;PJ%Wu z=CY1Ykt>T3v&{yU;C5b)QunF{)vk&pgHy%I8>Jr9r!s>2_bXR!yX{VkE5m7{U%B$B zi5q#?VIHJqEvB6h zoM?6Lr$VQ|SlZq6`LEvZp@lp0xm(w0=%xY<_QGR8ybm~DY?JzA-mW4*q4P)eto$Hhb$3R=v zFNP}iJyxb-R)Wx)dgfrhrFCcFCF+-B*R3L9zn+i*o}p~aKBVpME3{%h zwESi`jp?H;*tGT}dJsx??mbgV-?-2MpJ4h)$CVE(oha*i0R4*Cquf5v5q&2=y0UJK zvTiP7kJ*@2%NwMu&$grf&FEdF?Ka-l#fBQeFLT^6Q97un6|hlw20t}r%0dg$ms(Tb zU7@n_f#%S&v!tGb&dC(R7E$iQWfXsQEafa&NXf^RP|&`k)ck%isW+R_g-@j>hdLt9 znr_^}&cZWwS(|JAbRGUV-!WYJ=qvhWc9`K^(oq`KJ%}bC_OQ=ruC|oL(U~mFAlFHi z!q)_({GgYxdKzp#HiEhl~ zPzyrO;;XXl1}D;9?@wbRUntl5VWxWnbf9l-Rrb2-h?vfk+zsDVS6p?VcN(tb*ziJH zY->+#10Bfb^=6rMwk4!RHbz}q=0NSO9BkUo#c{B2%} z5Cm<(*6=e!0yYY*0{v+S>i?d>LV+%-XSuP?o5 zwTgy+I4SsrdDD;Q5j13Hk?;n!>n|(AY0GB0kodxl;x2`fyX`VTV*+>#+Jw-pt&4@? z6PT@N3ZynUzQXVE9@HVkpNw;Tg`TTDY3vwZ<**ep1i?74X0~b`t)qlGDu_m?_>mREUB9 zJ_t-m=#yE(8`!Kn;s0}8ge&0hva3hF6Dt=w8bPloyTq96<{^?HBCZc#<+aoUZlA z5_&npwmg*5Kg)%(FCMgLe=xD>8-#l&P;W6q?ESt{$QtWQrG+c$is3D#$xrBjfA<5| z@MIb?5`DV+0c29;U=oJ9Xq%ZXE&Ow?nU?I*!Ic!nfJd5=A~jwWKxXKzy!P%URcQ>Q z%2ep)=sm4b!@iEZ2&{f?o$~RdL{irVpK5k%!L)M%sbPL_eQAH8al4$}{}V?K+moP! znXFHTz;)(tFEG@hhhxTV#_~AfUtI0wZrJ~7>jXJwBKlWhp2EIJ7@i+WKP{mFarUsV z<9#q0|HM3C)Oo=dvz9M*#gIk8Bf;cIAT&=g`?KP^kcXT@vm5$iQ5x)RVF0~sjHZ6i zx-kpbKk6X*=`Z@TGGKR8{85ixH;@SrR#F7=P=oTmj4-!;*)fWIueWCjB|fxt$tudw zX%uWV5r008pd_jgMx!3yO+TE@uiPfAg9h|N?NBCXF@+q%&{$P(Co7 zL-!}rVQ5MF-3+Bq`l%-EZlYdQ?%u-AiYwZfe_u%}E(;A9-BExaF@K;6O5kl16a@UBiy*M4DUcI*;C zjv4E=SAc6W4-vGEV8#&n=IS3ALh@sr>4k_Pk8Kg2N+RgyPt>&ID};^uVc-)+J<#j4 zP=NYzHxJAh=G_;*P79`JL+CZn_$*W{38FRV*BqG9mR&3hq!pN5Ty(Pw3zY=Y{&g{w zyvl$%s$+H!a{;~U$FWWC1IW`e26g0V;A#$_ss-THcQ$2xpZk+)hZx{vC9J6yIQ6NTQHtTofT4y=gID!T4;SqMSSWoC)G%0h)OA2=2@%#+WzSuJZs56=86 z&SVxe>n@;9{uXET$|e)dF{txAZ#g&7)}*s+;V0Au8!&(Bk|BLu5J1Hucp>CHrC)Jo zRrUd!^hZ~D75-c2IdsW`-zrm_5-AZJ8gCnW3oB+PP&4-SAVU(qK9$p8@b);)_7prq zu%Gez3-)USRbABc;J4@BIVjvT2gV%n;RDwO;Rf(T_h-jZLEAQLHRdKQJ7We}M~~g? zf!;OhfqB_eS;*sH`UQMW?o%6<`#p#V&tio#o+&JX==?6s;{MpcMq|!*{r*_$^nNFE zDGsFIW9YdLUCSn}4dLowkQ9F z8QX^*O9n6}CE=skSUuF1Jkis9smlHu`jMGV6mUd#!uxx`^Sglur`>be3gC10>_$K6 zZ7tm#jrz=R%!^eNnHWy-p~_1w=V2>0>&gl`_(MB2j>gaI!}atcs1Ck2CU77(8XHdc z!1M5OcW=J=y__~;R^9ev4}MZiA{{qy=Y~Kx&?=G4{lFQR*MpydKB_?=beT`|=J#jG z$qMVhHU0T{+=*LPf=|A75H~p#P4m3KD{*rK=f5K9juT%0ZY=M|!f6)fnf1mRaq(v; zutMN0-8_!ZFASk zNDjzz`6V-U;RUz{yTp=rkM8UOY(Bed3~2_87UF@iba(+y>1n!@J<^kOfU&|17Kby9S#@q$RV5~p4>l8uHYrui9WEtO&TJrNk z%z+M)@_Nj7d&hz!#bXe^ris~Pd+_MyYx5qGxOmBM-)g6f=&Cxk*7-~zB3UJN+Ol1>L6U*F<`sCDD=8b%z z5@+rAC0VjUJHKZCU6hV59NP>yHC3XPLDM<{0!!^{FLxJ z$7k@>9-)+06i-{njpY9XgpgAzX81$9bGPbXYV-l8ie_tWH6xfDu;(YvyU!-0*YkV~ zxNbrO*7|i2?d}6@?qR#xdDUQAhW(S-CzlP81=FieI6KxEYy;}19XjItPKalEz|`pe z#yy^G!@}BN-gZ0uSVc!x4cx&fc}a8gfbf&H8!-l~ZtpQGRo zeI^sNU_N07MPf@p95*dz{lj1-tF;6RzEU3Z2-9*$YV{{7_C-e@zoaYUU-OHK!7rSs19s5k${Zc)jfm!<-yP)Bs=m`$<5E`0=ILE#Xx7`;^!{DP{u4rW46M|{Z za;z5$OtB%D4$XoNQS2_33_s7L;Ff9L$nIL;eZU3q`ei1&f@e2wW<13y64{myn7f&V zIBL2lyRsmNrXgl(?ytw5qW+}X1JA;Gl3+Ix*gt%(vRxah0pH^tU+5D3siSMq^0-|9 zP2}tXlfZGXIcCQH*Un$X?y`(&{v^j)Q>ahnGgE*Q#2#p$E)oCUh@=}h%ZrM2#7)~3 zq5sj-_Zr)kivEcWUN^XcO)x;cc^>rT9rIYz zpa_}@|6n*Rg$Cu-+Q3pSZ!Jgf^`2~eo*S)sD5sO>OUMJg!R#Ii3UOFt z;tD)upLZ?!>rVc*Ap6~^uswX{ltLCbIf>pNW^3L&mW}zVpdmPGsdle~y4`7XqBr;e z*Omw?Lo(>_0BE4hlM8c-)2IyVU60)a;e867$GUm3A8=O5WQ_f=*&tQ;ekqYG2ZA%I zZL#pfHQ_%_^2G*cggZmvXNH2y?(Q35-Bf6Pj)JD-c@5SE&%wnA{DC%onObXb9-H7i z44uHtP0&v>ji)@T1#C%WEbWKgB;8%vOLNo_{lK5FDVDwJ8cRh9;37-UVn2ah)xz@~ z^00ta04JplU(~m#l+9WL4$r&L&d{r5s}<3tcn{scxg{)lbtGv#2T!b!%HG$9&>@_o zVSy7_oh|(86>w_(UME}?yhv#;r;(=KvW_QQDQC8VdJT>tYb$UMCMw80Bi7`CI%WsK z)&9Tx`N{l&)a5EP(A5x|oo$o}XSY!q;*G)6mdNxb=2I8M8&Sg)Q=_vBX+GwS-?)BN zzO=}rDVXuzI@?jW>#~8eVV};5LSa$&Y#Imq*tI$%6ik6Gn+!2@hxbC@flLaVjdR-A zktO-1ljCBXWm|nVePb#Owgx}v1S58?X9`8Rg2#B>0v7%#iK5^KSfLY>JxHWk@vw7D z1UsjZNKI?O={+Qsy;+(-IYr>r+_9d$tX5Dq{98QR&iGUX*~2E@>klxO3v$wZjW}ny zlIcNDekt_xrX-$ZH$A~Y+fzLrtH(p5{@o!C4UkGdWdeZ1(XrrcwD~COEA-%N<@`>p}pEjY-eqBKY*48H1-a69o zu2C)QZ0+43T-7KgeRbR~GDo&;$Yq)WzmfXXf&F~TY1AOtZMPF^t~f-;Mq{RXlq+jf zP)hBm;JXgpVmo~{SN%lCJRpGvHV!rk>*Yj-dH=^n z`TzA{&pbQM8XuMX=Qn;|8NjW#+@eIBRmWFDq45g6HrU_N2wJGe>nNZdGz+@5<%Qc0 zQ!nsB>@fSm>i?9H3HHB9`!{Un$0E9qb^pDO*y@Zz`i}LO5qH>+1)FFc*7}cbu(!JF zsQ~}BY}r*dXU|%isR7>CNtapJ%`D<=aW5>q#J)yl&{v$Vjoz172k7PfZUbJ&pv$b_ zatd8g!RIcz%5v<4Q|MX5(*GQ0N3Mj?_M>s&gx$hUE5HMG6`UmR zQ&|pbc+S{MCbxr_`ZN#P1)lMm*Gt&e4leX@tOC4s?}d+(v7cWkXzR_ZG~3&Wp5gcY zuiq%o?8o&xm(mZ!GvP*woV~h5MzC{KQ4Y^HYNFGyNr#L$t{8fao_E6iE_LL?_cK}y ze`2_AF7Mh{L65q?Px=~h$Au-7hnO(_(_nu6+;&Rp4t}3GefW1FpGvV_P~DmTZrVt% z@EYaa_Pj^?94ba$X|zn0Z@<2Vmg0SG-}udf4YTM1-d}P16SH}ePNQ%~+zouo?69|^ zweY;WUaFj(G509IYIFk_CgK?DREo$9=9~^R|L346(GY&vv#5^O`#l*PXN9$a+}# zk{<4+fmheFBwG*KdLQ~wt2Qz-i3^?lET_YDFF{U5f}qknbD zi665pMeh>aP})a$_^5i)fSt8FpW&m-nn(k`OPpEGr$^r+4cO#&$2{&P)KUlJ1q-5+ zd2rt$}+o_UFrii;HZ@tShghc9tXPVII8fy+sAQe2j%#&wW?qfOGAx?HT zWXz)pywUi*Dz1lEs}WJO3;TJz{vI~U$B?&lE?+?OM&%lCp3}&y;F>u&agek2_(h$JnUStT4(ROxveaL^gbJD2-R{P7Jid3OT->Hbb-GG|j+&CJZdW`uG z_n<(;_(KWo!sscUk-YMh1_w3lviF3^~(#PKiXQ*(C%x!! zF!P5=6o`NO$KWPgEl;Frcu((RwJhVQf~v=nS8;$jql%(Qo_1B#Ly?)1v?iN zv2_N}N<#hiaKjcRLEZZf>LD9`6*3QrKk43zr3JnvY?hS|Iijv;Bb;HSV}WhJxhS&u z#%z6DsPA9oR%f($k7rI)7bK^bPv5Yz5zcfueN_uP|JrkdYfUY~-=Hu2Zm?L|xq)`V zr!6`@PW(~QL;}vW-mu={n2on+8*JNIzm2GKx|Z%vKtHAHBYsn_ismDaXbwNYmwhXx z%Be&8x z>VIP!``k8&zK=z%>FPH2VaG~JJrzsi%l9)KGas7zBo_KiH<^~52U)}Kj9Su;KiTU- zOYh-xJq>wOFK4=rn#1zxLwS-daPRspz4_?MyQ$LAY z`Z|+3;t=zn)_g~rGpRJU%m;H~I*8HcWmJ#-y!*-u@%rEfD%XG=W_pOPjx^B$?15oL zb42~zTl5C!eQ5b$@$<=A8afAc(T|76YNmq^@WdpUrHWUsE72t#b2lt(GWYt zA-dJPXHfxVI>2vh?&M)>bLk}3W`ovppO73%vB%j7iQ%uc*V1>q{(QbY-zv+Z!T9@o z)fxQs{d8K6*9Yni6;Voh*VuZq(=&L5%F2eTJgS9lW40Ow6u;rX6CvH^w%2a z<<&)YzYz6Q?B`PB6Kq6z6wSpw&g4oK=o3aNCo%UVuVPieR^9MI&n~izo#-4u{o5n1 zySJ0In!A#+fWJCFtdg0EKJ)^(*`nExS!Y8}x_>^7ens`*Gcfzl-)P_Ynh3%V-{Ao(Yl=ahiSubwiBw^K`uU6LwCAf9wCs4jOj1 zD0MoxPt~T15x58EnSqndsINGpYZZCfpvI!wPMr3pl=iv6pO?Sp9e(bhHeT^GYW785 zySad__{7s#>q_pMluHJ_h`U}F@GI^))Zh&c+nH&6y2@Jc2>;71@6UZkX3;sU?bFP- z`uTLs4I_qen84lZQfYGlVumBV`LK)0WDx{DteC0dL0H-hB2)S4uko|8~@zuYrC_bpte^ zQa1C6x3Qm(hqmy~u^UH-_h*$+1?()po-F?D(Ez?~_=@H%aS!b5fjh-~LWnpb=N1i| z53LzTQ_+Rhk`MOGg2a*H2kk04jlFdLVHa`Y^HTb_5@(^ZmFW6$2fYY^zb$;gAFeGR z^$76R;@+GRnM)B^2i+^-eXMe*PdM(8R_nRLyEU{o46(%ac)q7s77_lwC&Qk%Ig(D_ zBXMW#BEBm-m1f2uhPN2Rw-tJI7PqU5S|Ap^AoKj}1DjFPc3lrRl41FBEhT^Z(gF*W#ha(e(qrmsCKr62Xt{ zevKFS^7#_yzPrGP_w z%tD^fEtP8Unq5OC@PTHi&H5weoG^g@ovxr+^AM-5?#|;Lqfd@}sySYZ8{Q8maR>U6 ztIr3Do2TN^`*2u32|~xH}TlR9dt1hpKIA#d=ZH}Wo2UoKKp)iXM~$hxV`^zk(ih7Hsl+nhu|U zUirJW;G-V*hiMNEpiTes0Ax3?;(UJ^dL4RIe-1IHXn!i%4jzn=c}#DfKMgm*yrjWK zW(2(P>*2t$b*^C!FVPc+4__;7$2$VQs)=(w(tQyR0N(G4EwC0H>-pARF6c?N?5A9s zU@y)XSB4p~c-s4ZuNd^J9(f^ra!{4H|4TTcn1w`Te3?{8Uj(&)^d_ z?6eVG{vM*g*qp%zbh+hG{D8PN!<^$JUm`fRj zxTDLi^2-Bq=u|#(So10#Rk?=pvHqD}z+Dby(t51-1*GytNomk8#(cOlOjiJIFPXf#_8chC!`4(O*lEFQ(5{s^MV|_T=NQ1klFD zSdxEk!<#SolMMHoR)^aM^fwvO_$xW6CT3uA2+>(`m^Y|Krw5@$iB& zdIviX+;>dequD?yI*7-%)QTlS6CGNNT7DLCF$kw<@k zUR#nk`W3)-7Ybbsn^37+JeDmB4dI-Of@@N~+(nui(*tADw4p+@o&>s!NGkK}JwR#K< z1NP=%ZX~}3{>Ej$Vrh%qo}ZrseK8UGfYvj3yLSOJU?bKs!}+=X{?vbQEV;(^;PV&x zL0dA0((BvvI{}#Q=n_Mo3)=AGxZ{-e&}(Z{;Su)k^k^(_1!L9tthdheycW3PvF-Wj z=MJ>$dkopl)#dIM_B6gXur8xVamye_a5%@(T0J!}^eghg!j`xKk4stNg@HwM`(M8i zbXT0JyhK0#t;;n$6AK!iQ!(sp2Tj-^b(d%m?7TUsSj^U~rWvralXa$On6!_kZ0F^WcBHC>+?-;ltv&x4RqNs{j|=Iv1`o1X@V`vE*4gpKF^!Pg5(FqAiWMwH{q<_0|ySf#WSr|=MyJ&IWmJvby~a(*Vjlx8}%^v?yC^TYwKH~(knZO+YN zPDLF}MqC&6`G+`}H|oL$O52?#1K3%VREdhvN^*mp?P~MHGwpX#4(wcBkRYb( z7l1bsdBGuPvCelry@lPLw3;cNo4A^ck08EM4i%4TrIF21)YHCp7R%7j+6J4OTK?hJ z7s{zGo`sHeBUcRq25JYi-nQ29C$R z-hnZcm=%mi!NhW$J}xjVmZwT!A?Mw51gI=7o(PCbAFRA(>P zoSKD{WRH2(y|7PTAi^M0z*>n^8`L2OVZSlhz`hc_9 zRM@um;mBKb*&KIP#Vc`-gi#OJSrUFiTy(CC;$Y`^X|bphyM-RZ&Z0y*ZPMPlc+DdY#+Zpa-gCR|CN2glIQitj0EZ&gq*{yuc2nrO9KPF=B9 zKkyH?p8_9)_xT-kmG80yZV~ZBNN<7H{)OH#{PV`Z1H9k409tq#7}v+!d1$Z?xlhLI zl5#yi5{^22Ip&gHrSP>ET*T~LRnNmN@ zmp$EZoORzepP~b!NVCrve&_Riy0@YwPNpfn6uQspbOm<4^jD)cXW1bd+z!2ixjMCX zhF_##s8?8C{VrO09w80b`NfmV;)hNy)zLrmiRO-{8~C-wWv zZSWp8`(g7n_jwd>qlt(&*5sV!k)aV(jpx2;%5iS%7X-Xs9LeN+dCpT`da@{vx@Q&y)O-PTS`F@dn3g*k|PDj(DAP>G&u%~gYp%vFY(WfvM1lkEbb9qQvmW z$rJ(KJFTCUIB-)Eoq-KAwI!m7c_MwRLCv#=q3Ag%fh@2d{*R7Wja*}i67kG=6*0Dh zoI2qd9lG|4e+iGJXF0ex-EMNzy^-XFJFz*uj)zf17oXnQ3^^0(s!ng1?VyF=_XB45 z#csCO!IYdQMp3ZSD^{*=PJO^l`M-He*XR4ijlfHugq`~p^sM#yQ$*ci=f>s%wY{~D zlm9gIQkz=Wn$dPzkNYUW{<^rS(^@(NJ0C466CY&(R{%Q?{z9@833K$ci>vGiK@%{;^4Se3ARrJLbXW`>nzU4b~@w&#-7rBxT8|6=0!Qf23R?gE$ zd(&^k8{PNs;?Ea>Q?3`V)<5$3(l{6N8-dZOTF0j>b|Q-%@B>~cJmxL57aKA2HF*`! z`)fm=F`ruv&2%+|6=m;qFv-W z8o6!gZ?XTDb!2CU-bC0bG3Q)5=2_rZdu$i|ucpxt*x~igWRdMjr8}^5%|kbF7Wy4S zamVS|%@KR*CDUl^)!wZ}i!y|#^-`VVgsHv|9q0i-w&m{KF9-SALH9q1L!*XO-8f!^VhGv z$>1EYpw&gZ5uET3`a#QkO&(vY>x#SwT8)3!@Y6rxH-J}v^evgsJ>dY(k0@I1w2FUG zv!h7hKlw#x-v5F%O?@3jn-ga79hR0f6TB9-tq1V7(xr5o$I#$YADBUyIn9|DOB;U_ zGxlo<1>2eyOZ?H4K+mvNX|E!l>XJYKb->8oe8t0l$tfJK zpE&y#|Ax<;ScDpj;uJR@5KXHB5G$%2=NXv$@z#f)^4tUb=GFiTO9N+!UNL``=0m@c zM;Dpr^LBY2WH1uA+{^2DXK-WO!z|2zQ>lC;?!?D8qA8_YJP*`%LR~$YtiJkk@9p*^ z16QO@#WL=ow4t&U(X{8&WZtmTimsS|kI1(hZ>MHSJurjtCZLh6duKsCfjgDY+rV;8 zE~l#&xD%IOVJo0@^)|j`T&LrBK-{t?nr^_(ty>MN)%MAx3fOt`L5$>Nf-OJZjF|BeSQ*YoJ8Ged@FI*phQZBZI|4A&ik4sU}hh^!arB}v@r^*6rn|{ zC-U3z$eDH_e-EnUh0(A_Fmj^gJ^aR*Fse1cIa1romEg2_4eW2s#|`}G5Ad8}_I&xU zEFM41lb%UqDKkHjs}^JSq&S9@O%dE)%ax{L&g+l17oXw}J&veoU<8-*N;6?rFlp2hY-eBRd;^y)V7?fcYuUY!*g_duQGX&vjiz>2&-#ZkbBWVUs%EvYI{ zkD7CdUAYZC1ihAZq^9x%V&MmHQno>l+iOJaVc?nX!_N9k9*HxnVyPc;mWR&8qV}j% zx@d;p^j*2wwK#)b!_MK27NUAiI(XfY*X%+*Vv|NAkkf5{*h}oBlS)yDF%$>eitoi_ zIt{yhVDI?S$RwI~3bEg@dVawIJto-pKvONRj7Xp%7tmY!Ue13kQP6%o3!h0l`P4kb zgL~lH(Pw|OA)0JLaE>~ztaR+*JC4n5sm7 zp6Kv0gNjoTdjuJZ1!vO9wGe%Oy^dlJAv09 zQSxb9lIY~Ww#_T$w<8j1*Lm~}t2cA^yac*?88wirS-iDo5Xfzhd_cJ_foH`%%xV zkxu45-@$GB4zn%mM)HRD;1msyq4w_v@FUM$>3ToJA>rNl{G~25h+?SEdv!i-yc5*` z=P%p+f}Q#V{dDBlKTjQJyF8$0I``i`S~_dub`<{*Ht9Q;4Qh0z^{~0)j|z6LCwQo! zCG@}X#)q7P;*k3>bQE?@R*IrqWemw-=c<8mV#9dUDYeks)su>M-=&hlQfQB!=qft* z%cPJr^ggV&kj_?~N{*4u@rCdW7 zvu=U#?Z?LRec&gU(-*Pjnqk~*7dV91LLaA0pHJ!IOBNr&MfSA^Z^A5jE;!$AMr!j& zXkBgUj=vYR<16+9w_J|du5+#U9?Ss72SHQdNfYaq>`J5dqV5q|&vG)HX#jF|{ruz1 zG}e*UR-k6pyorq-;y{XR=nXCNX7g(uC~cmcE`^L`NBg?bn~$iA&dX)=U z(wBo`{S?gKz|JAhlEoRA+pdG1@70eJjTEpq?EI3{ME414q=g(j|L1kydTu5eq$8)O zJ-~PBWKbW(1E=5{JJqF;Cu$luw<~y{e=40vjL{(R;H`V5&|2(Ivk8m2;YHw4FCuP~ z8*}g7z^GpX)@AH)o^>RFj@`oE*6qt{pciO&4$mS-m%l&{syFx)){OfJl+4ALnp6ilEDX{bGiVUvlnn|l*=Pwza{L7#WS`Ry~ z?=Xj3-%6uy<;cw&NAeS~sdN=FL(r67{NdmfYK#3@;n$uQ+(`lt3~CxTf3U}g5=s9i zY-Rq8MN}mKLxDSP`3=@#l!7+l^@>TSnY|8l(TmWx@>a5>Q>$nv;^)HghnX9=d5rMg z9tIy^*TVd1K~x;YDfciN%*w+uoN`&W!eK{~vc+T`H#vZ%uaTSp@mnw8U?`Z9h|-;}J)Gu=Bx@=Xsk# z;G1CQpCi-w!hdam-_mpZBK{&WjrzgPYOM@;_rOe2gPo;C8hp^$44Mo(Z@ciCt$L6K zZbkUsI~Q3}pHfwhR zt%aT6sz)%D-$OLu2hbtjVgSph>Lw`bWWg2`1So`N5*V6od) zQl1m$>B=nG5bzL$BHl=7He*Klp7b^aab4f}Z0UIqI=B$?K3`_ABgr0gykjh}3K@G0 z+>1;F^I%7&vZ0;aN$`oKxa*Tx>#M8`YqnXK4@Tg3N-gAjQ zBXE|EM!mo;__xq^pF4$Jl~cCNN|2%sGXNST|LdPs-t6V?&{MdeL~rrlI9?4d!!XQg z1}48}yGBP+)?UnS8db8e@+4@C<2U}uWV)*9bZ|L(E9suhWLz4p^g|zi;!O5pWGXF; zgHKi+!h$=cP}eNfw2gFFE77Tq%Xm+&R&nmm^SvTZ^1;9@V?bO)Sk{CLRbzM%ip!O>c z&jh`1*GNHoS1Nc<AWe`4(Q?%5ti6>} z$EQFOVP-6aebH6kY41%NeZh;BAFI^R_oUTz(Ii%an|+lB9hnhLnS*XBwJ*3+?w2U~ zt>`D%taC%32Rbj&p~9JZ7xMZQO|va3h07noO^W!i--#xn|2{{m1Rhv%K$DsDbfRM? z(1)t~COkag1|3D*al!erv9m*Mt>UmtWzX@YxO8#bMNsfTiPGiF}@#?hepr>ae# zB97JoR@gmAsv4L^i=B~+S>KaJS!Mp$Z&IDwUN-i3IwdgN`{M`64y{R}&sX7drcamI z^-iVBjriPLd)c}Y%uqas4V|N8y3>+q`b+q26R_<3NTB=|sMo3F%a*rEpc}YfJ{XnA ztR^Vvds95!`sbi5?FTRsci?Ay4#-vpLX&VO@}O}=vODi1p}P%#H913eDg&`<3^25X z_OkmM{OPJCW-2NM%X;R33vM#F-5kG4`~3B!QrK2^rc!$7F?dvPr}`dQA${K31Ns_K zbZW!CnxF#cr}v7YHXk*GB=ChQE&`XZe}k~|p%WQneozthR``_QNcU@TpZ4v;-qkzO z#lfgs_UO!PX1I|z`cSIvAIU!d2_n_2E%8W4=burY>xY>1J22boU6sMWjve|5oxv_s ztCJq!Zf}eC30^C;cS<8U&dd576`9|xOmc%CR*xPaoBlYR3eNy5?lwcV*C&k}U=#gh zS6S{`;5naRzja8Ec?BiYX4r6+(Rx{3t0W3|g?qN4Sl0GH0ttAQ%fBCyX=3(pBG$L^ z&&htgK+PY|0z7H5R=*K5;(P2-Z$=+_Sw(3WW(oxlg2ilK;A7gNerV9%q?n+#!jTdeDmTF_`iPxE+X^Qd0ba6k4>Z_>>5f#>5&C5pjF~La zk(O-*uY39=w&)_bBO;;o8U9OVeLj#p2DOZzW3tXE$LM255Oy9~qN6;G{ag(@|9jqb z?*VrSJDd6MlImHckuLo37R@fQ>k~8otG^vBngLRB5Ou?*CKhk9(-nqtW0GgAchD{!JFH89{4tmV<}Y z%Q_ka)0=g%MB@+2mhA)&=U?y>wn~@H>xz8bCyGuiT_(G5-II2=f@W5fjw}?oaijLA zw?_Y#{Hk!H@tY&4Qm!pT<^f-H6*`7_H9~8J6Sd-z^eSioGgEN{r%@E0({g6{!yKty z(f{M>tD~yg*0;q3yRo}bu~FH3JqTDB*nmoRcbA(6#Q+o&3~WWkW3ty=8xMAOV|RD! z_jvE`kIQ$)xa02QK+pDFbG`G8C#W-7>ZX)VB7TGXu_UkRuxt>Fn(meR!GSMN$>Hp) z1~Rta&efNDzo+*aa|qjh)Be{vd(dZnyWybPdrT&h!pJojQGu7X`zs=&u5&!uwJ}*S*p?_ z8HZjFH}(0I)URO@Ix?OsBC26IIiTkl^PPSTk(0ywmgj%|i#D*~_u9i}bl9gmhH^Jm z&foi@yD<(BS1^p<^~R`y@Cb{=6xNmle+ak7mVcv-!0Qc|oE^fo~WZ56JFGpY+ z>+O`+T`|=%9NTVCUuaP+?79+y9oF;!ja@HcWgyI25?AoHT(y_}Y!MRiGtPU&a&s@} z$8z7AJwmaipOvSI{soe+5~iizX}>r~k89#|-yj6!Q$yrG|NIwcKFRy6{Gv0tef&F= z71ovYI2ZZLp?G3hZ0f_Bs~z+6i2PIPVd_krj%5#$HApgOJrB)zfA!t!BE_!FqIM8# ziIo}BfM%Jn(bFJJy;^dNONT2tH7$eoOI4nv!a`qzmtp6nzkKlCjCq#t3+d_OB$P1^ zSM6U7oys-T%j9gzq!B9E%iibz)?R3jE(3V38UM#}U!;$xMh*X4V{58#rvvrg_>SD# zGz!&@#9=-2(%a1waCK-bww&Q!__Z|_1V_VsG4o6pYm{jt(SIcQayFCb1r>q*tO+x$ z#$di*I8J0IVng5F7-&ZS8s4X8YQL6V4++9reR3!Uw3O_rosvl{3-_>ekw#s(2W{xR z7^hMk{XLM!xoGj91Z8SXPn@IYXvcluB-8OhXy2sryw0ZH1=*!5agK~_uvs0s$!B8C z_zoIvdTn}xb%DY-H{X9#oyz*{A^XFy;t|ry`t!J3W8U@*m24MeVg65^`I|XXi|-k@ zTTcV8xNVZYT{<>5)nN6xBhsmZsq}1T-_+s0bhlFqY^!N7Z_#h5;fAFD#7(rSk9JX< zIWx9b^4cOPi@he#r`ORwC}QpA!a5{tpM-tX9vjTOlzeU?I&(KN@*QiH(Alsui9>_; z+!yaBm;HPUR`Ol&a`%IiIvV}8>}NmvqQ4*UGXb1U2Dj^Ama^xaKF zY({THrUzmEX!-^Bz9hAIN)3~I&LDiE)uShQqn{Obg0l{Z`exKaHi?Iap^GxRj~nu- z7dK=7O2zW78=4-Cg6`b~seE%F(qb#m`D5-~lCO2+_hoD^+^H>_e`USQdPDcCzRH5N zgK2H{)bUT$UOh5#Hk0pl*YQ%_YV#2Eig=j7Ia25NEcE2L9o~0^bmdM49@o+qIYld?|Fy5HR=Ha z*2woxv&OzW3@7e!PS1IWx&L@v-br6m-UWx;9MCB@4z9c(o7eEd#he(d+CK*e$xpqo zmib{UcVthe;?Aj1w9=ywyPGk7wF$)Y1@t!U^Hcg0L@#ynC^tRGm9%^|F7)OewnU?r zs8brdGaPMa+KAO(ov^=AI6TMIQ)+WA{fnP}8iXmUhuT9f2uFRJZOZuj_V_WIUZ|m^ z%K0<&O{V^s!G|&_a7!RUmsH+c8NRtHkLkf4nsMH@wT|q}-R9q#`Sr#&s#3mxOBm-K zGvBB~+GS$iLiQlhQ>8gy=VI13=5C})^L(=qNdEZkp=+e}M>62vRfF~qWT~JD@hv?x zFwD6r1-qs~%b4HE{VomKpA2*6kd2x3xW7rF?>YC{OWUC*&vMdP#x1TNe(ohNjkA$X z9un$}j7LZ2Xj3-}%)c9rU%h!IhpEtiF14(`C17M(XUwbw5k-SNmVACr@FX{u}3SXWFSoa~^z=aqgsjua=m5 zyX5n3>T4qvy`Brh8X63^oG#_g2adKaYQNSBfQ< zIjge=4YTn}{)+IJ?_53Ps#Y zo6cb#X=4p(XEYLcXJ?m>gDZV9kA5UxCC>!*n}aaoN*ubkX^w@y^usca!Hf6rq|N6% z@$+*eyt9r;g`CS>n;Aij>mI2z(jBg`^yWUjNSbin4b}f8$9Q}#X{duM-W#z_Xnjfk zAn6NXKiL9Ifr@rZ=BoTZlc9_odPGQ=#8ogV#BF zs4_7bRrrit-Ze(#I`aEjx9ynP741i}9w}yz`EV$j5_^)I&HP|94$81NwD;g$XgLEm z6kDl9GewlRL)zX3N>Md5j#}i(FKmwAsKQm8jn8I#F{sri18uce(Qay z^GkQsVP4LBa7H@n>rP$AFeDG#DfN5ihUhwB*tma^^pD0Bb3&t3s$TvQ*iW~Wuqn^mM z_%3?z3WgtQjq}K0g;RJfB6~6Qt0d zS=eZyLGS7-q#*YUxJ@Kq{p&ty(!w;{9I3%8*DKP^11adnc}th&pQTR3#w=!TA01E^ z&h0fg&--iSn|5gJ#JOfXYrO9Rv6(y1rBjI)wHl46Z!ySfK_1-qDKNVhi4#K-vAu9A z%Ae9RZectIE0!=NMlr#F`b8N%;XK<161AcB7B|9WYBT?F4adE2RdC7P9ZuBdi1_eX zda37*^5hV>4tgRPo_9ma_F$A72}0Z-;c;guV$ceJaH{E9IqZSChLG z#@DX)^QyxC zo(3(}b2gRV6dPAFcexR(|EdS#B3NUxZnpk23>$mI!)YI}MlKczyAq8v0STBh%p5!B z@&56Q!{zh=_)5&JIxHGPcD6zH1-_UuH3Apz)yB9WFVs5{io-psa7Mxz-REFjI>&l) zhX<-v3C4gbpQKxxJm7pa5UO_fq$I@yx)A|5YIRatX6J$SxBPHt?RqKsAidtsQvZ6| zC}|@bIK9@scu~8tTIKDG537BV8f~GTc#8fMHv?eod`fbxW&?NM%5l~+dMFPbN&O&GEl@hxG#&StH%g^Lk=AVT#@D63*z`D6s>b=Y z=TL8qHq4TqH72icj~51+e2^B7re0%zdYU#Bsu!GN@1vjY|Mr80FK)>$>>Wq)44;WL zmFI3{ugM<#QrbLil8X3Ep7ljns;j-Wv6kSObMVhq*Eu>D=B+gND*vn2T4Z4vHGG=+ zeN<kQ81#box1P!!Z9s*fz*S3 zBA@z&vhL27uC(z+F?A=0UC5EV*V4~raS%3i%8|+k`k>zS0L(s|E~UTsK}s+7gohm^ zT~9y!nc|Hj{`;j3?8i3~)9*_74Jxu(bD|McCff8COgJdH+e z&X11tm>@4>%|Gr2Yx}Mbw1aEJVd6#V+AVl6Ok=>EwI6Yu-FK@#7iVJbUH0nd^ws`S z1}4AezHIprb$)RgN}qFHF~d#WtWGL)>?a>2XR3qUlhJ)M<92I}I!|a|;mtf1U8+9a zhx-#lz9VO@s3&t5{hB-LY0o~Xhg!!`_aG4owsoa+&gE8V=~YsmWB8_q3ysko=tvkk zS5%XX4tb-aVJJMC)ROvL^v1#)^i?UWEzPIiw%;gfn2xV2ndni2&NcvIiJp{u+!waR zo{h`))d4ql#{Cv!?0M{4!;OTpBWWFAtifkT_8fV-p#ks5hO}Vgr z7=B!3%^EUIzEDD6@h!w5gy_qv)NowaFkgS$rQN_?QeEDcW4EMgBZ)7XFpo2wS8m$l z`l)cwWY2icN}HOTjPoI^hrNbso4nA#c?@UQrbgPoxQ`D8oSpi1)RuGZ{?V7b$hEDs zQ>eEWu{r^p>onJn)sMp4%hb+o+C;m{D+1;n=v^o^)~<36M~5`xRlYaUUj7-1*!{7{ zv#PHh!`QS*qMzy48rl!k6y0_r3SLuQmyV@}%&f!+3~YC()Qmg9y8AZs_Ib53d?ArNjHOC)cNkx5txGJ!3EAQEzeH7g_aj zwKr-}AAB0`$34UP@g!={{3pnV;Qq>&IDTc8Od*7q@bAx zvAaFg^2J@r=xfhC&YH<`DChH;pbo|hFZm+xx4+nr&a*V~@Lu#j&Eu>lY=QiZb%6nU z>9MB@WS3@9_*0vC!FPw;_EtW6>vR}w;5r}`iqOtejUAZ~=BSx8#7&_Gw=%=rvWYo8pEe<9*P@&RNb3^+3@wFJeN5 zvPbj8!^WPloFq#FKTxlJp$8U>3&&1xHz+=y)V>sGe%TYlf6zPU>PS_}jacsBoGQh+ zyQNmPqW{B~&~riA^_YR-g^-%5S*ls>W(YuLZ_o=Hx!obosYuN;XD zIJ{K;vYk3bGdN%Cu|r-rFbVyK5hG-JRKCqxr4`TclxFwjw85OM%}a#s)}OLP>sXBC zo^)}CdZJI?D4gIv)bdvwG5TpZ{D={HG`FwtHw%MLI59Ez%|)^*6w{8y!Ya;A_^%GZ zV&hosKN~DIQunO-mKd}@lqybi2_c6)23WFCeBMw0$eBb?HQ9m35K4^r`0s06W3C2)8TVZh58>>J0qt&~*;$x8))+PBMuG)CD z5qGr-gS;UA+?O^tafi_oPxM`tg6`~Vw%7N9?S37mx_ZKVnFor`TBwqwSX}MzSSij0 zW4FkAsQJC^EV+j#y2ui>Qg1Eit}WrE_Ve8k=sc)lIMrG{F@gJ1_KItUZLpq6SnS&Va1@>5G-D0smCz=aN?98)t`G$n*W<)K^#&BV7Ad z0=C*%h*1-x@S|Y@CKcO>D)l4KV^loCZv~6lj$zzs$KipTCM+g~qVI)Re15-J3@V}r z=^(~DWP?bt3c(V_*+$tfo^d}o(If^n>YWh{7KI?~aWq_G9*bMOLUFD*8nT6+vX!2; z1qso}i)o}xPtm?2ImMW|h`kZPcnwcfR%$WV%x9*~7A7`9A{{=HB=VecPJ@b4@16$EyA~D^Z zt6Pr^5e5EH^fFFBPJ?vOZeRqy(|2t5421?P#IcT?)seoJcHOVWmWsGybo_5nwSy`7tC6Z$471G4q9} zO5N%70U>zNbMV1r>a!kb8jLSrI^f%H>WIFie#Do2{PUc1>4)^!+0j?kK%dXQqkW|~ zAK#EBD|Ps1FwSjiRh9jyLu*sO`L;NzZT>6-0j#Gj&6DKA(-||)Og~kBEpK_7f<`>U zHC{Ck6AmWh$SBU240?(KmejuLMV*$R7Gi*)J_L7RU3NH#bmFIe#*(wMC00aw#NzCA z?xVY9i-LJk$mY(%-forHY7>D%J9-I47YjrBfYn$ThY6#~M8KR-tbR#NT6&n8(@Svl z1bX%EdMPG)hoDHrV0XW2O1?)3%*?4FzrT@EZFdL?E<|%K(n)D(9tyQsK63Z%^n*P{kGd8H@aW)$g3JKaS(}cbN#5A6@xrjTtyLdqMI$n5cBMGS zdwR~*17_A3@<3D3lo&=7Q0 z$0F$Y2QmD55cIhx?eg%0=ujSjUazANxBQW)&pNkm&q&MVNPo=ioTrk+@F-2;<1R#o|Ki$YQD%5gq@ z#!^*|O^P+PHwGF>gCww)}@P&2Sz9k{B3`#`CwH&!M&#VXIcKlU6VZr=-lm8xS z-AD9foK4uzd|otOEFYhQhz^`f-1ZY)IGZ2vj5-yj=|ag(fL}0u7Vaz+D*D0tUQK|$ z=TGap)K`Vc(4rC5mbzYdCW)I>-JkYA$V)X#}==El8?X*Uyp1I>& zO?n^O7KnKdxYzp@2v6fpVq%#G(1YGUhgXXq+&vX8@WY7fPNGX|4-BKfRgK@9w3-fX znAysg_f)nNQ^N(5MpAd%zde+t&TuR8LG_39r+Maq^>sXP^4L++Mn5C5=gO=~=XqOj zd)cf$>m|n7EHqEMqa+x67-yw@w)RpQYdprsa8bTIbtq^4uc*^|yO}6|l)^axxeS|3 z#QV}@R5f9}VPq%FCM984Yw`!z#0r_an6P{FT-m-rcx^}^{*Zij$F*W9cl*Px(1-fx z9?|)66!fT7E|#1Sj}Jv)8Fx|hhu;;|yM|-SG47Ge--(K_Q0%N82i1sg;-EShd-YUi3q@uEzu}9y(zj@_2r%*5;r{eiKjW9I8YYOT)avYCb}bmy>>}Tj%at)4F*au z=JZ%0o@?A8-UlLO!zK}|;jT+X9#Qi(!jn6#oPYe_JIP<{WWD`)uP<5+PM3#9xMIUx zUmOY=C~b{&MjCU+;%?8REK6tjRQE-4U=Or8;qjlEBYsM%>E|(#$p8Q1+`QvQ?K5o< zY|m4}t;k-hCf?s^Ej9Fd_-mgq@BI@-?f2N_@?UMs6XY^4-Pu}fyGJ~&n*3JYaSlAs zeL3?vo#i4XOiRK9_IKG6lEoSJ)^pfb{(ik!>^VSfAz}jFxoj5i4#(onVb41-QZis2`N4}(bP2&AvSJ5_Pm%Ef-d&iQjZ*FJHS@oV!C`be`wqcMl1} zZqd-|M;z?7YodO`Nchc-hfBslMD*NkaX=2(yH$<|2&GpI` zQ>VLQgliD|Z><$mTX~>xR{$!~*NBGPxwuU6N7}Y*@o26ahOO~KBd>8nKg|U{=;a-< zV1sP(j}sb{P+vw9s_u5(3C=bBVBKk?)R*7kq@Ncu{p$=5uLwuA$(7@LbiReQfF2VA zE>rizx3JX5CKyXM(JOYfp*CVt2wKE5udZ4lJ2B4fpC)2$Qb%!{alXJh`NV+H!bX>j zzk4soL4KmSLlPD=;I8(4hG_7V|Igm%@Whp(nEl^RXL5imGOatY2>QiiyB>$xHM#cZFtfI5c~_#rmPtm!toUsytbA?8l$63&EEGIbxDI zcZIuyVC=X`^n6QPoIxOVo?j!{5|1>Qo^xNLSBcI8++ak_f;P$m5!2HJ+xz+>xsks( z8ROMjei-(7s&?S!8Nei*VMNj{Rt_oALR&hA$oY%_p#0QZdklxVU!2 z$X&M(R-9@4?HQMMaTPLW$xn$1s5qh#d1chDFyfwfe~x%l9)m#Mi@J~^F_-s6XX?Mm zd-jTM=fd$%zj*TZ4~b7sp(t{U!(H!x#Ugss44y&mr1L*wYlI(2`bEs0ToG4|-g#EU z3(fEq1Gc-N+lmMnT8t8Jp1YvAJ~0{j7Gesup=RfWV#fB_;?zM`xU+Bko)j(~pLWB8 zX!<>rr-_s##+({GNt#??Fx(w}QU0i}zg8T+OAlqvpTG4i5#OIVv+I)a!C*da*i~pq`RpZ zJsRw`(vv20B-h>4QJ<5D?qA2sfAw5L8RzRmugERtrQjmtd~{HC(PKt3{1|7Q(nbW` z(!hXwbE^k~#d7XLve)pv_-!rbub`$ych2hVd`0+*7`QB;RzsB(VRtqXwQm!j`YlKN z-QB(HMepx-tAx?aP`su-!``cf!qzVcb7se4q1|HfTg&&jUJOFZBgF|@FH|^1;aaMt zSV`=}pY0Ktu(`9?PHm#Rmf?6_vz>6F?p8rjC~h|EFTSmG#TD{%=2}^bOB>xVDklhG zL9@h}sqXXz3qa!aIU=;WJKAPagX37Ca9ZyQ`wBnYu60tRZl+!+xy^T~{1A`c(KoP$ zKk^(KDizJ0@Z8xCHxAcSP7*VA`(NVre67`^Y{HS=vvQpEjDu7&_Xc4X)u~CEH5<#C5&^X&QNyb45^TDo)J_eS4~dAGR8Tz{Yg2?DjBcZ61(#Dt=ygS zdP+f9@js zN6}NPOFTT+g^Rk}e_oy)hmpHugn3dBwDgp*Vy$@LiyuC-!SsMKSj0` zo{ik`Ttp!Kl%7~o&lP8Suz#-cN&dW={=+52qubUJZ9`m9Z8UumqMC|voY(DN9R$0a zp2ChhEU)JQSl@o8_+H=!b%sCoc`g^)zOLwf(hrYER){-YoRMDcho5^4l`MNl{JQOj zn0!;^%M?fUeSWC*WVjN($c>z4FC5yMsQ%?24jaqLb={Hfhg9YViBq~pyye5*svU*F z@ZXk*wkv&1duK6kuwQOE?V{F_vkk#Gn|BG2RWT`;%{aS{$(5%e8UBp(?Q_MllTL$m z-I;-ZPs$@9ad zA#O_XKnK|G_r=JI0ZI+lBoV7U@vTFF$}>HjT6T7o>SrU1n(A8g;Lc{870W=?^P*t9 zVw?x|t}rd1&$^y*ZZdt2*7h@f7#Qc+(QV~7)Uxi%IG<>1Ar}uy#+Nqq`?%{VTkqyx zg}rv8i)r#LV)iUKj~Z97Tpq`He3y2t3FCLj0o`NJJejzGz{7IDq)2Q(O>LGHx8&(< z!{Kchk3nVcw4PB!Q6$a@(*lKhM0 zO`h(UPjAh#v8nRx-hAJgAAg?;l=VZIH;#p3*X|fu_tgc{shxeYeX=}a3!g<%5W1#q zkZZl=`M(x`b%UFUF>poUbboA(St#ygIYaVcPHy%`EHNjSkUnB_&W==kC3}>!u3LLF zRq1?SHn#Qj#r=sn%G)ze$Q7(z((cJg&%!Wwv~8t0UoSLLZz&7H560P|*D_T{>Qn^~ zODv7+q#BkR0=p#U=M%R}A93GO`w{)x{wdZr^hv?z-qicbxS?IyD;e_{=giSn<>woS zq5G1EYiA7Q+0D2=S;}5MyszA#Q9LHMPQ-MNQF8t2F^EY_z{DI!S;PLg+i`lx4r3hN zhv6K5uI9N+Inf{#*;C>$_4ERH5#xN6an389E5G;hN9{o|7(FUXo*Co~*G-J`Z!`IK zmOJ8}MPR17wS1X1hKV)jK}P!Wl$kDgeLfT(A8W~dwzH43q2Fp(ec7;wE8JEv&IXg@ zNI`D=(at+E57)!VwMuSaTdC*@gMIeJ%BRi_XiH4L!=PQ_qY{V_BW6^Jv&wj~y5C`H9bczcOQTX%haKDr zGtND`OjEfNTY8Fd-ri&U@G{oU-56(wv=^m0E-5(5IM*(0sr}I*8AgmV+7H(@Ca+{V z&wculnc6+IsGqci^SvqY+K~5gP+G8;*IT5ux*v_faS14DTcq`_9*LTVdGH7mTSxy1bZE?4Wi zkye*G-C44?YkC57u>gdAC)w zHV30A??K&^Bvn;vZ}#OqIQPO`(>u4B1MVjxxg^{)+AakhjL4t0pJO_-c{0XwXL|qj zJkvq*HT3VKPvNeWrY6Kus}`}>Zm`|71ADuMO^EwlAxwJ_FJB&>0IM|@Oea>5J1oaz zX!#SE9f$8Styb!eS3e`rvrm?3HZ_@px$A1TKFxGGF&O{c3B`+UIi`A5U2tGB=j_%I zrjw~5d@>{mNsHHLKaX<8CU?#@zulED?Q+D^MVv2NE*IIo>~VFBFW%j0tz2n06WJ?# zu)0B#l0D4^qk8zD;zg4K*fL-Hm!Gm+QxYeN95y-==Vp}$ukJu$HwA7+n=gJ*0zf~ z#b9vzd#YHSH!gEm^4nmSYKGPwDfc7rYvo*3?cuKQp^nmq=OL=<`Y!0J4aEaL2i2*q z&X`NR%X_=Ks)m_6V?TTNCleQIF^SxVhTLo4dm*p&aKK6WhHKRAK4?O~!c&Xlov+g@dzo7|Xs+d9a z+GtN)y)svo`6&q_>QR5@WTC3WM}r?1*#q9$qdLSMrDk9vR_C8qrNzeK(eng+>ik4i z>JSZ#qMurTp1L2k9rjaSeYv`!deA`be~A}QS=U~@*Nt=Ls&TLn?5PeLPT%U5u_$TL zLv3%z+)3}bQ=glwU+wV50-q=ZY<#5}$-FUac?6>09Z(gupyuS0FqofOrP5t<#+xyr zxU@4>r5Wc;UC&@-Kk2ASTk@veEBB6aR0nnSX7;f z)*HDOpVvcq7&ZfE9(mzo&OF7V^;FbwB^J2l8O2YYgig0SILoN2yQrCjVLhm0?ogoA z*))xNRO?D{ZZ1mIuR8^z(?5LAyLMMQZV$rbbmommM^z2q1>@N)&L{>)sm@O&{#;AU zw|SuIYv&Yn;k@X=))dt(;<#>B;~eR7o+@F61`lQa%$SX;!4ZjYnw|*z#8TDjF~lmL zN`T}1^D4it(J1CDwA21)s_(<-V`a~o^CdlX=(|v~qaMNb=mzTdJa?wt39brkp`KMG z2!-@#3QRRryR)vVxh5KuT=dmt>E4*pFbds%TvqjobH{^T5!m>pNLBj41)c4}(BoOA zs^>~)l_SF^BXY6_YBf2b?987?KX*5n)u^KL-ai2o zwm3qxpR4@HvWEWliIw8qB=D?Sj~JeA8>khzV3_(bd+_GbiRk_GmTK&4deu%yr1z?q zDti>?9NQCd>v?C@rRFJ^#9j7lgHEcM7m|nvO2o;&JycmEG$<}&U9xY0%8oyO-6RnM zK0?*A3Hk4vsST22t@3{wh2~%ApR?OpRsMx})QFtG_2H^toHLuTW`2~Ks@iuon7fHs zj7y%Ux^j^CptKmw$<0z3u_tR{#`An3LZyuH#&!DbRxDAe0*1L0I~I;#Z)&NgEq8&< zs!+_Sdc$-DxvT!GgAwPDVp=E82{$GMV#bbFqF9>vEe&avzNhm zuVxP@OjON=GiR(y1dL`3pKXwW3hr2sXd0Im>geBnle_HR%Ssy(lkb_CNIum4(gn>p z2Q}n;Z)!8`lbf-4mqdPkt>M}Mti@cZDRg47qxSKxa7!R(Va>0~+A!wr;r`7#&Ld}RE9Qip?d#}C|8kPGa`%0qr@kV+^C-~si`(Q%H|cFVNABJ{6n^K) zos3u{Ck>@{Nkt3{7O#>G8V15i7ma&E=(XM34~NG`L49$NJeRw;x_%KT{^ldk@pr@8 zHeu*J#7uTR<&2mA1Y_X!UUJJdPUzQ_I<4f!USH>kqgDLq8~$8-xvB%QO}I1N`&>J6 z$t(=-#d>TTu~?qAIN-**`Tk8gbM-W2M%bf%$0;JIcoJT(orO29+e8>O)7(>LqTkkc zVnC7={Eyfo*5|$$-)Jnoxu(Lo)<1BVKMF?9BP+%ESW1M{inFPDp5&+e{;58d%N<0w zM3{WsrCw}A49?pG+*{(V9{D>2Y&|h!d>Cest9Cr;iF~7f0B*dAfacUr zI-RgLG-01JWuZK$3$>@*gKK9Z$q`o)K3%&HH1+*+t{j*OfYW7XUok`{@o4Uzp{fGD>+gxqL#Z-j#r%wCa zp>q4H=9 z*t6cka2c`CAO6luEkqmMxkH}C<7$f;;sEvJurm&3S+m9A(UF*A7K?uAlZ4m$5Eu}T z@y*sqSaK$D&x+pM?$t!O6|rw$h}Ac}AdjZ!@aknD*mdBn+;zV@J~RtLe8g_K`bsy9 zUC*7!=`OPUdly(%_d>sIJ=8Bb=?(ICLA$Dbq|7;v*tcjlwp1^bx-GTG$pjlLoYV`Z z=VrlX&@_ywz6b~3&cy7nDd<1u3+6Vq$0p;+*ik#qY;iE>=V4$^(%lEEp1h`Ch8}03V~%Ri>`jHz zkK7VNZ+V=OhLt?eKHvAtKIErF6SHLR`9ogsl!nX1)uaw=D+UjvE`%v-@ABc|$F^k5 z;~a2#*$k2KM1$kb>^Ch##4`h8pHitIyf9siERRF{vUm(6jwoVzG)6CDK3C_9mR%wc z>K}_~cNU1jW+52Gem?kKkTAaL&(<^w5!Hr^D&2i>U{(Zb4QVVs-0|cNDh#hb)esKk zba!+K!JwdeVji(tQ;2_Fard}9VWs8}}cmpX+(iuZJ_zt1HzdheEJ*GVirbeO2pECvi8*d0qY|?SlMN++m#C z7iGx~MQPZ_IJ@+@DGz;;h96GEO=VM$q5yf{4g>edTq+`fi*Xp^*xUFb@?|7Kaz~4aJoE7` z5ok5Bx2Tpv3?C#eEtaZNk6e>L*^d=|&)$>N;-x=J2 zxAlb2&T{$J5q~_Y=Z1Rse@Nz^1K>Z%6N^WWGBb*!moaYSf$AeY9cVmae% z^t?d!qW(kG3G81ke3vzM((sUR9yP6(SQnHAOLyv-cbG29f>KdoLk!Kdc+sIw3XTmX zkAB4>QQId8eff@Po~{$?w{d6AJeGTKued)j0rI&7%)fR*4BJTDnn?l*UGIt;OQZ3M zIP>9}_riK*B&M{B$N3lEMX^ITRB^1=k9-t)T9(5w%Tx;5sJ)78PEisMH6I*`xmIs1YqL_+oB+FnTLX#FT7* z^nK!w)2-`^V_O1XboH>-&DMnDv3@y)=>U$VsvG0=3D9CZhhfd*Z{?I7G?`SU&ojxHUNjJ;#%m zJ=H+@b07+}UU80X-Bh_dAQCll;&JL%OQjh-e2u!tqw!ipWxN$MJy0YUeE{jRwQg*Efhxk{a{{7p3A+JB4$_s zafTt(*X^MGbel2P55buC^U%l659jxUq3w$$W{ztDQQzIY(s^$DK1nKZc0~c_7f0+n zNTaRYp=49k~%+LEriSEG<+lv!dzu7Vv^GEgn47fF^yPKkV>yMVriU~i{UmYIBv!G zN9+>i?02Y>jTiHdiqqr)_vzjuYGdUNRVzF!2DbbDl*vZ_j?=0FR>J_o>{v3suyV8Z4*z>9F z=xd(uFP(YdhcIGLdyLqHhc`H9+8T{%4c42LFY`m`Rqsl1eyJo&8R69Q;JtrmP8Ug@ z;*P=s;zD27leQnDMw5oQy5<@6*D>4`E=$B_}#HiCq1cY?0s4e zo|cA}X5>D+>@H56q=pQ!kMD+tii>G!2xQKEdVHKbGJXMhtHlY} zRDZlu_Ba$nY!Yz3@c`ukbu)sroCDOUqdXOXusI!vz#gZ?&Qj`2EMojy4Hv(vvYsU0 zc3IgCsnvJh*S}U2Im^*awD%m3f-?TvH@d;&{tX5o2Fxlv0EB z`_5zRwU@QgeUkjp_%rw5_6>CVkA!0i>)z}Rb#&#_U;WM)_72zA=`~FQ;>eq|)z>Bd zO2hh9LGt()SOjzYote?bG?_h$6txK0dSMKj%QDUEy+>gcv_qbsPMieI1ESLSro zEu5bW<1h4GGVi9V^OYPU{>(e4*1DV^)__OIvv^xWHs?v57y^{G{RvAVsqJ+EgG|mx@ zdnx0{d)vT!$HQidBCic4FOqsXlY1)0uEA(b9ke^zhoW{`Af{92+4lTNS)J>Tjhriv zQnkW4e;>5rebF@hA-+|3qLi45y4y?4{`@9RPghyTweOV_X?6;Cj@P)i`ZP`nn#$ey zRr0InKi91#@7|X9+v}e@mUUn{{ zeAHZn?Acp%=_Au|#E!nJBbMm)Qj_X3Ihjijr09N)O~YFU@{X_j>ZEq5IB(4y@o}=Q zE_nf?29qC`H(cl2f&BUg8XURRMVC`RU5W?fe)n&vGZfUl*h7t*315}+J#l!GN51s5tkZ${xgacH|+EL5C~qY&MMx-@yIO1xhr;`zBg zqLr)TBG7`Lk3M%%bmYjM;=MCzvWYTk3U>{>BNl(SE9xKOY)_x(u++BHfbeU%K{^p+_H@??@yuWXM~=gqs%OYM%U#0>a(G&AH@mA({y1yR|BdsqFDcT@cvm>SAhvTVeVjeKu$=QZ z?U47nqgMj4*Mt0DUB5D$2Gpsz#WORtVOddJ60)gL@Tm4H-A{Mw40C?;VeK*9?r`Sk zVH(7`Zr2@dl#X_zG>}Iv)fInCgU5Icz8k0ObfeR-n6ce6H&_=iAQcVyT+WQK)iu09 zO)5UGsg5IbF|(2|i@dpiUK#0}pYY87q>h2Lq3$oH$@KOdc-E++pVC{MRGWU)dcLflZsJquxbQ8gCYc8atqihVa@`!Xh2Y0nwGS$@4rYfV#v-YM1RJNAL1(*0;)8-N}+{^%t zpXKaNg4QZ8jgv8yf3L1J=PNUbamtTk-MAz{(LHAV_N6~;map=r4Re?)aeaMVlpB1f z+pwN_-pNIA?a#TOH}4U5U&W<}XP$S*=@;=z;pBMSSxG&Ff=s1EjzeBKIn=`zDpiYO zar?y_pvqk39Q*j4)#!nK%u~5Z{=}Cb^9*nDP z$hnxH><^_zO$oJ;H)bma->JWHo_V15N~L9r230?k$8=+ZlEt&|v!w>Rer;ARJ8_Q7 zd{uYQVx{G^7}O>YJ!y@ja%^chhLi9A{be;}7qLqjk9e*EZ^@%Gd{Jw(20N?%D?L5r zf!;<*$Zxk0ksDm`X-^Wl;mKxI`?{ch=gK;PRz`hc`)C=)R%7k-wK3{@7NFFCac)p5 zW@XZ#-8Qft2Rn%f z)#VTZ z4L_e8zD!ACZlB0Fzv26mCx>C)FU}T@w^7b&IX8Yw&80edVu#KL!Mw+vluhb>hU9>g zD-xbJki2bI`U5B7&ORrz*n!TNG9Q8tGCgOiMB-QAOv6FawJ;Sl!Drqh+CbvEFg*bRottN3}QHpcs#z{~uk)3bSG**J>WtF`hNg?p1O!>HqkS9``2|#Z)g78PupL z>3>{Vy*?c$I%v@P@j2zXNg8#nI1>-KsO$(#K`-7HRTiC5Y)2%a;aCj{&&o;-&d78B z{><++%3uD<4(d3COifZ^Q$lg;KJ|XDSSTlm+ud2gdcKXma`LG+=J6iyQ-7|gnCyEBR}Tp}L`NfT#G+=l*v6b>`_6 zxWjY)E4q~~q2wqg@XpP%fA-$`q3mq46L;(IS@d|JBre~KQ}xLuzIsQA z&=kSC5$h|*Yf9?(LOg3sJ?BLil@k|NAcJ+(jDmBD>!*B}@N<>#XO!;2dHBwszdrel zGR=Mwt~Ox5sX3#>?wF76^_ZWt&MK{(=fRl$k)zjnrImXYYB8sk)xD$~B=@`u&&kTs zSCx9b((#*rm-pkZD+bF`v7Y&`Xya8ypEzx+uZifl?4076#af2_&!Tra)4Q+ZVxD(Z#x>_XA=# z>m3pkj<}#1ccqDAuTx*x8K1^gj`MSmI=ZtatFZV7^VFe0UB6%j&G^}BaE{LQ`y-^) z;N7a1uImte8Ljzu?0?2bx7zDpbY&c>EVI^?Y~P0`O{tsdJX|+FXa`y{Z`ZujQy1Q3 zGd^{g18sx0y2UHk!K*7Z&Av6(-PRVMZx5cs$F+4~lb2&wPx9wyRM!Q2Ex~90dVa+( zWpveCJn6>Xwc}e5XDqy;8DLv+bnAU(cz7oLf|%3x zS12aO(y^i?=dsgnC}B0}zrc6%K<7(*r;_2$?`ihygwm^ky0-lOJDSVN%*=SW^Lbqe z+^U=wk?8Y<8Un>jmG|UM-nz_MSC^^WNDaU@=F&w6Q@a5UX?#&>{UMcjJnCkSJ+8!+C1Vo5+sx-exks(eOQZFVdB z*2KYu?_=%j8zY~jx6RF1OUF#z?B6R%ZsnR2O}54ln7o3K?$ zz3$Fkg9cf8B}(0%t_X2YLYLuP#q(h<7&s-NQk=J*OV)+WT8%Y)jx!!z(`5ww%f67a znv=hDT@9Z>;ddA^>y>V>-YpE^dD#5pxUOTLV<_SGRNidYK~+jE64qc-^K~m*mte~v z_FT16bxRv=rCt!v{~SNv<(BJFGM3ME#5CRGTZJ&4#J;26|D)=wqoQitukBXs4ovKB zn6njIu?rQ0?vRj<8M;wSKt&Nzv0Gryxeo?ncVoBM*!At__xAoqhLX)$f4DXjYi6e_nd9Bi zIGDQ(cDYLDo=&XQm=oSQr`-E)i(T~X2M)bb>P)bPO9LHto{Cg(LbLO`y>Y=XKhNBBvB&*^w)6aDCD0R3fac z8ISH%5_}M589(uhO7MSu!*dN%NWWKRBjb-=TxT zeA3czpOUdW_65f-0G0eB`kEti#`C4PfN#=(QKPw$Li>#AbKHu1IrcnH? zm4zp?bGTa@)#>ReH0RlN2_LBD?0DEy02gtPN_^QBN2YbBCL_^Wb;l zS7|=%cy1dMpA(BR_TwjQiz)krVwa0rw2Aw(G_h}5HvaLhEuS4DivMhcQ6Tv<-It2z znsiLllEdxz9MP!B8ia+@Cv1j@4oSsFzVBhuLp-ugK|%=aU)EfND~YJUT;-!(4N>YJ zj}QDgqg#AdrYwm?w_xUk+B=F<>u6$ac>XsPDI3>BpoM!FDp$-`idYlZT0o3z;z4CL zeexdqrS(5|D-PTVSlFI@uw&bmoJroeM_*dmdW%wZ(NZkPVISCYyRyuO8q)!ciKeHO ztJ|EAOP^oxvZ843%|1pM=blwMi^RRw*px;*R=3{b!450ToL4@7PX6&oY+RKEgCC)A z7K7A2X+>yHI}e*MRgL6ivZy8Z1gl8u_8BE;$(R*Mowbjq#W3d`T;W+=eb=-A4R}uG zX1@@=`u$kFg!7cNA`umm3tw->eV1M0?~-h&5jgrdNb~T+b zfp^)rT^-?a%?{qbX!ES0LSn5wnK;fBVu=X5XoWGO%kymCw5y=*%*jFl&$Iksvij;^ z5ysPR9I5Z5el#z|*S3sDRp+QBi%Ve2__B50098M|7}rPAe~M=6oQi7I zbNg|Pb$WLF`(jUAE_OuH54IEHw^KGkXirN`j#y}r3Ae3bkWE&ISL4#rc@ICQNfg`;4@)p zvddFAc&9>J%--7UnWD+86pSijU1>2yJXw*5wS0Z1pP{&|kHaLDzG7iL;dPif#$NJ% z^sFS_dqp5Sm1j5Nn_~QzXT*{G$tG`=A@2imf^qY+{{y8Ug*+TQ&tu!1RhE)BblVv6 zS1dlFOro8ijOH_S-l3$tS&De(q7AI~DB694UOo)UjrW|B{XwNLU+v3^QAd`oECYO6(M`sW3Yc|I5EM2tK2 zrXP_X;hm*0AD4oY51FS~j21(wBk6UQeX|C=MBvX@JmYf-8Q5A>j*CL8UGy7<4MmrS zQ8+71qi_FU-CTU|cfjO|T4F>kM2WR6 zzPoWh=hq=&+TR*!{mS#1+lKd6D{am~U)tHLcDy>}a1pApJ~}>Vy}HA_6#aWJH!w(6 zhq;wtIeo?Ujc)1_hhms5pq(#`S5J*BfD!Lz&6eHOQ?K`4JrjdjIT@NAdKdWrdGwLFnDEgg@`cs5KoiDt|^F24E}S_OG5$VE zZzX1o3c|Q??DM~`$LH$@7rstu_(!RA%Ll9ItKTHvQI_U9wV(Yb~ zTb1Hno(P`JpP9BrDSPCBip)vwZ$GD0jdI09-i6;c8i`}m9WnV2^Z(?9Vh;5tHZIU2 zqVHMJigWGYFXSoxpS-U0o<{A%dTl*@^5O<-REvE@cuY+G?X(^0>7}I@OP~C@NxIt6 zql9x#)@1{<>K@l(Jmq%@96V2*GQI$t8RPn^L)1#2_v1Csu&YmNb=a<4R6EDsOS@|7 z$*649e8rrh*$c70LniWhpWEy$5@FNRv9b>PX8AkCPv*}(8&Ma-d6iJjQgNNHox^lu za6mGGc{eBAvln%>@vwNt7&>#NFgK6J@q>)Z#$&~kPT}a~%X5BsnD{V(@q7yVtIxZO zQDewA!p~gNv$=RS)fWSKHik{EA`&+HV3Z$c@v9ywew(~um&6)jp{#Vg&3!uF#~e9J zdH&54UOd|o9n+Pu++E$@mcGTjK(PoWhXl|0i#s(%4f3dM`a-;f^;|Laz8%Jse=>dH z1JP;{cVyDa&r>Q6pR5jCpM{U~$?46qRLi}r^;qLKt8i3J_bJ890n|Qjm7{ujmf+T8 z+PrzZ`ep2}Vm^M{-6W7LA5`%!d+n7VgHs?ot*RKCxg@SK7ABt9Ei zeC}0!z6pKjOw3{r?L+K!p_!46)t%Tkb3ZDQYpp>i^1-fNm?@4tU4fCEwYarCQ4CB; zLTEMZe_U_EpIV19??uhyuHvC@Bpmtg?yI{<4D{B*c0OZMxS4Py{&dv@a=vvLBGyy? zCBd9HhaQGv;}`M}^W64{tttMlB7ZY|czEecWdXT|m2}qKYN0ZUoTE9kbM@1km9-7L zU}n$W@51FuU+&T7b>NJ?Mvh__?~aPJ$>YjpO64GD7(AdIYK#}g^wm*axIdZxNo4Xo ze{55pH@^E83$@RlEHt8>XSLs>_R259fcL~L+n!YQVWs2>C+|j^1FF4m2_DZRX5-gN zHQTS4He-%dEkK=ZUVvl#oKEd#svoKxz$V7E39bWFH$CIvd(Jh&Tc~wYv!Q9IMeFaC zRf`^(Xv+CZY4j8EZ+1HRX|ynXctR|?z8bqZTg26!qJq&1`1H`i{Zg8UAD4((KX{KE zl7z7-^*R~v=BGu7j_h-G<+ENn-&@=<ZFF4Zvo}=z5i^*TqntnTPSD}(xb1C%^Xxjn% zl%s<^(1h5A{qkPLklcaWezHe@_lz=uIN@51FN<#U5W~L{*TjBxKfg-qjqcW%%e|Wa z^&8@^vwA-(i<+y%Bh}4UKQ1kTALqrLZd_6KwJgPY#@0&VirUhs1b^qy4=mWI9%@(& z!F$)aC{msGC?8TLXG4{()Y9<%7))Q0^AT$Fv|Mce&bU*(lllVL+)ZY`@j@MS>c@?E zXsktFk5A%f*K{11riDex6_I7S8flzuy>5{&y4P8b$sO5amv)FJ>8!7BGbjAKUdZIl zYZ1jfe8qAxw3m+kC(b+ego}#I*>*B6$E7+5>u&*^L$m+i-b~z?=J$U-O*R@RwqNkU zgCO4VG3|xfNH27l$g`T)NZdZ^feVcLnHB1Y3!~j|y)EbCr)!Dh#Q68I3&A;K15wb; z0lfl4@clp&(V~bL$Y^Rjt!yU_TUlX82>XXChKo7x$TP!d`ny7H^=3nBRDb4H&d%;n zb?VCv>9|EZ|Gs%atvXFX#n;RgZ@*L{S3kkG!Q`dve@z{^r|S=hfjp=6 z*D}XYvPIKsekh>7b-TS<=(r=++>HHyU6feO9m9WoztdSa(W4J*3Mb~G?PiM&;c~tH;(I$goXH|?aAjA~BFP%+lMtMK+d&+tvjnB-B?Sch}3qU_bs_ zzp~WEpLSvm?fj%syxMAa77}P@%g-+A{_G5_|IXU*&qQ_D#np(Qowsl4t=>_W!$Km~ zd2>^>7kz@;ENaQ^sHDDm5(7PF;!P$#7jN?;aca00eHL95=ep_e;WzL5MOnmg&n0C$ z?@rsj!mOVUl5JS4w%#O6yL(_geR7}G%f(?sSMv1I&K1JN=>g7I!al&&POhRwxFbSM z`R9L|i#r+i=w6rnW$6<{HFI0EpG$5KKS^AS;{Ggm&$l!iB<@^Z1bJu(nzrsPy1UMY zCWBmXH(H9&^Rsc1d+UFnRu>V8)8WOR**^EXatc%6KrFt&3|mn))(nppmXCu5k5;J- zz2fnLc5c<^vsy1~51d}GzcH?6VQZVq$n3?qcIKyg$oCW$(9V;uT~@34?Z;!r_xzZ> zYBj5D44|DW8>~`~bk0CW+WEV4kQ&fy6#{8z&-JV&-IMW}c3x^QL`~ct4>$HDtGl*Q ztFGisYBsr}-_}s;e2hW=g<8CH{3LRSJ@6ex>_OojvF(M9yKDTrV~WMPI>c`rLn6#*=X(Dv)TOHu0M3#YH`k~&AH~CYgqA+1qx$|b zXHRpr_%YBxT}d6BmrJ-ur2Z9kPDUYhB6n-oJ{Mo2!?C=v7I{;yiS27c5n069W%HBb z$V5Nn@lI{GJ}gZAJu#K}+tsGqgihmzHN1nBMy3hP5@&ql=eKN{Bz!(QU_@=&{7|@< zypx)9`)xu`+WFW3S?#fE zC1>@V;~&mYrSt@7XlIK+ojUtZ0t{&9OG_83H;NMwMmyg*BdIN0B@lnYTw-At^-=wJ z)FWo;!@h><#&y&ZvY~HTQdvFKHySpKk5l@;7rFH#@Q)nz6WW!C+Ke-4SD2sAy&!g{ z_`^cWom?{^GRaldn0DTJdcU}R*$vOS5yx^YTZ|-kR76wanU=2;sc#%mmHDdnQIfb4 zXa}>vP)x{*6o&O|kVXvZBzK$%O-gw?JHF3QwUx*-L_6;s zWl&f)Z!HwsxzeLfg`>V6fM*kGR*tS)cqOO4gIwT%6Q@S|#d+O2eb z81DXCt;**TaIToxp5P$Wq;DdwexpAeFjqZaA(4wp?6FK9t|rb&zyRiN(c?R+H>R{2R^)tVK+MWrnC_=m`6p+#_>aAzX;j zdSe?3?2i@m=h)!KPMP7IAtn3OVXUlA{rq6s->BRHgbD*d_ zfco9t$#E1@OH}+b1JmlzkA=vJZ`~Q(*$KhN@t>6VJLY&m{@MS{>*m#1ugsnj&?qFv1g%GwH+wsU8^b8DtyNI-97rcUHfjS2Z`B;U&>y`_noSCdIC~t zXSe!E>WqI0aHE|k`MIg?R*Bd~I}dMcrhXfg$h{@bpxyhaPRR*qPv2Wmm@I%*1v?!qiDQiO#J2fTy%aCfk1MnYpUH4i|mQ%dq^C}fz!f=`e|wL ztVaeGh#TZrG^CxwM(!2E%G_biJ9y~O7GXBZ1rw_fr+R&zKq|FjFNWen{}ge5m_4RB z5+A!fT6Anr?yu7!$ebEN#c3<@QHP+cl9QOVZZQUY;%=k$RI%gB0?t@Ma8K?j8Z0&^ zHy&}z!zu|OX2XEKblSTeN|O(>ag!K@wau?8^1a2-HZGrU{OG%0HSOSss>~rH_BJnk z@i+!+X=k}@x5Agq6U^C{4yjb3@YOyYX0@ViV^65RhQ#AK?cCO3y_%nxfLPkuqCl&z z8JLJAw6oR9`RbvSi8w(!2cIxj?Hv=bigrHsyrWunA^|3&wa9-}U(Grhj{%F=6G*S9 z*0YO4i8C={ZQqFI?PKtgy@ElwC6*XPVkc{s6?2P4$GuwYdcynCTQ8h`Q1>8_y_aMA zL}`)_j*Vr`mcLaD_U5iSKWA!#4AJT$`HE@h{U4T#@NrHUd6$~V_hQ7<-VUh195^a7 zOw@I^!|i_|7;(o#l=|49ANl_iWef3SKlMrN$QmzUC0q*rfh_^}9tl?zQ31?3$}iKNgRs-v8m#V%1)66EL3nM$TqywW&4{ zuj!x92aQlIuO*@r>$p8XJF6=;CsO}bi{2g$)Ga>~I0MuopjkzA+Ru1|Gxoi`{X&dg z69;qlyS_EODy~h5L0j72;&`E$Iz1ADSdW{XJ0z^G^Bz29Zqp`Lq>KzgKmvQ7Uo%C8 z$3945Z}V#JHR94u59G9D?YtvVOf`2!SatT1G9tu>8qTnwe}4PgPZW_O&omC7I?`Vb?tySrSRt>#4}zehMZE4ymCbzcf`pelXYZ(+YKaaxXgM1xXl_rJR?DE?wx>i#`=dptW*oHM6}Fe&pFCOeflDi z{5ix$*E3WrbxcA%=Dh!1#j(Pp$UaW^`2r_G5NGTLov>>si@eO_`}}pkskP>jJizS(zl#JygaB( zJ+T-U5A)gobX9t+A&7WcK-KZlxWwH)7}J|M_7XkGwX=rtQB&Me)OU9x29^82 zH(H3HZjR9Akbm-Y9bu!TjseeJ_1#~URYtZb4q@)(az=So%NiE^{KsFeR#GNe!KbSZ zH=j>d-2H5^N~6Q`t-F-cDa&B5Ek7T8w{DZFN#b4k%ieyi>#B2LFl^|Pn+C_LC)%_A z{>43!hh}Pr7SVXgymXqmq58r+33VCk4R=>kEiNYEEoV=+y4)32Unk)qdl6@g@oJicKAvrH`-e+gD@kxSDfUWd$T zgOrbJ?O}LWhx6xGC>vbphcA|&cV9fcS^baWc1;E5z`9g5?hJReY4hfZrmANY?OKt& z@uLRnxehTHK8!Q^ZjZ%|Ud-`GlXOc+j2hQT4$0<|;5>IunMexEt+*eKDkZ8C1M zj*DODENZMyLNRr1Rya);B?sv@*vHtFW+I*}Pku3#W)6S zSQ|F2(nL7Eh(K?~&~B(Jyjp2d$a>ReX*JQ6JpY{-caA6jQA8|i38I_MxJI`XOXb_Q%vGkuCzV{aeW0NtUjuw9X z+X&tMr2pmvux(gJ94Su3joIvD#Qj!GGZPR^pPYB>xw7F>9Qx7D4!v$DSE^Afgn8Ya zDrc1XDG^YbY4LBes?6HSzPn5u_?}~m?*!_PI1zWzdcU${qc;ZhV*NXPhq8~HT4haX zTjR}&<$gD8WIY&jHBAZ7xuO+q>pp0uvhSx0Dl%@Kn3tryJLiJBBe^3+oPRVqz0CM} z<1(%Cc!Lvi=$GcV_fXbtrIrnC;T%3!(LT1Lrm+q$at11w$JwFmpAP0HswpSQiPUvO zI5wM9R?gM&!@7;-aWZ}1&sIC~XEdapajHZ_GIj;f&g)HAiTA7_tY~NB*^5Q*?=j@K zrakNR6VFy8BcFDzFtDLGy)79FkFY0`^-XE0OU96g?198xSI$exxL=EB^>?0fCN~Kx zF|q2kY{l+mB0jKpRGPL@nUt1*gYH_G&x}?|cE(Xxgz>IPkn&TG#@(sxOYikiJjkh1 zlRxL-7boRH58{k=akf6wPSM%=W5+z^5+;_)405EHwj&NRf4;JOp$FzL_Sq{llp^Bd zO8CCzxJin+k1Iy=Jnyp@t>o9G4g&4@$x~9?pS$1zzt_In!xfzw_n!E^_S0a+TqYid zakh5+07aZ4$0p;8u}Kdl;)NXy42U~YTPlOQ+TmA~a5M{iCmWM9zR9F;L}LbUz_CmOOCTklIY^PsrM5u1I3u>tInR z$LG0Vb|3a|Rx0wK!7dnrP+SrP^2uHqB;mqYu+-s?fI>s2wK9Z^OQ2q~Na+AI2<8j>kGmJqa-n)erEai3$l5u$h z^VPV{@~cV7=y;L+_OvH@>tV^*O+OYB8Ll_|mxTEPx%+cxZ^0nzBn)8wHsw%)$w!w& zsIgjP)Hm03p+5DJ9Oi0ocWM?XamYKWMd+!^8Veokl+EnX1z*xs$&5s>r51C{b2M$n z>M-F~7;-=N(I~?huYK4X@0K$>{Q-A*SkHd*YN{XpdMPZ~Puu%cr6cCBCaMYxBHg zQPhN`Cd)+jEq~_AIV0`Rjj?9x_fol`gDu?q>kwS?fo%PWd{il{C>aTQ zVk+t%)=YWG*Pqxk|M63knV*cQyk8GLbdW+^lkt!C=^Hy<`g*q(^o z0xjx~kCA3CNIN#P6GAThrXk)cFC4Hl*Zr!W6kff9O>L#?tAiCv|qnb>O4Ih z+gMA6n8!!PH(_<|<9umxKrVv@rBdkgBXs zL>z6qf5RrJ{jdbQ_|6=o^I_@b-Z(_n)M04KY3V9^(bcQzusz|j6tI&!%U7vSzx#qT z`Fl957%MNk%F=)H&;PWvzOBoY%>D&n`#|=%W`s$nxtq4IPAK!{G18eG+aQ1r0kn!K`sG zwz~C_Pkgk;TjFfHw-WM*^R`&QoZLO5nbME^#`jy(@40kQ4jNDoC`5~sJ!@mA(NbIv zDxW`_lS4I(zn{$W>^^I+emm>7ZG2tnr?b8l-}k7*d#XKT98109r52pa@5|Q2+)G9Q z^S7}lc!qx@Q-53wqZ>V>=$pwH$b4*+>mn(fc!0R|?AvF?NT$T(54ogq*a;g3(HzF70vU zzI;LuTzmJF4EB+;`AQ(}G;1OaB_H{6^FV}*IXKl99m`5L>I$vFFw zceZO?sf;)l-5@@ji6f;NFOsR%&U(3ifb=+=HW!@ztz0Knr=3H8vA>}nlBxzK;x=oj zg|jY8t*a#9Eq(6DVWm>R;y47%(s56)GX7-8AaOc#{&w~8rDimqao5JbaVxwDiiD2y zS3|Fk*z_?RYisE6%)Tq8a2ISDpX0zcUD1elT1jL-58xVAjV`Z z$`ZSyFL8`*Dr>RwdUuo%<8h96V^j5Z__)dsuB-)WXMB=sc>Cab7JKX&^CYJwOOejJ zz1y}9a`q2$_P3<&@S-Nl1P4bHGyim~G)K8{%K<%3P`7qoWe5gswvzmHHnnNr`DWB0k%X#|2 zFUh^>z&^&fddmIgPDo;pv09vivazuv?zt0_5K{{ksVhC$xqQEFQCT;+OEm8^ZM#lB zrr*oYVo6`IeR7b#LMm-mlYMo6YZK3rvDoNK%!a{3O-WT^lAALJ=-O3!-#Z2W^@V3z z*-6Q@QgHqVdl&y!O7k+3(Y3k`of{sJoLHx5Cg>pU+>*lV6A>0beWvC=r5D%Zk-t`l z_e<(xXtOv}$kL%_avKaB8H4zB+Ke|!nZc-l>1tfH;_*uY>?*cNXGB(I+_ z=5s86Ux%lIyJDe13?}E%wiSjWd2$q{^3P}VF~g9{5lBeY;aF319BxEjQ=a2&8YPg+QG z=Q+UJd>JyPeK2XG+M&)TZDmav`U4^g;J>2S;js}=D`k;SR z)~YkL`UzW!p8s{v(m0S_LtUhpEl;B^nGq3-khav!)s$gZag-<)Nv20Eo~T! z7p2_m)Ah#HoM>be>Ci1@Fs87-@rHipzQq76mf4qL?yaO7VjFp0<7aaIyQBh4HhW_M zXL-(xiX`iL?%Y=kz|AWel2xEH29%QP)h1f%anTWFIlgGWX_2&dn*%bIEkpjNCerRr z_NdX=2YupPG=qs7ztV!b^GTQWzqRa(KBeZ9Q=Ys)Z;j9pYK=G=E8TmLpY0#@U5>0$ ziZ58g{j)DD-XBp4PuU=fu`k~5tTbW18?G%~TCTsL9nwp#wTc?iJj0iN$$Btuq|hh# zXs*+*W-j)_fU&?M)kNnSi{q)}E4cSZ^I%L0zO!~dSr1Z2&lFf5WE`{&mjb7!U`tcp z-)1|cN@tn-aR<0y@?~kNNP?9@eoWu*(uV1Ya4yr~daeP=*2LqAK{#Unb-=bgvFKhu z9E%JF;ca|08o$=zQ#9amKLQ3LYOd1M25lP_$|^wQ0@t{9nE9{2VAOD}mQW0x26ipeV#{c^^%SO3i*%yjx& ztS6*~)F#%iFlind3+MIZsdM?OdA~3PnT}f2ZZbmpn~;JU7dcZPUy6})3Jizn&?+=n z+RNPUC4H~UfUDBRq9hD|p@XjMr{reFnM><%+!)gUCnDovH<+9$wK^j!DHbLD!twe2 z5SUs;<0<)Nx)hDV;{y@U#_AB#eGCkD5hqCh@A_g0l<*+@Wj*+_q&Y%39~|vN?ZSZ1 z(tw`sh#V1s#nk6LKZSfRM|^Q0Ge_!Z;fRNI$QvuImIek=L*W7W8+Y1Btg=W|E?pc}_<%_Ejj;k~d6? zSmxx-f5w^|NRCA(_VPwo{-II0(`U=v`qg6->1s|2D!e9dMxsud8<~Pe<~lTvaA&wEvuRM(ZZ9?t3NE6M>Bh>gv^T1law(`J+Hq;vTK*;(ha+?q@<`vsq+ zx5Oh2vZQ|Z-*eKQew>x$_~2HxeCc(R1NYm!Ann{E-7jQMKG_o^Z!MR`HzH@?a}Vr& zVI>W`Xot1_?l`!pwp8-Z7S9g4VS3Z1#?yRlF!eTfkBcVBuP!hSRwNg?^DjAbq7^<+ z%RVDzgtDKx$Iw+?IC}k*boYV<>eVZ6=fKf@WZOtBPSDOxC0Re6ad0AYj3x86`U8xE zKWOKkrp-+HS;t~5bNGt6S2PcUQ;6&5%ye}J$+0*E9*uN(a>`12ucVL!!2nTYjb#|0QYbBEZ*xj_Z;T(9FSW6B#NI$peEzae>K03$%O4&v-Jd3PJ4JoBuI?yl z5+SASv&TPASKOSoSn?n2fR8m?uuIcJa-_y?Giv0u?z>NuW@?9&QfGKvEi{?kncS5N z-0 z`UZz)#I4P$nHMxa7H<3KL);QHu1izUfw5Cme5k2>ECmKU&+VqQm1^g52aWZ`-_&W+ zU6T|s%%d0yz4p?|o8v4#G*pUYJJ z$KG1ZrGGxWrCWjBpBS8>f8G+&SQFYM1#elCA78E2RQE|i;Rp5!v-O&*++B@l?NB!8 zug0WO3f$R`tzObjDlte#gC>k|H%CY-_p(PlJ{)&SEv4Cis9T^z*7@t2)AM4m zJWYo$cRy=v?V^w}QwPV*)ub-uY&2%SuDy9ZsR`r7)`pzTRjDui@(4j^=JwTl)|BFJ zQ&ZQL+TVjeX{5Sds8p9&^X}I*YgIS2YT%28El+3;4sn6|ac>kwoYeTubB5tqFPzwZ zR%6h{8Tn7?V}D-IoH24nDdz;EgHLGMk9EeP+HM%#V5g?Xed10toVkaRt1(hsxW`8x z%C%*;^YF(!1dCkyy?v+53y=SnzyV41Dg>AFXOtaO!y! zx}IP>7}B(0a>qzKWSscAw|;?<6pqaHTG-{*E|^T8JSv*=2Gc49pH~H=>7r2N-g=)O zndpZfU4wBk>s>$I$C-osz^2>RrLp)b4S_gwCX@U7HLiOkDCN_~$% z&7APfy0TQ2dzuy6IHFC5HaL^!h;cdW>$&C-SMG$pTb&ST*23hXZ4go)mFK-ot^QsA zKEWI7i3j$$V4=@D%p7SyaWbF36r>vYpd{u$+-Y7xoh6)kG7q^D`=!7IISXG` zPyf%4TrQQ#V>7#}enJ4Th{K6Bil3l&WFK{s6Y*UsuKKcBF=!ahKL5;E{lGTldkG~s z&bM^^q_vTFyMXh}l->IN5B@*?)}@xJ*U{gP*+$zc=k+fYa*y#mETf)vK!re5CH8yU z^5c5jvp(qdBoIkv+4|wFJ#dS4-%y>4KH1#~(E-#g?$KN?dE2qjVb8+;V1b7EkDFh) zqv%mc!Pqm_I9AgQZ^f2^kjpl(mZ|&m;CaEOv38hZ<;>c=wch`OJ+2;i#PN!a3M!9t zgq@KCRyaFL1MYKH$ekabZR2sAJXBk&IKtol5UzO<$4(BE8SmPfR6HJt52e=S&U5wB zTl&VUyfKYfk^3>d^b2+odwGy&#$;W=X6nm%aR23G-_(MatZ|*_w`+SC>UR^za^V2` zPRTR%)g5B-`#a~hHc|S0e4W64U-jkN^!nzpSk5`_Kj(A$8RKKHe<^v=R)5g@G>V3g zD`V)?T5`)3k=Q+fKBre}Ir@G$9`Sj-|K3YpSx1LoY4pFNN65x=$&Jy5yC?ZG<*gsd zNis1M9UUFyNk!bzCKfKagTK6BwLeUpgAsKjOzzUb7ekr`q2{^}`JA~oHcqB4{r^LBmeP6s?8Chv6T zSQCp32XeRb*OP21Yq>q#hLIEPt2OTSvcuLT)Tfwp4Dp{FP!iAGjE-$h9vB89Yl&4k zJ0G;n(+AMDq4znjJXJw2AM<9vnY$Pts}&R*`d~iioAXCn6u8ae4leE7V(du$6?@+O zUH@^L#OQU4W3m4|F()DW^-CAUB7^t+R;#D_js~%qV#YeNsJ6UhL<~-FhBabiXW4_? zjQcILC>ad7UP>f6ayS$8GM8f>awcEK-fZ+zc}GL`pOV;PNsg3fTJisl*fVULD(BV@ z!Dr4-C!}qX%gO?Agm%t)v`?-^Ub6afFhU$p$d~Q?vAusVQrF&=dtCFwx6?u7x%em_ z&ty*R69k_YRh6OCMm|R^)Un^{C@1#$V(c<%8a}V1L<}V-H+^OI)Sq&jH(uySZT0v0 zsq)P%4{TcRf#>;eHSg{c`|*od_MqYDyuuMxN4lZ)ydC6#cfy+1&Tt*l++>wY0LFK* zENADJi5dEhJLoGO&?m3kS#Wf>H(GHP+sp0L@S}}Ri<1UF$HZ*OgRR;5_H)(}@<+*95)I0g@=b8dCk zOh%1pG@v9*LQxnnimAS zQH_-$2mPQ<3_{V1PRjEl`gYcn9o+^hqh&w%91S4nIh0rP{1EoW4+sAaRzCb#hWg}! z4(?J#sr#3j>7ZWG(!=`Rx$bzf*Aopk)kch?GvXe5p!J%Su!J*)G1eA7t8233Ffs6h zmXxz|;n)y;j)6C}@H{V_)VE**bsNfvjhr`pm`Q59H#McX?^e|@e-3AchuLcydd*c| zt7Q!4uz%}hc1Yi$Lo7Dj<_yvLtKO@7EPioT7_A!0kDte&m_8)KVw{}NDF$!Y-%GpY zD!=?gE^cGipI2k$`LU6h$3C{vxD0vXlW=^z!I`r6Zut;rS>xEdxOPX#LH@+)@Za6l z?V9W}o4YuJiOt^iQVyZb9{LkE`|z(EpeGmfrC^LKt*xZ(^~Y6BFm|_Usr)pcW*P0= za8Y-q$pt?&>Jx-HE+)#ybL` zU|()!D7nKJ{!2z87;gSGk%jy{0|C(7)8_Cl}?#;7Tj@J=!dkch{ibU@l(SJwhJz zj@lF5I6pYIPQIm!Bo85bg-N^Rc-pzgX>vF`EtK1KVx8?o9QCm4a&LR$<6aSmrh6d& zAZPir6V##Ja$la-(x1DT!T5Lef}BS@(qfxHJo4WyN8NJA)jxiC)+R;nG|&ZOa+cvq zu)mzq$O&GN-sFP!lvg=9LZ9vlH>W7M>1Rh2-15M)3CVKa3MV9U@9*qu2bpBnaMHM< z^R`*~Y3Ch~w2V6Ulj0=nXkw7G)GFQA7rMc=rmDPSq{_;u6zbe~wVk=e#-8=_ZzNw?eFPmltxI z5kc_ejAT=r5_v_YFRboS59@*=-*F>9e0~7FeorGP))m93(K3ERsC@E>6MoHF292?U z{F1n=FMhnA5B=mrQ>pcK+Y_A*$H_Zc+kLFZzMNHxY+~+&>}Kxh+|gdHN}lZVW zYV}3^9PpJ|L@93;Nsm9-qVhKvoG5F6W7I^*XC64c%6#0`I-qT|6E=6+Xk3=)i}6nv zl{?SjreOuW)7^0U3biy&2@}!M9p^Wb=j8Vg&6i*9kiA05lXc2u`#bi|PmwRE{!D$R z)=>!Md8-|ATyLh2hWi$BDYP(>x#Su6SRxlR)?xKjVi;mx%1h33myx;Ush-c| ziNr4II)`BE`irtfo(~!=2x9)QO*ZN0fpI+pa5p?k-qe;kS{rKFG_sM$<~d@~v}IUx z&|2PBlV`Zl8N92EJ zU43Pre&P}KK$w?buG2_*5pIhctOM;+Z%ZB1smtW$ikf|l@YC~a!Ku*^^R+^m~-B90+I-B`5H5sn{aG~E0n+W}w z&`6vk#=zH1=pCj;!-Dm16^r_^bS)ZVW!68Ibkj-qG9g zb8_AuJ06UE!;Z*i?p`=fY=Fs;6xngM8@}HqM$O4lzWagqy_Fx#oM*|h8FBlZUA>=g zFF)(f{C1=dyk3XMb*&vyX`2@+wu+O(&pV=|a4EXhPLOB+qdwaucMPlHEUSGSkw$KU zQPaQcGc4?>SLO=W=vkWXLu|Q=;D!MwBcuVIHaNhVan<$v(w{{RaEo?^G-nFn3Sc}~0&H}NW5a76&^Y`M@#6QX16;I6^BCVll0 zt?5^pPyh7L>rI(IOpPPX?M{7p{`zP*u-8<-|0KD|y=ct1&b+!?xO_O6_J2wHH_Vi4 zY>L7H<`u_I<;(4CIKQTEKaqJ&zI!Ym=P5w3B3Be2fU>P)1HgR!8dPiTp zx^6G`oZ*NU7ktqAexPjXH+j1$u)@w$wf*pIxO58Ygob96RC$HDc{{g1Q&FRwaK@Lbw5OA~=G{8-?r!0E_DR-MDt1MxFM0FE4%h5A_oK!;^Sud1 z`qgFBt-tT(Z!737>fWE!LHTgyk^NkSB%RKJL$J=T#zZ!dSJio@vRY z?Q*RVK5+ODgxH=D^5PBd@EjM2>$bDxogbaqm-0vD4Ws4B?5&00@T2DCEV*EpBi;*N ztjn>LgF@IBwIz4?c^|oZf+Lp5-bk&el`mg#gwaJ$)S07`t*$sie(!;gb^PSI7aXwQ zKdrcq^W~1j;x?b|j>fLNSEY{lN zLeSiJr9A$TH|Awh8)c}S+||q-b^Zh(@atfC+B#?4rY_;;Rh{MNV~*sU@Po~kesZUw zj(F?IIq9(xa#lS@gtS_Qc0p6*9v#R7Lv5g8$IazdJo6u7scqA4iM%<$5zgC~6AX8e zEjbsM?dOgOQ^MqnxppvR+^V}cNnXM|<(|{rQR#SwJg=DzzRz&Slw~VqZF|;;w_RYo zHPytk)SEo4i!bd2E@fW-|8+?$XYsC+BHuPjy4vVCK@qtec6x`*pAI2z5_=c)7bjD9;~;u+f6jCw}WnP_w)J|}k3Ao=l-XgJZ% zZtX1OaXq7OkiC)6xG=fX=?KhU!FcDHA{W#NhxsJ(iZ@#$e_~wi%vgNFbGhufDiGVI zhT!5Le>rTD4^Hk0!l~eqa?3>aiHWNVi)b!O`<&su#vcy`R+sDKI%2sG{j3}r>-Uu`4A%_lg#18JR9*-R;e>GuD%=JL~$+P7$ zFi%_Nj+GAaa+Sq)*xtw;HB0hj-4q*yj&Mhhq3`9r>#eEn<&OUUkE^c^i?Zv!7O@+| zRxq#|!D41Mii!oIB8r7HNJw{ggM=Umf*=;Ci0#aM&W&K8V7H=zfh~$%zvc7&^ZNbq zUe~-l<1p;|oE>Ygz4pdm!b2}R?3V)u6}DK~{~ZXX><=_bzYP^q-> zof8@E4xz>OWYY846>=7KuFz)`2&M4{3>1p#F_Z#3Yc}O7 z3Rw&p?Zv#_n>&h|@EcQM=bzY3-)UkDU8w=b;`V64L_M08okU;H9TD?LB>hamUHE1$ zL@S|xvH*U5wv%uGc}ErO{P?GhP*M{>?M%U&4V*7@-{(c+!QXoDdw}rn!X{eU8Z#>E zTNI(^9cfn*Fz5r<6>swp`_Q-Q)3;vH2lo7J;zK$E-zXjl_T=9gJL@NZRZKczPXXBV z)nUv}h2bN6=)bws?4BKjJvGRax46>D%9+A%MMoq6s;iFS{LyZKh6 z(QXs1RUX8ODlIAFt_#(6p3I62!9Q>BM6R)adDQOjg%%@x{y^cG-EZZBpc@Y(WFXfHd>p@A7IwZ2X;_&Q zq1Y_O&{^1dfnmNP^K=YJVCS7#7ZfogU~|~n!~cuodJpWI0H3z!z8*qYQ6wEpLLPo^ zn9v?vgAeoYjHXTyO7@2m!Or(qjurZR3ZRp#p@VU_kC5@xiwJmy?yNV8-1e^6&lo`a z+MH0V#_proBia4V)m78@XA>Y`8-7f2UNp+oE=ojof`}1DODic5IfVtXjwa-skSOF`BodZT3mQR!ce}kQy z4)j#yz_$80i(hsvRYdR@S^zt@+YqBLR*#|Gh>0H?iWQfXqp1XS&F(*3F*Gfb(i6Z@ zpL0*~96j5BId~S2Un&T8?ox<+a>fhA=3arMzdo1@HeONe)$^vPD}m6yDOQXoXz3uI zPPYhE{P^NX^+C}7voTW)h=)&>`ckL6W{R`G+?vMw(A|CO6#K!+-`MCyp3bWj`mdp7 zG|Q7Fs~RZUov^r&1rVFGqiCMS&^$HSqugC*H%S10Q@cZ{OW(~d~w%NsTALHHtg(` zAd{~B?L@b6o(+$+mrn9_A>|O{8zZwN-#7S?73?f~u>IsRyC_mMMa~weC0{TrhK|9` zyT5Li@2ZZWWZ2m`_=P+JzIqbud~bbU#j4&o^RRPu#7xE5FHvN06mt+yS1aa(MUrhC z=9k0#6pOBdA37_Pw2Pw^w{a)hAP!z{idLK&7f5Lvf`RFIDQ;swa<4mqbVpxb(caA! zGnm*jVcJ(=+{KBO`T9{q$5slr2=q55L6>~-5Bco~d(2+>(6GqQ^43r7Xj_dJX-FI7 z8-W{#4Z@DFae{pB3tMXJ);5;{}%RfRNSXl&TuhdL_wo42Nu=)D|vGT9aqlkf@aNVv@ zzRo$4GLaLGF+Cx72iJqoKwa6lM!vKFJe|}K+FgE8-hWCU=6!=HSY07c$@Qj**ts6# zuvMO(=}Nzp11QVOQ~tHL6Y1Id;rkfLRZ+)v>f=lLBNoUDSJ>0gAKtWij!eE9GuP_H zUexEs5c!Eywq*RmgR-cV{MLJ%Tkb{y?Y_&G+_ENPk4@CORz)~`-I8XV#C*$BF0AOi zfn4gH=s}r;*=el<2g-@!u5MvkQ`eBz9!E;qP|dE;S`sbosMc#byN6!ZPbJfT?A&Di zO!{%RBelld;Ec%S(r4&@scpkd%JuJ(htT6ya)+-z7AxsNex!C3{B4~!5^Lle&yhb5 zmMC<^88I{x80PD5g}OHp2j><+tKn##?$!M`;J z@&5KTy6=}qQjsU{sC^G~a|*ym7=>J=`lar(c+87C0$1t!Lbui6K>9Qx82h^~>mD!k zCe^)xH1|}t?x*e8Gk)ElZVZv?mLmQPL*D7E-&(f@^~ku>KD1L>H1lmods>;|O^1K9 zni=xT7QJjQ@-7;B(zn5e?&^Bbf^xf4zQ?U;rKMW+}#ihOw5NGFMjPYhYXhdj4Sl3d5ml>M0f z8=+PrnSLmWtnr==4+M$clt_Ame%QHpHzoGqKDYG1yy~AO$zvzzXXu2`JN4I+`CkI) zI`kPTn(jz~lDtXVE)Y5n`y}f(V}32tpQ2oRCAR2Ai>G{P<@8}+|w53cPPx2or&Rp@?nue%=SKy;0@3qN_+>j@iSglh0478x@SDdKZ zwE052Otd_~o*IH}_?TMD%UUbnB0)KvxFSquHFFFPc2 zZ+XxcOYA^@VJ4|Gh@k$O;2Zd_l$?JTMX75r+v(>k8S*lkB117>|0PS}uNgz@vM~!# za$MrKJ(}`SdsrO2D+vMSd?*BYg~d;aSGP!-xB%Qpi*8aAlW>~dgn8%I1EfatkzY3l z)Ax6Sq?b+wkk`&2n)g&yT4~`;dr%+V?DbNTz0s94`}@xh1iqHP{tfnbk`2NU))%wjQ)$+v1bj?X0Of+?94ag~%6-u_QOla1J?< zsj#jyCqrOv)Mzg_m#w8_1A8hoQ)V*oUa|*+D>KB6y`H~<^q4KZSuZdpT1IYPFmp9X zi6^&ON(XB#pi{q>{R}Z7dx`Nsc5Zw=Np?iZii*-hXk@}RsW$5OfMwA1Zk!;kFR-Jo z{gHd5G0Af5Q~fv>z3;1=Bu3x`JXS+aP`yU-cxx1C7$Q%5zDaVUBAUjy1K;?RBw77C znl2$eMn~{XH>z!|d3y{KM$g2cMYmL4{EP^Yr(x>|i~sB^X($=+={RoCB&Dht5P&^<1{@O}d{ zA;E#EI;05FS`YnBJLJ%QLY=sp8b;Yr^5k|b&X?9yeL)4A_vGdjGvt-5ZEvbJDc3!9*kiPt3O^vW; zjO}8n=}tRJ>!su&uHYaAW4r(a22~DCs-|&+%Jrx)^nkA(sh(%%!z1n zvj>++93{E&J(_v|qc)1sk(~C3CVd}Z7pDv)bCyTZOcUhC+G{0G&PPy;DtLYST_s!o z0MjrJp$>te64Qqv)PGShxkZLa&h`qRgAMS>%UvYmIWICA9Y8Zpr%U!++eCMj{HXJv z_qwZJZ=@x4-t;&pO1J2-9k}PH^;Y!K9Wn>H?%0bQx=86%oRc-_zTZUs#m@4EX_jOR z-2U;78u?moPVHUoDN*I1!m@lVm2C!JTxFw>|7#VUNwlCC`Yh^;{(4HCOh?sz7e;!(f!^s17le2S*7R?tcO1=7Y#i{!abg{b^X_oay{<_1c#1W(_J&5&xAC$W4c0VA0_>X*WKE2T#0O^2c9qM|)S`Ub-y=>c>H>UdhJzmsc$19eg!)M4Yx~E8_a1-Mx!61bPIYZPf3~#E?o9!^vH*m zNYtDos3W*8bHr5nxFOJoS%i76VAuh(RAKPp`+vSytnCv+ZIZ!>c|1a}a7M4z7QBUZ z^MnWB<)$~HcX?rvFr*NAKVyQaW5N{S9p;}-+zX)7gE|Qo-q7u_@S|~^t}B+7BCpo) zp~XW_DrQwWlhDqKrnEb+STX`SDzWoO#j*nXDOc@RbQLoEhq}Uq@_6 zR|ES}t9r=P9USO7eD$$e52XRntnP$0SJsN467ar#w#D+q=1BTz46X7j+ZC&siii z#=*BIK#P83pfE=}ihAn<4@^!Jw10=w1vl(^v`!QfCWGI4D~OVt{REkVKfU}NK+8VP z7QPjGLN~>ao@wA474S4>x*5oPURaZXHS|aq zjFojbjF>njgyyyxB5UR9KpOopC!795x_O-sbqIxCM7kiojr)D~8FpT@Et8hxJXgH~ z4`F$v^ugXR%15kRrqm)CJt~6YM?ssY^+EZTsz|zmp4XbV3dQ=d(WH!gPgETtguaWW zJ*Z{Ef*ggAEcp3dsO6P2gw5#HuJnX%SYfGf2|UMP*o7oNF1W4> zCY{GYRC8>Xu-w{@R(S^!-x?*%w(+F6=l(Q8$xzr-0bV&cG?OF%#{it9%kwpb z)Iw)+8s$S#11BTHcBTl-6h+l&36Iem8K;1zl}_hTcH|P-^?GY+ zf*;f@n$0;1bzRI_t4Aw$feCV zj~Bn8Ujd3Jwb5NbE7`>{xoI9 zI$@-A6LyLE(ft!k1jkSpT6^A?x=pnZIJA}AE0N|fpG5%?p9lM=^)Hc6pcn6vPvO$07l1`0{=9)t}tkbqG_lfN2)Cp zCZ5Nx#=SVJ^3B4HJ<&887lku|-Y;%Gy6`TvA4Z%-^=U2eFY6_&L zzzSjaWjAu@97sESk_54pE7^?;pq=l7g=yBC=n{Inlas*lK%a1`zYpz+Nfw$nU?;*m z4~pm)Akn^spKF4XFei;h`8v~bB@e3hE!1T_^hj z{~QA!vU|3n?Ds7jy5J0suIeJ0LxBT5T#dT;?hx7atv=MS7aHJ)K1mNCrd|6PLXDRj zqy{@N-;8{Zy(^dYjt(ORJNs>#DD8+maQ;a2N<8KA)#j0ujDPdc?V;kkB8oPke(7kw zQn+?7nl`|mk9Kbpns-B^paL@*C1-_{D^cXP8#R0WYhk-fB&ncRt1-MC>(dZUw+ViJ zn;KK|0Y?%(YQ>D9tXLcPN*VgaGsm(f=xW3QpRwCFkwp&=psnA7DR1#Gwq>F(nMXlW z^j!xwqtTNF-VCBnJ#GkJwcP2jN)SCiQ6glbe>JFeAn7?~2;0`X(no!ND$&5%2Cgz> zhYuMIHkS?mh@A+k-gM6CI951~tAO=UX3x>*Qtvq7e^i?H(##J=6@$I5gveMtFe2p!jGE&FBwPV{eZW%Zk- z^KI zaa%O)MjX9m@=f>wj>jGJYF(^{GUxYEG=@V%`=kL|yEBp&!-t#tIWv{95!4|LGxPi6 znNS1HsT1B`8_Z152eU>#FTHQabYa(P@Lis4B|CtA*R9JTbYb2CwtksEt;1QGdqRiJ z+2TWQr-e|^?VjvNv?pyX0^iBxv9QI!ol+2I+w|EXB>r}#ovwitEesI+=DE^n@IkFd z-j)q{;7m`@XSZ&3ivsp-q$+SwL;D`p+gtUQH{$e9zL6AGDr@cKlCc6dhN>oXejs{7obJ zS-N55XW5gFYaK(DwwMz<-HxlyizexsF!~hsj9Gq;q(bmZ`#-N_DXtOp<}rGXU3am1 zWzfQ%p>^EdmUN7UGT?-cor`EgwMflv=G>AjM@~%k|Ue2vnY^Wycj^y z`<&>~E9f9xdPDsdIFQk$V0y_;=>2?QN1eX?I|rmxSt{H9!iw5l!?WJeO&HM6mR41V zpx>0l`}K38_QSA;<&dg47e2lr^DnmlosUKDd&os-sQ0OZbxO2kX<%6kV6lA@etH5t8#{BJ2tr>jJ>1b+e z9YzJuhw?%1p|g#7TN{<`{2T22a#a}id4FRAI!Do*$(T(txxq$eg2($A-%aBfbB9LJ zXa#DYbK6<>-}qk0!|iS*v%hm8{%+9o*%84$Ery+tldqWR%^WI6Or>@Di9j8+^BspV%F>gspO{%ee#Ef|3`gVYwt*- zriMWG{tG!x1g{_ontmC_^%i^E(z2KT&e5CiFO{voX+?FY-C|Sv31hq3lGRmkahp>3 zl~GRAeJt{>N>#CLxf8|YLDOtEG~Rpo(!+;{O{S0eqyo(1{N>@#6Zq#wXfT79`|S1( zJ~jnAPr8QDvfxC%4zoTr{laL57ItuGM$(M2Vbq4L;M0SnfGk2UcZr0%rbbi6vM{nP zAHi2#kEU&A(8_S?$xHR3>8K%eX-t)PN}nj&2;QlR&O;Vd9zmaBQx|*24y+2NO?8+B zbHN@Ta8aFipjJ8_CzpEhaHyX2Qa7RKpKEE;~Q$-I)h`2#-hI6%s3qb9JM0x`-XC+sQ(6T<9ZWknmwH8T59fVaR2T z`+cQ8I(AeHUwJL^kY2hO=3l@``rkUGR=ZSoNp3|So?)N%?+w1u!pWxms5FWqV7Ku15}va<8aqtGsNcqs{Py8! zDxZVhK$>dYTql~m;ZKBjO1zaic1Gh~nB0HJGR{WOiXS+)6BvsQ4yVi4ptl*Ylhs*b zCIkJ)hKw}U3o-Kn?3QC1&60peY97G7`xU^ZyoP2*CH7&>a%OHH185q~Owokp?BaCb zf8T)*xDR0O_ju9O55T@o?-#c3cE^5E@TrO~NRNMV0jCe2b7CP)S+tSDF{k~_>?LOX zZE5I8%u#ONrB@MbP0Mfnt0yyf);`(DA}gBpHiSN0m?bnI_NBeVP8O>y{t*43Dqs=) zhP8$cyc0dmLVee!k~b>*Qxr>7aXGT$FI%+`QE$mxOG(CZjtv?&Z?t&ZH7xrNp zUTo_hVA}Y6?L~GhdQdcV-iN;J&h@NEM{srU+`GB1VYXi)$Pc;7`cLbbb_bku{M%aT zMm7+dK!+H#no9y$W)^nHJi&K(8^!wJXLTy@ac;3}JbbXYn)-=^3i9r z_4b@Zo(xX^|DNZ8+L<(IQ8cwdZq|@mD_mCvuG|58e6n4I(?k7$HRAsdTzASM2RS}+ ziT&-$r9I3dX?hpL_4IBsyYOhbtO7rHe2OgQR}^i>>nF`)WWy##lX)-b-o(F9MpDelLFa4aIpc@c)s2vksxcR_IW*w?r+os8;ZAj;H=1@Cge#G51*P zNu8k9sT za`=IF{kd?(%AFSLhf&-8QpqXk_Glq?9E|-Tdky~5X!Iw}J1=;}alw8|e!&sC<=;GyWT{+cfRIDa$cj>MT<^H9F%O$u??)3)NBqFYc3wFl)`7)%yW%0Vqf1SlQsIe ztEO*a)!9jO0si50R5W`Et*}0C;D3!Wn0HP*HNZ#ZJT7F1C&tmy5r`2T4zN?#&f+=BUFg1~YWb4|UZ2Vzz5g7&u^<8?TLF+Dd`+6R}vKy@*|K^CqKN z(BHfCTj+4fjiT|qyo8y8`Z{OYG8bp~$pTq%zC9i998P1O8B*sPsJUyxDK*Mg@6Hzs zIt#6<|2@xbkIoj%US`vNW$4=<9>E^3J5EARoQ)InnVzV-^qbC-SLIX2Y|JoE)n&dFInew7ucPN2*4{On+L<9Q zQD4rscFiJP2lNN0+q0QNworNyer^}W#+YT2EBwsfcPVVvoD2$puh+`VV_}79q=iVGryOA`pFjfvwtc;tG2`!v^jCM!uk0NAsgXddF@LmVTperEDULcW z#|&*@EgN5enNawFHewZfa65w3)}YQ-;>C|5*{a3XG!o~zE`GA!lP#9y z`1Swc^M7-mzyFJmjb}MoTmO5V^Q{eEeg%8aQFlDooy>3NJs>xn^Xmf#^RZ-X z&(phc(|IT9Qd`{LoK}3|=l$f@9yp!)YgYWc>bv={G)q@`ansJRzQZ;nRv#Zm~h8vH$H% z+1KkD>;5o`9^m_2>~@|#hPKDF?)d&|j<=yLeKD*{gD2g> zojvBaj%|AEikJ*srDO`*dK|MUnYgEAJ=hB^d)m1Jai}Rx=u=`%>G#5ES;9m5ddrgX zkmvmGd2TNM#V%Lpkk5}0nqa?yXBeEILSR7)&nEK`h7U;YFK_;3@qwS4EMV|2C?_EBD%%R^(zsJJU)(<3eJwxfiUVTZsT!}zKjg`^H!O&`*m z%WU(hNCP!meP?cZCYN5q&m^>O!y{9-Qrk)B%Q*jJXSA}YLI=NV=SNmsl0omM;f~b2 zX0wN+Q5(EoIP*EFj4mFDe)fY_?4} zD~3k;l@Y+WwrpZMJA-?lh;wD{!oGm-q>_rcyy}(ApV*~eDP*z&IO>oW>~JQuCYIw_46SF|rzX&qWq8k_YwRxc21nv^%=FK*+&fX^ zVubjjB{1!C@S_XSubFX(4FJw(gIJvSWG8!M=|`^+M;01vW%I6jQg`@CmG~rPJJpS* z!)^!XCb27{ohjHIHRgkDtZAn`m2Jd4_2xZncn=%OO9VG!yoRuP2xeu``}*_uXzFZB68 z|6(;t(4+7{9c}rFjZI1-4ZOatd5^_+goc_?0tYWe+weZRrt)kC2Yu1U($g6uju5nqv@WMfbV?MC5z3Ly3rdI;0gT; zm|)~gy-bk*R0^yEc)UpxXfqydU=dodvvD}hu#aJOGAn9qAN-Gja>SJm{`1EDj&Eoo0g}*C!ZY3*E(ck7YS+#9aa8*XByRS19s7&4IkewmA2$T zBg^L<%kfDfRpj1(dfa2*gm@a03t#%QhNWMMq1p`8=4y;71A}@HhqG;Sj1{2P&kcaB zLJu;7xHLtOvFPHz-C9eB%jMtqnqT8^uc%rwMy10r6 zeq(eiZE^hbm$bGA^8Z`o#e{|i(is50Tu^WEQdKQ|g&*kBrL{QSMxgs+(96qh;0YEL zq>nsA>25V|j@?HUIJcU|OL^G47XE*B(4F_;ZsB_{jrdH}k5wN*^4}rzqai&xoV78w=vl7g6 z>5jw>BgCM_ZK&@$gwxbbllh7OD;jj*-@LBNj~o12Q89gjo$ZV!h>zA*(=(iBgYQP- zuph7JkQz8e?F_`jevM=^1U4@mD-Io3NBOYr*v6jX$TI@9)&}0Psg>v;ub}oa*vIuD zH@d%%j^MfX)~e*;LrQ28?rA@d-FyUM;#Ys@oL6t=>m3jivw>mm4d7WpxzNl6hH%r2 zYsO^*I|M((Udp?qWK!!#f9vAmeEi8Yn)m{H8S;B@&lk}2ehuEENh=<5Kam`o@H(`K z9n6fQo%iuMM{hIF{?Qa(1Fin5%WQN6W|?90J@x0 z2Vs8m6z2ck7u)dWtyaV^3;n#s@!Z+ zZw8i~wuo=b%_QeG(3w3xksmplMj60KPL1iucjcwfWxP(G+ktD>EJYCiCqy{!RWjnC}G8(AE1scty)YVIQa1FT5(@WH3g%W+Q&9r)TYZKjQ2mOlE&sm^lASL2G4ht@^&;~ym0}Oq?`YGmr!G|<3 z@2__H0P~6VqP6(^Im64@g*Wc#^Wts}y~f_nM?difu(h(DTs*Lm`UQrOMjunYrplIj zPYx$rw<3NO_~-V{|JwPIS|8E-VljRA46gn+4^cIws7479;Kc}zNXkuQLDvYjz^sW%;AlSChzhN+SI@RGm;1JZhJ9n&;mQ_ z_2kX!;phn4GW{j zt-pC7xupG^pdRsrr#eEJnu@OcwG{0vTmv={HS){!o!K}#`sJufq{Bc++( zcP==|XS}zfbhUqVw&lWb(YdymCc)0*(xb$-S=Dsr6?mHq^Te4ZugMTTIeyj_agCyp zCh1_#y*yO>v96Ae;0%9Tv{p3wCD0+{52qeVMVlWL^vg1o?i?5y*)#)MG#3J{>tC2>`R@IXf4**`El$OGw)+HL!N|?xZk*>v=rEL=+AD^vd`-5-2N$tNYetT%@hr$t9MSqPt#m?8dw7zlGpUq1#-L_7+DE(? zR)YQ&;@v?dQIPDQ4BX$Sko&yuYCc^9KG`_uB%k&;m%0GY&)k;By^dtlyCCeiiHhM% zu4K^LWMGn>u6*~LR62y7>sf>KJX4xLTEMFtxiR087fssTp)3Ay7Jt^^uNExk!*@*N zqmet*<6d+*+@H@-3Z`T)>|}Y+mN(o9peskfo80w;&F$+?y&pjfy-OvFiT0(4r|>_E z_OM}hy-DR<7@7GLvfnqMYXsbBQHz`3TpDT;P0IEakkqq8i+G&Q@B>#((W*oqeggnQYsouFD0dP^d=4s6&(^w zs3UT-xW}DDorOE7;vHgW^(#KMA)ji|Tj_WI4EKJUOXGk;-g~l}58aqefq7x{e0Vyq zd!J6TwnJyhKZ<`no=jDE&v8FL{?Rv%d?&&tVZgl?MA7C!z|hi`@i&X0AwLtEoC{`h z4|9A+*k{Jjq1<0JnA~9#eXGuVaT7E$o1vqc^P25a^`}2=pqHL>hHZtN2SXR#@!KwT zx3>?8cu)GpZ06zWMep`QYirCtHV3=dbbv>tJp9hKt#hHIv(OJ&Y|Q^4_lTE<)6hZR z__uFXbO;=s|IIgi*;4UdeKDmXXC807TYQ~YO*QDP9LlX0&sn@CH{@?ejpgFI+D58_ zuh@96K(w)~BTG|YFUE1=@Ai!LI)Go)%1NBn`7pgkynD+RibM5E=~X`bWZ8J}R8|S) zTtF?^M@?+EY6rbghDP*&A6&g9pQae#JF{!txgnPdQp4!F=@FiJH;abjyoG-+;PHFX zs39Ny?E4w~>=W!wK;A&g@%+ON%y~_M{?DZVZe;~cUBs`9I&*G@9QFxt&U4rGxj*9Y z#7g*qtE2hEzQJ_w8_srYPwpBVKwn|c_-6El5wA{vMqH?EU=GkNF1~}luu2Wn!)#hz zDSD9ykFzz*gT?}{c1oyVo;L2_TLG_|e22C7-9*ox0eAJD&WD}eNDkw%k7;B(aqt5x z3i$u}gYKpq#Ja!!89B4OwnEf#tR@9Ga?3hg6V=pS)1qDn0*!YLB`XRPUzb%-P#9u*Pcw1A;eGT8cD6E}DPDiFlO*R6qo-?# z88L;_AGl)WjP_#0;Cy;KFO25vJ>f1&x#X9Lob6~8H!t5pcMs$HXO;6GuTv=`7V&6c zF;CS?pcl|q+N!dJe|{59@8-j2c8unRZ6hfJ=l1$@N6vm>7Ysvw(q##+G606x0(@RF zjgKD^ME+l(IhL-;Kc2)a=dOCh^;V(l2s0q12!SPr=yxE%`mcVD4yYr7vJm|qaXcb;r#b@QZ zkUN$dTG4@vDAI(boUBKWM)! zS`1s10Ub5)La}3a`l%z((!*?ZuixUN<#(t%@{Q9iA4KhQ*XbPWyx{g_(P%fLM%a0L z&kFI6(?QCEoy~o6#9;|Lq1A^ozc@;~S(-;i_?}xf*oY-9Su_B4_6VIL-rAc^Lt*F9 zZX?A3D^h9UZ1ji^bQN8~lj!Yc)Djy%aD!^}uteCw_7?vV5<_K(={l{>@HyZoG+AQT z$cH1md@Xk85;T|k@8rMdV@4DCo>uz|-c84wekOtYp%%sG%RMMg@ppHp8-J(oMyBUs z|EcTvG%pu2&P9J@m=XVNCaX4a63!+;91tlyKx_Eb$DE{In}`j zEvO&G+ZL`S?KeOMV}FS zNDezIHS82!R_2or?0n8YS-caug;vAPZ+3f#i*KaT>vOD;^x+gTdPwvIu?W;O%_5mp5%eP9po1%9F8!>1aV1dFMuQm1nMGUxxQ|_Toj* zF3ycWK0MrpM}miVX=E7X%`@Y#jqT{>eqdR9mvAL(E9x~HSmJzrzTxD0(wGh&)c1*e z@L@AD!r7LEsPT9AO(=FU;$UzyYrbzxCZABd+0Ew{RhQ5<$-j1PxVl-)JsCltVCUeC zU&SB&N+=k1{_tA0azARr!7Au|WOS)KEw3g=*tx>>z4*BF;D6`&;+>0P*W-nB2X=1P z^?*3La~AD~ozJ$<6pQDkkOl0l`5{0|8x&6`VCOzxO~lhR@ni}+i$AqRi?9T8gRSZ} z^cN2fOQa>p-%KLgilwm$G!1dQ_t>}G;9@K_B2QSQb&p>S1m*@mEN`yiVJ`SQ^zRDZ zoaF89`qNiDuQ9{-@j-{YDHLaZ;hAmxO0Wm?&BAD&e=5I_1|0(2m)XOkd3mZcg*&4s zxH5pdf*Y_JHAsfw%*WofrJ@XA3pN&f*hfn$fX_Vk-Ixnz>&Z<6+=;m9{F18~X+#5u z=e>D(jR{Hng+b$`k!_bPrHTgRv_2!b#C<6=f&R7g%*-^=;5zilVCRlcTUV}_k&jt? z>;~#Ru<~r&DQevTeSzGbmGw_g(GNUdx3^zJySpWHALlvZ?qxC4F`F7-XP55>#D$}< zHxqU?KawuGK8PcI*x5bSPn-q}Z9VKfWvPkS??XJ*pe}Q&)e!?r639db{Xmz2qODOP zRVIc}*Hs-v%i9U`3c2ex?-qV?VH~AbV~@|l$9xfZGST5-H22#TzUCWhclaEabCo=B zGxD@)*a7slg8R03lj9QXBhf73{UV^Dg!A8hMh@R>IyE|`BgDI z4f-=vS|jFm3+3alU=A(@HSak$9@yQATGUZ(_ zyOgY;l|zuXcfH5%)GQ+v)Lac;yK?i46=byLUpsf$nRE{v&LW^PN zR)w0C9p9EC2LzXCaPLaZ(`7Uncjxzrui_@3TuNAl-}UaIr~-ZRzjmITxJQJp6WxHF zf38awUv`TpHP~4{&`o^f0S)c5m_uGZe$>E+j^K_w8oZk?-QxjmC*;fp+jx|xD}A;@uAY&`V?vy%uQ7h_wK%Q^&1YBS zKd~C&e9&^tXD5JnXXMF80HX*1p0jV-dj6)uoQ?qRZP_a088vTgUsGeeBK_V@WN8kCklIXBH zk+#CN^*3Jfj_u;<-Ni5(wBrsp_!dPgaORh0Uf|yN@28P(v`iOxj69ICha(R$D(78` zd?4J~ovz ztCg6|LM?MYu!f~5VIEWWUwq@{+cfc2+h8(*J+*avRBqXd*&NvUpIaYO%CJ8M-B(Z;7{{9hx!+_se*{xZ+Pdg~L~lIhQIP%ZjJ15%6!PJjHCkc=E(~ zHd0$EuD%TW!_N8Bw8a+31Ue2o`{xZ5PxVbCZ`iq4w~nIC*+gm!J1;!-flCt-Y2XFS zxvAafy=KKzySgyUabM&gXGW7o68v*MIlb<}_vyLkJyzBG9( zcIfDAlxXF!X!EeVm#`5h?U1&UP-oG%ED@Qny5AH(MPdA=30vgZA zH&T~daK9is>WR92<+z1hKGK>7pG3dl>1gg;zJdBL3!|Q~f7sbC>uBWAaPn{2&fep- z7PP^W7BH43gZ3c!y8l}b4lGU=+YbyOb=2K)(^V^TYJ;iz3Fdv;YF4&aiX-FOA*A8l zES@-o9P>N4yAG$sOYpsa@r^PeOWaqSK&w2!{kRq=){RNP93ij^Yg19>8_qM%#_?Oz z#2dQUUtbH{OkG1UL?Ru-8D9Ij znlHD-9^~3EGF*L}pT!(vEuMu^uQGmdL^w@@&rvtn!M9*X=(0ZG7hTNae^&dF3}<_H zMH2t{3>Te3#Z95!`eQaxOZmV3lvXVnqB8K{V&KmoN_tivO9&<#;C09R+f|N$K5Z#DjR~<;V(w_n z^0Y-CZS+>rOOikiCdezE`HExqCsNlS)ZOikMQfbTBfvEJb($J{ksDk&hWa9r(l0?PzUywj z)-#?~!R9aCY~#~SF;^RfJ!Ns}JO`XXHN?Is|9BoB5=42(8Pv+c_=sHSZ6h`nxw!L` zwO+Is{&S1A6*s-@PRtWHTi6Od_=PK_;d$+8yMRBM3au%`#}qp$|FhMZG;qHjE}g_> z(8`bwz>cmPu5-5;eHx4&H$M2*dJmmj|SArOtTIHSpYYqq&6x@<7DI z(8K`lq7_XagYa+PIPr^}v8!+*a1Xwo7dQt|Q%B5&HXHN2)4uc=K4i39pKDfnQ91l` z{SAhq`SQ6S_x|uM)7$whiLXPuS~)9AlJAhIsBS_GtWqo=@8~VxB_`ts0EHcj-8B zSTFG9fXjWF(N%2TnL;_+P@A-W%O_PPQ|3|R80#gCuf*PhQq) z8+Uw?M7`k;n`XuH4Q-Pt)E;$&rVszzD;YbZaApe3d5UHd_GyICxMU+fdoK1rqGmB# zIh#NI7)8TyChsIqA+z}p8*;k#BQQ?Clt4i|>mM{+(RBRoaVdy~)UukrakS?k;#6K0do(qQ zF5!Fz8^~GJ4B*FIkw=}aV9k+%G`>_?R+ zsh|c|8I{5ImwM2{>)-<{OlB&F+^OYh7;T>($D%JlvlKD+<*^7>mf}i}Z-&u210S|C z8?%HqJ>sF%?+_GIryx?mcK^V5cHyyZw8l)!_x_$0(^$Na^vf9-6t z$3j#+2`x(4`AeIZd@Fd%>tW}VuKD~!Y81J31TSci3;*L4PXm#w|J0Q64;7oKDjq#4 zQ*|zsZl*ism;v-|&(%{?sR?<-(=)Hw_@Wfbg`MXOxy1SpN}&|kxqts-jNeNpP2|01 z$vc=n_Dy>LEAIU#mAx`eCNtzTX?r4AAWx(f7s4p1!k4iranvmz*yB$(wonmC&G@&& zWln57d{Wo%_+9!o%pQE&v4|x+U@c3F_oWkviPz37XIgW;X&?Oaxc!Tm(OJxC{>1~m z=CGy5uonn*{qGnVQ$OuaC9vnAr!&~41~-Zl!l2N_VAnspC_%TA6I^)8a;Pirmsp7)|4*yMlD^W7CSTnqC< zKgAIGHgXw{!p>^_ENBC|cjImsz{khT(v|VISi<)xnuy#Z%V#gs#2vqBh?CL>MMiTIC&B&4a80g_x9|1 z4fxEfVYhzIgzkrv$P)LOXP*(KW+hTMe6rS$9Ca^5+%J?1cjraX>nVtLRaL^R zvB-Qx`Q3H*VvbApMR7ll@Xzj3ol*nZc8Y7r}4mU6+Q z$(=SCV7_CKLU^a)PBzv!!>)4Sl{I=&|3}qTM^({wUj{bj6kUKNj9oQY%-Ce)!@B8P)wZ8S;*CmK&o;lAs`|Pu~E$fYGhvZeJ z0rVkZ&GY`W?A)3DDks=iHn}cOrv`$!oqX~E59G1$JrR8~5qG{Fl(Qduq5g&>Z0cw# zno@7yXj9cVt35K6y+^4l#k%gIPIu++t0e4W?eQb!hx~J45;icOSG+hVe+^GZtA3n` z_~grDKILH~?>@)QzVhKt`Se2|pJ)3>d0LY^$gjzPnb%S7X_bpPJi}f&AEY67bMTVq z@WRLC(khEo8eTpeWb%u=04f6i{~O-yP?^=ianXbJ1dqj8ek*9iDArwwYqN;+6G z45PNQ7V2LtjW?yn_Iu7CY$a(;%U~QbW6XOTlUmsap|um|2$9#M<>Vb1@H2MTmIts7 z>CV39N46-p9OwuA3hn|d%#d^GZ)LqtgIz5o`Nc{4FFj2}$DxPhM%0{_cPHV^?UQ0> z7wYXVsv2i`)L1#TQ7Vdg-?h!Cl$uOV!O!~KeK6iBeJiBCerZgXoi3hg$*;|O7pND2`IM-X2Bs4vki+#+)cN!fO=1<%oNA=$w4kXVJ{6^AR4gt-nm!< z#UNX(9Gr&deKZ*U$wQ2}Kn(=ucE=J^@eVn~@9&Vqa7;(k7)D`G80VG84+|>CFr1oA zevZv5Az@+&mM$bd6Obl!)eWZB0qdolP+|1sAlzi0&pbCqxL6Vh69e80?g^@RY8@E# z<$ZB0RXW#|`FR=f+xUs{@O182X*4kQmgQzSp71S6M0fj#az$S+>XarSs$Cr%9UX+b zoS*(TZ&*2ulUFoN#erJ9`zoGG?`@f%^~rPSbwIkZCK>IUu{X({B{hr6z@EuG4~hFN zPn72)ll`gJ+drywDIf1xOH^#P5!8$FaFy@%sD>+r%rmS#cpgT)dLq2`pkEtvY*F1# zqQlT!Ypml`a( zdq6DilFoim1AC)&q5*T^Am(t%Hc2#RZGM3D#;Q8j;)3zfoFS5{u(hqYy8ItzM*i6K z>f$`J5S(C5RlDsIK~i}45fgj7?7HygPav-Qki%wlT6mBgNL?w`qK#98_N?)0Z)GmJ z*ij1n?#p~YTyEVQ`G%D@-q+IL&d|qlu?6+jhEX3}-9#Cu&`+Uh66!Z=fzIZ9Ud*@u zjq}^76XcHM`yFCkacC3>7L?=E3`4Utm`v^t(;IP!i{)+L~gQxLma0y|e3}g}B5a z7nLokCAuz3j31YaxKIry*IFa$@tl{C51(3mT->}O2d@WFM<(-uIFr3$mUSX}+dUP- zAE(3Ziv~i;6>+mp3i=NwU!ruExbqI{KISFI%bDUY?iY9UB(G`uRPkC^IK=tX6?xTN zbnG93uGDNirJtS>c*g_hsc(3pm8G(5m?xV0B;uD(d#qU;fWF>U z`xHH+Npj=%4_yLT3$?u<2yfZTuDX*i*^D{7mlZ)T{~X_-u4KkqG_#rU=N( zgo>YEO6{=5Ivt+ei7hqmh%Ab^)=^ zOB$pbcEx65LbKZ?;#pJ=jNyCi9FYkB+g;JkG!C^A5^>JH88y|SG0L8vTZW2w^8|IH z-TAZm-dFh@420R*M7TA(AXj&$W`6_f5PerE=U8t9(_=t2#t;oo`D4q6s=VAKWs~J= z)b#tO;o!F8m$cs_1ufdJ26nqFy0a(tb=2Tvw3qmMRW90+yQx>R zP%NLHi>uTlKG^cCnBt!cy+GFg(|?OIFXiCCU21{J%`jkLHZ3Gk*!4ARZ&~KhfFGp$v<(tE|lsk8P7Y2MDgewO%=>3E~b2BVpGLv@#<9uuQ zP(;UY$5EgC@{uw4b6JhiQHdz)LjQD^IMkH5BUBCOzAqY^kMZYeSqEPV!{P8Q5teUT ziDym(aZfG@?{p;jU2{K}aF6=4FhSYAjoQfP61i*L9J|RkaI>z8BQ0+-MSjyO6=e;H z`|YnL{|QW?#vONa^lwQ`kMbVu&YpUSMmjq`1A}6@o0F)8roozZ+r&QQ zx#(oha}{!5{IVz)#R`2MW9#A4^Bnr~Bw^PVLyTXWjmK(gNw^H+-J6LKIY~$#V}%*< z>F7Eu2^U69#Ap8e(`zKbtA-7}T~C54pFXprCcvVA{!O(LvGC1ENNUcMVyFjaFbE$E zVzIT7*i>SBM2?8WH{N~MhrARQo@G78J@;x46UF7p0mKbrvE$hV3tehr?>)~w{BgVG ze_ot_qSQFFe5_J>)g2Y&{9LLvPZ?5;e(S-U%e2&i-AV3%Csf5n4LaJ&gQ)%fhdKG! zJRSLR4EG!jIeQy(Uvj)i?F$oP$bXWhGix(&D2*7hZ=UMHpL|#`R}`Di6&5upK;a_d z6*{|wt#9&B#6Ihcbxkp8WFDIH41X>gCSD^ae0jVE^V_D2kzaCApEDQ6GJT^W6)uc`xxa zr&3{sem=B3!+~`hh~9pAuo2NX7%v%)$>Hrd6F=Js&bv4jr3{0N#C* zVrs~~3t89oVC}c=vDE%UG6q_*E}EAvZ91EQ%d2=c{;pJQ8B_o--go9>g9T&j0z~l) zpE@oJSIqLcmqZ`lqDJDH<@D+eBZofSRy20cL)T{-%ow*&tl>i6-eA_gozIBZ9rIAy zBndloYeL^B4?oJ-x8CbWADbLpFiuA6@qH0JIt#24m--{CVMFw0FOUk&DW%aM7{P*i$9nBbyo+>BV zrea+y?g)6*kgu#wL0li!qCSr$bKMjS9?BW|=5#6iaR!F6w=&VJRGpep0ILk1VO5CG z(4RYfpAvAIlVpK@-RZr)~vmglTq`S8FHPnP~Rq*+D82_z$A@+Nl9=i zZUz0{8f;`;_i6bDamnQv`Xlpht1XL`-NL|WHG<|Z6@Q)yq&6V^qVA-MTi}m0hX@R6 zIYE5&#|KFfVK`FuM;JcG8>e=Mpx*ju!FQ(@B((P1K%IQFxv0U;snf-qw|SmtBw~8KCF0-*dFb_n_3-Ko zVynA(kcyMg;csp9CI(d*l#HlaMi|gH7qRz~>DSvID>;8jUz&{Ollo%Ik5t@cPR?7{ z5|?(fZZ*@uw&;WScnI?@d6@Q36miXBdX}2Sz~kczF^BcAJ@o_2SFm|L?1%2ul8PAY zDBf7)gV2yr7=CLk-f8TOZ`st;eX~Y56~Xh|JqUAtd#Q{%d!g;_K+NcJLuySw*gIQ; z;J#;vtO|F>+%q9Ksy0)KtlV(rRyh3>Qu6BZTVA#sLb22O%e zNdX27(4fd|uP}}{UU9Alf4v%r3CtnSswcwW@g%Wt%X}0RB+@5$zNkYy#BeBU+{LHG z)DHPbtdopq+iSq^NFL&;IkoL=du%byMR#Jgzxww=Lj5dUJ3+rOJ7aRMQ_*N*5^n43 zq3wR2k8^Rw&sn%X$P1$l0#JD}P+Q?a57^fM z@XqNgdmM6y&$}R$w7V%kjdg>4Q}*`PO_Zo5?s&d967#Rz5bJ(%#C)6JDtRNZ#}rv- zYAOtPFK_ezE0u4fu80M_>SkV-3>)%Jv>|>zIaxaKmfVc<@v!TtQe|igFuZ~|`^urh ze#W^PYqqetg~DrMq~|tk;C}wI@RackZJmf9pFtvcwxc#AB5p>axVjZ{_~ay9pS?%4 z=%M4^D1=eHZK5#s~6_t!iMd&d@t56T13nD^1@K563JX@2B%Qy2QU zgQ(x$2S2U^;nl6KVsI&a39kfT_=``%h@oDnKGq+_KMo2n%DhnK=7;;ER|$KgykS1w z4}T}N5f(4zOnies-qx=tG^gK?lNb!Mf^&lFjk)+{8-eJ=H{##KS-5tys&3C-vte@h zg%lVw&QYQFr44ic7w3~1d! z0+^D=9=x?U;|5I&>?4K^79ZBl$3U|rw7wZ9 z_A+3ciBoL;u~FRrCl3$zBt!k>toZ#!E~fTNp{B|c@t}1!+JC0+!kVYz>elIKL~k4C z3FpP$*Aw9!Nqos?n^@m44!!G9|D;~7IJIRszPyM=@uN_&WOfj~Zi>L}5_hrP0e|Gs zucB?`EOGZoUu10yK~k7X>}>CYQ`>@Y`$`+JX{a|;6#*FJ`B~7TcDGSqf0S942*H26 z(Vlvk)0-y>S6BK%MGZ$A*ABvt>;72j>IZ4mJh2D8BI`^H!m^SX!aQ>Om%ON&HyYM7 zl{d^u!71jAChrbQ+x1iMcM$KCrVAyL9OAtbSmXIas>!~460zLxE_ce>3@Je0Qfe=V zBUCv&+sFHAkU#pKYNI-z_OBY$Tsd4g{y7h2Z>cfYYpD=kk%yZ>iP)4_Dg0zk)@Pl3 zd$xf%;%y#o97@8Lf=QzOg*>!V)Bku>f>>Ue3t!&BGaTlLxrN#IMs4~)%@XnOyL6oR zorJ!|`6Ag15W7)ZZD6GMDIgw6#I>pyP8Ln3MPj&1Eb0#LFCNkjLCW(;JX0Bp@w)=B zf@eGNR|heRyj*Mxj)jAt7t6 z51tRF4zgQz#Wp{CjHXJKja*{~`y@?5}<5YE>K0=iuxI4X$qPD7<-`gRPN? z_eag z04;SSdk$JA%*kS3+>+kL`AdX*v)NNbhG6cKY~j%?)?@xb(Ayp(6ukC9hE)I_X(kG{ zO?}~KNRN{))r1>nerU{R(4bbNxT=#M7J5)`j$RzA`Mit@>0Nm3f~CJ+ER=h`RpPv; zds}%z9nOV_O$7%plyXm!_e89t$IGEoeGtEIK>nU@4XHQrhOBYq4D2k?I_%EGkA}oC z>q!3XVV?OJPKH{8&`flg zM?Oi97TShcnb@d9{AW!=ZB}F^zYq8QV(V+)u_tO&!Wmq%+8mCiL9HfsH}6|n>4Ib= zvzLCd@KTvg5c{E5+{fIxqO7fP6!jruF|p%_vTA>Wa6B&(x8yYkLRrUVL z|Nr&B`q{m*uG}z&{C&;`JqP zyY*u_oH)yF`y*T1(Ki#ThLQKOGE-~B-13hrXg6cE_HgYC99T>}%F2sc+t=whc#|BY zZH=Vqx*6!p`N;D}Bco&^Npw`AjDTKVom&BaKyK5z%N$F_EJJjKLiS%ezD#o5+ zFWI+La%#h#n;fuUlU33r`n|*vhneCqSF&qDo#ZAlXqZw%dM?tZk=!=%maDeQX8I~N z4aLWjnPqpaJhAC4{Ty?}vWMgYm_`Spdb9Gf#MYkJJ}v;N)Sg>sjQ;2^X|?xjXrfFK4@{opkPEIzo7F zUN7~M?4P8=xP^u~r<)|*Y8iOu#~4~Zl|nzH!{&qr@#?0siETPYvky5pr=J|$Dh(~a zl6&-EoZQ?$1&RAuLwR_4_4fa>Mq!%GbJ3Ph%qYn%7U1Pv3~d zg$m+7mPYcVR7xKr{o$D!hUslGB`+%<)N2}yCiOc?m$rMMAN7Ujw$qgg z4|t(h0r%F*612UE#YI(mtML0N$9_f?(u)pqC z%O3RW+d=N>f6udaz%glH2EC*hTc;*>v`cTtp(|%t2Oktz9xq}4O8wiQ&q1n}?KRZ) zXDyvmSZ01T9o0DZ>8=;4tv)Uji^vP=wr{02*C7MFCX+KTlunMf(^0^=(s--U(wnk$ zgp)I{tkH65=Na;us}V?`r8P5gnsg*0`8RVJV7)Tw)^E>53O{hzMgY%|e2jz)J$jcy4Z?nr~ zIi54a92;tLO@1QZT%ks{R?KNmALU8(W0_M(9SQNX+>`paPtB=QH21N*vrPmdjz=TG zSCKof55fI=^zbgVll2=@kMU<9R{nV}e7fQb#|!>2%IJ+H{k*Y=&!uMD4Y+#58^zNjfDq$^ZM1Es-#k^QqNec{V-8a(pLtk!;wYL^$+d)%hziK!%-84vyC5$LV_RaQR6s({Q9VI+{v0w zjpN*VmLJn1vEz?Rl{jx%9wGG&rUyE6a`}Kfi)ANc;lj_Bcj^lT^sWqHem)f4TR0a- zJ~HbNk9GA`pZgH|J;<|iu(h^K$v_e@{~deMv@tyA-ke>UXVjK%+ohxLH1ei0qNFAx z(y@U#q($TfDZnWmk>n-59ob%Pl$?%C&aehywj7a~jvLMzG}g(NKk269Chxo0PdjA2 zC#h(`d(*f78F{WFv2iyIy4`#%pJc!OtgQylZ-2|vEfO)8`TtVm`ij+G?j3GTz|q4k zm6X5y8Tt3#UED?a%XhIK=Mg%`&6L$m)zrozH#Kso@_a`uu~c%>_K#Ma+Qi`c`Z)N$ z9j2Iaf73cK8oJ9`DA(mM)C-S5=QmbzoM8~=n}lJQ;|X!@dESp3==;VhbMU5|zrb8_fjYr&j*AM3~+ZSc@v@b~8T zBG&Y3#s-y6yEJs!9FL&`rX1MCeEZ@Xcae&6+KX1>keZxKCmcjBG74KH^DQ9h3DWAE>eQh5NCWgwg zM@lME?KSxR`mC&Hk&MTj;p)6QF6SF)u)YRoVZFA>ONdRH5|iv=nl7)L5KiywSl9(Q z%I}B+^>&O#%e^Dz7a0M#yD<`{TTPbdrTAkceVXnLa+cfc_#>CQLzRDmzSgUjkfR}!2Y-!+$zJ&pJ){0)&AH6Wm z+aIplb(RO))1UTYRh{h_E6TKa?pL$=^NXTLoztUe4UoHI6>@X=tmb!IgfS;WxJldp?F>szi;5 zb0>tmwW5$uKGOJe9)iI};=%5mxgY(cN;OZ#uieyp(UVo1h+R7zW)2T`vs}yhSC6~# zsPmwXbny^9YZ!A?pMBB}Vz3!je3xyE<$CXl6XsGE_e#86>5+ySthY~eE|TwXmu&&_ zNspDMTfSfRS#F&O4N!|%2x2sPRVBl04>mORf08`lRRWCuMR zs=X2d+`{2;gtN1Pg+imziMYtx$#IF9kkCB^(M!0$R;`_ou{;^6JYy*@=Btdz&Fe0c zH>S5y>-{$wBgsQJUT2MTV>dnBIc+lPWqv?!di_ZN!ESH{L0qeU=LS zkK}{ZJuVM5Ou@LrjQ`S7`4(r_li5=(yj37?-X4nt=DM40+-0*b;W!l2a>$$z z^ofbZx=9n{cPoM*)8{mGv7;R95QsBZqcNe}OO8_o;MLG5)IT01N80gQ$T)s5Mzfc=g*832lSW=v#njn(Tq0sX=IY z^@eD8#tY$f1FLf^&UBttjk8gM&Vola^EWkeotv!?)~^pl(RnqN6g?KcafdW< zD|3jUt~mEH_sUDj`Pbbc#0P0mIgH$%1P5VWVloUk7c;DBC4}fEqtyaxfNXfG>dwzy zw@^2!c(C>>_k|a+KKY(JPue~@1&?cUPh?d)xp%u%Y#2{Y?5_lQPGu@OF(;^+?~tdg zpoj7$a&&iU7Bft) zo*07Rt>fU4Y9mjp7L2F!W6`h0T-jnTYk^fUu*;>NGH0v}c(xyV2gt^0{?I-qXFAbW zK6RgQb`8V+y;J2gI)3ml4ngeGX7WB0AC&wEf^*OyDU2HL-f!6NxUUgvt35D$W-#`2 zn;@>J@WS59|HCxyC5FOoV%2+4*F8|UfUJJ$6V`>>noOmZ|*%s&WB!}%OXvx|&uvrsX-zOFI$FP6N^pX=;Cl~PCE`Ky%_G!zx z!#wUlOUqrM45Gd3z@oEn`LbR#qT%zQ>?ZeJi=xF#xY)cz1TQk_XxO!@?mF%Vbe@ zBmeeZWf*xN17y9!zIeQc*y$H@x%4&h($&Fe+|x#Orq0Iat-;Xy6C)3{@!*^}1Y=xN zWP|ly*tIGMD_1X2ZTb>|)O}UsoatOB^ktmeQ+vwu%2J_(alXSiPw^}j0vP9F#<}0> zBf@y@EB87>Z_T9%g53fQesG@U)}V{}H&I9uwqEUs7R|NzSuzu)NGT6?+QE zA1jQIyCx*zPY?DQtH#K30q2uORoZ1dyHib9Ntv6`;>~xbYdgEqWq#yDt?mJG^Umn z{i>3X(uaH8^*hUd%Hk1gPkwpX52@zvD2(hwEGg@pbar?cEQZA4di(`xR87uHsSEEc z-jl|~2BAS>EOb;arBU5@mWpHW>Cqc$%L{rzOp3;tMUSP*Q+~KKJQD58&P#vZ(%Xu) z!j-t2Qtd}Rs7MaMw<~?+6K}mRcUCYpI|}9A%oXc~1j9DBn$q{78@9#=Bf_hT(xk!z zh06o+u6Ty9q;V)#T%B7bZ=~!!Av|E5S2NDzXJra{`vNhOakkx>Ce+CZgyjJ>_IM`> zQ;9D|GR|J7y9*!L9~UsrXV>3UjYv->=0+~fty0y%&dC_fIDZ~vty;(#btU6m^k+|5 zGvf5>o2>UXSC=l8a!x`_)wX|%07PkGupb+x@Kk?tGosNVZHc67ZeR$u)axye{z(4Dry!Ud-!DhbaYqd)2;B#FPzGnaV%PZ~oYbABWOjDP zlx6f2O0TVrHweYT)=pL8Y_|KJ@YpvH#>~%6N2Urj_VbxsrH5dDZ{cumAa0a!-z|Nz zu$BLoKg1$yZml8oNTS}X6?fcrY*i(&mbl8E<<7BORZ;t77?EFXQQBFR!#KBMoF$hY zW#J#VC&f4qe6mSvq@-XO<2-Oge@Pwvzc}x)%9nbxmext-&Ph*M>dl(`S`NJ@d{0YH zZzQ3Nao#&@yR@5iifRt)#_7qD@y96gh}6h9HC?*bD-2WK#^Tsv8)@y1U`$oV;!+O> z$w5B|7Oi9PXSJhL!5YJ8ENf}cDblLC{^&zu?XCMwNM)SEsqxj~Q?elQJda}iyv}62pw1&kyGM;D;a!AO#`*kF z=5X<}svbF9F|0Rc878Uf#Ux{B3b{;ormJ4Hp|=`mF11JNsD3bSG$P;Q-<`YvYcif+ z;qFyff35v7dh)VoiOfBvZLXnzI&r6o*2dD}x9nMBSu=ocgMR#Z~Ked8iFdDUsMe8yhY21N8 zq)~Ifv_UmVU59+;i_sY8{Y*P_rXR*SMPYZx{n|TQd@x*$fPD>rZI%&tc@~CZ|2lJN zksD{M4ai4tF;XtRN1xdR|9GOG<@i_5ux=NKF)mI@%~U6(bJkmVZK6%QL|t7Y&ETT-_{H(ZF-BRzMH)|j<@gFdn3l-O(M>v7f>69Xl|TN|PJ zcfUs?vXQsee6l~n9!25O6npKZX}(A^kHpeVf_B+dZ}?mf!-o2%TBA_v-+m8<`*$yC z`BZm&whn~6$5#&4xS-^SKX;59Dh5-XaMOmo+s7KE#db#+R;Rb`CrMG#>2=Imfb9b- zWn_XEqG!*n66ae=OYzn702tn2pQ6nc`dBhomvaxHLm#0-hd_9*q7Tui+p0UIp=h>) zT2+qWs`cg?oE^aW`L3a=9_OLP;mo}gK3P6`p7j5E1&?j^TY8)EPFzYnq-lYr(KCA6 z5#KA86D<|?;MYEKAKX8~GCDC8U06$;^jK>-kbR0~25aV%TFYbXUrtSCZmEzgORgrN z<_qe3j9g$jlJ#9FXKEh@8d<(5kK&9k4nC`lExsp*;{HPN%NMOFUAZ_2^L9t$<*myH zv}*&oc+xUhl!`9Hm=B%8ulT`3f`=3&)ln*5s02k z_DCK_T<~j&A3R^qmw#qEq4`T6BpY;7W;S(1vbztquUw$qH<*Rp{9aE-+*F)JJ4|`) zf!z&rl}FW`q4AtnCC(jxn20e~==H;#u)CyCupxK4&RR8&sRs%{>Anym>DLx~QMKb( zAZ~|K>($CpwXq9xb7Ssox;9Ydl9zFq@3J^uYdJqT5vyjA*Ho~;(!PEYyaTxt_hOsn zoxe#a;{Eurj*eX2jH0jcy(Um(x)w z@jh$0>9;>#o#q|ae6Piwcwf|S8v&CyH_Fmakejh66mB0EX@CB5#|QEO?n(xdJi--4 zd4A+g)sQEcP}^aOHxlOTlh-eHL~fubO8-KcebElpE_%S$bc1p;YdWgMcyN~XUisQ& z8b^RJ4k4QmXKTAUF~rB8iv3a0*H zJ+rHxaCA`;UNIN-c==iN?gw}AM{pNx#BSBOtp;n3VL=@|^Hs|hXFHCh~9paD2^?W5$ z3ukN*y%993hwM-~8{uo*aerflY!YWQ!$sE;x4Q zuQJxe2DROs*jMjW?$nx!_d-=a`U`)3#73Q+(P)Vp1210|+Rt!7>})me=LZWN$rB6c zz*_FBo*?h^K$o9!c)oeQsyLB)dVCfR?Ru&Dt*7T0X8~;jPg)KdLw`|XJDX;vSe|qw zkGm;#0eNle>q_$5Qy!`A zXQ!YcGL5MtO@o( z`;pm_v$YfQ*Sh2IA3?t8?*L0;n@!)`k_B-ltjwK|5@4&C|FuQ&usP&R?ouSn$+&-X zHudQKC{6ZFK%cwz*tTqqvPLx#u4l$oInQ_>FD|X-jDtDU-+1|2@K?FuwJqzVUAaP} zjw>cLBX;+BkZ_6^V5_%r@N0NoRnsR7BfPjf(>+6_%dZ>7T4kc+2-S}f#50Jm&Z?)c zs^db9&${GGn>@C3;!L$?U+!(qerWlnggM-mIb?8M)i9)B>q>H5Jo>42FwSR=l7kUF zUDYBY1qNH`0nyb()p2wZw(}iH(vDCyE#$1&EDn}>HB_V7!_C+fjq{UpEPECQ<5h4Z zrWqWws48a@f~S{9xszBG**Wp?Ar{J2AxL9B1+l}_5V z^->{hq-W5NNNxYwDVU^Yo^hS0O=-b-E3xM2v`noBdqI=Mu_%1*sx>_qfk@UIUhBtd zQ@MA!H#q{&Or~ouFQgVF^Fz&90or;!eUaZf1P5OPYbTR4FgPp#yAx(=zn^x+Pc>)Q zFZ*ko-*luCXTxXdHR)#DOzb{*<;3qE=DPdKYa z;-H3t#U#!*SbHa|zN%`&d1CulYNXb8Q+aewgi|ZlBtxs0`LG@iVK3S9#xCty_Y}m3 z@oVb#mLhqcUD@x{m=h?y8=e9qTkbF#rAhC|&+(b~&m%QL8rP6>)i3n5Y(7*P-7^B6 zxRcqryp{CGHwasE!eRMKU;0={-@1OGD7x2F+UDtlzhObx9)4Y`IpG02^6WK%C(CB; zazX7p4+sedRI3)x!Ox#g$R2AV9Gz*8*`c%0&AEm!_wIC@{y7y#-`&tAkDY@4ZZ>!^ zxQV>6asoYSCt>}_WwK#2YpA|Xz`?O6<-dJKV~)KwZ1Q%YQ}zhVSs+x2vwF#SF=DX` zmeMzFYo(*urll){X=?Zf_7GPquGnFyhRUs_IMT))y*MX6x>{v^$na_LnX|ZIUnv6aC{s(I=mTb-w z!_&m#=F+_u!=I^evlxp@ zz9z`jx50*%qfqpoXRgmg)Hyi<%MV<~>}C_`@izp+t{xb&V}%RMY)q=eIlttBn7qdY z7FqOm^z{_~Sh^yC_u!wsmSW*sSA?1ni(cMGv{>kl2wm=g-)kqHi6F*k#Tsu<4bf&` z9OO^*bPlX025?VkH_zO&RyyL+od5BiIz6f`R^*e%#N1+E_qWi2nA^imYMgEGKu~i| zzKDPC?177f7OTkVxImn9$SBnf)^fAhkGu<9D)qgef;(&Df#626@e%ftYls03ZY=lJ zCSpCG%cau~r1&q~`)BQOK)pxW=pKdD_oDD@_CBfF$1t>O8;P@Rj!9#ChoH&vFzhs+ zC#CoXAol>dorh{`jhp+x=@@ys&c_67bw~FvE|{6177v|wMxv2D@*BPp!*0yMrw3DT zHhMIaFh|5a91q8)Yq9Q=J^WXXh03Y+km2_n$X6PJ>0Q!>=3A{dmn-IojN$2#;=>|$^l7QarzQhM?LS;rp$xww>s)g<7Pa)wp)5l~}rsd-)Y=-0W3P zd_{cpyi5#sWVx^}L<7^WtlM{;S4C4_Wv9Te?^7V%=$nER-jz*$_m^|Hx9fGE9PIAy za&|896F$FNwiZemaN=I&RoJL5*dD?Zu4;-EpP|^Q6rL(T})6nH%5ziKgP7 z*f@0HeHWN$BK9Jl5!0N0G;PepI;Hf(WiRul@c_}KoVpRUseRYBpBQtP`!1|W9Nu;k z^;vuWdC2(JcrNUmpuqyZ3sa}H6rvjvqhqegI+iIp93oD_I-|m9l>F*L3U+>AZ}@he ze36`)DQ}4rK3*%I?U;mlLF|ui=g3o;G8CPDL}Op$PV$!X!7!;Ejb+<=$%o@O7x+%io#^iJcH*f1Gehy+jW|`ieqmC;xM1ZS=~|M z^%dOJWzGD2@d)vWma|sI`D*vEqQz<6Z_PMoiM1BLUEw}rBl3Y>S&74m+a0YzEV|Yp zaa1GD`+hSoS=ACN$>H*EOu$bgG;ulLP#$Kb7#ovgYMgtH@~@MWTx9NHy_e0y@h z8pg=>zc|Y)48VEacJf-zWADd%;b21>)cWO5e8mepDi#l!|0VzyHdS#Xrxj@yHGC0r2w<)ogLnV``1?Y&#g*iIW+pq6XxQMUN3rGC%j` zz4q=)bMX&(lIG;PPul7&Y#=9BWSko=N|$a-PsSzo?9G#%t(u(pyqS8)gAuKQA8 zPu$NU>w~Pw{R-TQL z9jWtU<`xRuyNgs`HwEIRQviM!FGS*cKjLHosDEJd5PL&Eq};BGKbw5NDsJ#{p^gaa z;HKGPq&4*(m#MMvZ<4s7hZ`(nIq&Y1DeC@qhuvJx0>l*2fcR^JeDcuJy~N(f<1mtO zJ`mv{em_et9(%w#Q~brAcZd@+S7+@D5L2EpmORh#zrDnPeAk~a&U19_#LdhbX3XK$ z_Zf)})YD2~oEv;j7j(EoAHZ7tv0jq2jx#LFm?7xY@ z=IAO@Zzscoaqe8RjWV5@x^`EI8JZa>ni35TtRes5VP|ECLQM`YYG15sq|6*2i}gKt z4u(IL4F^Rc^BT21KkSfCi(v@&;5$1$S6)ml#|@rw7}POSj$Ft6Hv1SH+csJ@Cb#!@ zUIe;!auqvY=G>h8x;FJ>*pBx_(q*UcGp2@x@uJv@mH${!GCERTs z$C{nm%BBZ1#C44G?M!NJpC}Mt{BXydU^T2~=ZL2CAu?e;pVlW*)a;7`m^a+}hl`Vr zP|twzH0mEII$q=~i~07z>9l!fFS@yUb43~$oxHjarbS37Wo>CNU7~T;t zk$f8tlslgINZ!(a=iU0ZuZg9z=mmK~jUL%k#b!~i*ttiI z?W<~(n;h`OkhiRjo4-^BMH5qHe{FvBmSRR;Lt~!R+%H#^5M!QYo;{)XqN15Y%@r5M z?e+ylA%`(7ke+Ty7nKF%1?Z@`OFQ$LvUDu<;dnkb-@2_N@b|Z@;9Y6`Q29;1+z*-F zc8;%<{i*aU{!D&C?o(wWai zgXYI8-|uo~u0HiK%Ka6+oJ49wkO!MQS2@s1gEZa~ff=^SP!0Kw%yDtOhA3ke#A4nd z*7V2QDh1~v(Qy;++}aQ2xl6+El+XIt`~o~jO9?$lVq|W6H zhmo_#{JH<_gYr+@8`bmX`MmVF{AVb4(zkHW;@rXVE0@W=e8_h>Zv(wJ$rt!WU0IX- z@`vPQr1HI9JXc-bb0FhXjk>I7?8}?>rpC-q>VP#v`Dx^dN}ey8N>OY%8;6ko)?to^_ZV665w%nm+~|>1tHw!*P1U=`s$=Wm)|$% ze5T_2j@mhlbElyRN`pO#+<_q0w=7txJy!#h7t~4`@2VK^|I_)uif@yZ_+`9b`1iV0 zm?*p6M&a>0);xtD<+;S4PBZ3{Mmfp%p9CX;HTvz_zlB{!flyJ$+0tVS>c#nDMy*(s z@2@swK!zuB$UUnWBn?S_$-Qsx%Ki5|-*&zxzG>$I`y0Ibs?8K9@*X^WN{!(;#^r&% zys(G4G)k|sd|n^E7d)SOx!=m?g$7ZFfI7p8XUhYc5D(^=*>P-J`6k9PpLtSu-n{ZK z#@msft2xJ&hrDM${gt_Tj(z!R=8ZD`_oU${pT~T1>p8Kbv@Yc_8GJ7Mx1Z6c5bAyU zF!Ikwul=e-cqQQ+>+JjsR}~}Hc&j>7TR6N_31`o~r5E$NX0@{P3w7g|LyWKHDcgT0 zp;`^TKMj(VI@H7P`^2C5V5D+6TZ5M$`1fkO6q(PhA61d!JWdX6Gp7S+C(0`DHv+LvtzA>i2Y9mU_b*kj*Op%Z6ADafwQxQ2GxgL zC;s!-^q*hzz9A#u6R#lm;J?OQ9kjnC(N6& zzDlkv@At$DO(TdE`+qGjq^6KR-|;uuXUZq0$076ydAYZ@mXH1S-ZO@RQc&J>7xOUB zMz8NN<#RVs^WZh-umfh5H)HKk`ILO5sbcx>Eba%e?`U(&sJxWif#r9Z8yD%9e^1b$ z7yr!iKVOswjgpYem@C7tDg|N5NchLEyH=ufwn)J{#%G@8DrF~m3n82r{58u}4mV4N zE&u$P^hD)Ktt71A&$GW_gi`Av_wM-~z02}ePUTYnrZM+`Zw zHI%MDRs48{&4S3i=)Xm&V4XX74mmT{VM^y4%#jnh^D?u)Qk1~iEb*mXmJO7kr}X0* zPh5K0Z@C7!xILU1=k(gji5@8!!S87zbWm24<8g2^<92wElG`m6bx!c!y*FMNP3-y< zpIvqbXJz%4WYp$6*3mCa8C{Tsw%y3(U6P=@9hit^yg%9uj#vKXQ{RGfcB>w$8VloPMFM4Ac-@!W7ucE;! z>P6h8cKy3$LrmroFWOsGe`B3?BUBF5TVT&SdFpO)i!Jq**gJfwQBC?18-;Av5+0-b ziT#&GLSldI9+@iUHs}7UE_oXLmxx79^u=cVFfD7FI8@|)#LvU^_J}`^Qd@~R=Vq@R z;%nbz=Yj``tV7y=Ocl3&BDUOwwe{bj;tD739~&^{x2VaMpMoZ4toMv= zNq_azuyH#1)tlGK(E;h`l)@QSEq$fg_zW0H)IOa$TxqDHX2l!!NGtpm@9cCuWDXhJ zI73mzrXh}Z<&_qTl$lLZ(S-B#{U4SqgD28sdK-7d^7E8tdo-wjlsgn-U6ePi$!jYi zhv$83C30dUMw1iOVt=kIMpK(~N&@P?FA}n62B3Nu`lqjMf`=QtQFjM-_bN8w7H5kW z)@rcrSNf3Rd(KEYPTs=*|N0-!GdLaiykj1gF`h%#48h5s8}O(eb5U9&YGW*d3E!(m zR(C`z|M^(V_|*1WE}nR_5I1Ny5HyHVF%{$C6?kEvjW`e%>B5M2I8`2)P?BA zt<{iH;f`|-?)N5VtDB)vy?QoM7{htx^R%JYGjUYKeZ^_#r51BDQ8<=8g|(+V>~JO$ z=hA~<%xQUiS{6np$75qe8)eR@Y~0+<`r)gs60#v1NzCm(7bGd}{QYj^9NZndR2euf z3lApq^UEzt+La7glb=wuY^Ty>aTQGWe7-~!M%>xrR=5wm}N`9fYI~C(cH1Jd7gklq8oN! zbwkh*4Nmv<9x|-HGd&%u>LVTQTP}TlwE#DD_?}MJQ{L^|jis!CE5;31mNYEKb;j-F zO-tpeA(=cqS!=EAugF$Kh&AP&Z1)~YYV!@4Y)=&~CkE*K-t7_}I z7K#aWgD7HQpk4#c*~9KG5ETm*5u~I;;LzP=7mA4;aQ0ps#O@ZmySu+}-|x@WU+3Xb zz`56+YtAvp9HW&oDQ6kp4rZ>nV5)>y%z^nBY7FYll*ERaSj+P{exZe8zA+6a8P99A zt(0!YsW|4rdn9MD66lkHJ<-gYeH@j{S=5Hzz**s^NaZedVtr5XJYQU{eA1*KmGi=v z{yUW{ zik!8J^%!SWFWZUyd6#ga0yXz~w-srp&Y=c#MWbHzglWDEuPVG>##I*nQ+J^@Yd@D4 zua$_n0$i^~toim0W$)9qI9{E5%5kTZtfCdT%J-tmB%w$dx%gb0SkJY6%IU6IXvAmg zdZMdBm`Ce2yHHgPCe$MNEMu}|~gSV|%^Q>2u{Wr*s z>_9A~ber;>`;JF?@xJJhqtsazMBWo;IwDN*P4O!YKM6EiG*v~utzi}>C9x8T`Ir#H^DFzgd z7yb!*=#NdTvOHGYt$Y*a+zJm#j^X_F~!gSvW^fsVg>(hBcpH+k@jBVb# z(ISjK=`v#*SJzsk@7#px%+JE9gXpkeEqXBL{I+i{Zp~T&FeiKa(yMD^E~0sNuODe3 zzIbP0OmpUKgYSypfeiFuZ#Z9hr5w#n$D1y!ZOR`hx(#WlZB2}O{XJ#drc_iO#9FA) z9i_A@wSbs&p8mX{3^Yx`^3miu%u8vHeJ~q&x?2 z`TkyQ*h}2okcAV&i0$8KEp8fT;@C{a{CQnbp(q_)1GtNkTv_-zrJ*t7(7VoCC7d~= zc0TXZjklD@wn;G9LEb{kv&zPX@p!(IbxumDqRESf!7gGZRSqfo_d4Y5;lHi2Q*qqS zo?HL#>~fPb*C+_L1ifxkS1AG4eaXkiU2>EalihKRpKrh3sdUL$ zgp%p>NiQf@0!A!=NiKJWH^(TG+#O+W`M194ZPOIdIc_ccuceqg=)LgE7XZ)mt1pez z!JQuC8qaXsWsTK>+E4I-=W}>xL$&MJOUPzCCk}ZfQnE@hj%PA^@j3B3V?Rdm-c&{% z5H?ZU5zic`IkisA@!W`J-I&AMrHOKR4IVL`c89}-O}!Q9%zN|HTPKlOkc(f;hvN;# zi0WgrF^c!&4$FVUq0~%tTFRPjzlj*!FatH#(0|#grg*n14b4i4Um1N-maa^JVL9<< z=R3;sN32O6FwdxGl-krb-1v~cXU)S({>>{~;$>y^QgP4a%L@zDVNNE390j9PnF$mdAKbIu|ITGu&av=NOZFPC0UR5zgBa zvub20W(P08Wb!-rP5iD{#M0}HT=)N;=cj%JvMtwpfY6}m1r0n%g zL_6*lR@GfnZeOOyRs;6Y_f9G~+}(IsD-1z@N|mqFNQh|8Sx(y`WhXI)f4v<$nC_zX zejr{B3&WXJTa-K8!SZ5nIJ4qrWz&fzs9cZy)%^X+O=8UV|9wU?UnqOIx3V~hoZ&&O z#O|U6P@}@(VbD`NSm%f+%fEd+^m9*$xd!=&Wt=~DZKrzNIE-D4v&MR~dZNP%oMC>b zZ8uWAT>K25Oo<))^;8o+U&cemw)wCYs+oBiURv?)a5hxuRX>Q%HoT{@--xbvcVIK~ zs?U^*VkhrJk1_0Pz8w-t57#2ij=lND4Pv9oN(9VhZ@xWMc<1IJ!I$^r#9%R{X$}Tw z69?QdRk-!Y!b6oj1htQtoScD#Pt>}p)Iz*El?E+qxpPaZiW$99aAY9;YhJun3{NJ| zyN3O8@O@gZ21gzx-_AOOX$yIq0Laz{u{mRE< zfq1)`yZ`2eN(*|$2Jv&#V}(i*`Fm}7U)J#|RThl%K#fk^Pk&iK43Bcb_1)C&^ZrN7 zt?z^yo5RuOo|CvOJE9WjGXFi#O2T7tuzNmtY^j&EMyrl%Scb!|xf|QWN!{uD0${F~ zIB%X>_WBu~n$u6vWTa}_4qS-_UaSY!tQLAD4=duRU3)T4j7JXY z6|%n$brGHIIICbD7#J`_OxuwGK@3P=)k1h}r-mMDvY$hZ#J26!w_$yy8CFSLI316J zteK~L{;D`9L?eNJC;jXzrNb{B%2?|@&AqKu=GUTgSWD|qD2qFD=6QvCyB&*^DUE|* zTakVTO?NBR-uYqpFXB`!_bMrQ-tgQ@KbP{8%9OJni&9-KzUM@w9PnhbL`T`#Hi5vSY zRWDR|j@8V!E6&bVzqY>ulYiLXT^XQe*_WZbA8Vxf9n>=e4&u!y;zunSsIyuW!gDHj z1}j!l-@Vxcf5x`Kk%wYYn{}wPgt*77<08RfCANe!XXfn?LvH1M+*vB2W67^=MK}w|V^M>Z4#dUh+EF)*PMO`t~mpZ6X z)GUx{h!fO(`q$6#VQED%L`$wt0e8tCy-)(#m!Ejab9?%{(wpabH8m5Cw2_tOfkBuy zKOBp#_9(3vabI>yICkyar}U!!<>IQ;G!8naB+l`K{T})Vyf6|Y;$5-5H8m#>PZrrv zosdO-TR-c3v6I|{T^0V0bLUY;>g<8^6a2*8rOD3f(oSU<^?WI6-bqrkHoU+()?-E` z32NQO&*9L8yn#SJb#JdL^y=X~)nbb3yZM#7pLc z0Uhe7Rt5#g^CUL6;hTu-yAID-YgMwoA+~w1L}nUmi8NVU`I3h#JBj`FSSNCWa}fQQ zGt@D$V$zx{%&{UTb=F)lR-b`MjA4}l{lxCGsjxUiJpYxYNL!JJMf-@eRc<578^xl* zI${^!nurjWNPH|J7X7TI=txZ(|8Lx@efC9JRhQnyzTmIWoGesl6 zg^*h7;G3!!UbW|8g4N&n#?uik)egh*@#y1H)R`2jcCjjh(Np50gO{tPcE7+C))j?E zbJbdHpTndFXKHEDYU}=2(5pXtqL~ZTBR*x=&HS*Xm5@%ypLS9SWO!8?FZ?p^{N7<*l?GPp_a}Yv| z@x-GvF}pYmCmnb`bG<~>_zaXCWPZ3ZK^(Z1ft zQ)hIe*0PDkruXQPr%4T(zBtT8keO6+xd(`QnTrDjdBu(~_W^ZT}` zHCxP}UPRbD9d+%V3D4&9kWc>Kf8#uCKwniqE+3EI(}R9hmb&SmG6X+Z3e(#A)r0B_ zbRa(P_Uvx8LGS0t(6DCcyHbrAeFekV+cte0t*(zM!!n-XrGpl!`XvW(z@0tFhEeLo ziG|p#<2-0tcQvVF0U}vHB)4gy{+zWA_FJjly~t24Sho@hW!$S>`9kcpS%$dp><8B$ z75g6NU?%b5i5v38;=(Ls9bxU%G+BJ8pN_{opPep-iCb1lcvp+Dd+935U&rEnCu*U@ zOcpP$Q>)X5IpT|rIJ7IIa8<<-0+6{l3Mqr6~r0Nu-3m1 zM~~N2M5wX|SAulVJ^Up;a8`2U)89CM+kr#XRSvA{$PtPyTcfVil%b5=+UJW8tHV#c zKvNUq`R9eYTY3&7<_iC~0=312E2uh=IBH_5Iv|0*>hoB)?+sKF0uEv_&+wBHdv)^E zLflVe9+o9_ja30$))B`@w@_1^)?wixat`L!Rb98Ogi0JND(JhAW-Nn4GtLXMFN(WA zau68F+ADge810Zn9y@EZnB}7MM(Y3c=Z%{uiQDZGQK}6GDAap5AQnmp=TdKHi&xjE zpKw1Mhr10HXPGx1FMSwS9C*cNi!t z9-^*e6t(3q8>(?195Hdl-+H;p9Ve?JnKzoTmTP)xt2(S^8QS0A?$wd=>OHR)C}6MG z_Qh#+$M0uw8o=D!a<6)*=@rbIL@YXRnc8Al8E&(dXy_iLZt8dt#~5dmoeR}}e(!)4 zkL#xqUb^N>*5&OyC*wWU`Rkhkw14(qB-MBEheHdoO@d{=AHX1ObNY@-iarLMxHtuxyDvnB~2 zAv%tAqQ{gDRyFFWt|g9e8~^uw@Ma?yHR9q5dY+P}@k3T`RMTVQHDaXWpOE5z54~7# zGfbFAOC-8!be{%{6`6FAeXyGN7hl^ueXb9YpHd>nqknpSIOT-NN<(b-0OLnil7=FSZb^g(zU*Qn3w-a}`E9kJVZ66W2&=Zy$!?CPKS78uB z-5v}2;B>YWrE{FIl)pojLzZIQrg^B>i1)(#PQrfvESL}C?owtu5!!AVx;~&scY$n|OUIZ5m(pNNR{f9L0*#1OUEF%xfD%T+W#r-n4$OYKH-V5a<35qcFK#5My4 zepNTLx`8L`ofB8yP^AM$ahUz`o0)obk;#6vcO*ujU9WDp*@EZ9&DvE-R#y&Ni%#r2 z?r!&2*N#|*j*N49XL~h!TP7@c_XTZ})KtS%>g(}5*K4aDTb77v2JGoB)l?5mV+Ed4R9TMIV)R+hNpBrox_MD@&iJ<1stW2?#z3J?0 z;h1d_B`ORitFW;4!1A9hj;`^RD;XPwc<>#F^Y4H2aTy2Sdn!_Q(w`A``20#j$Z8+h|d*0uy=Ae!iP)~HIKR=sEm4L zmJ`L*c~0nEpSz+RMu`4?b78ufoT|Hh#kOV+*m#lWq>ZWAcghZ}T{s`S`CI8=If?qE ztkwSv7YlXcaisWfeSY_gF{*(d{lXY$-}kRn$2J?-hc3mTGj&V8tSH43_KEtnMkN-} zCo!7!M$Dq0YUkJkaAlmExL#9-58Z^?jPti{N>VH?GtN$vtkf^_V$uFL=iloat8==>5mO4oo?#VL zuQK{C+~aJt{X;R~N(?L+=Q?3$MXEnF5G<(=maG@XF|38BvG3TnRWxGXA4|@9SEH5U zW*T_{JhxqPQ$>#>+;8I?-Ly}%uqdL}6?LkgI|qx5RCk2iP~ZN9o7gqc1;g1hS{lz2 z^|@CV@rAur6FafQd@i=IpK{a<5FMY+fPqR+nXYES>!cmE$f)O5_*PkyH3@~BMOHR% zFU+1yghA=wac*rCt7h=M+sinsrr*^!%~v3fakf9(tYm-BL-@v?L3gPiS{%sBUqyQLPsT!~7Ib4$}=)vzQT-5BSazN^&z@$sm_{2cNyT3z>*n)8ga zWjkke)2uj5Vh-)*Gg3WwI2L7$^O%lS>Qm0CI}nq!zuH7yG%=1|JlrLWt*q|<9*3lI zVsTc_#BO@iH)$4*T9%i^^+%C-&?X#h2Ok!JJPaCe`Vuy5&v z2Co>;SwhhgohS|abK zEv&lyoi|3diB+qSdsfOgKdfG5&3&lYiT&Wv z$|ZF+uEk^G7}Z{vtHVZR;3@m-8};_7AIB%4E#o|4TCRGsBpybL^TEbCb#Ui+Tw|Oc zY@DM;6B7<(ock9JRwsUqMHu6}@Ta9}zAqLrUs+3cZ=}Zg#bJmoHQ~EdQYTu*qsOH% zoL=`tRN4{?d-fppf-i|({m7GH%s*uw79E)z-jYAPbkkljmCt;zD=~*Do5U3#&ii<_ zx9OJ)-vmGS?ximG#x&tpz*-`Kn#Q+di6y!to_A|x>u@oe`e_##=N@f+M9qgzn9JYC zK4Y%1&u~OJ^M*_85YhehO#FOHJi)AmaLJv9cN_S7J~*vRJ#UA{A2aZlcCuqhlLf5DE>e5cs6~m>W!Am*$$N> zV<7Y3=f4v0mbkHV)MmAHLISEX&KnF;)IVS2@sN2V{k@NxN?qa-#@V9d6xHxZ z9DEq(A)Yqs==O0iW1I)e=IZ8~#EL&N=U+2Y?=B-BgLu)Jm*2%~yLc=IUK!jOX$CdBWC z;X~@RNr|}2^E~-ip1S%<0!}l|GIZ)7Z30Spo?W)jR%fq@hfJ*g*|P=fGdoVT3XNF-~{js9F?n1QD zGN1hDCMryuhtGw?wf0sOi4EtVQ4T#5pKnlh)trqZU8#|++pnCsL;abtf8)=eN5`qh zzl3AYtEEs(tCx8C@a(fsNnO{uJN7%CfsqY zI;ndS%odRs_dZHJOdm|$QgY4znWuhznE;Cn*4rBft23np>?xpkq@Sf~l^Ty~f_s2p z8><`c#-Yho^1$+|s<}(zAXqQ;NqQyh$OmwlL@wys^TKR@Jc^IA4ymRW1;gXe$}k*N z-fS21PDj!IojkdQ>x8W%JuUh5YOk}!t`cIdeR)3VM?c&>7~_4zF(f-er2Y0s8gaQF zrG8@GJ9_@`Y|k%SC|-Z|qTW0G^)62nC%aMyg3s~zm@z`PdNI1?^W5IC5rOL#VLWly z(9fo#zpWDr+p)Hs_FicdIu9B2k8i#&Q}JjxkGpp|bj&!Y#LaL=pKgE8tu}v%SEE>O zY$U$X<6@1HarfE3K4cErXjBr)=RA#PyPtAi^(~CRF6Ne{gV(9uqZ2S6>{9|F)D!EI zk;)#hQ`Z^lmpe(YCKi|Grcw7cO2U8*ti27|sIK%f_)^5YE!R<>geTw$Yte^(KLr@W zcF(Evu<@?QZy%32b;$D^bX1sU#N*p6@>{+ainZV3;dPpQckpUqH8~Ex#NnsD$Pk%~ zvmtRL%Np@wwF~v_zme;;H%wUG<(!tf(0%PZMZ@x7wBlakt!8t@jg0|#yz$@NmC54d z17AEpKuqb#Fma-y_$7YRYXlAkG%+r{1+prWXg#P1p$a_nK7v zNa8u%(?NZ|g&qeR=?~kcuKId^GOQHtrnUMh1|3d92+yta=37F(oQQ%qoRi)=EPm3n zKA;+Vfx3mFPMZY$=@5qZZB~e7%sJ&tsD+-EAd&|rU@h-K`!S*7+Ne16CDzgP?qU(Z z{giqSiEjqX6o&J4$au+l-+lHS%<;dNtJ7Bw6s~=_)8WQi`gm{QKP(V^wzFq6>nyGx z_JjLL@<$i85yNKq;LR3(_Gu>8TP?wL*5TUwb%hhPl}>kL?dNJB4u5hZr;O*X(nBS; zuPYLXmwx@RO(}TjOstrmeYIvPLDlKs)Rmee-_|Q#n){;HnZJ1jty-t5S*(`^R^*(h z{~PuC-e_#)=Sr`ZtCz-c7SGT3CoNDrvZlS?g!k03f7GM(>7PPeuIsr5>avUJ*v#1a z#e5f0o9QXW_jaT8RpB3<3cFi;7RQUkgZU{4|3c0{`3A9iTrxJ)B{#(&LnL=gLIYyK zbsI*Cw0{!OY6Ry;wcNy#w+Zl0Ah+DnR#b~ffc-7@yiW&<_TBh9yr(z!$39{Ud7*LF z=!qQDSyY_D{Vevs(FLtVCqB0w=Hb*SZbAYIwb{9sILFjjq}>aItsIV=;fA7Tnm_tK z4M)YE6-ARdzF5edI5p;za?!;bjkhxA&v~YFQoOK_x;b|Jt}2x`dSJ{hdJj!Gq>O9g zhSa6>6sVV~n3hxD^>75DYxGwleo?crJQ6n-#VZ36{m_|s$bZkX&MI9s>l6=Bg*}?f zdUXr++nXEm-M5~qTKA)#b`93RHO$mLQxnjTv)2{wzr~I&8L){UKWEB$QOzY24VV+Y zH`pmwm}DUD8o4F6azya8G7@7~BEatbOCogBF zr+4)eUq2>d*nIY4A3BR?j)|zxnMlo*EyaUn{JDI8D;3ujE&jyf6Kkh24-G}f8Bxe* zUESb!1)&ZlX3RNVk1OvL#}?$xS<~C1-y@~M#}HKKJ3gnwb!Fz#AoO`p55!q#l=pT4 z2<@W774@+4V7wm|^wi;xRk30g?t>rAiMfs6qjdVS1hv>dx_NI>yp6rEjGC%_?q(>v zGuQ&ZY|7zpd)u^pTaMo6>9`CYT-t~JDQK=_6C1W-U*)J1|(>cp_jT6>R zS=fAnm`2nhVO%AX{w%~rokoek0@i*th-)?ODQZnk!(Qfuv(c?YQ9b%lb9Ucpjj?bn zOvd=R)cDd=7FA{^;S>9*zS~|YJBf9K>UmZhT~ppBC!p1D&Qe<+SHcB-0f^P?bC#6? zYInS0eh%HbN9iztI=Za)8k%iUdiLRt26M%-)U`^rnM;v&llAufJY`42V7wbne7I$X zQuW`x%xwOfK1s?1YO1;H&|!~7tnzb`FP5#R&*r8GCF7wtdZ!Z)=@q1WsY>6r8}y@m zH(Tl9Og*aY)LwDwtJHbA7!j`{(c80<@+WRFp8Sl$0qKeSP3KE};=kkEU+=2g+)P00 z>coX+d=@#Zdxsctc0Vp(ta}lMwhhRyI1(VvS|(vmZ$6i~!^F>rnbgl_5Awu9tl5`^ zP0U4mf7TIVNG9ID=4|EQH$~h}$5-BKXDn_hcVp9#$1@!HqD(nsO|PrbjP0jgid`AK zN*Ay;7HgFu4$R>ZeCJKll^tP;uq~$Mc|@dgoxRT>>Js0*8lZf3h{d|kJkQ_Ul@+%l z$#tQ2dEf%YxtR_ezL&g(i-DfvQQHeweZw*M$Lcaw3|lruhkYh}Tn zBoweN-E3V?8JEEKWd?VA?pIJkUM1iz`?6Dc_vC%867cH|bp?$s$blPTF^92zdGoxy zqhb_yJE+rG|DxRZ2IIPkx#-bZdGA5aAwO~!V|h~kOf5{O1?}Nv&*$>`zybMFF86>K^Wmcp z$^IAJF?$ldb#@84O^?OczAh49-))wku6M<_%k%@jHA&Ky(4*|*-*K*VE=y^&IS#vd z-&t1gt#rv^?Zlj1>4Ks1`9UliGHlEW0(xgwrl+QB_KkeY<60 z_*e1)*7?dmE@t32V;JgZC*KK5M@P=#itpRVRXfsajNFMYy;{l59;CoLnf#xyD)O|| z$w=AB+G*7p{T8<*l(Mcsmr%Xg1#*fS(?j>?p5l&e5^lfP_AzlLvO6JI!t-=Q2&*^%%0UcjBi>&{>6RdAy?>| zbE>agvD_U=1@!tYNR$&>EXI6l#w|`=Cp%NWYeWxfhy>q|ju(63Y$x4c=lKoyZSQvD z|Emt?`&PB(c%C2Y7Q_JapXj$%j>iG^eY30V*4OEmgbnuOoV%OoTUN=U&N}bDqR`?l zPqVPWlJ)H|*P=BZnV38^47-|HXmp&JMl%nLcf6w6Pd@E+&LGxa?yc=IIu)ZXhhf;) zXl+qN`j-CS+1n&*XWdJ}0oG$xdmBn)CMRJgXC*y9^^yvXC*sHndUT$fApK_T*MR5b z#t|E-VNeWnEHw^Z)R82XTzAb;d}?Hq6J%{}4sy|7UmX3kxZ?%`;0GD+JfJqXf4 z;vju=+Uv)t8^K&Xdbf+Vk=7rF4{(NcZ-BPH>WjdK>@B@D+Dh~~DA03X>wK7|4K;}; zJ>y(p?+*Rf!|u3Q9D$%IVe)?Jkv3`)h1unLc}9Ku1WlkXX@|P7Q|RMKEa1O+!!_1h z4(i1-V@w{=sCsgj4x9&>kvDkuv);N+Ji^)c4H#FVZ#*&yB@2iJ)#;#jteb^uJi~vI zLyN<{XJG{MtvtJFkxxV>Mudc6?j~E!tfm=g!`K!XRn#`!orcuwVQ{NwuT|~XV^(I) z+_Xm9(=Y`!i7m8g{Z#wuPZE+j_wVZ0UW$!LLf^u0%;>Q|dTySCX`CzVa!iosy`bl# zoer}eMM@n)V$tsl=dg;Mv}hvt+JCBn?zh>M9BO(MYre?=g)Z3KHX6MqnIh|$2Qrz<{u}2H zTYTl!+C*r0-vzg9EXVaspq~PHhRZ6+4VuS8--q>Eh4Xq$O~Q5`@+wPv=(F1L?jr_1 z?`l}_-MZO$Lmt%WWrc@4S7f5mMslT^hiM{N`*mgAWuDYPd*oOe#@3_rNG{ibC7;jrRGrnoLLVM>Cy>eck_tL6*ZnCeVP%D@{{yR_}E$MWy4uE@7dS-29mZy z5UOXAR})!Hvj6N)&OdR9tyQFP>*$BDjks_|W$C4lFSVt0m}>t``gc#djM|YK&u`HV z&+@___V#J^W%?nu?s(poz1;CK*~QKkZNsREKcKZTtiKDailb0Ey*(^=SK90Tj`PoC ze|hYXMEq(@eo;hoc~1WXnDGpE?^j*E-GRR3oV|MPxUG+NPJ&Mq`)dnHUs1|JKsV;q z`Vqyux@BWU7V~X*^FyrP)3 z&iqjOw6>hy$E}I&n0IL`bpid3Is4B#HB-ua$o_qt4qsNTlwJw)2d?Wd=;B$aPk;Un zGkH(%_#yo^NknvM1gu8Xz!B!Rs;9U=-_sZ^_r{?AE_%dA(65}mdDDyZ#CqQXM;1q7 z$COBnE@+FMUgR6}k3x>yjzug#IBKhX3wb4FZcKvd z6W;Z1bule75ufcN@u$cP2ZM-#%!!11ys=Fd{hTD*TXPb3PlvH)c51zyS#(C@XAX%E8 z2rpC48FO39hi4_gQp^6@w1IqU3_X=tzva*Vq&LY6 zd8;j5l)@P)b&jg_lAh%xBRoWhf!AWBNfUUsxyzc;uT07woeYOV5r`?Rg7oUi_{g2u z+-l|ss*r@tpWK7()Ccb$(m$QM^j5Qh@~*MatcXONBrSefXiQf2Bx*E3=MdA>$^P}vW*#?)Jp`bgQoyzqs+Rmb#)nmcdYsnf{2 zKHE#~+Hx`0Obo~R`4-BCoJI8h)8Xo&D5d8WXAH39bIhrUeLikj?fN&q(V|1JeB3z^ zUE7cgRI{yI)hhvm2XQ{~r?DI}KOSFZQ70$om)?lA?t%TBUyq!k|3Pk{e;m2o4spc> z1=-kJD;)LLMp`fElLgtHpBENu&K%7kZ;^9~xY1h0AsriDgu@A2w3j}oqNuYD-|JP7 zRxRUhnyU^^at2Daml)6UI@GP4AW%Dvba5?vV(oR2Ma8B*Vin3eu-e zn6oPpGe%LjvAQKj){Mg_SMDSqs)PGxk;nHr% z5mkp|%BDJ3i1A@CH0!I_YZl?Ixej(!G87wny_u6|cCSVy+_82;XYREA_dM?p36_rq zB;ut7cQaR7$k9;=|I-+mwXB)kjTn0vvE>gdD$4sWC*k+8P>kAOudj113)Y*tw|g?K zc;2mSY8~@^D=D*X=|PTGJb8onk7#aI%ESxyylot8wGVT+Gew+sVE^6P%iYqj)sy_6 zWmTo;ms8OFAZx0;G1A0(DadUXfn2*4QrsPKHqJ-Dt-?L20dc>b%Of$z;FlEAClOb9 zp8Ku8EWPEP+QxFe3+j4l(n1~l*^jro9xgePmw2D|Ncnz8>3hRKa^I+ldcC9M^Oahi z^sl+29MR68Zpp*YKs=abqU|2yfjVmfaL>e8qvKBTAnMUy@Y}8_810UdeSv82F-jj~ zOFyMG!Du&cnf!PHxd)tU?EEb$!z>qJ5NBk0&Us3;0%yFScCBTDkJ9FAi!r9r-*L{G z7%aDsPsFB!p3hXEoOb@=jzuwnOirJ##Z11&bKZp$D}tUTLr@ zV(wLIN|Rco;!kz%KCQ5moQN+Cj;5~elnv6yJ}G!UfV-3*UrG-c|EX=Lt+v(>u19!Z zQ*Sr=@(ZcO_85%jnSZrxzci~@hey-Mp>3BcE#w~FmbK)=e-D!W7RZGA0v0nGxEpaZa$jw`)+t&;*VY5 zX6k>|bi=jGK=cjImAjd{!iE~BW>qyxdZR_C6H9EiW1g~`+DPdR#Ak;;k^=1)qeaKR zasDZ*g5<8mZ5+FBmaSUI?RF-h0{f9#uFd6cMe*nqM%|~&tntivPranZRQYs$v%c9F zM!a`r<+$RP1U4KoFlg?I)0A!hD8QO73%QZuUNZE zCZ<#^0{dUqk!~#F4lL`35hG?w>q=7a^d+@NFKw1;GM^Y1v(MW1QF3-?|5z9W+ikT` zt635rY+;<+e~})%jX^K&Tb8shkybHB-e*nd+bmD|Kx}Lo=a0*4L`x&6t9{~d2PMWz#V&BsQcPHQlsv6!=?gX7<4z*EQoc()oOmI zzt}-v^ECC(w{q?^Em3aq+Xdy^GmKc%S@AYlgmszR$@-C^d|KrUc?IvFx;LfAtz2=D zT&Vx%jV${>xo<%tOuLg8YTj0MIg)^RtZDKcn##Mc#=|Co^9h5B^7$djnD&SLV1sG; z8}8Xiu0!ud=8a#uIT%|M4rk+vHe0Q;ak4%2ptqmX^e@lE)-)XsznP^i^UlD{FFNGp z7ipK)Nyky!2sjTjl44cX9=zj{=gyYunx~?b9c%tOTcytx>6@&H!jtQtrSjt`$m67k^KUc#r*x`m0 z&K;Hse$;j4ng=+~o=M;)FK@H`dZ{y)WT+Zm(cl|f#WLOeI z76)wgQRKzF@5VXi*Tmx1*K?peopjrX zUq2O%z9%c=)U8Ccwx#aC@O#qAMbsi_8;JpZc1zFn$e%7HpxBMOPW6oCDKCkUuHpUo{GHxp zW-{(^chtJaRDE(zHX4s%{cvf0@rf(kuQb-dTP!FV8I+A#>{Y+6j?*}|W}FQoFu8UY zt^P;`2Kq)I$2~`@o1cytYVP;i_d@GcCk+i)(~f-KN2)q5mE3vyRV1cLM*KYfQWUNf zUyw@sregaedgCp+C)plL7Sm!J^3$@+6PzNsQp5(-h*#6J1^1S zYUUEGOSq;v`-OhI+9k*}JENIT53J*P^!S)prrB=e2Is*(_-sBw>q*@ngH-|OG^>hK z)_p!^vNk*4;it4N-T|MA|K=6U4V^9bYLJMYj5978$_oP6cQeil=DgHbUK5Y>)!dcy zQuPL=$=GkgeX&db=r0Fmqt2jktnIkGc-KiqQQqmePF`~Hm;!BtNgAs4h{Qlw1L@41R3s3~T{>f|)P8U( zu$i8_OR}Y~A*t9eM^oc;uM}&OOx>Dje2Cm2rPYl?^wUWA4v3NNu`m2d+~a-vY{`lF zGMKn`>gl0UjDH}e9Hf8qyI#`r#lFaENz86neQDoQFKFmJ{c+?K?a1LCxHg;q>G?@o zb*mdf)-dLY-L%~e-SA~Lwbg7ZX}>IRL)INHg#13Nsg=!M&twU`EX!?vQTr>?foJ~W zROu~!F7E&Ehw0N;t=Ca!cy;?bKl`p5C9l|&fZ*QLwp#m4Kg}Wmzgf%u{#LB7I4vGl z%ZcIt$kdlyN`grv?%EVJ)kpu64a*+nO_i)H{+N?PP6D|ib4`oyjL$|*?hgEOal7?( zgDm)5W3ImLsyVYe1Gk4nz^T_a%{AtY9y{pEUUjs#3(s>xy-1WNZ_u`#oC@Rh^lBPf zQR><$74H7jO1q$yj#{R|oPG&UmbptWt|p^L#TZO$zewsv{)|^F^^2{CO2^+*JB2ls z+p)HiUkLSJ$aN{z*O6|KC)1I7H@UtB(&}jLsr3v-r;rcYqf^L}X&H#Tw#T#|vOV$S zwI80FuheGmbBEs>A8eZDrM~z-8IrM@1n66E9Nha4N3YRoTv}sF{kYE^%fbJ)>RkF#2CRTQI=T>cX zKXMwE>rlOVs`imJb=y2Sm+=eNw%!$lr3!V0G&=3JF8qU&|V@2z4RaLclxE*TkDI4JL_vN4{}G}IB!h3aZA&QnwHDb_zwItLNjNzJFNbA zVDq-mTI=y1@HD3{VVo^m#=4_biVroHQ*1`H35NNdzxn(N>0i^iK{VXVh+Q<@q(8l$ ze0Yg?(EvOB1HP9N|LwagG}0gJ6@z&^+cR^{6$iIUL16%Q`lhcb*6d9~BKc|ijU$U& zM>3bP*S5bhv-tVA6#OBd&Ac{>OPeLrw}>*DrYJ1NlrKj4dYHOuyiTmM{JBy|9&yW}qi- zJom#FZ%3OS^jJLc(-)5`C)s>e$l0jii-=t*Hpj=gBhbqm(@QJa4E^nfJ{DfsQq;n_ z7UL=R_rRZ9Ia2C7H#}+LiPfEBv76qo7oU3LQ`=28$H||pd&Kjvdc$~N6FFla{nUu< z|2z_+KcI=kjUKE$uDvRD3MIzC9Rr6xy^8llMBzsW=hv=ZiwtduTMp+g&Gkn`J4{o_ zpW*y;y?;@_=VTlr#`|oKaZ#J&Ntn%<(a}u9qWk12P0J;3w(YDUM@Pn1C5~ipp=d?V zc$~jOjC9T1;{Hi-u;Z**Yj(Hzr7O9+5jw=Llk_J;;!sM>uNHGc_3Oi9u~yeN+_EKYym4-4+|R7=$s?c(mkUCvG#4H#`BahK%kD1R7l zXlN6+!yS|V@xyn6#x|o1+_15VFC4drTSv8W1Gduh#>cE^mysLnnk>Oizvjhbm%8B{ zYm{VbOKq(W^r)#pAG`b~(!c(jkq(|Pt(S+++gX!@QHQt69-A`<=|?~9Z~eOBbrs|> zJNY{^&c(t~|GQfxN*U*E_fHpvc}9?bM6IW*6Eu5>$t)m8(6mnz&3Mx!T<%ZqipLt8 zk*sxtZ_&@LVg=1_=1g=pma$h}pPwZQ3*k9Ct=oWyW z<j`Ir3tH_I*4XwQu!}H8mq)HReaRCa+pNL!j*DSD$s4!t?z36;I{@Rn7yosh zm-f7kZ1L8P2TaQ zoDocZriesD#0?Ij-`dN*`z=W?@QiJpuZe8!UvBnf}qr^ zEpIvOiE&eWaOsfHs{Pzic+d;uf*Rp{ZR-7}FTwYM75LqGF{L=WHh$DI-u{!G zWdHl~|NM=w;raT8oY}TvoRb#IMR%G-;tkL9if7feeeEJ}gXdX)!a@6<+MeYB#PRx@ zXrDYzL{j%K{AzkhlV6&G=7%}Aig==N%}j>)9R|Bz_cSZW#|R{zTR2tLZ10?iJH#Kh zTKj4SkuMh$L~rzpjct}6<$h%v^|eb57oTYq2QoC!qH&V`2)Q~z+$(vv(on9_kX&e< zPic+4T)%f5dT1ix?~*5%R*6I1htznTTq1un;$Fb`NKAhCKpv})#?DpL3Y=O&ffK!G zsqtF(XKm$Sn@GI3i$d?r=1QaIIvjF~Lh&>Ur8JdT*EiyUBP|uLR^&zUF5Wk)qcW*0 z{lIGxSInxfm~IHfk34d-SBJ{_OFpPwhn{7Ao28USp4i)kSd&X69G?*jE%n3H!y9el z)BVxm)}p`STp`U{Uyb$t_omznaMNl|J4HZno|2VrtDU`FhvT3Ii&?JrTnzIG>*|HN z+1i^%#rxOBVoWmkAMdB@PmtT+fU}iN4;slg)mZH0 ztiPs(uWa!x7Ou64MV~5^hjJEwUgiC9^Ny^o6^l_rBXK0TvJ!QPy(8bx(jg6$;*==3 z_lQE`r#4FCF_DOkk3!z3?n-P8);Q!28SK?6kCuny+{Z}Nf7f3bY(%c?+6ZKNX_N=I zsR_+Gs_N?&N+9_jH`p)V^of=yxAQ??B?wjaWJ^sWSa+BNLV4(cvpH_qn(GH^hfEu@ z$9~k;|2xhxmz(QTymdI(klHo9KWN4pkn6-5_ttG0+RZb_>E_w4Xm?Z_!}?U3#&f=E znKs*vb@g}R9t8`uV~-^v_g@}Ss<-xWNg^ihA-;5ciMIB(1nw1)&pCItc5qHSlKyb7 zr(R#}jj%WjXhMGA?KhgAuH==G<7)gOr^udoh0SQr2<}Db-#m-K?{(x_9B(eyo)Ak7 z3gXGH!eo=ESmYD0pS34fzI-woA!X#mB352EKH`7R#VKKi9A-fMF1}M|f7!?fT!Z21 zMLynANsine0F!pa%*{s2;VU>3+(+%rUsL26n|#oHH+QaW?d8c&sn1iF{w(#U$YvQ{ zsQJ+!2MUekEY=kDNBZJ{z0lh3a)bE<>O_zGC8f@!UIFWqk5$~DCr5qBEn+B@me~B# zk|&w@w=Qvw-LAz)22+3Ch&<$WBec=)sGrIiR?;9q)tUifwrPa9Nr$} z{KYX#d((ou52wSBVD79P+=G}Kxrhr&3pCO(`T>#8+~-U`y}xk`BBoMfG^Me8`$P;* zeqw!|u9GL#Wz3mF&R0p12T_M-=v?wEa(v`GKh}w>IQw2ZTwavH{VfA({|(W~2YiCD zh_mk{??=gXS_EQFHun=Pr^(JA{cw{!ld%1BW!)1Wl=Y(SN6B1yiJ>>jmeV6LY^q#0 z*9+-R0qjR=%8t)H@Zg#+zV%zKm0jIX`o{-RZ7)kbJG-LV4qq%-JQOp^ToEwK7XjD0 z*qE;HMFZ|1{x?5YtKUmwNgtA$FGp>bWGw-&RAzHb%GkGZNRi!RN z<NbmYAh3lKZsr#qSj2?Ws<(AN_464kqqo zZ70v!=!K>g0#W5#4SDie4>V>!S^x1r+9cw5Gmrbi_|6(>Uqe^C^7lh=(`J}b;)<)r zen{GO%=$aexX$zMIFImcqV0OwA63b19zA)#_VOx!oT^IwNvm3t_JDgq+>0r1T}OJ85rbce%9peUE~!{qcN^-u{ZEqPF5lK>JAtc=Q^}G~O+S1k@T1tEW9=$%t z?>OGRufH4)dAZN)yw3SJ9}j4DEHhrjwRQo&3ZBJ_hPm9|cldkFfZbg+lykfrO7m~y zuBX!|ZvBZ+O8bdD<8n1_UXM_4aRH+uQscgF3!yaR&G&ayxVaUB`Py zZf$c1cU7;|W&6y)^@2M5R?Z^X+q2*TL=N@NTPIV)jDIou(Bhf9WZH{-$OgEkCyBPQ z+`H((7b5=-aFFFCxKq0hFg(A_Wcw4LSqgq;%Q}78;-|aG9P^P4PKvU2__LKR?g84C zOHH&L=>ADh3cj>gtb=)eKg5=MUzb8h!;YHoc~X#3_~|G2@O$QV%!4H+MdE@vz=r_; ztUThgSYf$4U4=h)Sv-N;fnCpN*w%dJ3T~S+^w8kX%(Y zcDrLIsLKd-ieo?2fpLpv`;niQfulz?)j-xZQ9?&o2jY%pm&`rUhd!#JPCH^FdobLK z>f!%;F51Z6UT~*j$Rl@hw#&LUxKfQV<_}{Q$xiomp%_$+yIMx43botD9# zRxXdkPkr4fxrZOkd8NqBT;PuVK5pnzr*hl9JgExUuur#CIBoC&l%dA!GO;VyYd{#u z9smPb)|2yn7fOS>A}7}N<}ShaxZ%KGSt@Yfa2xdy7(Ah@3-?+ngq8uLthuIDybJT6 z81$9aVbS6@b>JmN4n3Y$R$Tw?#Gj>k9ql}9#%=L&*m*bX zT>tutIBkzRRl&|J55J3NX}D7o?96Xb4~Y> z4JLv=D&dQC<4D*UxUY+H-DL`UanFHgk>R2!+qc!11jLZCUc+RTEzpc@z)i%QQL^Ga zp7aqj0nSB5)&yV5f}Ouq_m`#2cZH2Hw>;7=Rq)?UHrw`)`-uz^E-qN1H*iPFO;rX5=IjK&L<}Q&YjJ@l>cjC6E?BfUec(CD&O z_T#A?B@TwJ$FhsExF{QX7l+zUHk9{#Z$sU%JJ|hmsW`^om9{!sb+Gf}4_!E?ZSEvO zd>%KxLVUy9om}9QHeM_IMe8kx#FOi}@L$RH+18?F$vVp)WHS4-W7%5^+)+H1B2tEB<4Lc&l+R zJ<P{hvq88qJd-9(Tn}wfJnM_U{G$Q`ahBX2hA&=|>!BgQges zo$X|gN^Ggj40-g!Uzz=6@Dd;QB(b2&Z(3$e3)gv&&5W$-Z?JRZE{l$KzN*NDptiZ* z8Sy!xNSxv2PH$0fRE;v?2J6*EzuD>0JF9c^+wzRPP`Q})$o!2bhP_y@sr2k%tv3gWb$zFLxW&C zjJQ4dNwsJxb}4_1!124VxM~1!g3GQ$+gNj!w0Tw-nY&?M)5}5H^8q+QL$UvD+9K8O zA4HAQk&plCN)P7y6ZZ!@weFjw8NkKYjsOSUxLwjPU0_=yP}hy!Xel0L?Mb;kapR^xN37f*dsj2uU7qYE zc6k^|ovtHSM$3tJoDQW$pTIS``IKxIMJ&iTdbi`em|>v(kv$$W#~ilH*BlZkJ+PN^q@&i7o-u5 zHZ*vM8~(pVvYJRs8m!?;t6Dj}OS&1|!G3UH#eROKf*FaRiS@dFyDYlGiFR1;>|kfz z?bEovuye03z>nQ65P$V>hXx9GTwQF%?(pZO`2MagbH%E#^G?K;tAl@tp7a3*8M|G( z>Jm}yZS)Qo!C?|`Ky<7)l$73rhi6fw=u^K?3P+8XyU|0`7rlvDPwbO)HjB*92a}}& zZqQ6-ik|BRQ~%!BgDkzMwK6-HM97al7A91Vgq_{eF`LSpT>WEo7%5Lf4eah*z5GfD z$tHp)?T%ITcwq5-vY-KEw6j_=(Vu3`MJ}lKu3q}Wm)@g>To4ygedw$=<)fb0GmEcw z-|s;OqA|mnkzD=U!WH}#5>iS}sUAMlnUe3}c^pZr9^S`+2Cl@Opy_pWva&5bggu+i z43b$sv83zf&Q!m@MP_GiMhk45sC`VI8ZpO=W+FSyYq+=*~Y5(z4?s zryP9N4X8b~ZWSe9N2(`)tHfmlBoI+=p!NtYyQfv!5CX1K)P6S-wLVP=Aw&52`SBvH z*eKwTKjNM%`HJRUrC{>HJjE>7O_K`_Ch1V*{i1ly%XJ|X>-BlYCXxOgkD#e!vrcH#=6j4tY2Sf5YwOF;%rQe90L#$E$bARWBZUk%bQO z;zhY?Ju}o)1byM<2Gwa7chf=4i&kkIt=3X=q?Fs96gBWq^^izgT5`;lUVe0wst&cH z$NikB$N7!2EGIJ(e%a9uJ$c?Nb0hDz*+ zsSx}#T}rE}Ut`9047>mP=c_^s14%CvH?vV;Rc5xhF#%3ef5=tMT*VMFMgMXwda7tz zHTV^Ie|m7hQlyX?Lfs2-XH+{+WQ`f44RS%C{~N9HSj@u+H%9#GPLF0Q(3O{D9A+_-qbn^9E-muGN zns*9%_K!~SlAA^}>hbyxcJBTpm@_+QK^3s4<*#>QuLw)r4V*>2152=%aamfOfZqBG=3`SH8&rFsj{7^z6lvYLgt=~(z}<-)4z zGq4961`eH5ZB?aHpz(;FJ*4~O>KEgHmjst-)_Sg5$rV2j4vO}h{i}UHBX{BF2kK9+ zToM>Wa&ef+TI-2s_rjbR{bTg=1QC>1Xc2ZEof{lQ$z1{|9Wfzw%}CM5JJ1a-^rhA% zAGK_8$9=|P4^=%4)A~3U9L~+&6m5`KmD9AF`or!!Zf95T8|*;2U0kW#t0~fcv#hB# z*?~q$fl)CsqjPhtNHTbY>`>7T^3sQf`mIy4gWtANv*~s^5+LHU3^viRBgXV|^-=!r znDt~i%9xa@e(@EZ*U+1GL(=9l+9TwnNZJE;H7R3<+5~5X&mzJ z@zJNnU5A;`V|58lsopL2EQ5w=H)xC=A0qw%z2NKm;D|n5E^A9HsT|g`#>~3L?wid+=V8>zA`OO?93n3A%1BN(E2e= zLM12v5C79|us0=-^&zEO3#$qZ-06@yFo)Mvt2aOgGvl=znLNs=4m@Z_7OKv4_G5qP zOJhrFd}u>sG;F0_y3qNmGo?AXJ!KQtZKHGGLOM4)Tc&EVg*@~O>A>{K{F40!^gwSj zg+(RtFSOT?BxDnPJ@b?w*|>tDW^W+JsrLM@qs!^p8r=?d{&Kv8>kT_Q#6ypM(Nu1T zo+&NaC82_jp4FfIqACUWP?Lw?m-g4M7JUpRSv+DzsBU!zYU`-PRsy+6*Hq4%>pc-U?a!=uI@E^9G87X3F*@ z>*z}9Ix0>#z|9t6k+AhDEZacM0S(+}XzS8bs=eU&u*L9EywMROwrAzp;94}69V&)JI=RG_=n0A8REJH>|wL(eK4ylsxU;;FD% zHlAsnad)v2`rw8F)Hae_t@#gwD06`ycmqFHCu4Sfr4;uvU*}3E2)KhrzT4S2QW`cE zykF1`|J}X2)QEwfrxNO@yZvR~y4o!vuK zuP<8D^iMW)QSwG~Le7jvelVdgE|KCF`?gasxTUVG&J}-MV+c)50~+#RkyvBy1`>y^ zCf~D0(nnj@P-D{yvcJ7UcB1zR>bY2-9=|S^-3iu%MzJ2vd~bhZl4x&cmCOVEc~r?CdZ$*r7^Jc$pIs| ziyv_Bk9eCpb})Cx4L9Gw>Aeac&RtH$%meZI{N^#-w>0#c@aYRz)VKvn*c*S4P=>`s zZblU5>&Rb*(GxfdLLaGvnrGB#Zsb9{6V1N3`?@0@<{bE+Hsax#5uz)zL+RW*KdQOb zTl!N2a~0I#lcsEtPQ@I1&=zn9jSZ9vx!@_e;Y){H1EkL!z$-b=8~c@k(w%-DwCEJ{ zTL&kL>Q$X+4C;*9d)LHv)mF6dy9rguTX12@CN!|ymjAHpi(HNAaL8(U7}1x^JvWo_ z1wC@^qe~YC8_?P7i|J`gBt1C3hOVtzM5}r}!CW8O^${GU?B}(+SDMhz`%^pEx%|Ul z&SJP3Jwg3&JUoWG9%Duk!KgD2S#a_qbF$e1{SGBxE(;oqM2aLE{jUmjt?U?py81 zcawzHS(|b{v%H9*Xa72XJ11&H{{cHcxo*R4|B5-27Iu!g?%YevN(awIEZ*YBMZpIL zq2?&d4B%?|_)`LEmC&vMTr9pnxk*Boj(Bs6&^uZtOK75W3+IRaJ2z88t2e(8t1bzm z@jJj@A+IbwFgTPtZ-Tbz>Q1tsXG3UpDDIs%c9M-%#cd#LerVML>A5gy`y$ugFMciU zY%8Hv{jpzr^+%dI!-o`4_>y17XX(y*57I{87*b|0T^a5|{)gOXh>e}tU&)bTdN`11 zt_v42+?LYMo6)8msa%!xyPDtLr*VIm6}jT?c&DUqCI zfF1dnLsR~K0H=8EAD$ZXy<$JE{vm2P#8r*dFirt8q!AouI@K{;;s|hWpl06GKam@U zxt;b@^e@fH+`%c>^COpOMgv@Clq` zWgs}P!P~YxM{DtI;HEmk&bbq1O?siUm-*AES(|06JfSVPA9K#?d9sXf+<{@n(rfuZ znHiqHD*PZPY@lqG?H(GD1C21Rk+RE=pr1Y;x-d&8$+Ggv+_b1%dsVFy=tN&GSyTM4bD~)A`7F=fMYH?e;uIpC!F|0Gw{{WQDVe)z z&<2AJcHVHUGc9a0rTgU)`hGo=t4TGZ(|CXP4T$HA9L;HHfP{9&Byoc_TF|nc(0@!y zJ07(-&pQNJGg()vxJtUa1vGQ@HN3Z`XrOvJO^4a_$)fL z$2b)Zx*Vvjvy1XLpCz~%9gmy+;#|&kDSiey^30Je&VLbhq_~^9rJcZ;qDP??Jl{<# zxrCbmbPVw)s%)nC%P(+^oP#b^?G%}FTL|#^z@cqSm&vDuP~0=z>Ml>0-RK)cdANt_ z`@}=WbiiSQXDqv*BTKXOrC;dr2dFQQt!LioGte*1SSnkHyFyv2 zy}Z9u*6`kyx~%u2t2$P)lj$zBc@lKRYCFpgVCPaY&W0N6HIoAtp5HXl~W5erx3&tS?XcV(ZPZekylbrA@X;cW=1+`#+r{+Z0#F_^M$qJLj? zaL0`jPJrWBFqD15Z0T@_JE`m(E&c%Pbl4I{`msEf@}D@+p8*c2Q;W3c$lFsH+up&> zt$}i+^4pZ^Y9y5YDxa%5ZbrWg(OyM6N^Vc3!q<- zc+525LcLI*ujwZn_cWLSu$R2jTr2z5487?ze;PVap5H$pgr>sgchv{*PAWn4=@NJp zfBuja!`^!_M_pbb$TGuxsb>l>REdeQeA&XU2xb?tUcgDW#{`SI3eQ<1OqgH&h#97wm8?az8 z*#E9n;J+3Edp^XUMh{cv6H0&)g&lYFn$G`NiMcmsP*=pW`Hz@u{e_+Hp2`5pv3_Bzfp$_l75SlnEY-GC7m^MU>bj8L;s@v#7 zdd1$rJ3r?XvYjaDvK#rDJf>H;la;^bMye+TZMT`$!-jt)LBg)RqXN7^U3 zlmyfpQVH#EJj}a2wxl)SL~5|S!tV^XB6HNe`~Vr>9O6KMJ%J@ycZyGO_d!jLJK2zv zd?IqzO*?RR6rSJ*$6)s3jXlMO;5fpt7Z_j6|H1d`6JgIMC;7E|QA->~ep*@1 ze}o@>D8PN<)e1h+2fmFOvF&vge-QY%{gvPh-Ex4xsslc3#Lrp-XTG#CkoGiT9_y;Z z_W~w&3Tl_W+FJZH+_n5N@uwpb7xUTcLU1>aS)c7P{`iZJ?xXyf5}#qpo0Qa7rr69^pm35lzi`R~YUvRy3F30x7s{3z(;B35b*JR@p8c4$2Nv(2CM(RakZ?!zKh z`I9&574!Hue#(4s{#^vO)uwa&>QV4#*xYJn7XP3H*yMchuBZg@2EdTkok7nSx0&w= z9LVkW=!sNT@D&R}XpJU**TQwY0r*cQIY7s8>BBksfCQzF{ zcL+HXu_aA=DBm{^y3*K}Da~n+jo;=)fAPFpPb=kbVoHUWdF8(?=Pb0$NOBP| zdEzl%A;FS-k%KnfNM{2~t!d{nKgt}`#P}F{s!K*KBstAy4Dlwv%h;#r9$?>)2am&U zy$=R5(=oth;IsRD+`&#DpC`P~r)Ho7BKt3tsbkm^aPr!@|+0ti zzO0S!e;w~~HSDQf&)+@`PV^(lv-a7%mK`*-Q!w}V5Xuh(XU~1u+~MsG-Y5rr4_C0G zFIvkxeMT=cz@L7)ZR9`WF8mDQQD^O~{8;SB${c~8{IQAuTOUYju=%J{OZbF~&}u`C zo_}x{uY?}7v;_IXKq{kYUQ~*IyY*h9)P9y5rNhpCQTANiJ7{?Tw1DFl8t zROqU0*wdOWgP(Wn{7UV!ndX!d-0^NAVnt_Ki`h}ZLkXq*D(Afan9`OT=sO(p`E~l1 z|K+$-GY+zI-LWfJi8z^gjaBxrCpUcFkP#Iuey10iGyvoAK7~bM#=q||ZsH6A*v_-S z_26sc#BJ>IN!YLjy;(KKK4+m8YsQVU|zu_-h;bs&u zWNKC|pSup+V@Y_v!?XB*eCLlt(UV^Y=1+zJ=YoIV_+u;Ie-(J|i|{iteZCbl5H~!t zXTfXvL*qlJ2JgeL+nb@~9Zc(xUkg@k;ibcZsKOU{uuh+6>H+k;0Q=uls=V1j3BAt7 zJ0rR+n=r_my6b~)^MpuNGT)s}M4_jR58|{Kbi|x|$v)4D9s#IIhkAHY4xp9d$iY=5(Uso~D$89mH$gLcZcLue&cH#}UQ+PsEP#Dh4+BHH$5Kgj^8<{FreU)(M~WkURS7b5;Dn zoA`I8sGsfq_)!=B&5WUy&_|6|sY7jozGKD)sjM@;J~j!@qj;k12!3YH5X?iigQ{uoo?FIiw6ZE@vm-Ek1F9p?uW7Dn^ z-)D>ut=kAJ{oN6=0l@J0j>WDy$B#>Jb|#Mz61rP%K-W&$Q3GO4joy85&{|O#dIt~3 zgWC4H&B(H?<6Ya$=an=$KZ3S@lF-z4eVUK=J?7)TnZ{IZ*f(#o`XeFDxDM~V48}b z88f0Y{lU*)$FsXW=QHPvxEhMD*Qq_>?p+I_=lFV2#(6IAXb_d+=d+gNaZ7OXrPT|Z z0MWa+jX%H}0sEINuNS?=Ze^ej@C{NWYhbQ-a^^h6>b5d^NC`>3%qgLucSxaofcJV{S|KKDKHHsVH^W>-G&0zSJT zuqCD2WYa6$=pk~hMUyHc zI`Z?+@m)?Lr8u&HJ%j&jq!A5yqzPNS9|B&WlPP3`uZ^mD(JoVHbM%HiC*9#TIV90R zCGgj|m2mv5B-*3`|0~GghKcvlF!L4qG;H3_?~4qE`CHLsn3ONwUWeR!6!dRgqmFBrJ^0hxK`wv{-?RC=!^d%XFvPtMQ+uWG=37eRvy`FM`$AUzWz6l`1haR zf3cVI3)ZUMxQ_VBCEL*9aH@uEIQ76Wpg3`)KDzXbDAk<*% z`O)!Fq#Fkx2wlPl;pRo747tzGogXwHnkM11duJcurxk<89`$;pq>MkL6;1t+I~Sg* z<~M(dpd8fIL;Z^R{+^-qE(G;ao!yTCUkXV6l-7gOb>e1!4= zYQTFj=6w0#j|_Sv>NY-if4X(tt*=KV8L*WXVf1vooVTvpd?kUe?IR z9#4Y4I{I#F9k$W2h++|k(?o%+A}ujLKd>80r?aUI}Z$-!G51SLepVq3$@YAOgDpu<9#{*egLz) zok}K(s7up&u=7)r>BT_AnL9uE(18h*0o!i(dd;7(kD~G-mDTFYk0px)o$=P zh((@=GtrZ;@(nU@2`(T6(VeTS{( z9dJ*)4Bx-jtjWjXPIE4Ls>^ex@q?7DXv<4*+VovRdwCR^F0SDEyoKd_Etm$FaL?`}t& z&)u!gwkf0#4MUCkL5=-7nn?FX!p97TGH)TC`oXqIcNLiF^;qhHcqKd3i5-6yLx+~b z&iU{7-_|jdYX=UQ2M_q6ePUp5?98rR=O2T|>`y6X&R+HWN}~uWZNTqLtmcOxUz^{D zMn*yr-?uyX^*{JgxBMgg1^B|EF6e37_w%cPD_^RBeNAx`&nvrA>~GYa#S%WX({AWX zU{<3R#2;3+rxx_IlKV+~zMd6H+X85OPbJy8ax_62Q#f7-r$$0|?VrgZ#Gf2UnzSFfIL##Gdvj?JY`9e?mIyeJF|~c)KTN5jA7l1;%M$t=m%X;WRiWcbkzzu(V#Qy z@ivCS@VO$*U+`VPFZA&$a>wfHeCv{E6277jZK~z@m*G_2$DeA?RPpNu<9-vlQpur& zKMT$w0sZ5)ExG)=RtcG-FP)rq2sOMnEn1IR--rGDoptWiFb_GgaUVZReK&oE{XL40 z^3Rvs)6G+-zZ9m#NPZP9%^e^5(^Sb=Ju{p4`n4V{=Eb4D~o#fIj7ipFH#26-(1# z+kRWxcwe&^YDUfMKC+o#@HvX+VODtTWj+6h!fEveV0~ZnykRu>B+wgv+kA@e4h-+~ zIDeXV?KtlZI~x~bZrgl}|9I4!ii&}Kx{}4$rMVN2yjg!Zn_uI-o2D*CkNKpQ-xp<1 zLo2|0Hm56FQD8-S?a;7z{EP40YDRKt9eLH>2wAM$<|tik7o3dFP%bndRfo(F z`u}`JV#J3*7v>1J2EL>8e=+l%nlNwMeTslRkL^-K5EE!Du39m$5J{t74<{* zLss$eBy~glycl{8ql^MNi8|zIQ!&%KpG`+}z=!bQAiGm=h+ZHcDUaLB&aO-&KLhkc z_P(qsen0I;Zi! zR?Pd(7jBLrcg#(WFKyv}nMIL)7&zy5U*q+?!l)dxP>Uz^{FW}5DPcyZY$xLfEP|Ho z7ueaPl-I&LdUiDKGP)niO@N47_)0QM}IR>JaTXVQsnc)w~7vZW1aqzrq`wu@$_ zT~jF21v{(=Z{~6)k^TfB*P9u!vCjKw1aelss))(=k0j&Q5W3b8lw|wi~NE(d!=kP0!_=hFn344eBPJDx35)(u^z>BOuTg$s@;x^F+KJ9v% zUkbm-J%pR+0Vnx(aA-WiUSaj2Ql3mbsMQpl-byumr$sIl*e!rwy#B`DT;V`EtDsL* zHJcghThr9d(3w4F!+HUm_d(Rr&JSYmu)&ja{?orJ=`v5~?o~^(5uZ&eO@-G@FX=C0 zvf_11Vfe8&@b$sApA3XudMz|%8hWvh^MzR-F3@ni`%kZr5pH1ovKh9GGwCbn)Roe6 z*p`m`WI1gGREs+K$KMv#n0AzU?m~S2P|G5AWzuEjugB+4F#m69G}sGu^3Mb8=j;@c z3rCz85W!5_6RGJSKEIYDTbHwso?J#vP_&%cE{&%llQ3JpG@cFn5KHALxHop|!~VGM zrR#5jb5@mO;RhpV?LcV#O!&;d=z<+0=GVnGkNE{Faoe&FwQhSO|8O;UEZ#zEEL_Sz zK+SFhe(cWf<-FNjA8H&8F7C|Je9$uwO2-Xd0K33PoOPjC>>Kjmbz|c$U|yF4Z8+a0 z>|K#H;v8nRMKP>5Z~}_5|HDW9|9y)8_Rp+DBZo>qOQ?UWzMvUZOHqhZmsU#z%Wp5K z9reS&lm0@_+BUidAFjP?E9^9Gp$D^34_mGjB)uAG5{G)sagNY>OGX!#p)Nh3BHVvc zO4l~{QJ+o?X8BnP`1fk6_!8Wj?OlhTskzFR8M>0@J!pZy>CJ*RIntRw0n{_w zfK486LmR+vb7@Zwi`igKjT#;8oIa?hkfW1B64c4zLv{)*wU(Y?rqtXPCHx)KO3!kxaT#sR`?hZf33d|1=8Q&1e)NGp-Ee#k8m?zG8h>pJAJ`l-U`-|*+{ z;6+g#D!iLq2%SDW3%%}w(%qv}2iw-Hf6L+zXVTm#U=NC}GEJ>?S^>XR`c}bgy;4Y_ z0`sx@!>n<35*gmZ%}IGAd)zyL8m415`oMy{j)|u=m__7AYBTqp;HCf{f=>1nHtb{+ z_4E&*nCU9)#<+0G$8F{bNgtMO2RqLKM~%yO^r1oIdkpyC=G#1196%eu5iqN{hBtqK zT!cQ{bLc5vU(uJ^1_#kf&r1IJcrW^M3Azc!*ZHIJxLsWl2t5f!mf6LLiZ?>Dd*ODL zS7t*6*rgp1G4{sBoZjP>;D754H#a3=$;upBj{0qDiko1RT}vExC{1%yg;$eW=_YbR zJeMYfzi*@4s1p|I?-j&*TF4tdyjjyt*gL(EyjGy@+`CaQmE-BVA!eIzwFIGm84a~Y zoDr!BN(&3A)f4#SjQ&D!`%!X@KriXiN${!4q#oNB>Zp))?0j|%)dU65@?#;Z1!Q-(v>mlC{@xUu8h?3pT^1H?$ z-ed>S#jU0Mof2R2*&jra{$+e^s~7cx#>Cy`%lsYmEYIr#$z-=8t7rzU;3RZdYD`%t zLtA?6gqc_Gn{1=IIla32Z*ThVzkl@|_Rcp{g(C(zG^ib%Hu53Dz5H5AdIU_P+c6)wvapS`XA-U@@nztWyuSj0Vznn=M3Nf$q{>Uy{r&IEI#3i3* zCLfzZOVB%by{cl%mL<^%_;8oo2btE!1X^|qad<%xQ(6;GKXxKE{xxGSKJKL%k8yWT zE7;Hjk@OjRsaMD6u+wc}H1jTS()i ztd1{UhuM+}cs!05@l#hxs2pE=?g_}jS^ceH!0p+E_0_|2B z-5Z!WpOo_;5v{r{FM*Co>z=#*+<&Z&S)B zZ;u}hFd?DBxRB1rqMs5^6!!H$M#Hla^ScZZ)E{Kh8Xoavqnwa#18wWasO#=NV}spN z=u|)4gRiY;2UlPwfIZzONe=VJ4CHce@bBC2WtwN>$V3)E>CA(<`G7|V7@B#uTiDg) zNP7JUJ}eS5`3d3F*ENW?Od7}jw1&|47r4<{)Q7DF|LcOuxQ$VJ&riaw%?NOze_nr{ z7dzu-C>A>~)O9_vmwuTUOy)^h{B&@LopuYRm-8z4uYw2pJ_rBXny&2R&E3>$A4Km3 zBWC~Hj*Q<0(XP9lgk#R;6!@?sf8EdovGBtxhYDY#7YaBa)SarO#GAkP z+)(*@M)=b2JxxXpY|yPlcpKY7zfnu{%uW$Pmo}0IYTdx#VBz^lo{Es;ZfIBuKW3JJ z{{(YOlNG{slS1-9FTCDoju1HX7=;yJ-gQ|;82vDljNrqa`zZ*cHm1{b_^>Mb%<8A4 zP=EAm^6l4I%+@4&fS&6|c?r8aCV}Q{f+kJFeilh_^tx9djdTiPY3ugVHQZnnnV7NT z<&jjpI*2|-=(4-Z!qFQB(b@@9*?^ZJ^c39YKOQQvCr1z`G=jaOygpYNgj3&7c(FYp-(-q_0olltLGe&sn2XebBKgV>M!(VH&xu_}n_ z9age~_4dFPf&c%Vys#a4@Y(+}fA+Y$T(H=XLoUdD_2Z8U#UZtH0GO-&qb>_ZFJIDm z)OBn1uL`rzw~?tP`o1YLA#PI(6)Zs0sSw>gk&qowJ1(W7d zD*c!5^bCb1zY8ca8a=>i5{4Z+O59;^-(Q(199f@9jWYOiPbDD)TFE`1150|Xi=b?= zAG!qobRqK*vw4(AX63lOQsmiJaFc4|*3x8Q7TdssLvJ4Rr`ATX-Lv+R?NjI?`8%-y z*f|P5TyD6Ijgkwe*8CvKRncT&&^=h06-4Sm6PU{WK-vqAt(}{Pu|s%o8U}zXPktbi zt=mIi!RNMU#{d@H;(`5G0QsdUv->w(=t?`{mEm}1`3d;mSYUG6=dfur?Z{apfHoGa zW&;wesbV1Ru|E$Kvag#_V0%aYx)-iHgy75!y7>h7+ptqYmX4IRHUgiy;HeP3y@du~ zj(4v4xp07cNsmz{?@PWW80+4oOH0v5>?jwwfweScGwk`{pm3*C1!_Ii(&HnA{0YZ# zw-DZS;ijF_U-yAWE4I6AqNx9G=@92|88_eao1cRwfeRgh6KdXUJQg~Eg(#pGxXKOeYXP}q8m z-nn5ev^`k(!DrCIP~^mU)56hq_qg9rE}+Mct`zr!eaKI-8^wM+uu_TWLrzv`@Wr1hiX)SJwH2W`Q z%W9pe0Pjm_#6o6O1`SQjG-j+O7HkLYW5kq_?D&R6?V4W(7k4^!UY-%yg{!4 zJ!{NeZqfExsPR(12_`Stv{k^NfBaxy+|krAKe}FdRG^z3GLu2ulV(-7XOGhb;DTJoG(q zJGXq?KK8XAdb?TRNOuom@3Nrdrv(1|10HPB0v{>>zxvl`OLkGsoiv9-i!j89tx<3$ z?RCK6SsAdLSGIKA$e&L3Ud5~rSdf-G@=l#L8}@uB$)V?M*Pg)YfzLfujd@^TSN3Jp zCRzkc)V5oCY;MDP;M+Ue89O1t>TobA!Oo{{KM~BY9HH6<2@OBdujXEhKq|l~#hvP3 zGx*_UvYvwZ!|<*(x#t;az|KdWJrPcfJwavY`_zWl3Z26bQv>X*l$|GNsHD(7*!fi9 zKH+Rb9C^del0g#TfqWGC!OlIt8wpm6ptpMhSlP}Ch4&kvaoh+TWBnvyrUvxTKf%t@ zfr1}w9#Xw<)DvPrZ|ax(lMglsQEw6{K4DCZlWOA zS#8L8<~eC2`5FH|c8>NF-Ufib4R)@(`A)bOmqszL^AyLSHCo>*sOMP;O};U#CjChr z&BT0TS6k1TuBGL)1NC#P@++aSBAfJK=cYOJ!tvx3a)zC|e8>~D!eVI?>|FmaPB`#8 zia6N0ag(>8MBqzL#@xxc`m4(yupU6jjAFx&haDN>K|5UenHehBb4TUD=o|H27kLU2~kwE%bdX(+P z9_i5w;166=*%$Ptk@unVI4hRLrF+v<7kqyYc0=GYcLR@=kBT4j40ZzM8rm+UyV)q* zX#N}zyl#Lwdvw%-#&5>F-FP*7uyq$bLp@+TWfB`U&zO=fpmy?n#jjA_LUR{kc3Rz& zIB*ZJBJ63uF=|BL|3XLw0rZ|nyZ0Q${z}> z*H-zOpuTyuM+@(J-AiHq=TvGmz|KznjF93PL!S}5stk_^i`t^8#uahcK1%2`8+_>@ zh!w}3g%+nMYDxkw`tW+;Y+fXN%g1hIx~6cRMNmu~a%ERFA-yP^Ccgq_tWSSo85d5E zMEvY(8HS~Iw=#f_rWuw}6(p)d>Ved=%cEj!TdItKYzZHDfi)N$? z&YA!1yRAO?32FJkY6HP#B7 zA4QQh{Mj~2Ly!%CCMoQ^#9vkTI~qLC=nV_y`U~-WBdAjgeov3iLPtSreKYjwl^Leg*EGQUU=2yT=WA4O~JYC3X4tSCe>|(0~M;Z`}8DPR% z<^|1^pTG|4zEfw(^Q>ssT;LnW^k(lu&1jku`li=;e0_-tZeasx<-rsD20dthM0A`Z znf&q>Ji&#Z|4c$TO`U4qzk;?2`V`v{b8GA!FgH65T=Y8mnp>#xHBW#q!lGGlQivoM z^yBs;3x(dBVrk<>S;?ez=QZs~7zuTU^UT)@ zyz4ciYERn#3|hUGTbbnmH}E!t6ZP#%HmKeicOKY(>2NIL zr~}=_j^;)FIHo(%mO_i5QG4VU|MQV0%`5^psC6oznrJ~z6@jGvq=f%r4z1pRj&uGY zZGnPTb{Gx7Z2wE6Tul#fBzC`tySq8cHCJnbNdYz9EdK|>MQ~!+z|Zq;6bhH212}gK zdXsxm!U1R*ueZTW{-w3>`a&Ev1Y%xvZ>ezZQY##!zm0%WN_buO4DH_3{RbTLL}$FX(XwF=oCyg1*fGCciw7m7V|> zG{bJxE`=pY5yO{)XZ27NyP5(1{*&L$jvjjK#WUbSzr%;KMQm8CJ8i~H^{C}67IMgiGCMDE@hL!~Lac8aRf_V^`-8s(h8SF~ECU)Gz>Rk*G z3Nho##hhRLM7J7+7{op7twKLO6DHmaqcfP1e%g~Ge2|Zzftcx?NDmae2SS@b8}m<% zje_yGMA{R9xx|_|Lgx4c`hq&Odc3l*_;Wn@!k#0Vy9&3?#NkE>xC`}G_G*7Dl|BM4 z;`t@^*ciL%kBG^(r`e~E(KM!;KkYhljDYFl_=>U}B06b8&U|FtbuJ=eO(H(SF>E*6%sQM+Uf)ZSRga8Ha%p z!rni7X;Y_vc$Hs5FyiMQ#NM09*+OqkXdmF~F>iJYRhiMG)F1u^s#;&MJ29S`F;j@Y zo60hvZt> zwnNN9u7}fG12&4)(h$8<7THpkLULTp!BbrGkqTakxiUMRo;yLL>OI z*QlN>8lPh>b|~dvIx*dsK2(gF@OH~5epx>+%E5ef=#7{BF6b}4+6O+;usi&qP*>y- z>=Tn1A9cx@8pZ{ZuXQp%sGlR9gJxvDiY|X)q5}(Pa7z`{O&HpcO!s`zUq|0% zat5ii7;*Jj>}eKSyq_LE$K1HbA+}RFnKpF6{AYX=yAqK|V@9GL+wH+5(C2*vEQCzh z##Fb(lhbm4y8U<=i*k!4v(3QJmd|H{f$zGAUhJ=IBKu(<&f~o=9_C(qt~tjXbBuTw)~?|gbD^`=*=7ZO z&(tsrG1t~g_r{<8m3?@7*Nrc1_8}SWwTb6+omZ%ePr_$D??XCG3Ufx0i^7_D=)1cG z9e*YLPfz}w%kBcx&{cSzO8l)+QbBZXHomhqC{sKO@*l2(fevfkM$-#K?@T=HKyAQy zRl)n{bQCZ@?rYGkAp1iqQs(m>k2feV?wEqTp4=DeTc=i6n1-rVAc0S+NBpGkp4XcyWZ~5uKgZP zEQL7U{#>n@DScXq#XY~3rEQfJ0>h9ncoPwjQJ=J7>v-*j#@w~#=l8!OwQ-zr zpW8+M(}*x_$S_}ASr>){t^wM5v%S&(NEphZZL|XtJWxh`!?RCKv~O3s!r{Cc#a(r@ zHGix?HFJ9P{l2Z(6QflEF17gKc#9mgkQy#ag7)w>FQ z-$}&M_T)>*p#`St$v7j(<sT`+hW9QoY@7p~cbw%#H7n>fDhuNqvsPbM zt-vQb6MqK>!#eV%w#vP9lyi6Gh5uD;n?Y%q9YB3iLq*$mY6_;VVtz>5rG3>o2?^w= zd_=A`k+}V}1KhcKl&1BLkA?h*KGcn(v~w+Duwo=VT+RKpA6Z+*9%an+owUzNBd7-x zih^_VwJ}C&B>o|`Szx989mm-ecPcjB8vDOJi;#igc$Ym=`*G769NI{3_aS5Ll*iPiqmJQ%4=uF0k36t=GWRhms%i7m zT~U@9foB&^C@5M1sUi|DmPg9I13jsGRyoeMT0AbeunU) zuAu9P7{qA;5qS5LcHo{kOy<7T0k7lQUd3rJp2z1hHdlL6Mb7PEa=M&iwP!zP(8rT` zSnZ{4o1TvDwaA|@pQCNwHw|kzds_6tTw8h}1>LR4pWib;Yi*j0G|n(ud@|H-o=5Lv z-c{3gwbX8COpj?|ycri7Xs@uwuFLo@->#!gsTYIp?2Dz#ZL2CX_R+bUu-%^9(=$K#fy6Ie>C({xVcujk>r6y&UDwCu2(S1 z6+^E^pkYjkQtnKTNSi2___~T==JX=l8D8l;f2^O&IwT2IYjKzA#z<}OnZ*Bb=F=KB z(LOIqK&>vElYalGv`tLHgmFRGe(ktoEUm)S)5Pn%H!3&MvysR8wsvlcqJ6vyr)Kbu z+Z?VG4$MS)82LYQT@{z4bUfZ2441T7%CaA+Si_!9Ng1L1o|S^Cf5~I{+FMCmnS_f5 zA&6VkK}jE<04-~$Zf%o)F~Kb+cR|H&I~6XTTok5XX8Twz#dC-h37!x1fZ8=+ZUy*}#cKqJ;A;+%ELcm&j(4S~6 z_j{a)3B|#1w9-59JX{gV*otg7?=$Wz<445ARgN{L}>ITW^9>BPT zy-=0wC1Oi_2#k8QmO^gFVJ&eC$KSD%@5xvk{z&heT}9I4mGrKi$NZqtNHac1!Y?Ki zyQ*)HY=fwc`IL3?nq=uyav0p!ldr!jLfT%1zC-@>aw-av`tki}KTVBkPnSs2B4WwJ zRqs3*DtQbDzzfE3)=YEh;`Ws||6PqajtNrBCe$7;Q=`LW57nll9{7>SGyJ-);zr%D zb-Gd9HAz>d)Lns&+oB5zna6FHCWS5wKmkqq-N`XE^Bm80FW;Ld&5;ks^eYX;FB8 zl)g3C;#Uu>JzTA+0Tqj3{^SfF-N+h3n&Z=~&-FEr1^ow}s zw##bN>v2+wrdGihPR$#+JdnEHUWpQ;2t@1Z3X9f0c%Vz~>52hT(K-*@!CGGJrW`6fyHw&E$Rl^sHz7`C;=m&4r6;Sj79QbxGJ!**KNlRAR&xR7Z(Q#v|hG zf2_tz-un~rjPb0RM!NK_ntrQow6d$&77l@@!G|A)W5w&|{f z%-~F!J@wJOt(7nI8*RLcd+RT+$bFS8bmXjmU{0bO{xt{2UxHC@b%?y$C>w(WbFAe& zd5--md=8^$M^JaU#oi3~pXOOjEYke>n+8v6U!QrelmB2=D&})$H0)K0Dp^iO9x>t3 zoqVP9^u;@{i9JPjvD7U$0SU$QdP`|93`WLdHTe=n&m4r0IX#A=8Mi5`#jLKesA|Ak z%j2Z5d>M^7r-<`fe-!&FqR{9L_v+*8qD9*%gv_K?^^`U!84-#75_gR*8RAeC=71}_ zUq5z1tEu$%%8$j+icYZm_ne8p?2K=MjoI|NJiwWR>mK1nz2^~4V^G>XNVW~8Z&*SM zHFtEi->qB_*N>jBO$K5A2I3pzE5~_6Mw0TCy+dDP=7cpuIaZX6TGNRA{^+Avc_-nM zFFB%L43%zuQc!Y&7~Q4&^2?W5IL6vwQk87EW3SbCVn~kJ%s6@G(rnc9CYQCloBVL| zDl{(&L2YxDJo9Y^UUP<200v9TOd zG}D$YbHM>(zSi$Mp=WIu?u%EhH-5BAR?Zou!kx32dQrob-}jR-nX?DiX@eChhg@!A z7rNJbD#g=M(BL-rp^ma-d)t%>t$(&gjZvmx*2eRnlPE_%BP zCFEDUXg6L?9*~J3_EV71t{TZTf`aMe}Is z25XyOzVlaCe3AzK=6*yjH61=#ibk*EF}`Lv_lwtvbtduXK%IiKyY7h>bK}s;mYV)v zbM9Es(R5I2kX-_pnis=>EQ{#5!3-s+$EdaxM6?|br1^QDkuBXSG{Q@ ze1e>`4+kuV@0Tc~UTch5>D;d;$NIl{quHEfXN>^@4#u1LlyJI<$sO0g|u zt+k3flGO(&1A|lW;6o4w8GVtj%+7{;3G1;DJLEfuSHpm{!M5>hxeGnhL#eAfVvo4GoxS-a>IQauBT^T|p>C-f zx?v^a+OR0pNagHmMT`h1hi?BOz9Yuf#25BhL)KHf;BpPALBvXU-Xkw%(3pJhW@oiv=id{Pl~R$4=A1*7s75POTBTqS=OC1` zQQp2x!l7-PNev&O^gNJ)mFzq0_y3d!uFJ-*->iYB?U9GoT!Wn_+4HX7AlpqMSG*rR zo}&`vh*eoAAdcfP#zqb+%fxc_XnF;WWXs+exWn(fb3koPWMCSq>?h~@TdwL=TncuQ zH&x5RNSZ^h((Rwa;9pyodIct+B{dz|XU`Vx1bsF?Q+HrqqPW7{z>(~+cbpCpBbG+t zMlpM80~?`VO1y!&s7`-Ld|5}1z@!k2>G?@&9UF-C?YMhlxIikK!rlL6e1AWDH@!hD zB8IcS(bbIe&(M#cbxZ0g)Vr#B?CFWpe)Op*FWo{{32#oWSA%eTZlR}b z*m?z4OZ2>+8>Q`KxSalDQAoe5gCA8^pa*#)|Bdsok4ef*t5kTf#%NzSTB*aG){cSX zB$S#dwoQ}q^(g1j6HJs-uT!9H&s`XuKk~6x*=X677>@3K`N8}(7(w5_ryiSSyS+Jt zEIFr`m@IFuk_~_Ifj_jilS?P8f;>G8SAI2-M`mXrLJ7ms0eYI6uhXCUpGU-H=$`}0!I4+&Vv-m0PBGBIph0;=#Hk6yf56rH5n=q~DUk4zMn z*Q4Oz#6GZ%k4SB(M)sFb^sPT#+-IFQo?28Dts035JIMDTmQ^PqRkG~A66e}+*W-SY zYJ}ts=b%8W`7NUCqix=}1WlM^Hzt z%5h~XT09HquHYEyVjDi+pPWD8hSX(QB5q3bKj`5iVp?#oZ9oJPzHbm&J>zkGP6RIc zWr+P<=oPD@M(rOVB8!?EN9NF5<%5l|C}Yijjy2Eh_To74gYCp!jsNbHGFq*~svm)P zZ*^WZwwgEAoeRM0y3YB3=6Yh&&_Il|G*O-2?t#}l^RMTps}9|8hdq0-(`~9Nb54^Z z%35U5kHCIp8mA;M*R#e#f*?aXKRE ztFgy0U-j)>DyA=EZyRVPH3>>a-vBj?Q*KKc581O&^C&CLO$0?H;`T#g`b~00s6#y5 zzenIl<8*OrQZ!zMu-DiUDt0bX!}}C_leV^E{|A1@`n)49bri=B1fugq@`e2NNh@@z zo%N4bKlGL=^*J&5qySikW#)HQd7{?g0JL3k&~zZ{`{@o=1s)>5u80_#MX4Nc z*cB?TS|#C-UB(#2HhV znet$D3f`@yukpRXN>NrahQ1+((yXs?J0+Dn*Tgxmev%uM=HTQu`l*fFDX$G!i*9?# zb8EFu&VIWZ735i26voOH({teTl>F6B3*@$kvarR6o}HuX%k~Xdp=K@iyg$nG)r*)z z;?=18d#!4ZRT|d6qW9vmj?$Eq$@u<*I7M2C^nOYbtlT0{9_lDIy-B3UU?lFir3-y} z9|w9yV(ju5VKp%tCj9^UHS!Z4>^TM+5oas27PFs)V3B1g4h(1}vLmQo8+g;r%&&XMe z^yl>UIf5Jl+>Z;%{?T5gS7-f`JkE^J1Y$F5phF7kfR)R8;4^v5fV`xe4E;SB!JH2Q^HL z{iT=^`uVh`#>yFURRVVdomT|liSyxn`v)HAR_agga+~}mbv^L5V*qX!=9#u!>yG4u z0f=<`s*?M<C(?SqFtF37M*AB@%KZXOUaff6PJdah5^YT-Hisg$G zjANV|Rd25xF-<{l))?n>8Ym6M64Us}dgzj_GS@T}Jp-vn+2OE!aCHu}tT6)3LgjbP zYjK}*i_H5jvi*zIIOY?EnPaBOU1#K=bqo4h2K1Cm*gsxoAMs)H8_nT%tI%JYLcwDSTYwFK;Rj1*I32UUsCsoM?DNtKSVD6jclJ3MLOxzd&&E+N{n>axITkJOu zOc$-wxGO;p&E|EJ#JZ3ee7YQgrGHGs_<0d{`yw0eIMWxsN_C z*Ue=yU@b-wxAC6aUmkX7H4e7^a z8fdPkNpPTl{cbfrTsdvJCN~Y6*t<0dT%$@_mVzNOc|LVIN}ZgO@G?FE)f>xF3u;H4 z$fd8?;3i_3VIpReE0bQ$K%AZs3p4i8iBoC_Pv-0yQ|b4ns*q~&KHQZRhHHPyBz>Nd z@1x0UY;;&!SuFs&^;z?ogiAB3`{Kn{@&nC`q-hPkV9mHqce$yW*TnT6>K4=ELes}iDU&{W-E}U5U@^hwDt|egYMm26le^hM> zWuFpF{~?>D(u240#Qh@Cw5q>kK>pay^~BjaJ4u(72&n7Q7pJM{ zh$lZ><%h|7k4>*xx#JM)?=+*1lGR7nA+{^AD`p_%0ykK)kM>ZhO=B(m@pnySUP0P! zC{s7bA(4HGhvukUY!HWG>{EIw%jHEQ$kEzL9BFe`dB}t~)-(f*r_6Wf?ih`OCKa0YVKBJXO=C2I{X66D z_@=(*c~KHnXTp&3`D1>^eu>ajrDxuWbNL^J#^Yg)aIC1hHUEZHELwb{C$vL)zH#+f z9AmBG78{>`FNnEfuo_pMO~@}?5Q)yz^ICDR@Ys}9VK~csc~9LHL+fR52W}bnB7&Vw zpZic}nw`Q4k`!hxJ|UyYR45ew|gy75)+2MvhxRU=2M^U?452f1Hk#2U|gSTmC{ zVtS7b()+T_Ak(uoGhm!UAI4fWR6oC_p$9Py^UmW`PVuQ|Opb(i13y((yA*6ZMt{Io zF{)>IN%*PDK4n;}>d}xy3>d*(5$iBj*rs^YC#G@XUZAQ5G0&NN=gYRwP`$bpjizQ{ zD0FU`zjSppI$UJ`Yran7Ltp8Z7U9$=h}0Bw$H&Gx3{iWu`5)(UPWX!a&%)-W=KEPw zyx|<@ww=&UvB%`}3q5+f8Lt z59$*KU}<2E$>tgExYL{-uGMau4E}cy_VVR@w?^33aziS0yyxGI!q^HIoQVuXuFBE$ z^_`WdbEGoAZeS-pWrblZ0vPA~hJEBy;V}rZB_?b1^_XW~G~WKJr85gu!+3u7-r`P> z#bedl_+;$fNzPmGC6&*EbUcrthnjv>>HhgN*nefOTC=&dc2O$6ObErs5<_VwvFo>M zLy;jHNhbr6u;m%`g^wCa-RmSGxC86Jyr$CJqb(4hIK8WKixH#^#>Eu@AY#d_0w%FTL zu&%Q#3&4JVz5JQB?ifG9kGs?LrSC7?P;IU+TBj6?`jf~F%UcPn#>tovNGx<=AU1yU zFwHk!iRaWf{%?Lha_ONQO8j;)<9s`Fo5qoM_h`ns*+xaxVRJOX80V&orb^lFF)+Nz zo!^sI(nqgk6mO(5JqrZV30DD(>8yBc*$Swla#1)MSO(ch(X<;-?SU=-{Q`6{zmQ*R!^I{aJ{ zrFK(aSn&L4CdJB|`g!8*!vHwN(_f&jI~qi-M1=JRvFL{jep4ge{d5vGk9I)`dwa*{ zZl=wGd~xKoXQen7RnL>lYQ^Hofd9|ibr;59>{9-H=OrmMBpSby$t$R_Mk=?A!MkGe zz<*>&yO4~~EbjMx36U0trz4j2O!K=bQW@_xafy30>RhSS-xO?ZABs1%cSyOMmH66o z-sH1Wx=+s7vu)&A-P$Dm$Vq^>7mD*O(xu!^@zkK;z4^dX>a#Z%8SPlNyy+$lC6~a8 z`17P+dZtb*qp>q73?I8C$mheNF==@?_C@qowttC+F6+Y%B^gShXABmeCeDy`T`8Xw zgC=*Q;d)y~n>#BSS$?sYKDeoN8f);HS#gM3*-0DRpMKVNct5!tY5z0}$A!DGSpThy zwvhWkcLJmF@pL1tnM9p-&I*6IWGi<*`642Mec2~_apN6*A;*LuC&`mKJ+8R6j=I%L zY)uE=@j;V-%KCL1YI?|)jbk7aKe5@hO=aQA@4SE*-Ih41S`O0INx&C?F z4lzC_)o7UnFLE$U4(^hi$u+u3KB0d?q4a@$RPQn^+`Gq~2P!fMEL}N4e{^~b`A~exx$o^!l=XRxZNeudxM#4Dolaezx z2Dw#Z;QXnHHjTem)TUTev@q5>)rsQViSw9=Cfa1ic?a=)hnZ&DS~}sF>K_Z;!$Y;l zdFPz08I81d?X`1=IVB{jq2Fzr^5T#$J<39Ws)esYHBT>Ts zrOBLX!m2DD29tuhfAvgivpWSh8ip`uRY#i5bQHg^KFp!@OANF9}6;lP^-oH{>}J_q*5Yru1}i z6e4}eTfWy@x@Z=Kta@RHi;9-J^B(LXSf5O9uB_&J-?4`pYW=Rt-K7y2?8e?_YY*kB zDY-Cf)ky0sl()oS)^LUunLbXb$$4fhasKD})0Mrg$h%}cKl1DhC8)YT`VwC~e{Q^D zIM5eTqfl(l>!u_YdEqWOOqcFhtBSw5qb+x%wu~tfX$Gzc?Jp=wx)@t2ZWHP6 zV9j^Utc!B%low8s`?p`G)U@OjnEiA?o1Nqjdk#fvcWM{Zr6&H6dnPTL zlJ9Y~vcBl4)3R!3MF>(_2I1G(qmn<*;J1G{B(a&8+Kv9eBZ)698zZ*ahoC8E-}6t%2d#HutmKhrM`WKQ$I^>!?g&-`)Nx^@uBmE1ATtzdJ=B z*<^+?<_`CS$OmZYVWYU#3&AYU2)uY_uT+?GKO>j?Ltk6PpWa3jX44ON;WTCDa$kh* z4#mE)9hGwKTy`hF{Zm3GO&a@gf9^SY=>>|LUtHkSgPf~`2Kdv<1y5I!!*+X$$$@Au zjC)x*&iC}@NmeP;cWLrZ2k(Wng}J$q9Hgl&dy8UnpWE|(JeX}GBHMH3%b3S4aucEC z`C5`+S9QYz@!X7c^$6mP`HrGxSqw7C^{M?nNCei1!Tlq_uzMaUs&|b>ZSp*uDRJWb z=qP;sO3fnU1Yx#}{A%vSUsmFUBfSeF+K{`|IZjBUiRBw{jv%>;$g_3+f9HY)guz#MX zT;*IhQ701q7WPV7cRuH15eU1mT=AaGeLL1FUwoD+4c+}w#AmbLdWupr#TO-w!*Hr) z8%5_8b*Lns#iMoQE>GN1Z!vj*>FtDtt}Fbs!SI}PTwH_;BC7p=uRWor7kZ7XoHuS5 zqDHKR89i2iDSln)`VBQ;#S<~^1c!}#lZ zi~1*`Ac)BvJ02`lthXzclM`+fC(0gDH#M1f$h|b7(`$nbDbd3jD5K_Jp{uC-<5`TVIA?EyyfIO znt?N;5W14Qmy>s8x5trKuue^lgYHWHA>w@M2;2@CuXwQke$^@x)jBOwYO!WqF*XwO z^Bk3Tpf}b>#=nuXqO9Qlbms`1FI}Q!(ieSEbv2IO9jhG6_r+!MOTYharugc4Bl8sb zJZT|vL;Ae!VLX*ZR#MXrt_WF3KeJ{kv16tS&hzfv_PEM1CB_qrxD)>0`gy?YXVSw% zjAvucSgl)#v77u+)|tI_-bAsnoB#jxd1@aH5heWd-{h3k{uM0>SPTD7qjtyFAaUmk zXLH?op0}xmr#2b}67*X>Ep(heW-D_c!$hBNdt*Q8Q%+59Z1+45z-W&>w} z9rjYs!QhTu_K$nTGuh@ucV*{&#_R$;3wusfI`&ti(ZWcSw_U8nvmPHC9*NR=j>@(v zA?QFq)bk@870Yn)==m<)?Y}^|cb50yJTfaM63=TEv#50Ol6O`LA6%eu`d#75__5P=QPLJ_Z276 zqxz6muFX0wX|ozenuban=JscS5jarXOL_U68s_yPQI+t0Zq+dSHi^Xcg`<^vEjc$V zW8OGCTDd!gJ0CqGu(h3}>}B2vBCq$;rH+bDt}mKi;4^jkBHQawgP%Ru{W)*t4S(FB zpBVz{SDlnSEnRWE8u?B+^Of=DE_gVEoc0Hqs<3wS?qomt-}Br{sV(X-&cAt{AB?Fg zoNoBTgK-|zvz3^;%pYHPA1~7xDy)9;GxIZLaKumILvtDD3k!RTR;)4G^a_UC*@5B_ z^?^I{F1S~3q_8uI#xVAbt*=ZFTLaktGgnmYF-_!asU!D{I}CX<#PtuX1(+Xlqi2da zKX@%q@{fSSvt~k1gf=btV9gudF!gi!PB2*+nK&t&H2}&CHv%6TfCsho&4Iv%jKjvcO2&( z?ex=4d7bKlZnwx^9d$}Muz3Yu^S%4CYNWKHlPBJ>SO0IEM@(rZUOn(f2J`cD^(Uzn zvF&o!csJMTil>YHF{U3e@HGY^@3TLCFmL=h&_difNL~Z+rFo0=#JwNnAsaEykqyM1 zGGaSk^hxU0QkWV?qvu-sl}a7O81}p$3prcV=_*F-ip1>u z`%VpCJ!;3D=_*`qhI770-I%m0qJsG(O2ggxxnrb%yYt;X5{sLdsX5u3{J|dK2xzlX zUcgz_MAjP>p2uXHu@R_RoweQMd$O9Cx01{|vFkheIBSQ9OT1!JB)~*WcfgcHHFr z$c1|BM$aW}>uA);WN%*MlQel=6z;P2_@eqQbz054>>6`&?honN^$1wL;4CTXyR@c^ zv#jsL;x~VlMqOq9tIL^FfJW-$uSPmK&o#&DNlA+$;mW!$p(IjMt9}&z+z&(T(&6&! zY0UW-!m%VOPL8P-0o@oibUtmA*9-~AYVzmQ6?t+;V*E3B-|gF;CwC%N_ndutFGs( z=(5jTO}U__v;A?3^~RExTB+wt&dpS;?N;xTtcg$5OQ2R#X_mC;NffL)1jFAZOFDm^ zoHcv$!Sr&as0PG*5_oRzZ;`SmMqwa%V#h9QmnvdeTb-m|O#F7qw20^V26e(+wn|sX zC+hKtx}DE9N~Pq~FJo@0Idi4dVW}FfOZlEo->%v)F%sJXLb2)jGR@Q1k@yuAh9}nb zjBf${ z*!NpUdp5)oXBe0LQTE!2!yKTu(;p5Y^OgNSJTS(*vVV%+n_=P@b8;I!?ormdE{(e2 zkD8oOHb1#h8a~S(p557lC#Fc#s27yWy6$MpKxs0$oZjT!$pfZHZ*TKHYDIm{F&5HV z;??I^TUzcOC%vy0jche*d;N)0#PBF` z(%{;1t3506h(9y7^rgmvGuidj`f%~ztqJ()1{d-T;(yPP52mib)kI$m9}uk6d+LZ` z8gK4gch)Al+hN{EZ`A3XtnF7}i(bp=aqdt}Yj=WP3FnqnI?tMdDdGWha<^KPHC z>gWCOtU2qA=1EeXHD?0sS=RMiEVX&+k4)Ac^)h=(XL8B+WIg2jSVvkxF3_lE^wd#5 zQ5heNMiTeYI_)k|_5aB~_a}}p>YS=4^)wRFiDeyCRK_lm7{)rJv+q8Y&GraP<2kqM zu}O9Rgc|Xj*Dvu&S6LkiM;AVqxkDzarm<%+<-L_@Uc+?mAnr4fm;dJ6!~7vzBGKeJ zwf^>4Xs!fsuE?0G9U?Rtufw6m8jSu>>x0+YImV+ydFD}wn|Kf=2M=JY>d9|?>&7b(8q8jy9 z@=K+m&-^ftwa1*JYN=h2AAYyxZeaaEl0hxjd&HVL`Mpr}Cf@1nLros{1Xa7))Fi1D zjQ&<5RnM%*#U4kWs#!Hu?TPidGl%TDz17s{ekAmQSTnmAnfkPegl;tbcMjGuxkf%w z%lKeS9lPn6VUQXVxYyRDwpsqUKw>Fw+;Q8pJbz;w>L^~Jo=nlG{2}cksoxTUV})Jw zi-IE2-jlin9hc_!=oNuFCqnU7O3(ku9Tc6PtPLKN=YKN^MIdXVuva5B8Cq&O>XFlY zaFu4PlOGP{^ZxDgN;7P-7cyM}q3+yUo;TeUlZ|~*ni(b=U2(!acX#N`>!REbvqQVJ z&UilNg%UVu3G^pAafacgRZm?A{T5Crop?pN^ZPt}q35i_n|0c0;hpRVAc+kZ|BND&eZ&?btML2RNz8xDeehdNg0XvYGfm74;$h6;UA?DinqCaYGk(6a zHAK^HcsTmE;anymRnu;B7>pb6e%!oX)ARPt^nQvQ%JNge< zb1q)5Nlo+pUk)_<*<2n_i*@cc>Hzu&%FWW9k(o*k$Gi)2jSPD=3n}CvTAgv+Qv*huSiF!=#)64hZoJ#AB0Vss`6waA6Oz zkENGQQ`>VNj&*e>u_FH{>w-rA`tcEFnpWP#N0XWJ2c>J$#<8yF=ktFHHB(v92C$;Z}R%k5t6K7q>`*)SDJd3!L!DwQJcW!Eexd-3nIDh74L(NihYED0; zuKR}urp;IrZe7n^!Z$}vJFiq@)Q%8@Zun|i#+;Fs#`-G7(zH5p4D%1c+>b5GuX-o| z)eo{(uFz;4u6RS(^B(FhC|mSDL+`X5$;!ZK zi_pj12A7nM+I~ytqJ8p03_F{peeiuIj=x&~-|IiLcaBUWmvTP-{5r3_&~^r~@ClXT zY@MbNoxBz!iFzhM_l?AijW+0zN)KGUQ&O@gbGak;MfI0UX@i#Hpo-k7=T)So104}N zjlSxeC#q^L@qvnG<@2l!CR-WrGu#_`HtkFPFNc4AZk(InUao1!&k2^)9DcT0Gu?)I zl7Ce*QoTIspXso$G z45JD2{Km@$rZaaF8zJr|+HW$QN$gpNF}=I`fN8H`3$ekD zOF7D&Zu5~-Fb|G5x@v9zSmRykY($ymXlu@#hN%^^;C$_ew*9Wjm^|7Vqy3L)YoDJ4 z<2e?U;yhSf5GVRli-y`7HR}kGY;OaDIO?a*c`mIPz67O&KCoTAO|Sm@oNi;*&AdylUyuLGyrrUKUIZ>Lradqgapi97ZgC z^pgCBN7Q)8dgfoBbtWYO4|!JqeeP4n9ai39OIOzK{7%VH(YM!h9L|o_{^>IXNA#xQ{)I={y8|a+V9TlS^a;`q znlu(VtwvUgv(4JOVv^BfbmI=}fw*a6nu86p$VCghq$m20T7n;Q1JQ5a6{&W;rTEo@ z`hhdoNl)rH;_L80bUjBd${-(^oltqT18%sz-bm=4H`e^2I&X;7RO3hXo?;Zkp=dQ_h80 z&(E0aWtwtZjj(~_5cWNuU&D)i9{bHjRr_epa0X%9huCjlPt5|(A#W!A+X;-*tRnZs zD(ET92`9|VwSGwxx!W=k-P1N|tJ#mmhQs4< zTEDk)w!$3m>_nwFx0T+B!JQW4@TNfIH**ztc%I*c1fol-vAAQt1j3rX`>lH7RKulk z?#ehvf01r9aOC-94SN29G~C1otEf5OF8GKfbH8&A&+X!mhol*N_qTBm@%N&`|BJbC zSL(Ug9F`7EW7ZC#Roi4oxA)Tn@sw+WPX?zr>|(&_`I^RIbjm z-1@d34ultLhUfaA+AsRLZV1mmvw(Z7+-QE+pPp2#SjhzDfXiJzrs-^7o9*>|cV_e_9ZBDVAU zOiSRqd~dAK+vk8FXXXtnGZ7l_RkRiJPcb>i>c`0Y>~+SCUGqNQuoghfiF3e ztitcJt+!Z2oG_5j=3UBRNq0d69_`?c!;ev_H4jzE3cePFoWop<5`sd(E8bf0C1EvH??-ppkv%AHGZ=xbt) z??U`OI2m(JwnojI*|0refznU2;j(QyJUflVhG7|S&zpiyWy3J5_IvdEH3|F8C1|Uj zG|OThUcJt^Qk+8^8$&nP4(68wam90!IC0MozX}2|%}g!yL+qj16^OU-L89IW2Z)S7 z)SnzK-Z4M#_oXl7QnmP6&jW*BlJi`}72c7s-@v^}zbTS!FJeu-Lot7zV}3yj@u8OF z40o}SA5k;Ip0!S(cc}c}BzY6O3-k|fHjU};i*wfA_-6NBG9tG*-*q`Uj7}6!dpjbg z&0?5;)J5Nu)W1DC121OIMcuoLu zeYOd6P$|y+hBiT2fE_}v2BP>$o;dl!4(@!Hy_%$nU1|2*cL+q!18E{}o&zk`P|s)O zdJ)~#5!J&2q5FA@IKw_E^-UlKjov8+{bD`BdZTrhd~uF3Tr-dTyK+(J3=f74^N8Ww z2V&7gVjH~Yj3#^#`-taUVV=3-^joxNjXaQetTd+@$`+9aM_kLwMi&uF7<1|**E>-a z6aBb%%lH)TyD3V)hH`(Mbzp}Ov79()l^(2UlW~dZD41ysEus{65Y=Ie%Z)eyiMwHO~>^1KUj|%ND=Mi|$FT=aV?;L2uU4P_Fl+dvZP!rpT{`!Y}a2^11p@k zi^IEc{Go<8$zC|Yg8MiL%~8l0_Uq4?Z=1Fl63lbnfiXPL9wQ>Ti_d%0Ke#PwMFrzG zYrlDq8^9@=Iy%ftFFekQYl-3L8%B@DZ^Oj!TjZp3F0k-iHF2LC_A$%hV>3az5$}dqjhEoyk~_lok{gTT;x)Jrz!Uxo^RlOIPkk&#)n%Z9Y9l^E$qIbkYYV~+E5l`74+5h0&A~jj+!5&wCYbd5SOp(7$^@r?Ap4Ir-N}F1~Xz3Y< z%UxzFM}oYt?U5(M)UC1?&zNFBz4(aPaHap_y^>|vV7tXEgZqPSV=DLEXI?jj{!%+U zD-Fcd_s2!qFFSO+5{Rl#j|l7I_Gov4{oc#dV)I%DxbdFSiGL*i_&TC^HGOS%d=Ohd zcwi^F*>WE~4n>vi%rlJhl5IfMoy_MvORZGHP{=BSietA zM9D3F&*D%FK3`LGWe)M+JpFfxt*Y8zYDAOIW6j;w#ByIe;0(0ec2cK5c_Dq3FZ!mZ zNf9a!xJ-6|jl*i38t8&!f1Pk77(#ElURFAYK~=@z#uyq&N_Uqdt0F0kr0?#an5Id zP&~O!EVM^3o?W}Fn)8DDTgyXmy|Ib1{+1dKEJBgx&t1#oVOW|Jij@UBRQANS%kx5U zv~j5vLToIP`8=HUfBy~vXu~@+_i-)dMc4Grt$M-?JvnIk!1fhg-*1Gk<~FNigO-K;uz#xq#gn6+;}6Ik+& zdu1AgHH+FpcA!Te&w1C+oiT-ZSmL?wpVt)&n0rI{Y+m&<#7ov+4t#Ip$F;#_Vt9G{ zS-OAg<5~=Ll{#{-y!vM`p6`VL@xzfT4~chtcH7yrx5#QKKDmV8k{y4}%Ym9YR@8#1 z7mOY;_hn1s`qAaVP|4{^*jI84IA?q@aGl~wo@w{_)M;#Fs8}3%DbB z*IzqqH~BsabI6zB+NR`#WUl92zQGS=f^#qg&)-H@Ph}YA*ZqB|rO@cJ?0A89+BNp` zD}=H;pY?M>Fge@Dm7ABAU zHjI}05TjmB9h(wINuDvq7qf@)-)+@Od%Qj2KHi@@>Bf-ey5fbG7aYF)p`R1uljX^o z@o6)ok#_jm@}DR7zkmK;?%f>y}6sY)mGm^xyIb^ zW-T@M^1PHZ({Ma7rRLa@`^r}GJx|ske=MhlHjvz#y=$n+rhTC-tx3MY7ji|KM=ITY zIom0w_G`7ra;uI3SW`1Hmcl}nVw9X=~(v_GX`9k-NRjh3#QcC4Y{jSJxsmf z`XSiVKSr^)4!{!D_pSr)%V$G;(3<`1_k?xgKKBPZZTG|YiSF=}oe}fe2WMARF>8L! zo*t3D7=L(=S?$wHkrGmQ-d%c3A7(#ov5`Gp`@+k@>%cNJ<=Gw(r=y*z*u$GWo`K1T zg0sd>c*0u3Mv5s&TJ8iB#^R6P*n%dUKiJq4ci!H#Ae*&bJx|8D*L7_S&#aXr@iOCB z?QzDqr8V=(Dnsogp4qd+=A7$iC|$Jd7yFQtb9A@HP!j|@1ID_!nK;1M{L5>90`f#2 zd*l*gFQ3{y6#K98@83W?-1obf%lE@Dl)AFNpNme6$CkuEXrD%ihSXOpZ$Rzxtts;P z)!~@TXHczr742T)sC%ceHk)du?PSM2>}S-_-fOOX93GDNj^qH}>ZG+i6oP-8-HIKB zO5D`|Y&B**bU9z%s!ts%&X}G)$qvgRahe%y)K1_4=$u20X!qXnS0k;D&#-uF2%(DmH8V#bk3lOMLf^NzaAu%HAfiy%Bi7nbiasy8-$0foyw)}Vo;VpvVO4M z+h~A03;ocYJ>Z?&?eLm4>37DYdXLUVaN!sSj8E|G0YVsH)cQdss!p zMl5U;0~@$12Ango6T89g1_h*%?(R+lF#rP*&fd?)?(V?CLdEWQ=ly)gZ;b2fUkt`U zaqVZXXRW#Bnv-Yly$RADb1#;E&!BszaH9T`@h?y0MVsKci66}Q?`l=|#;I4nXv=3^ zw4fVws5$4yd)c^0JM`x7)0aI|-`$PSdlvN%SPM1W^Fi&vS@%2MBRfa#Q(Mz><|6w< zovxCq#arsZjOTMbn;->$r5`$1a~ zXPR$%%O&>g1w(n}e?O4Y?LCnGma~VGrqbKrPWVNP@zrKy^}^Zqus`pP!YRFQz;gpu zyl_L4v|?0jT#d<|9%z0#%yRnKW!TyEZ{F7p+i954Dhd@mw-z0&;r}=f`t{fseHny1 zt23~v;T8mc?FgT;I1J|3aW?hQGa(KgoAUg%f35Zx@p#pSy8xf=sAsOC24H*U?TeSy zFD^%6UWY9xj6AKbI1+)u2F%Ziin>#?a4hafoI32FT5m@vIOKxZ_`#e|d}NS1K9^iMp8xg(&a1M>=c=;cdyyPjc7{3uJ7%zM z`Qa^nCZ=S`d{lYCKrU(%j9A{6=YqWC=eF0A|SKWi>evG#y1fA*VPBwgv{3}Y9*SGHAUZG-G_l{mRw^c8hs#0E^Y z;@O+Vdv(HUSb1?LZkwHDt1-)Pz4PDuR{0eNRclhY`@r+|`=%@nZnz60d7m9GGM1-z zEl00T>^-#m$Z0K0k>8V^gDni@@6tYe=l{1NyO~^QlaKMtC)KmHW$mH4ILVxO1?|Mn2hB8Wp+XuV!{2*am*(}%cWr#=nFQ5eaG2y zsdZ@t_A}3%bU!8CdmV;8ONn(%z9Gd}b3e##3z8?lmVCZ)KgFBRbVNPb>q8I{m>=rZ z8Yn-R5{#HL&NaYNx z)|H3y#*FRAVcz(lIVX>f$U;NrlZORmvd#WfT&m9_!%>g#NMCiJtX@iuFP?d`&w=vt_95`; zL$Are7`b+r5G-YX^xAg2{FSk_VGc=qd`PyWcJzE3?%F)uFaHh+M5rxmn!sH8;?c*( zpB$C#QL+i|LG3jD4ms{}l&%M^u)ZnnI8}bM(i!EY>~qaq$_pDi04I6Jc3#qxxR1gvD9cXKckRe5{4pF}T0x6R^i z!(%XeO}zASxH$Io9`aaw#J&#|T3fE;7oWxCC>IgC=P0f+-+r68P(1in{J;Cl=FeDh z$$1ZVubJO&n~CBM+cBT{^VY;}qO)Zd40N`@^_{-x?2?MvjCqND12NZ^I>wB7*Yp~~ z)FckK8FROgH}Z(N(YV->Kbw7Dj;o4*9^-sw?Iromg)nUHPOa~$C**&|axZT%`_M*5 z}_J%W=8g;SdZy$l2L!NtO-;;x+5ZzO4%7nw|YP&tZLX zDqHrfre|_};sx%p^0X8W9B$)37b!%&!a2%$0|8wiv~Fw9V-u@<-}=nKGZR zh*rt@9&4cWmHI{ZhtW5C1!pyX$9ef&T~Yoj1&etf?LXoxI$he2FT9W9d<*CSdKy-h zp6G6QT|6$+L9ng7MscUHO>HAsUCJlmf?go*1{i|~+V zJ8PS#m~m_;*76={)^3GxnUza@DdMNOQ$%6w476ly>m5^z&vG(8G@(CuyS`#-%LFWK zu?5c-8;HxFW2m9R+_<2rxHBdS&v=H1zOEx&KZj#9>v^~3-{e}BVR$=%-Z9Ug%9f8p z(T@3~|JfVzl=q?dbeeTt)fxHVl@RDK4}85W&{ zhjQ|aFg$Kek7={BvQu6N{_WLU<;Zd&`H;5RJh%D><=QWO(eD)NkjA^^ZREVKdck>a ze6HNLttW=FCb6tcm2;dpbGc5gpb{s0S5fZ~Gv&;ewy^m?YQ(}cxNH&`CKAl$OC#F44!!$GgJ^6N`9W@5WsE9e6 z%oW>x;<0@+b^bq$5MRQnuREKu%{3MMzC^->cVgoG4kEQy1U_d_$No+|VPhVSWxrSp zeRwJFObdgGwRPIFi?ZJ|?l0e9T`~HI{QFY?J>}?SFuz1TNWFwq))}Gw3gpfP+TxN z*+?DK-@oO`#Vh`&#rog;JoH7f$mx?0E#~Kf&9#;IS||R8X>`2VQ}O=x5DQsLFZ|eF z2|oB9Ga1ioslAk&c~9_%@AA(GeMRfcCAb<=yZE5CGR^r2jC!yyuzW3s?Kp(yjN#o? zSHz{h1>|W`hp?VTIM2+3M$Nj*E>A2i%z^JH_R<{_Mc;Sn@Ma%3VppJWf1C_y7VDNk z2XSUe0xm6Mzd6!IT%8k(dTy+R#*P#-wnw2Q@2q!I`-d$fsckUjO>-FQ?9r^NuU~($GQB`?Xeor0N*%8EuRtotZIr~~S*h4ltD6b%IDw6vq zQ@`((U$a;9Y~cgz_`P!YKv#s_r^k2XL0LD^5fA;nF@N(dd7Zxpfd~D<=7u;laDU{HDHga^g``v&QpSQAZiPu>`4%XVAwt zV)g3+1oKS#w7DiG*53&+nV6@OBwEkO#jv@o88+<{ox(CuZz<1nRHBHsPl1~)xdfX6 zg+)~Yw)=4YmAXm9Uya4>OxE@Wb3{plXk2CPZL~urGN~6`&iZZG$PU7b`?l@&&~qVN zO9a`4Vc=xW0W+%PDJ#i)FJ(OI+>%vG1MoKMQ`@O;C`iYC1+t#2Yq1T zd_cA~<$QR*4<4Q@mizB@<@d;eOg}0&Xs{W6{MpoB@8tYXcHG6MkKt}(VeY#Y32l5~ zX0%>3OkDwg*2Dij&)v3P5CJy3@tAj<%Zt8>OYSK+5u>YmyFh7dUx~GhbDiU>l?D|b z5y77gtTT_k=TFhQ7qN@F!<68MmvNZ5$7`>iN{;_g_%gPpTU#nU@=K67hWjkrw3X&Y zh4?v@*vMU;^AS5yJdavTEv|}>(Yd&_k{;-zG{WJM?6SaN3iCoqohvz2e39 zu8Ek(obaBx#h^Cz=a2IFYONQM-J@~(8#x9Otwf8_k(kFC_-CgcBA{yoni3~HYSvg7 zYBSEq7~A1|m$ie@Uq$b*4^QOvV>iQ?bAh4yTH>?gMyNP1Fl;kiIKEzsOMbp^85kwH zm90P$&+UKXTs7r|Sh-<0s+phL?;WlT)trI@^Rsqa7o{q-5)u4-{ta(sqxL8AEQs;` za8N9bpJF?6!kd&?iu3Qwa4~0&HB~8Bw;e??^T5<6-IVF)OVEa~U2&nAQZ%6uzZqNa zv0BRRH9Ik5^%mr0zYrTsb1`x=>k#dWBI;cReEpdRI+Tc4cd7TtoDdzAD?BG9Vv58& z(KK3IFo?tb*VH%L>m{^%N23WjNYA5e#Jeq#)EFaQamoPEy?q3}lE-*Fs*RYM7K%pP zACGpcD@NT8!mO*@U*7aq?!tYn&daD5z3-~r(3%>?_qg*`SS}xCp75$qz1C-k<(0>X z3sT?7@UtvGB|bN-jQjfwugm?p=Tj_b3=b1Hg4TE6it)>zsJm>qzL@F1%exhGA?|SFy2R(Cnd1Fd|e@itYS?Y zqpK_o+lfVt?bCXHM6-%qSTnYr(;ta#tunEMJze0?Q^G(y6<>>qZHgk1xGE9ak9hu% zr;A_IUUP0oOpV^Vn zNfVL#CJ2&`FJ$!(`B@ov?K@GsqwO78kDRf*Fz#GDIVvBYM}Mk4^fexNSZ=|8=VdPa zyKBobQr%HSP0sw+H|2AcPUu8`>YNB&VOg{Z+o)6V=+Jyo{9zq*_{;{|mWvVZR^Wx@ z-*G-MzOfPzu^T#!v(jUoGVReR*jKSO?wz3cU$4YXo^#uSX$mV*xb$Vu`!q%gU-%Ry zJi|98dnqG(U4h|PdUmf`tbDzB6t#JOrJIdb#%dqN=4G5KeKb~@1r(x?Ibq3#w#vl3 zoyhS0cXyz^a{E^r*0t^@?#-bFf}1a1l(!P= zdj_Mzl6w<;->bh-v+af-cHDRh@oEFP3MpPO+WskNX1; z%Zt`|Ajg2*zUJ5EkL36V$8z5ww29c|Z4aY%ez1>OCRWC+M;5hf^kZ*{$>foJrJwzO z^TzR3ZIvI%yYb>9`7qU6l&P;zLF+j==VrOe=ckphV!iRZW4L=Xg-EezGrjld( z6oZLZylN1tWDUN8J3PbHpX`;87e~>2KI1lJma@0yVSHLgp7SS_GCrAc_8{lrw~=Bg z?SyqC^UsmyN_NYw=&+qT<2SXG#7UX>dV)IwZC;8S?Nj0KiQGKPi(<`WYK8S@Pw}%v zWM{`B$Di|q=b0jCJoS^+F-PGcTZzxoKsok@< zqtLMnhQT*_*c_}Y9D0&VV@ECSUN7VVe$S-b9}CP*%IBW?pz9xhybjwZFTTtfL^IZZ zwTtA3<2>>8F*T*{pOxMAx*&niV)^YxqQ(XXY~uMJ{cO3IFpe6S+^xG+R4vYEuf+YD zf5+MQiII|LHxXSU$#oR*7W6faJuD|l* z^iCA=4A-AxpbY7{6?#S7a~aY|i65Vd=QoJk*Zv{a)=EVi&QcSqD}?RO1T37!y-wE? zV#2&w)a9&k>$H5aum}ADGQH7Ei4>QpWw$2P2hB=sg;Q`i+>3o7wHPCY@GZPh><69C zMxrV<7!4N@x82115rMdJjC)wN@8qa@+&gGR9mq>(`+O0^Q{uMIA_`P>X?$Z;uC%`&fUA0DE3+-u3+BKx+=c) zratE{?p#zI5b#F>rig~e*Kl)c4 zm4mq_qRW}0WFyJlCb^=38o61Ee#x`HI^rDsu%TpzxRp)*=}mgs>}aUWc)9|Ko&WZE zj9WBRDN5Xp6RgW4?qw+FPM-Q7f1_pZGs@oNN{r;JaQv(*%B6On5dIHqLWwcAe2Uni zpMSI)94{K|xMQT|P z8pZg*`bl^3Q*c%|$q$-EZN(>Q1^uf%UZB@pR5G@OPsmfB-%PZLbHfJqFTEq%2;AL_ z7}n&I-gXyn3O6DC8hfRa1I4Ez;?I_x6Q7tS26C6M8)uI77qn0!?<~iR&USz0XZ<5H zlx16Tv66Vv0^b6qgQ0>E7dac+Q=wFP+yTye;@$P<%EceAaE1Ly-Qe4bLAMGNvreX^ zlJcv^S?nOr@X~L)V)IUep}Yr2kBd>Z4cdo`Jli*)c`3`T?L@_T=8fEC%J~+#IJAZF z3>mMaY+w(VvIUPT`zzN%lJL2V{*NO%DUW+lfBQY3(IZ`@6SXcUj-}s;{x4Bmm;P~_ zeb_kP5_=C&myCDcm?gzx9QB{C6_B$#JW&{a3dD;d=8Yp;L`Uuih5S3S8MROp?&FNc zl)iNb$BK5k^b#bm@k;s-F?^E;F)Qk;2bc=;gHGt7%RE23ugI>k3FpXxkbF$ViHYmr z$N$UVtN|i(>I$S!_C&b4zZf=c5f)$d#PZk1BIk%T_VP33g%RT5)md2l?C*I>ZU1G8 zr*jH=kyo(8L@1~C9l}z^cHGMk%1raitgSq;M*FvN@xT-G?9N_0?~Sru?G z8u>vrXtC(Q_^rsG7ee4v;aKdB$h*|KuQ^7vzOWhQ>{V`C4HHM-+2O4>IU7TVie+ur zBDW)Z+XX7oUTZm4UiU!B?Y`o|>jii{i?OP1DFUqK;*t@0Zc!UVe)k#pN{!e5)*IhU zHYgibMgMQcJ+S|IrT2gW_?{#GIa;fH-}X~@e8>}rjO&%3)4B@-_JdYcHOi%@7ctC& zy3nT{Ds@aH7%|Qk!;UE)W(9C$uFjKoDbq@~;x=m!6Nd!lT}&FjuVzhn&R6N*BmrJ7 z)NuK_Qn|V-3hHR$|H~&RpBjdtY&UytzkW)e1;JQ&m!IF*LFs-s5Niy%D|fZN@`)PT z(+a#W{RMqaPXypd5cN-V&WL44slDy$gUpM&>9-qzFwP5m)k_pt$bbG_lX~fM0>!&& zJkRfa;cMz5k^+dmx%#4U+A5LU+8yWlE*P$xC!AYvMiO})Pg>6qgQ&yvkaODwdXq)s zv^AJYEMlc*q?p5cfjuQVooB^ZYzvJ9c zu~RxN41pWD1UJUtR)Y6!$DgyFxR%ziTzRD6VX-IXR5mU5et8+jtytfd*DF7^;S|zX zKaZ+ktrU(qh(OlQtt&1lsYyHVWh!Ub)%z9GdFiNR4;ZvAO_{Jd9)lR?z_LK)WV1+g zaV7`Gex0IUlOACaoK5FXQj#h{@PxTK^Rt<MJ~({)kf=?J$c9=d-{c%ow#FZOZ~NknC9y&F z*4gLSN1qN9m_p9#R9~!k<|(|XHR|O_Ui3>l5u53VUTcZnyRGyrOgC66&)ht!fZ4rT^yb~`*`z!VPhU2s& zIf|`TD^3H#P!d9(zm1hrvn6}vY|d7^1}HiAf^q*8>ywS0l=jp!an+^=ZWmqU4fDn~ z7i!lOe-%Ba2f}|gv5TOaB27CGHO%Qj-&qp^+aA1L9Gean3l{u6*Y|MYw%{Jf)po%60N&<{Q4(o%G5l?kz+baU`n& zpOw5*SvXEi>>H+g_@eYoni%%g2Sdo4 zk?%zd^yS{$cOL{_2@;7RZsfH3;CQu{NV?~U@8oi*q8!8&7dzDYNsP;3h1jxmE$n#S zZq=MDMsX(9@V*D0tT7VLx-W+Q4e~sf-jWZEosYhG?8^pTmS0R-gyFfH|H{uDM{iU< zt_*<|<9uOxwc>Xx3_j$DnniUkA2)O-PVHyy(XChcw(t93e2+61hsNcm^|LUt347<` zRZ4J04AT3P6VvjDVmUPmCam!)LUNTQt0ECk%ya#{P-TK^1U<@lSH9h(%!vrc1>*Db zrp{2_M~9)9b#=D^7Rnx5&iG=8nanm)_6-Wb!y;lwCtE1fPSMx+F*#mU+Df}DY8s6q zH#f3Me9sBQbmDSYq1p;O{{~hP!8fQ9y;dyQt)}!3WH=7y`JljvYl&5;6Gk=l;7F)aApbq_rPkAE7>zXnt zG!jmI8J`OU%HaGc!?c)@)l1S9~_dKh%C~J;Jpw)8rh8gpftjpo}#W;KR9j-h( z7ly8^@z(F|t;FPpVs9vC%|BZ!Jy(PvU~Us~CAa5M7DUb(nfb z6ib2hdE|U#Q@Jo27l@jdywRi09x_qQA&L}bQMm+nw4ZG~|gSD}%?NqTQgYzlYY#(P2 z7P)R~q08RE-lK_l?Yt6h%xSad?3J(AUXH5Pd`8+k=%eWRSDfwJIw&=7g<=Z( zlvNksD=R935r2hVo}G=$+mA{`Bi41@<~J+%ND77*vA*qLPn3OpE(cgQ-dlA@sn&_c zT-F{-J0>aXFGjKuwhE%qr(CJj@x_R!PEle5D6J(Xx` z5hpOV>v!lYO(urHEP*@82XvHz4k=NkWcFt>})8%Th3Y{vs&$V)w96FKS(_w%2-ID{Hl@{|NFrAol zebpBwSQUnTJlh`*8d8yt_tbSy6i$Dw1WgLT3+@LQ#vW3>@!hYZMNSLP?TBr$m_M8I z)*nvFn)|VMy_t7e#x!MIP7L7Be3D|O>{}C!KFkU7Is@g$Aok1Y{Cq(}WnXm!g7Wz; z9QZDbT*J|JKi|z!4@FDr5=S57EcL<};oE`r^Fwk+Z4QY;SwVQ(gMIhGTybjz^%!rF zW9=Fv&gTW9KFE{p#fihz0An6*@3cg0zeukD-jDt3%n(N$skO-& z(?8wEh~iG{Ynj{6nOKM|b==@SpSyD>OvE57Cm3uaf9XvZ@!pgg4!T}g+eA;CeP{>! ze%u+W|4?ooydFK-1A00I$v4if#kxf50Ndutt>|s)x%h8f^rrR}rLeo&t8h`<`+&ptXu%A&jBSVZg&bwU)Qr}RhY!TDX=#mdVmiRkam8be>D zv_4N??@aE?&+Md>Pl?A_=GeJM8Yu7Y#3ETCAEv=4(bX;nr!O%6LvD%pPot1{k9VSX zxybJkiEEFjHBr1**wSb4=WF68S2M&TgHU|?&6(r)D6!Hy7@C2^m(sk2W^WL3ID;NB zdW~?XrcQqpb)t^V5Jjp$sAiEv-eaT~_ko<}$JE`e8Yse>`QcT4U)(;{TbN&DAIX`> z?5l<%If=7M&Y^O0S_>x&cVunyhVzdmVkUPvmtOILwSHYu*l;s>s$TGG|4weEWskj? z+@;xDCSSQqKOpjeJ;tt;157sH^JrfTZksCqdbk@vGPqEJc(Tx+{zL&>Bl#Ocv1i3 zQ9`>;G;X%x?uxIkSbsPI^*b;pgl-fEjl)oAK!2S5^F$|u5Nx*c!o;L8;wQOtX1B== zI5|KRn^7k)gxatzx{1#Y>}#yJKlQY=7~MO7vrQk&?a@RupYDfF+P+xuO-F3&;)9BP z)S4--A>8XybH&65SByW(dDE%Wv(+1x)z9QlMy|MNME$YEJMx5`PUv-wyLMNO%K4Wa z5O3~{jPYra4LvByf zRI!BqhEv8w`(gOZorU+kI*Zig5Nut;pABj*w5VOMF}E34DlhWz#Jb7MCo}fRkKNpm_R|~Rqx0oj)R^hTd)DrKitM<0Gu)<8 zyXK&)Tt%(^)IGlF@w^+o>^CBrnD(P0OS!i~&#WeY`=@+W2XbzeiZQyxe`c;!b{|g0 z%MSE1E^DKl>z0H=#E$CKcqS|Z5}-E!w~s3p>*LdKlKD1#Yl0|zl8Iw)x$9TGMNA|& zpk{NPkNgGV(Ct*bB`%Tjd4x#0k&LaA8Mhc?p}L)j*Q>d!=G;M?NsY%BcWNT#H4%;5 z#$tmX@Aq}uV$y&pOe4?m@a`|NtwlI)5oah|SSgRV9s;8x=46Y@a_Q1wH)B)?`hY4T8 z|Q*# z$Ia!Q!|8z);Ez>fYRKoRHsbcgK(w8GQM&nQGg8@m{x@&@_V-qP8KN{W=;4utV>*n&-?cffBv*qPXEf<*Z<@J&q#@7kJ_UIOJ=M-mj zCr{n?pC3}*EozPK2t=XHA<4YuCIpeIT6}nrW>67@HaGw651ZcQwb*1E10CXZ2AwyH z1AU{>;27&V8za#pmY!mq$@(7tBgeSMU_En->p$mZ_sk?LT*}$U(p|E}sC3+B-e|Hr zPL9w{!|ZzOk&}I8bH?_N8TUPUub0iDlDOZ-c>bCtKf9iQTjc(kw;v_fz7+@6Zq~B3 z2FcAMVvu}{JKm0cc zB)LxOWb`!U40J_1`RpY zpZE!OlKaD0^xr_O(ejm&u~jtsd3s}M_f^u&SrNGH!E@Vcjg%i3itJeC%mH(yaZTwt z+};OnlZHzNzXYK zKQtUmUE`V;GzOdrW*!PcgPIRDv3!Ph)c^I5e57$;FFW~c5LWC8(KN|+$Nh5lOVf=s zFQ{*@eNZs&&bzD$GINCCt`PM086}PEvI%9o!cboJMg4{OB<@|%Uvc){oFuK@n}+&E z#CZZ*NG~fAag=?;&dOJsgv05WL;lZd?PAS&-E4ed zt!`^upjqBB6Nyz`Fno}w>G(Mfce`_6&m}{%{%HzUbC2oC@JNkSWfF>#SywH0(cFHP zKy1((>s!p#IOoM-?rUt^^3t7=G))DCTW%}h{T28oT1FO*K{Di$orc&CN_lT z$%PPZvuiRKo+q z_?dp8$5cb+yI?nK`qM4Hl=X!pzNPXE544u<>uf^!o^aHTGJrF+Uf&l7{}pHR?a7kC zi8Nf|eOEtTB|RUTik>#C8LYcXuMQ>Scp&!|;yO#~4U=$<^>A11+EVcIbb8@(UQ_eD zX72cGT)$5}G`&+AWo9Pc^z=r9<3}`K2c}~W&!^+L63vS)sX&1@ERN)9%ng%~!+2V5 ziq`n|NyM{m$FPai5ZEzJvwu$v8ZM!KZkIut)Q0rr<=5WRCuzJ|hvV*8 z?zu0ir

|^W-G@R(Pw1JT(e|!E9f|7B^D$YD};44cwXE=&d^biXM7A&&r2FRpT^j zviS$% zY_JFYvFW|yqNjFU<%03#o~|_Oq?y*o5uZ)SdFq%Vt-rYu8Pg-6`O*gqZf?S=&h&Ko z-=BZ$Xy%9gDbl)!X=pWo`0(f9QqZPU>|RY?_jF_F!^dRAvUh8L$3!YxmxOohFX9dK zB!ku&Fj?otxyTcZRd_aTw4x5fvWJ?I^h}Id&o~#{(;Vq1>`a53Ls5hjdZEYXe zs*Y+_u1rRwF?`<_M0%QP2HKMKUEt!4ojT|vHI1I<8-IRJHZ^Wm92pCTu zgouz$=obEWoJYr{O80-KA(|LP+@Y~jQf?{=SR3zNH%Pi`%G!gyaF<#tX^=>Q%^PwC zR`CB9t)>c?2#WAl-ajn zuax79_YEyAT6K-0J}x<^(jQy;xIK=- z{6ZCMnL~7T{~hN!sx(R6AssD9ZOk!;?KDUnaqiYVLqUlH9Tu1soG7HUrd80;C9qCQ)474YY>T{-+w6=X3 zRuWIxSo}q^vPBC0xVfjAa8J`lKMDWLqi%N7V$CUo1gy^GUZty-ro=1`)|J#8E`3p! zIfs7J9sO`~x2459`zR>0sIA?2tZMrlatYl0a5-p?s$u^y{KG!PD!;jUYI+C`4xuMP zwY&P>)nI(2hGYHeE9ytTgVA$!FudEf#GnBo7-JcZ`NjRvmL5Yp%A-&xaRhczXKB%- zSo#r;L?rd&e`v+Q@zVg9cBgjq+!%5qYao0THK0~T;oayRs^cTro5x4tt?3uZah^To z*l6e^^}y>T8}Xy%-*HaJPLqyWreo`P?#mpQDtYLp0g0@czm1Z1i4^Q3_Un)^Sz5U! z84i8e-~BL^8sE)8hY#EpZLTZT^UlHI%hY&xY$9#io`q)23Hb~3B;A+{=(5jhlh#-& z@lV4E@+~6=>PR~7DQM{AixFKuYOLLp@PhcxkWFVbd%P2Hfbo1YKUQNJ9fzwc>36Kx zRD)eHn3G42#IYV03(rKM))VetZd#_=cqjtR>-yuX_f1vT9bvd(LjT?EmTJ#`LQ#`D z^ZVPRs2Bbd!XAX0@*i)iW7YI}W6iMi`x$i;&T5}I2P1rkm%4n7FFMQ(#)gQGDuunF zomnt0wDVLoeB^viBQfR8r^Rp4SbP<_07q7&~GKxZkdf?@zkci+*(>zHxoS? z(F^Q=zI5?t8tQPa@#bI?Y53<9?0rt`Jx5Eb_mOq=ct2b?a$mFeQv!l{CYPVg)eQR+ zhfwNFO{+CpV|_0M?&QC%a!4y%xG@S=-RY_GG{d~^m2j-(XG~)+sIHMuJ~`YUNoVLG zJ2(`(SYu4;(_Y;olIOFFKW_Z?RHdIMH~BSro|z}iFEY>BoMFFwY)e_}6Y3K_B;TNW z$I^%7s#qs+cHXYG%A7hU$;1Q=GK*C$U%BFFcrcDsR9NUfazfV<&Qoo7NMAnDOT{mY zv!})KqjEb4ok-}sY6ATV&T!?wjV&0eHR(gD_BoEN-tpCwH?oQA*?#E0unmev%d zqKLVoZ16nElicsLSaLO24V6Z}%Y>!BHztp6FXddy#eocBVmmuZ+w^nD>!5zMUuP-1 zbrx!ni!y7Dq13TW1{#sG`cS8x*SYo28(G4fWgqXiHPKCL(mFKdyAH zBXv0#hemsOhF>+8_Dzb$CeB5g+-V|tI!3^>26g;P?w56_5rI$lc~)C!RGB*AsLBk0 zzFr&k@NFS5X5W{3xT(7TqCkvc|J!D6scPCgUs&k-VU~4WRsa6p2p;Im{l~o0{JhOzej1fbn)7Dw=I?P(fwY_9GV=I;tw>f3lNiyAqvnom#d3)g92y*krn_3i|bHftiArCJPR9)}vifexYFn_|PvbbC)^gSO$ zf3ICqIpchcz4ktX#d7sEJ7ltV^*s7T{dl=8>X`o>=gBe2Qj$&vrf#H;*63-{-ofbz ze$Kt=j^m|WOVjXj5w)_%&XPn@Dt@pZY1UaS)jpktf8LUN*0-$`b8{=M^ruGc;|@}< z!MQldbMvi*q11g^Hj;Dvkg=eXbZdDg+Dze$KenyZX;V6ee)Y%tkGj$^dVD`34?y{; zBS~M9(BTJtB4X=H{a(c*r*0tc`}R_$bqubsW++c>Dd~GhqS2fHysP|K7R9|bm*qTT zKgv|SnNKXNf{^yjK;6$V6juy_xG&UB-BddW9q5y?OaGGU4D-#JZvObL>8)Dk?2Rzy z3eEh^hr4p-lYNML6UlE%kM8uqW@kS<_s%nSzUGFwFn@G5uc<2S=!$S^uiN#UU6z&Q zgh@k#u6X)rMl zBnPstv?eea1GWaD@~*Ble0l=hb_QaxV|U3WDh40fUwHerl6u#SLVfB0p1-cAN%M+? zsYMW)_TQ#jZ_OT}H$51JHdP-u6N>y_LAX?-fjUIR*;Y33AFpE7OXdT!O6I7#jZ`nn zy`g`EeMpzSrQRnw>!W`9vX2#|8)|aLmw9PdW0N5tf4X6nhWYIpJ z;_W^sY;q06pJ#f~P<;nDzu`Xl!l%-L?RH3B9uD=Ynpo3vC5~kN9p{lr@zPk!41Dt9 z`!jHiv^gdn1BtnvF}9Gte@#Ou`9FTXBcv*uH1uIl-FS|0i)?aKUX8xtL7Y!Kr^injNSi6)yXJ~+Va5|Vs=xdaSejj$RLs$Uyrz9VYun11N$?}aO3|MXJ@}aDbgby zd0WWc`q@*O-y$7Wb;ujs&`L7*O~X-Qh3}@cmM&GMVp3;%zq;0uA|GYp0C9%8>u+nW z58DPaV(Cu(?`o`%=At5udjwnWYaBmj<2moRwDWg0$J=DVp*u0#Z&x)t24$djHGR+H zk86xA(=eJd)RIJvX6BJ(m>LDav4*1gQA%11!H-BZs~wCC7eCdLA(6-gd1H>xRQ}iKi#;L)n-+alysuV8 zqNeF6awlIdT32daoQAnIykK(jjmEGSvCTm0wk>$9DU3=*Tuas%6U#Nz6SJUiMs33$ zsT#eS+wda67fInsnu_pTM6Tn$Ol5-R`tfWO4`Q5e#Aq6S&O|%jW$$~2YU;MnK;L5l z_+#R!*)S*#E?%q&zAx7#e@LcBaS*Kk%+(lnO@!A}dS|*X)SS8%i*3F5{awp6bE2bg z{y4ppqemwF}L<{6I2sCA~AuyQsa;vs@dd~IXKgsd5oeuPF_>i75Y+p`N9ewt1q(7uJ*IF&5UjZcuoqls(9> zNDp*DoqRvoSjJd)#m@92HzKxP_VE}QTDa|yUoZ@lambrRvQ_b-WF^HW)&(w!4 zG*;x2rIIsx!X&sXBRB$1iM+Dw23Z~yyGnM)KF#I$OLBH2SRrU))FpF5+ zwS|LJ*BS?+$}$*Ry_>4m-RC?-9fW%&&n+f^^O=R5bxq5+*g%d!7jMpPYxrBFJ#&Nk zCV%#xb{3l%=gu~Ms57#=McP1Td^zZg0WFG$%)9S|&RN`dGi!ku)6FO)N9Tu4Tk|n) z?pV?CZ=8SV`Ekm|1FBPSa(a>Y>{53kH^yz~L zI0XA6c7&?*2l1j9_JAXI)GGbaA{5oJ{wPW;Kir#N54jY87j`CxH|7S@cQFt~^5wy% zoXI+JK60e?yCEMuSW6bOZ~3;sT(guMu!n(oS@hC;jJ-FORRoe(*2?17C~8?f3P5H} zQ;Rlr+;M~cO~%{1TDXO~z*6OhHs6<;hZ{PhF6+P*AGfJq40OWep5*%aPeh{H5kW%& z&|{K?`LL^Qcs23wxs}#_W9eIqc>J;Eo@xIGO=)r*_8;Qi(D-Ya@mu1PEt#tiUnsq2 z9E-l2=t)}VhxxB52{_ly8!r|Pvk3c|iu5Ve?L3@padK%YdXSeAvhT9ROeq;d*lRba zSwmHD_ZqPi172fTqkX&pUNcDcNzD!@9cdf*vZ<%ozGt`t#WhQq}Gpg)m)z zXsw^D^5kCpm{LC&Rj*Y&BmVQ9b@10}bJblDjPg^&I&{xkzCaMa!i z(*)Mi>;>+*Pc*kQaf2ggxc|)?MgKIF#%sr;KI5#)7@!I9ibDW*b7ovyaJce9EG9Rl zzR;o<7ANY)!h0QeGy?joCL1LnlzhKNR|lvr9ZN-on*0a9xvIs+snC7o13N1()q1~V z>|VrvFd|B|^m-z)iD!0yoThq1TyEfK#^>!;RpnCd5%2IrNWDB&ooz8V{GEPF6St{? z$e+pKy&o|;U8U6_5(f4>w=LsUZf(P{*@r%bHzQO%UW7nzy+5}9=&7pi$3ECH09Ty6 z%SP>_Un*-1gAD^T!)6Af?xtXrI^QX4+#>+rJ_q6a>vpA2$jLQh4ZL^n8S@8qyR)>aE>p5f5A0PC5AEy3R zXES!Pmwc^Dzar{R9b$jFVX?OP%TQPLpnvlUUcG#&38)p1Da1EE7;P^bwK)!Vh&k(q zU9)h~#9|itPW4J0RKH)xkSEK&+bm7Bq+SAYsjE;gBwn>7H5Cu(%~z$~r5aNs6{G&u zn+-mu8Zjjq&g4skbh@pwNlQdgi7(bBy->Ay5|4C4KUfa>pvvkNhbj+0^j!W~<+LmY zZrqs+DtMS5lEmHSjOlxs&|vZaX*r=eYH*1`dBFaBK>i?!b1K=djh%@%a0k|N zmwH&CBLd5LwwH6({*+vf8UZlMsb}8xgA2Y-BtHDVKmRvRc|LNVCgXY>TF#+vMtW^? zw^4C0<$P*==gF!?{@f$0&v|t80hMn-4F2JrsMqN+*P0(HnssW_|Bo1BXK`aX!C zQ>j|EKLw_&nM$|SRBP8xMzs;Kj{A+&z7rBrE1vzhw!XS&OgsiMhv*ixQyWl!VCEEJ zL=!uxyEc!3O$xoK^xLYt+7M^H&-}2wsXAkC1au6^N1UXkZp67&b8=DqrruVqOAkdJ z&yR8|Ow}?n1f_)ms5dRFtQ+TsF2^{Rebr8~Vw?xI3`5hEJEU1V!#LNb9?h7~QX}gy zYP!Wi^QMJtK#UW-Cla@Ikq6HS!Uevoerr0*WlOoQ`8XCyBOA(wtvD0k90{p^o)kbX zjc%h53~1X(?N-wTb993+w0I$2aaNepAPAZWZFAj)E*L|M^}lfrZ|9;3ijBqU>AY*V z9k+9rMa%P%3LVf5t zvE@J1%ey^FJ#KI`tVjCc`j+A9cd_L7QPXzP&B5x4#EarC6PLKyUG3-_h9$=SICw)> z?bkgNngfi#bXpZRFa&0tvwEqHmN>_Tpyu5m^m%P4ol77$uQ#<$x|T{Yv0AJ!zja^vLENwckadGUCLnDz?5-viN~}D1LeuwH8dX|iz@q$at3k!O`{_5 z=-n|%i(FbW{}80BW!1rs^fqO!_@T{sOz-K4ydlg>TVD+^x#o;w#_hjxu3fXfMyo~i z|1@wG#|~G0PK#naOb*PvODdf=%#Gw07R9zwXLgT7^PXNvif~cVn=}lIJ!`lK_dk=C|m+gzhvg5=p?|Z7XD!E(nmY;F(QRh7jg%|lk#|H+fvrB>z+{h0n z8oH<(lM9ft-4DG*L$x>W#Me383p(+_JZVP=lG%gzXmVI%O^j4$XeefH=_pyA3qr3$ zVc52Eq|~1GW1@99#@3i2%~(u~_7gcGnKLC_@}S+$hQj0ec&Y9e&PX}mH9X!|${OGS z6Y_7&9xTudDsVwq;{dF1i%{ou*o<#R0odJR9ELr!XTLyCM9Y0c`b~DmAD-3!#<}>` z#?nV~!g1b`cWuoCRm^YB71V+VrR%{>zp6}vk?Q9`A=yF&yd6%`Cbu@w~VJ^P@dVmB&wcXxgB@%R1l z;u!B3_vN`Fth>+JYt1$1Tq)A3C2N2Kq0~BMN*c}|Qs0wP*kyxc9-e^AuEch9HcQPf z#i7TzF#1I2OUJo$_8|KTL*IQ;^v@{ddWPXsX1Y|JzxR21JDQz0mOc}M{4F>mX(vpa zIj=s?ncqaS!|G!bV=*!z4*jnhXcAwuKh{Zrox^m^Q`UewNeNhRV~M6@MK~TbAl}z~ ziKcmL`kj1?gMr(0&6z*s!Y_!$?f1r-@zldk8OpPszEJ%$&j)4xkqCL=DwQ|(gzfG~ z^sq6&$;WOuLEggp#p8zUx#)$En5uDZ)!~y#@5V96AHe;vffrQH*V$v)(ie1Scc}^c zNS_S)syHu|3~qC0DC_E+$SA4t{b+QLH|V{yF;lXiMt`j&&I%`S--p|3jA}uwsTbqm z#=3VVIYn1WrCO_a7sZ6Y_w0EopLngy;SlaTx+&?*j76&_A&9v0Q0mh%2FCS6@n-I8 z=@R>ip?yQqV%%40{Al)nmh{sY`&H^{&l>q5_XAlUm#%)H_YUvPuyIb3&+}*u)#C4) zX0N)jBo<9ItmoYG)HfH!qO4jx#&qnbxvdw2$W;lr*wj+9jXmYm!wH!A)m{_h8;-_f z5|C8gR<)t7#r zXz`AknR9z3XZjW6aWsCNyncA~8&C3htH!y1_i|NA<8YkrL4BoXYpI?#@BgXfG^Wp! z4i>Vfbff0^XPne`ei&Y@rJrr9d};L_&L*gbn&rG*@|_cl2s`eRShrh>z8O!iIO@(^ zOQrtb2Y7G-!c|8$m!DU{#vqc#QpW#Lf~)zO>!W2=nJ)| z6=l`Yk~6v!Kgs<#P#e~ZBakzS{Eg9CtVJTIapO$<&;{xCtw>zG6^`76A(Do<*N^zB zc0|1Dzu3O`NE~n0Cbc1TE^m$FVbrd_#-#=GPe=mpzgwc2PfYsju>`F2bkMX3XN_sg z+4s5S8aosASe&b#ESR9F(}nw;M#iClv(BHy|D7CTFumVK^|#l|8^+NH+VRum;|x#S z-$d+Xkdc(x!yUh~Vo-hO&?9{#Ju#Zvx&O`2Pg~WJjM=YmAwNI$kdZX~L>Pjm(-Wh+ zt>mA@8r+-OoWx|Q#?mm1+d!`P@;y@S)i5kPOJB-yyQPbMym#oKH^B0s^s0ISEWT2s zgp*QUzj$2YeCX1T3Mq7Y9K=fIaJ{F}kX5m;q@Tm(%8yd-rJOTg=03tk)$qGdG_>pR zt{hYwJDxKR^m4a|sEaYI-9$0-$>N&4Yl*X#gdyMiinNp(w+`gQmQIL}<{QW0+cEao z@#(51fw9mZ5sM^gy*kt}7AvR5V}`n)#-ID#FEP#q21_(&pG4vYIX6vyuhf{whvRP~ z`C9udH36K}cRU@BzkNq(#`oiXoXj{Z|E{ZfmlJ@<7cr=P?6BIcsW0C1bItx_p}z0! z35QwaB?KQVxiyab^Z7h;+(+N4n6EZuKNkAw^Kpvzw)Jr~5reCWkDAXV}onE-qGHf*)r zBE@;f)6bTg$I^Y$n~iapPff_a3bnNHXe?TiU-hc&ghcf%j^8IoG3cU{&EBE~bs`PQ zZ%LmAMImZhCq&Ps@y4^&yFJZk39=_uUn9F{(_k2 z$--Hx(`n>44q$C}F;V@PI^PvM&)4^~()4{5jo*_KaBCSflUZvY<-J?|%~;LkdF=by z+i$BTXlf-S^e9d{MUGADBK2Kj(b|W3Z=I~J88V&u znf&0n4&yae?YTd8QY;3WWt!aU<%vpix&QY(k3G^(60E1zGH={D(^zU$L2bb_`oo0w zlI-^K8TI0hgELd5C}I_BvdQ7U<0AR6=1t^zo?LD(b>GhZ%Y%H@c5ad|NWd7L=ei9e zq)dx=yyAIYAty@q5pjs4o_9fRhP0h^*GQh{H};#Pv;y8uZpB06Y&lh4#u=1{MDn3V=-04VaSbN>S}wVv5$EzX+vwxWCvn|f8#NFaeK`-UHZ*r z#Y6jCQ_VT%t%K*|Fn!@Sb)!<&wj24gTIQ$+av!wdJ!-u%TfM~02aCQ&!D9bV&7XV^ zn8tBWywg6-2_H9{Pme+O?ITpndU|5QrKfOVm5b{d`j+4n1Sb)%u_=@*TCH9p0)tKVhD~7l+se@6@ZDiIMh= zLt(EQ>Yp9C$D?g5c2(r74XDxCv^^SY3ZZUn<%gBG>EY9StvXBXg(Uj?IIi^4Ofev@ zU;^jtbE?Tt^<2?qLKGbJ^i_?h8*)vks%z`eewY-;{QSBLHS8m*N%n$w-^3t<&HkzS zPHx}_;?h@qb);qs!qA8P%hor|q!pLLFzOin0ITat?Hq{btl%Dq9lFx{SMkKh$mieK zT5{?bkDKkN(@XCvwHp(M{3-Nizh^9sv5uv;KRxjC21#=~sePdCrvD+8zFN4G36FFWzxzd9>L#pbI{a=ogdhg_WJJC18=aXs?bA|4B&ScwO zRecB~w(3Z4D8s9&K(jDZB+)sl{J_#)9Oqs2?rHQrI3Y{+xg`lQ-0hkE(A5M-bJsj}qE^j>ZV z`_Jl<@`rUYxu$(j*OF@Oi$Fcj6zV2_S9QqY?&(149Mboxyd9#@peeDwUp-VFZRuOC z$Jy>?b@4RnOk=d7(dltZwN#hB2NQUIJz1aw>!~kOOW5%iJznc=FX^l8h0Vd7***NDK3~rbmpjtGqeG=; z+$<+FnnA7j1Pl4b2nU#43r1#-KuuJR2lC^cs^sTGZ|6%_H-zDAhagOIdadfSk#)sb z`i;*$q_SBNhPx}dJE>o;>I(7f?g`XUs%aj9S|~T=kH?*6-#AV_2$}s=;Pz zS})K`VSAve+4VSR*PzDXWvJ@+_gK{L6@uhFk*e_4#3H5F;4JkAM$;g$$hZW3$w0n|pF8lakP%bkP!$j$2- zZt}Td3|xu%e^wioJXs$DAI@JKdp{~Um&kf{b~OHITBz4CC;RwEhU}$<9A14 z-{wy0UyP04+X!fSv{FAE5rBMt&l?wX)W!3tkLX0LTVSkMNQ9oXp=oiFc?+5Cnj@>g+6GPLd=G~`Gg~`-+G3Y~`RC3rwlRU=9Wez!5 z=BG`D*N8@I=I~jwPnaAzPaVlpp0ku=CPPBVRkmfVGAGaE7-!TwUxwg;#Q>Ap z!Ff&1Wk=3v#b6n0>wx>iON{x9tR;U&=XGXDQ@v=cn;(VZ-p5O35_59y8-)ioo|Rla z$35>n|9)q*)s=_oCHaJ#A`(Vj{xLVUT z+(-QWgDQY}jW~(>r(PwivUY}Irv-h1#+a!Z*b;l=tah=kmg<{^-le&$H%==KLsd3vD%@;Uel$(_t6vUn0dG>f;d0LJRUjnZN_V_!0yBt;B2KKu1tHimR zTZVLSKmeZC=gx?@x>8s`0DL+#59h8|ZCplwn!)sBSTjV`XE@(uPA%t@Qj;ky15lm4 zdEeX%!!OMa$E;h_UOh@JK1mG3jrz*i6EjMBq(tG44R<#ft^a- zqr!2sIyHkI?vxl1b9=ZX6l1r9m0XI5hW$70n>qfaST8#oUD`%qLV_rM&0hSuC1>t= zBTD|$SjA?B)1&xIiTMNmTxG;>V+X5OuJMEUP4)#-)~b#7xTB#3xf(woslT~6!fCw= z&Mlg%nZaGI7MoW>ocXD_n!60DA{*=u3X_}tvOw%1YiNIXEGMTggmKw&;^e1g?KJND zcCWhUaX=4^*}jdma;EA$ysE`VD%_!vitHqKi5xCZ)X0Ozmq#e!se^nu}-MZ zzjwh@wPkE59`o7pb#AQIu85!yQwVD7XOx`RW`D-{(N~@0#Yfo_dvZ42J9kQPK^W&7 z&f%!Jynl&j0{N=!X-zzzl-&D5t$Ba$MRr=C-aO8S`wsmvJN1y-=(7v{`qHml)j)G? z+$wbZv`sGoGTf=;D3kTb9h{eHt55lE0B&&aAzagi9qS za;On=CTGu~uKFi?_XpP0bGdg_w`MH2EgD#l~IHIKfhPR((k0UcM zY1Uk%zgOhNf2NVwY+fbKE{k4C(nuR(wA5oBoi8bwwzyPAzV!nw>7ZmScy5crH8=qvwm;|~9{M&)j=EM2nEyB6ecm=(@ zo;*3yj`!!8CDbhY=#+ekq^}QWHbt+h{tG$R?ETeg;Ux?9M8JdRe#RPul1t~=8xm7Jpnh8HSrCP< z#Iffu`&?{a5`jsqw^#4>C^^qwXDRREqWzCb9?-Kc&WQVdVpQrj^{7qLxZ`xt8g=qd zdtCXx67?!8)TeW-ky39d`JGmpzi%yYtLA*}xUC`oemoB!+-AYSIYf3_GZP&S&OpPA z+j5!iR2+Ua4Zn{>$zLW-L~hW?Dshf`^+$R;%m(_GxbL-#yOf<~3*)1K)Gq2vKRxYm zdpCDhje4${&p2OAW&FL0R5yRGz-%vS&g&$oYHV`FdHRuBUYn=t3@9IEON z#yv}n?JT2isv^d%_iW~tJ}p%r8QWmS*5-W!Rc*d!Lw|Zz{j8;$6-b}*n)FJV|HmYo zU*D?c=h*$7i8V38<&oS0UFV=lBysB}KHPoNt&NHKE%M-q4c1#Ytk~xQ`4`P>oybpz^m3Y}59 zIih6Pft6TcU_-B!*pi(cmLVj2AqIONP}Auf6Bo`Tw;)~ft;-yYFPH+;r+ws2>S@T& zo5WpG8{~s^CsC_D0Zp4M)c6*U#qPr{JezlYCk6eL_B<7Ga^`$3_^GsLHBMrZ*nr?Q*ugXA-bgxjgWt``dYqIdo z1(k~DbLl+Ztt&36{yW>%*kc~czp5(Z*TaVpYu$W9RY7dKc^7)MY2Q{=_|n&e=T_N& zN7bKSzscvtu;*>nfBWz1m;`dqI*wD&$JmdSoMpTQd@d!`@hN=euRBS^Ga%D zybqP=P|Mz&c+}_4b=5tqM<9wAOa8@kB@HB!^xFyA(ro?>rQ%P-AD*@bbq{iu)H z+Gz?_JB~$*j8IK^(RkSAo8je>UC7*I2CtTbs>Jzj#}1(1JiglPL zo3E4%TDwC>kDATB6Qo7i?x;m=@|{pq>3BB}a$1--XG4m}^uP>V`UF}ImqvT}{@Z(Q z-f)nlQ_7u?PK;MAl@#)lI{>XXXWTkks^IH9_M11wWNGg!=5k}6=jU^z3-9TXS)HGU zWGSU-ac?H)o$AIml6P0`h>YdF=j%(QLByy!YX!meOiw8&hCbxugR#Gbq8i6DJb<&{ zxwH0|G%SzC*%$OM@j6gq#{1EMI*yW8sU;irBar$d7;Yi&P5g7H1?lLAdC{*_yJRms zDRjd9zur>J8wUifv?8zRmUMKlHM*Uejq*)B(K^opyRS~b2zs?jZ|9-;^wBstWeaB7 z&4S*q5g7OJJMP?_PA-Z>zSl|9I`yp(cFC|xoEP0~MIRkEyk|aK*mk$H;E)^kYjfA0 zNs_dcn5uO{;we88q&>IX(UGxzC8tRaE*>aq${hrswo3bcd*B+sE>}Mw)vDu1{5S{` zEfpzHo6j`w!JZb^CBwnoDeul)p#Mfn8o{_RpIq~-fwlDBh?&GWdw2s(VgIVvmm2ew z78qhlZcZcS_a`0T>cag7ta)n8?tzl%V3hM7nLMovdQz`hB7$HY-;j7GYviC1G`+3n#ddj)(1@15CU(!w*M!iC_MibN|V*jFtfA6hBkH3TYDvf&MiddOe^R%vqtgaX&86$AZk2Yig$0v zp=fFo(}A6q;@RY}m{^!(s{7R$9+OO~#QFWoU#*v}9?6+70=&`SU;CAq|=1 zj@J!{Kilk==6rC66YuGhi6bqx>le4ZiUNoW(j5FWvJTqNd(B~$P zyOy3$klg0`!n3|Fp5;YLhLLVKqwjPLw6?{i{AjNeRnsl9qLp}E(qqhTY z)S8KBWVG8j{Nh94G>f{R-) z-gwgA;OYXTM{o|n_&eCR(r+~wx~q84arc1FI_6sD-cxs0!=Aru|LN>~dS>9~L1Jhl z_*vL(!rBwT*vwva@Y6i_-XQ;dHgnghJmhlrvgjB0Uj4|xwrJ{Di2;`UjK>tKDAe>P z_l)@RTyo5JvZq?i8A;*T2uSL1Bs+08Hu;_(IcKz=Fcu3~H`*Kx!#ww=lDd#PpfcEp zCU%j0I zR1V@ChFr=H2lJ4{XCpO-9{sJ-@w**!3HzD`(d_g1tX=6x>@w)KG*A_YO?!fIG_#vY z-&wxcInS4VL2cDjI0wwhcY@y>OKg1Pip#g`a8tj)G&9%P-T%*vowgu{P6!^CxVGFRKvf0(}eyNlUpv&N1v z--=&ld=KM1ve|x&J4=5l)+%{g8mKO@9~{eE9d`mzH|ZxglJ&{>^C)=AnI!Yf*Y{UY zT7&18pVtK6vpAK+86R`jmOF(o>PtL?J_+Y1=As%sb?2`N!=n52qK>0Bj(nT<=L?at zg*kg@IHG#*M<03`WgAn+ay=P(tC@#v!?0C%7;3Q=%XSRG`yUa~h`o$+m_Hh1*OCf2 zpX&X@6{RK{F>R|0F44E~;kaVc-jNQd*M3ozINzAi5qF&3FophUFZ`cMD|iq3*I>V_ z`$lqN-WbF?F||S);SD`tSC2b5LiF)f?SZ$<+u!wuV#fkcEaK}Fqp8^X)(?A)SX%^H zBhHFC0OoVF>5P#o-AdbvUdZP@25W;ajG3B3UH1w|IPF1aPbJj zoFiIh^%L&GX3RYjf5o)~&B$0c$#a{#&P#ZXu1Iix)qO51p=}C3!j< zOSn7Isu+zp$8YkEURC}ZU`9Tv#YTFp{mR0)9}%ccoPCg90o2vP;dhbx!Gc5hq8*AC z+vy$MDHl5f=ylPUURCdHq0k>O){^|6Mc<_qp66+wsNoDcDV^Xwb!L$}LM=`~+rk;c zsT9(0W+A>$`{Hae5 z5_imDy?5ea7xYW@z!2sWFMU%iHs*QenRmZFi+Wc-TxLD|p%rWWiNyQ)jB8Gib4|@w z;>;kt>%@5!&q;5d)e(~u*#~eB-9q|%P%qenIa!B2`dwuXPru z!G+xXj-0KJ^Nd2f4w1;x55qV6wcI;Fe`w;o4K{AYVfN)es7)BSd=q~b?y3%@kFLHy zlACcqE%Q{++wKTT^1+^Te|%lm13|2HOIs1sKmG!v+B(6Oo-#ihmYX_^A}(QSRVB{T z;yQA7x*IgaC=5@%k?K3T@xOC7N7J3E7@0mxjAx$DCb{dU`t%-3DHA5w6Bd$C?H>i39&`w{M<=@No5 zb64QwCt}eqq3C?g4fhVwE9rMAGOxuWZ$&7+9;6m4m%Fq22g8-Kv#Z(kc{L%%&vP?w zu^GbFdgIS6YJ_fBVSlh2`q+4&a#C&6)gK)2&D;&6#+)`advAw_>C3CcIqY)>6kg)z z@P*!?>2IadUT&EDo4aYI?o_q(a7Q1W;jm`sWc4v}st3_)@vy5XzvYFdk@O7Q6Djgr zc;n6io~6DP;=(|GWSt?-V?0zihR`eV6K7lgEksM!T)ID)^EGefxAZdX@{O2kmqPhb zD);$(V2yV@RG!2-Wc5?dXnGjP$(-vpV{EhfZq^K#MZV-=)^ed0hgS|_&dDHGsv=YR z!Wygz@7DM2Tj9WO-lcPcV5x6`BWCounaJm>h#2$T5PFu-(`ln8HgS*Dul0Op#+zZ{ zcJ7)uL*7n~DLzt1_|AsD3i``&-zgL}#2Ifj^vBMR{M?3zAhW#_)(rPY`*nQQ8qCB8 zXD>eYzW6{r-q`7`IO*(x1Ml@rKV7j$t@_*ndFzB}-50iKvCpPToL8-Bk6>?CjAfj6 zta>f&z3B>>cjEK~8LDMX+)>87(E{gXhY6mT!Sg)gk+T>++6$S)BQ)G$r)BMh`30=s zRLjJa`F`kD%6e@4FfpxVFpl5jncvV{Y#SVmUiX7=(d(^T-H7#DCGoqnMe^P@tQoG* zm)I{-ZdW@PsuMiVu><5Je?R*weZKx^gF~Z2u#{)~=lr=aBQBcLlRWv$`t-$&z^|d) z)qS-g+H9bg(ox29O&`4DF05Ug5l_4`5r6pnJ>fGGV>Su?X@1CO-P>`*1mquKo}@l@ z_p%fWU*JNF)&tFIH8I`#XB9T_`FA}in?`oD#gbiB=T;l;wu4JESL|cYHL~)V^xoGM z3z@6i%yL#GY;;2eYmcXIFUr@8Jz&B+DB!%4FwXEquov?~LZrBrRBq5iYNzP zyyfp{5;|18%^}`-nrHP+Gx0(ur|Bd;th&CDqxhM;VcrOSS||&~?-Ap<)izRA1@K;F zZC3B+Ai290XOc`#3pYYpb2A37CM?3xH{;;bj)V}|5K45V^; z2-fv0lUlL{d{UD&bKFPCq%pY?9az&WYKev`{owRAfIbn!vFNV{Ixq3T&9r2E-{lNb z&Rm}w)i-r@ScMs@Jz!nA&vb2)4fdW~S>-&xOl^bidtES=aqeXKK)TSz6{C2zV-D%6 zdW>*GGVjEz)vw8Bt{$jo$U6C+qi}L2@7IOTYF>Ad80bmwE^29w9?Mhy_@XgmH26u9 z+=4Mayo^|9t5$N&hkSOY^W4sDueo}g@n)}at=S~@^29_9Sf`2aQV`GhgeF1I-!K?c zdG`Oim+e!R;mR{|R13NPm$g937kYb#2Xaphd6D(mKQ18NH76Old`9lhUd>(Zh>Z0ImI6RIr=0~@yCQ>IljP=c$Y9;Ci9m%V06oOIT>Z?`` z48z1sY8Fg9rKkKErZP9K*>zT$`p_2^tT7_qwB+7y4;*UggI}k@(2h06sj;5$^!$!C zhN}>L)|0-nIi_>k+TcP@hbnRQA5)4u=}B0^zI&PFYFJT6;Ldw+rbi7F1X1(B{CuEq zTMXx1=mz`oGGzcRaJGM1i+x1<@%S1Wg0X)C$>W)dX4I67;rlIS&4c?>^5S@h=Kfy# zZ{N`!{@r@-?C|{~y|`-d>>hN4oKC$X|K0C(-O!GHCnG)t;xl{JWpy~WqHo~?Eq7F$ zA>ZtDAdU+s#HNK&2hSNq8(YNKP=`@OOeSDHmV%y?^h|F0coc37;+{JCm5hI`jeD!Z zaS^=Jw>?mmUE%NYm@}IB#TqAahz|13NI6ul*|s4n(8ZwQRGe7^A=U8i6M3HPS*y?aE=8RuN0+Y`roNUc=+$?UIYORODXn-$ zop(F-HP4SqliHC_$G_Wcb&j-zGsjm(yca^PrHJe7K}@KP_wgvcM-I3X^U=AtXEhey z(UAV~S<56UepOwu(D>TMU+$_Mz@=0`=_04dlY3>{EFEmi(4AIl1&$?ZJGvL(&|+ z?u%PtD#u5H5=fXP4 z4bl(dQ(wj{s+qi_(JuU89b$jGmh9@h6}5(O#^m)*^CoR0>Z|z78{E)nzGtDPDe(f$ zaq8>SF=iCc_QXS)nqAl83v0rGb$4h!M<(ILc-DTaHfw6KwrjZ9xz z+tM$hs?T;twI*_4X~w^ppDdPTJ-t2f?MQbqxDid+eKSAk4O3fi1uOv{z>_ zwbj{w?@#H{SPa>$#!r4;%55!iXyracGbda~e=BeKvmLQD`J6VqC4Y9#MQv@K;iyxx z=g@3?=I8i&-4WT5o*Oe7u!i|tAV0THr5262YizEp>z0fu&3LYQX2~m_C&G`Z10Jd`M#P+Kv9xjpZGf;_iJELyPMXkR-~{&tML{Yb`k);d}11a#~1Z#HYvDW$Wek<-#DdMcBeWrYGALq$u*te!f z$V21(udo>B!_V|_^fn`7$$`pif)nn@s#uKOGj6V**8z%z}rBaco8e!@2#N!F!!YAB#P2L zH?fX)#KgQWk;8PV{}MI3sVP$9c9%Fha|P-2V?}8WYKX z*tb`1t>=&7Q-TrMY@KXj?nSO3cbxSImt7{i(&v)c*62vN&kcJxyk*UPp-fuW(hk42 zRgLq+IyJ@3fjRV13&h!{J|evO5qL44)pq2G360?#{5d*TJd=0A#x=Gac6R*h(B0>yX<|UBHYEs z<6G&U$~?TrLUe4u=^r*ICQlUC9o8Y9cWC9b;bOgiI>2*&#L7q3+&j4|SGHW{iV1InVU#M%=@0Gkin`#f-(P4Pc%HwqC;H#> zJi}$Euz$K8kC-03RJ!dM5}_IB7g34%x2skKK?Gg6g-3> zV+HRgVsz~*xW`=aV)R*YqWl;xF;^@Rg<|5I!x+e1@zQ9EXlAzu)p%CF{7exaM{LJ5 z#_+?j2yxyz7k!y4HaofryU=VTF;|#(SuDmb%|r{{eV@jS7t<=JiRQh3C2olLc{&+` z`V+I--GjRw*P!PFp4<4=qWyX9>~>_Yq@^pi6j7VGg_!N|YU0M*SZr&^-g3($`Ak_X zjuAuY*#DAj$~fQVoFJ>yNm=_d{g%ibaepDpTk3HiMF=^8PDS#8#mwJvA+VaXS8kc% zkD<;X=xmTLpGftBnK}1M8WzaYT$wi(kSlooj$Fn#cU{LBPseQe+Z$W>#8-`TY9l8x za@`(OXP#H)To$Str_qw}G>EIKY@B)@otYoXx3p5OeR~IO#_h9Rb0wzF-+J$>{6AAf+PEIj?er0t-D0UkS+vlnNCNkL+y-Z~5#$X;f*tvG6#j>RL`&%{m_BdK9s%{$TE zSrUV-lF-eav$KIl;sZSmo^0lO;@XH$sqv`(g7uHHwg}@+79&rd%kal?W-V$8`jI!3qOWdi9J>eaBr>se1Uq6BV@V?vS=#T!G+?l&? zn&!(v#2ikLryU(}Sbn|L6|vVsaIO6xxm8VajjD&yuc^AIV4P1AJNV!8jF(A5tJgtf zFn`vb`bX?tapB(`cXLBm#iifVf3G#o1}c`7pRtH%?|WKrC9dI1tYQq`57k$?oveU8 zpXE+%>npd-P9eT4XH4$jMOcg)PubVJta(@Topk^q{pfG3eNqHJ+X;)Iyo0Xq7c)+7 zMZ78d%CDP**``g7C6L)I{okr-?EpBEHyj025DiV->c?}Je><&#|5Fb=NdLM13y<$Lrl z?zw;(iKR#7mfV$aEB?@*t$J1SDvhX1yyH0`^^U^*%xo1BjdTW zYkQ^Cv>fgDT-UW~pe*&)V9Ibl@1uW-u0sw&J&Mo!vHL<#Q-GDsr5}RJMM&Z{EaCZl z`0SwAy)XyWEa>|YkSiX%S`Slu?x%j1B)YcF#E>x7evd=NRqD!bGqzU8R*8U;Wc*-1 z+1+}k*!hW`RNXlbduSqZBNAYfMKAQ}`r?CUJPvq=U`Ssraq<_vhZmA>aNvPF{d_bO z#?Vstv>a{~iHYPab*-nC9qG5HPY)E?r%--O?&N6Ba6_z*$kOKkyyiS0rSgPqTjtF= zF$`@My_VNeD-mBS41k1>i8VQd1A;ZmcN93wO#nmTI<#G`{LcDZ3wjD+4e0L z_8W5Wg*oxmMC`Lz`qNWG^z^M<^K~??QIn9+ z_mX^!z04kma3rKD@{P9PSW*xU<2A){cPHZ5^wgT}E@a2#K*+A)cs}K_yn4P5#_EN` zd{K3wspgK8)T-}}F%^5-Ibt!n4tM>MM7N1{*gBwUoLl3LxLvJ?oN(UnrY6d*GnbLU z*VV?lD$>^%=vtHfqOqY$&aZFq>Byb(qx_W2I^7I9 z5znpPt=`JI`x^Y2MC^1)Tc!QxgBUlDGY*e>N}^eMfw~ zm;=)g&SdRQh{LwoxV(;jAolx2_k>KOA0tjer_`mb($If&r1Yj`9BC7l9ZLwY=qI2-Lpx`tUp|M|NU=FfIb!zTcF~tNB8Qy2Z*% zb%aH-JC>0%sh%)Rc&0hRw;jD?pYIUAR&q{gST)Xd&V3PMTNR-lV>{1us*?NSGS2aJ z_oWfallCvkvwSJ7utP^QOtY3#&qU~VNX4k#0fX?LSi27J6|zBT8_)( zS;N;Hq4;UZ=sAa)C0j$q=Hx;A;km8IZK-scu?s61TU|pPuu@*NOHQlF^=+PyOL>Vqr-l zY8un;BHT&5f1QAgZlRdm&Rn#yipN!YfcUy}607y%U=qTUwWT>4U2$wIcsU^ zhVz>f`xtaWHa!-O{27tlomnEUHQ?Sna;LvtES2v^FwYrAqFdcNavRwfmV4<3vbdp$ zF!jI|y$C#cwMZm%cS4Q*^uQT=Oze)b!<%MR<2+=iw$jVE2#1(Ajt*Okco4ZUN(bgLkX_C6Tf>6Bmi;?>$!{o;OHCeHUs69&8tuS;-i~J5Db)P5j)Eh-=$9 zCp{4?^ppfN+DA_C@;TznqIgVv6NY8ej70yLaX3h?hh_Kc3cI2hxJ`=0^2#T2&lvKw z??fUx_oQsvhI(pp{-1X~BHv4-)}LIEvR)cFgE-+}{U{Wr-;zTz{Ww>SM8LvEqP!vZ zE3t3)X<{v!opi!gYOgBx-V#qU?Qr_df4IhffBp~OIQFKA@7BlPg%s zm^Zz$K?#}t61rN%4X*A`1~2-KAw7u;C2m#>X1|8RFybs8Ny;?Go47uf{PVmZW#OxG zRPtWi(AkQ+bY%)Mz^?Uf^Tc{rWL`k}CavTaB% z;$?D5NBz-%Cjq+67ZVo6XU zo;0QoYgVj~ViOS9k-V3=%f&d?c>EZX%{pB9_qu81 zPQ}=o^&4Y;X!>F0`l|03#JXbH?7hmbC9m<9_uaGI>y-k}n>as?XV^MMvHx6-o6HqO zt=*KrLuFiG9!{t`SFx^n2*=!5tL%XCH+2^t@;R)&sHgJKJr4;v#3&xOP?q%0MfKC% zJN7_Z`4yE7d(KztxA`QdOwGiSMZvIeyCvd+QxX3-7;Ww!6ZYE4SQSlf|APWCvQr{D zPp212;}lUqt@dPVdOPPhiOt*MAs-Lt{c0j!DsfodkQnHK=Au6J-)`h5U6}VpR(5fx zp<@&@1!v`YGl}_A!$17+KH2bFD6&q|E5UJxoSQ`c!zS`0&5y~~I|k50g5HK&^+dgF zFZ7rl36n%?kpV)HQ=`v*=vFu33d1XtD(%J4c@`)!Ldzhz0`rafTh@VB<6vgFRIf5DIi9sQX zMkV7R&vX1yYo%|ULm1#n>@Iks(mHz=zJ#-uI5klDup*B+n>F*`PKs~cTzo&ryI?^h z<@cCujA_K$Y+ViIB{@dly@L@r<7J%9#^_| ze2Hd!-NfvQa;4LE+%VwG>36x3-sS)DMkA{Oiuo|+=P{f?8)Pe!c9vr{@l5YovC5dI z8r+`G+1yMIrEu#(eC0j3+;YBh#BdkdvyU6SXr$7javPegAx|K$my%$cgEuAQ`y!(uY zb zz^`d|`kLo_cN^t6J(SijByXclJ;h3uh=+KgKP?;if#gEds__+&+IT7UFA z+F#6Tx)_stlY^JJTIjEv2Y>eD|E|IRe-Cb)KVKP7F4_vt<62xQQcej4?-*Ot?yr@5 zt~c@HBlQ#)|0r4(PqB{uU{25{rSkb5Tp37g*7c@Rf5RE>IpNp!g)(ZP8a~X`F45bS z`S5`au-T6gnHo6K20W z{)V||T0ou;y?g538!0;Kcu+&i^I3hQXdUNBZ-GF(tTYui4eTJuBm8APK*Vicie>w` zBjHnX>0d(Z8AO?ZUrGrTHa1 zCw6x?wNB}sj(5oYB6p}k&C+n?IuZu(8Nd2cIlA>YB0>I)_Iaf=@(^ya_L$e>kTTq8 z2kx@QyX&w~SvM^Q5zO2A)8mywWZ~`-*3tvLmDWp`2be?jpDj=}S<<&GiJwLPkxB-! zh$7yJ?;;JAmX?j|f76qgT(OzDwUuQq^gE}f^61OwVhnv|ykBxxj@C(G z;28m<)5MW)M({y1~mO!TUpgI+#W@b7g|vD&&D7l|$BMC+7x)@6Uk zINzJtr1X016=Z1f9-P;pv~cAGl(W|!vG==@vsH}=>{C{azN!4YwF_IAt9Sp@D1%Pq zLd9HdpuJ7GW{`zfvsi=PSfjM0SJ^<;)ty`elvd^R^A6JFLK9p*#&Wp z{oKhs>Iw($7YC2g>yEsQErD602RWjj*)Q)%ixrD>!*Ho0j5Ew2v7Yz9{U7v@-0dO^ z{pnl2nLD{GZG=yy8%D6^DLc4WoCu`1^Ns*$-4%wotR@(PT#L)$;1Bdx2<9{b$&kE+@Jqwhe{P=&p;d0B7ijH|4 zuI*+YRAHn%zDi%#udMezwo>+ZMWe)vey4-#D6i-P5lXH_f&T{)dXc{4^iG+u{<5&5 zPWb@m@sW25g&TGEZWdwuZ<|C&1L`#y+ubq5rk)Vv%n0MYk4Ta5f?k(JTZE$9K~6@bFmV_x@$M@ z#FtGrD&xG#J7f-NVG^S>W`6j@9P+%kv*K*D8pD{Y|BRWbbmo3`M=$zqjx|y8-QsXR zoA~yZM<;@oAl*t1-sj98a;~n>l^Nu4Ar$!!Tus)fi_d|K}Jp*a_#D%V$SFW8*#%<>6pwYXPee@Rg zXI-uNvsM|*{pnYDwmV-4R&K{9V$n?UW@=a|L9I}At2Az!jPQfSCm{6SyQ*wq2z z>k`JVC2Pf=j$+Ve4-8_R>HXM3bails_mu#g^dBdtd#!@)Qh%r)bP&_?ZP0=~9X4Z6 z$Uhq`L+x(-`FG{Xy~}J7r>^S1q1AY~Qm&VZXN>ccOAi!-P00ZB#)svdOKp`rnD9J1 zdKi_q^(nyIC)}asTfa0hD-{8^1MzLXeLF z#yMhUl#=j$4Nf!8Iex2@!91m6&Ca;eV3VoHGG}+ zs7+~~N9m}^Gi?`*XeDV8?>pvU z%blx~i7k`S#*(<)sY%MVt7~wVuS0JPP)^btwSYZi$che1b`tQ&G;Yg+ttCWoUnb^o$;s#zQqxz)7xDI&^I}J;x=&gsO zOU$SBPsO#@T9|PTm@w|BVnk2N|MV$;+hi-NHl(7EXEF2GkHp(tnoVcP;BVCs};eS_1LD$qc%w>V~vqiyQUIgl}J4Ud7k>O#qG5` z+sx1PyIvEu=y`jFwa0;nitznI-x!@>xWC;keELM=4(r>euGyj*HEYvqbLZxvcrnwB zzPYDDaN?7{7(t9@7=3w8Ra%SDZRt@%4!M??C2sc&$El~x6~D)d?ex#P+9?$Kj}904 z?8BOOrvF&qKH}bSUledgb11Eg=-Jo{g7>)Lz$T(^7I%lWr(Q4osT}*m>ECA&**;!= zx5)u+tGP4XZL{n=$^)N&_*aRuPO+dgNJozE>KStV2Re#!ahQ>GJoPFz!me zsAsWaaVP`9#_aW$CMmUMrei7^RnOn|36q~$LFsh9A-JR3o=87Z?=j-*&i^OwN=9Y`Z zV>@gUhiWI_(LM5`8mEh7a>GWn;oj=B7?Drz)&d{y{8jsiw&du~AU8BHYKh2Z9U_zv zbh4Nr{vTIw9aYu#eh=HN7^v9Y-2!Ltc~FtCvAZy^Kw3q*MTF*0|8A&ba8Bd&lNlO#`^^L@hS~DlETOa+OBpa8%bTt8MM$pEavahnOql_hWd}aHe#Fw^&2N@>R+E28vKPF|Yp%MY4`Z&nQ5AXzWh(kZ^ERP^9Q(STw(6(T+dP4D zf7gyl`k-xb7{^-HYILZ6n?Ve^^Yh_U5B->BkvLU{x~$&I^clay;X0gJP2FU@c5f(B zLwG(Xs`Yn_==oE}7iJUs>N7&dN`F(+v^mp9pkxT#Tj$t2kk$uTgAI+M)=@VW1Ri0=c!JOsBH*}X~Y`_@4M}2o6 z)!Eq6lfNT5kck<(1K*udV*+`c=f>-wt`wc_1?u1Fr3Zj zRnS_0%Qy@V$oZ+i$Ut8?AOu~y`eIc;6}`kv*u@WhG3x0n-K!75h&oMugt(!r*^f9g z`@rS%PU}KUshc2PH2umUUB5T<5{vM|yh|mz4W;zOr{C;l?JixLz3h({QG4I9P3!9X~l={O>v+ ze(zgWCA$z4+y6Uvb1aK%l25;MYAT0xD9io4g+GhDh|O>HM@0^H^Sm9Y*6HIyvT!Sv z^;nb5`lpq)a4ta2%z{AukKs9R@59+gYdihE(o7s+Pis1IoPO5?W-Tq_oW9O5{i8dn zXtTiwQ|EQjKk1r`N5tYU*=Q$*VSKr6H9L*ADB(4tPj2th0i=6f?K@R zWfF@!o$rHz_3r5O;bFMSvtrV_3f=EA`pl8jlIgD1J@3fRob@}D7wR4k34z*?^>gpd zy5v;mZ1f30`TjUv`?Ku9O#Qk~hT4VX8Z`1W{}Zl}K+I^`0NYV}71ggN6yCbK*H92N5|++jv+ z_P^`ga=Twyh0``P=Q-S6U$4x+=ndZGq3LSkLQ5m{b24(_!5LGhgr)lC zGuTt_q+Zfg%~}5zY;NfTxkVR!@bw&==GvC*YN%g7ISU@H%)8lFNq^{OI=&@y{og*( z)t{M$q675nzHmYJIxrbqPm_Cm^^nfWnPJ+;CqubCr4l#H6y^jiY)oVn<;U~2# zn=*9=EHv=2U|-xLN$0E&gDKD9c6l0IjY}b@Mh(xyxqiCjE+H68o#2kEt92c%LU4`v zvva-aIzK~ly&h1{Ho#Knp8Bt6a}bRDpgSECfJl1uUmb3uo9;vp50@ZxoHbO}A&9!g z*~F#$^we$CQXeoP2#&iN>#8jCz_2Ajm|FNwludKT9C|RF-@jdae(H?o^nNO8_gP!H zpBv)zf9HCn_V}VdlF$6LD&%h6^VUb&rSmxux0n0szwge#`W~#WK2+1sn3RE8JVO@U zxT>>Nr6a?G^~sQZx_5oD(e4dv3IENy+hdtA&38PsZiKF-Nd~&uQA3#RsXNzhGaOQ= ziLza;Yw;%q3r?`Vcs5N}5wQtNUQ_$$Y^A$&HUS5C#-2}u?!ghB8?3MJahUFj!fbjo zUmSVVUsu1O1~sFJ?I-utePXUeY-d00H|R|MVF;f6VODOak?!Y{U_7>=R_#npT{q@s zC6ljTR{B)@>-YG)dk7?#)1uzGVC?n`g`wp^@oNjcmwPdf`;ZWyBI#kjJ`CH-wZg#P z7oVf)8Mh!uyk=c_GnKhctz5+RgBz*E4};C?$>NCXIvj2kfwx!2iT(L5SlB%hZaXw` z9QDF&?ElV(z1M!HZmL~API5ix`A*Zh7{%a<9HiR9HM;W@FOsZ|ohcH(#zJSQWEB#EQFVzBos zeLsDZMSxW#8ujChwON{YP9EKG-f_R2H;cU)tgGpNy5Uo-*i#aMQ||)s>!Yiv#QyR0 zFTTsJ{Y4hFZLM5G@qT_~G1M{y?C{AIl;z;7dHUW$Li1j2@6Xs^I z^w%N(t$!o2YDg3!S*LkEXd}$LBhcU@^{p+ti3s+L_o-tIU2P=F$Aw}?Z~D7#Kd0PM zGrxvDcR$YE)Ak|m=fk^mz@rLPpDW~iiCHBU zQW}5eN!v(F{&`56#P?FQJQ8N!ZDni46M@;02xRJ>y489->KKh}*0sg(A1<(CZ}7HR z7u?wIf~1R)f35SG@MLjudJ)3LlIMBBRKzbW#M~6l>DqS`Z|3LY&NFIqp0*VQ6Z4S3 zn!#yYC-KBQ7Y_d9C#Vg?jc0i%BtH4Gih)?(dkenuJ{mfuvG}?z8(DXJF>g;3QEgZz z4Ep$?o0?z0xEVuSnTK9pU(8saijBm|ezdD2PCeL!&kvb@+P=0}#9X}jzx`nOxV|W_ z7l$`hc~|{xA#CqQ!JmDcX?hp2lAf`;uKt)Xv6onInE5H&{P9F${%mF_66n3YwWnTb z;1P-i^MbLV*1OUMpg&_%S&iryGuxJ??tI`fNOsQ!@mvy5MsS z-Z8#1?)-L!6*G8ZF;EuJsfg1pbxHue?1Gml8-8eJ_dxo=Z-_!(yW8^TOX2WvN*%T9S+VnCn^C zL4-9=#8CP>{ByFZD0>};Mn3df+;diu5@R59UgBz-#HF7F_50!AJ~|q^pg?5dA$AA5MnJW!B+HAU>P-raCsZj6ml6L~Q=kn;iLYJPqfa zG1C~IrcmcKV>3oN_QBgt0m!SFia$eZqsd07wA> zhlYrTQLL+pZ?>CjC^{`>9u|3S2U-SrG*50ecmdYZP@oTxZ8U%B0{3>dxqe zG}u!aGcOFOb;;ctn<72#%B(S-(fVVP&E z0#s#YPfB~NJ58^g8Go8F_^Vg15O?Y_H^-Jfm|^Win?hz=G!8;q zezbC$*%R5sk{a*mr(iT^Ugv@l|E-E*I+a<4tvPobq0<(e3P7(};kes!d}%xOdBg8$ zFk(k_Y0WiX#7NQjGgdE^_w&Jy`!T3MW%(*O=TFzfBI6{$nB5v3E=VVI%$o z7U1esU)-=-EQ+h=L;A!%clk^)p|Ak?#0YxtS|~0I%*SBzfjh0W7cRH9AcOrvd7t&- zfKLt%zG061IB&7LYZe>>xIe%92+!hlysi}lZEBFXlbwokatmkcVnwaGn=ssj@4jxU zxbP_syZ4hTJFP^t7!!>pZJC=qwM10O)4=*7`N?S-VaJS!B~kPZeAQJ%G>$-Geh}>Q zHA+ur0W8!6BX@meWveqYR;q;HPWvO;+QWh{Wp@bc{(rPBJOi-PB@AC`ZYs5F;?G_! z0-dGPDx0moFq{(wqjs56RC^yhS{{SS>dR7boF~So#lm5+N+i5nhw%~d2#dDXxfZx! zS*1-lp>BZs_D-13-0}aO8?i~L;;p_IQAz)DBBzMzIYme!CN}??mAK=&ja*9lwy39w zp*;$r4fVzK*S4bn(R_L)Fw3^nToGeci1X(3j8-odLmuYCm;MXQpF4}nDS7C0n&*SH zw`e*h7v`RUxb($OJouD_&0U$NQx+ingEMeW1fj#gFyS1Q28ZVKAQ_M-x^otGrV+V? znr&jq?RaFx2EqNbUg&GZporf3BT^3uiy@Kp`(#eEPlEVt&AhzPLHOz2TU3sZz#Ye6 zti9^3)ax3KxwAsBXm+V~-oX$QhlXH$&2Vj1>ma;183LDT^w^vgfUG)U=u~o|^z8%c zG>1memn>R!Xd^k2(UF+b*GJk!tS)L_G`8ytrPNeU9Gb>_wLnX8x!!tQ4vfdL^szc8 zy$iy-Z$ih&8klY9gd2bUUgwak6!G*|F)n3OJ9flIw69qV?}_x=_p%hze{I9q>YPg| zHe$ksLX0Aw5H@77*cVZNjqD?iE}bhh?+Ve2SWG~*Wny}I0Xh)d?b63pJXx|8V7^-Z4VVbKDI3=kyrYZ4y($cz8LId^+7STw1G*ue7*%N-QGA&aBi0 z`z|LTaz-U2YwYpz!QbnwgeQqPYqn!u331UeW5n4*#q_|T9^tqwlq$v0O=i}{j?rRQ zry@KVz}oo56mhfTHuw`K>=|n#{H=?yer5pm@N+~!hiy2vikMiDE~dz}~ACkP~NCq_jdjIQP)uJU$fTd^PU8!G(f7o*8~Uu<<#iO}>S z>|gE&O%p3&vU?k*EcVBN?UrJ3aS`%&1i+<_jW9^sh7|f=*8{VSc(#n-+|F?J8u7_t zE8g==m@wO2WSDKigV!PW813^Yl3{;(-F(+ zBw~-MF52C*L$m+iem08<7Lnz}^qwWR@JV+O?OKffu|Bx5!cbJYU4&H51p+lqgiEU; z45a2RXnG4_-E$i@PU4Klu9-0GQ-r##y_*!(eBgw-rHR(Z*;rWH!LJEjGeAFADZ{?DeePD8JgUXF&vB-Keen zd`^z;7Y&wPd|@)pCmhcCk*GFgh$?PB&msCgR{x%EYF8}?4Zla?^0PqG3xe4()~ui3 z)>m1xZjBolh0@N0Q~}S~w_T6KPOpioEP-7pGoELN(%(>LkpH)0^eU8QS2+}pcj zaJ}mxX;y1TJS>g|ZSW(Bt|I#rk9+HVpH}#b@V~poiOFwJren7F|%bKPbeqB<677hBEL$K9(g1p?cOm zrPKL5NStS!?fOXhzB?DEQbLgB|46yxo{fa4P#pT_xw0jnde~86i2wOjxiK^iQ;7X$ zRjDK13}KBohuMU)nU_Q#iRcrd*mb*|D0mi)1FJ$|HUE=R`Zfx|@x=W{I4Kp;QK*s2 z?68!J#@WQxYMqXRvFBNp>!=7+93~F6@vTZr?}8&=qu@S&m+JGHAnd&t1^vgBsw;Px zsZmV4=tPXleY-E-_ToHvVu7mjRq}e)N225NT-C9+o(LIEUc0A}DulDz>WPuqJbAdB zxn~0=64MxhY?IAXJTZ30-|O6c-vY6JRUs}BJ33JPo${quAx^HMZ`92_N~@RxI1OSQ z`94*-csd^$)%@sl6r-%Bzh@!!p#gzG%7U-?D5)NRVU7J1>nZv0Yew9>j=!Q?k_XR9 zK`>|@pd4DBi*CJFbA7Iy%2cfG$0CDsZqEf}?Xe7O1wJ3q{n$XxNX9QvE&`1Z8J5=9PP^ zHngJ0+5kSk*&eEVEwO|iQHWR_sLHrPoWEZrVo%Ia)g~|LjlTwE1#e3p{qTV4A`MiQ zFXgV;>*$6px*De>kW;1hYSBUnr zNjA*ek&Aq8fi{xsS#patUXx+kD^}^~8^^wQsG+v4l*UYuU^M;wyfi^cCg(O7zNdGU z9wu)`b3Pa&DjZACw2Q+#)+c>^ewM^dW8ZKm=zs6yCDyqW6M`@@G}Pph9rNqDa7Oa- zo=HpQNI#z(isk#Nn6{r6fmP1*b9L)#YLUmxkzrAoz1qw4CNqOny&jDJF@`{*EIz;=g^$+i3$tZM$52isxDH8Ld2in}ccOu=R4N ztXK{rp3nJ+DzKV%&6I2mVeM`o+)%Z98nvs`*PT6;qxw=U8+FKYwQ2NJ)lHqv{CQ$7 zi7lk``I&gTD*yvlm`KvvbePTy#Hhk)(#v&eu;V^AS+qu4?wA6ZYp$*CFD-wUgez}@ zuy8`0wEAH@V!pH9HYt!Q=ET4-i@EZP4@+HkYS85e{WA1dq|fDHP%n5(bbqvob7Q9x%eruQ10_hv+K&i4l$7K1mnr##`0x7&&ylE7+Baw z&VCurd2cXkC)JUUGM{Zfss>BKae8AE3KEv7v*d%dFMDCa4e z{o9s zd?Xz^oQ2cJ{F!50U0%Ui)hPP__Hs>StGm<@Hy~aV+eyBEHx;XM0?~b7Ke_RZWbEie zEaLkx`N!!bv?DIzuae}J#}e?oHS?>IWjXp}9P*=racPjLyyj61b~a)*x7R?qR=a47 z*%yL|W}W5pzL7{Krk_{2sXXjM1isu4qb}pDR4_6EXNGH#eIQh8Ggbr9Ar_ZrbP$KH zYtYeP6Z)I?5Nk@qu#KJwPnw=qoaPg+sz(j^;`++bd}5GmW6<-|x01DueUQmJ!2Nhs zsR7UDYV|c3lsZ>FzkdT}_R+v#%5tdZSF*QuIZv>^iDk8);et}D$RtbzOZ zSUfkLD;_P4#P^2D)UDhR=Yu0Ls9h#zJ#D0$&of~Ek{rajw9s|62t_4iqhM?`oe_Px z`&>@L@ez5#(3m(x?F6hn?IZOZ;fcpbV_@%KjT1-Lq5HO2^ziI#(x>ePJmyT{zw2Bh z!dFROoQ*NTN_P}M)nJ!!~{B!gIK%U90za((de!z0O{QYPjNCyunLx!mqmI&3Sb z^Y!Q}zYNR3xM*rehsttLRpJ$P{%^LG&rvHqRZ%s=?mp_5Hem71ovyVqHIiRSSAcs(2eCSgUCcKZ8XFiEW zY!dHETaCPNUKEb355W$j0J%q_NL)D?icX1ZW3w@7SbyDlITXR<%WnJ9 zR;Oov*?D>>%zA!BSP{olTPFT*4X;+PXK4|KdFmm!b!{D{^@_uc1qLQN^423Yh0p0f z`}xvALuG1@4D28uqtwAfD#=a9@t>?c+Mkr7?rp|ZFLKxh8p=JtreSY2U(8=3%SB&O z5lHN=yKc6exI7J=hWcS}yH)Z^Cwh62!`&$(K>o8c6=vi^ye^NGFFZ+xr2#SLUK#Sk zW}6Taz`2P}fowP`5#jHdSrxil{yjS$eWwNDS-v8F>l2G7nf%=Pggo$Q6t=U+bTGIs zCo#vh0sD%Td!EQ4hSU)|Fyr#eWBCO=rovK!p^V-y4>vN*ISmB zud3Br1Gnw5SUUTua-<*ql+Gn!%tjO8$Qtk5(M0kRCJA%SzN^kk#K_6kq7Oa)i(kfL zvuAHHG1V7Y{NBLwc}E+b#7Vb)B;)E$a*)ca%SjWG(Uxlm~Cg{+y@f_*1(Y^g@o0jDpqC0L*#tL$;X8T=hS!1D@5u zx6a{cXdQ@QkLn?XS?Dc)bDq_*Hj1l-;+a!0-X-6VD-R9B1gkJi9pfWEycrHt_7tz% zb&!ld6NlRwi-k3rtJ{p3^Zk^5@)Qa(!l z?I-d!r_T8)*RL53<0bysXHf%cyGYb8s?fW@N|T5tbs%2dWW+1HmulAGh7{tV$fSach^c3CAbYncq1s54#+L9ckplFTE>o=n{iVzkI2Q_##JsCgw244||_hNAn|* zSQN|r!bJw?;Y+W@Yh3>iM)YZoz#DQn=YHylg5|7%=lUbKPalX=A(&s{k3Z3aakz-S zm#ks7-yDXX^@ume(tE_AA6zYh@q8RJ9A`8@gAdH9=^qB`lwx@V^>Lexh%1?8ORM}M zaM3mvsV}c9(>UWUAwPAXkCnK+jd_Lci75KCP+TK-I%0MrzCWEP8kllkF)9JI?{yS| zw=lPPK^&$(-lx=CK#lLB81xw!DxIF|f%LuPZI8^5mw$H0E^QnR^qN&t*=QYJy8OM) z?_O-U3CZHe!#eJ>kK=DDh8Uo*ctR!WgrQ-iwTSq+iUO@rFj zesI3k61882qeU3`$!=ZHFDMMdE9md!+#jQ=vyUL|DydCyQAeCF#UDoxsL|ke5SsdN zp0{-bZl*Dt=1?F$?=VIx`{`7 zVnv?|$^|7HtJ)->e3hk`nH`Gx%MxLEbH4EAIuEi-giZVy5kd}FsapcfkGBv{iFJ7C z<8XEL9z|Z)?jJ zDidqrIyY-QP`+7%&!6l3e&-rleMy7mkEl7?m?$6j)?fv-Nt@IEkw16PU=1M$*C1jYXI`Fd z;jlCU16UJQ4eEglHNvr{Bk#~1gE28Z6x(B|hYFMMGL>FN;{$N({s`=B7=p01f#`d6 zB$P5{sb3Ak@b@P0rZ>j+Eg^{AZA1+*@xQs@SiMuo3C8sJDvQMUu16#bu5%Xajfa61 zN)66x_y3H?*f?`xMa;VaYn^7TXNv^(pjwwiNC!rWRL;J~@CDj^@!xeem>_$-(vTa=nau=m*^d05G_Lbtu}K~?MuXYpDpz^9OWu1Y0>jRd zvs9y0&Kt@*VVy6Y@2rq_JtWWb7Ws!G@5$p{MZ$x;FLl)q@`N`UEb{b2-N9Ahqp%*} z9^Tx&E;`Q$hhuwx+)p=z-{nwf{pcm<&>9!X1y$%d&~9W0%&QdwKlYWwD|bW;`@i#? z8_u97^Pk2%D^`cV@xe!V$X4QcgTpalW{f=3EgXIFB2n*}gEWM^4vU7d_-K4ox#}2> z`QzfzU|(;sd{8LX4oX0MV^bl8lJnRk0jl*~MC-fES{W1%mlrRUYs<(3+Rr=GJ5gDt zA}4NS43<|usp$K8U;+1bgT6z>xa;n?Z^Ao%a-yocqdWF!|K87Ud^^dtziRN!l3K`) z&E>8?_+At1cyM-r+_XZ2SNEtB@ti7;-KarR&eu2H-5~Gptbw-&IcKw?Wz&7kct1uD zNs~m`u1+*|t?@f4y)ES%>`2uZ$#mz=YNd zLhO&X^4BlqB0da8FPBpJX&(7?D;;nu;dG&iAi~#qsNZl;sBWS8EqTzvTjDM5Yg_arXUv(?TWk zrzie7qd{ehhT__}^_)RO;!$k2Xtu`?n2AD)RqQ{vU4iMM>xCkkmipKJaTCZ7(8gr=4sj3y??MH)WG@qU=@mLd1z z>}V8w98X<=Y~7N3>?}11`}fLa?4jd%Cw^U^lTX@&;Cvwc;#QQ)y90tTY#DJXI)TfzcN#Xefxj=l&;@N#pimq zHmA?$zAAFdcn$7qs0DWWC3Tt4uhS2z!NFScz?vEqQ~xsVcXQb&pLyuSs0Z2ikbCma zF5K+{U&G$A5r0Qx&J&%Rn#hI{IhDn}s9+9z`RGV$IDBzCV212YoM9OCdX<+imA?#+ zz#n_^a$TI|_Vhiwm`hFNK_9ukS11a|9i6r_SpLx=1WinMC)SH#)*F3v{;l_3hs)77 zm<#rUT&9uh~fi(laErf87-yD$_R*02Y^kRf%QPL4Bs@9DiqXg_hy3(F%h(bi8H z6B&wm6QamP$Wwk$kDu;Ee8eqXxp0_S35O!^Oj@VtzWX41wYbddeyfE}Kb#9+h*du3xxrz<-+nSD0w>5HW@>Pm z{O8h1U!)SAz16~~6MTL_x=jB3k_+C5H$Nv0+7p3I)JOC(zacfXVSl=ix`IA0q;Bj5 z>ThA*#?vQKv))nILGJytfuAM6=j0A2`=WJ|YVy+08o2UKT#!~z4*3;c%DaTsPlJFJ{~0p#4G|$4lPn{6)=yiZWzi!hAD2x$+ah^H@)o}ZJP)WwDJnT znw7g1`^xTUK7-tBD@7!nb;6KI%z1h}RoAu7+W+ZRwycN}X;YZTWcIhdJGt!wSyM}c zX=-{Ts$WZOhJ!vk&JGP9ah$@tJ>oeNk&vq*R!o!7=uX(-PvP?wmnye#`vsPN~wE zoN&yhMly7DwzSD94D&e`d);}P^iLbU`)i4pwc0C1aW);E=7(o>OQo3I)L@b`)YE65 z^q5?*IrN!4Qx+$!ZRb%3StMEw!Ly5Fg*;Zln_)8#F68xA^Sgz>7s&W)>A*2=zH zxwaDVx+Bk}6QL0(@*&>(I!XFST+y;iBh}z+<-tJduzffljwW{c$xyog zDGWyBoO_nsSEY~(Z%O^{#DRxYzneu;7vqaP*LJGbcGr;G<%@Hz^HdXfR)n75%zkO6 z>hdV^Gsz!ID#=jQ?96p&?1$BNb5*ZzhTy;;=I5R%Qr&Y4M#eZlta!Ow^>aBh~7wn=k%roztuP z%Lbw0csHCHE8n-0!_si_$Ej@}5GG}{3uisZeO{@Dl*{*eD0!rXlMbq+v0>1&XBj$e zplU8_u#@DUe|gieq*+_emS2;Px1y%jrj-VPD*8CBu+#c*ZS(Eu(-n}S{V_EhC#lc9 z=XF3^K@Q8P-Fz-L&S>+=4_bVb+{mqWw5>)n6O(-PkIPdCtuz#KUIxL|YPWW$O&Inb3PGG%iPr8~ z2(I^IUEcPUw&;BzezRBC)$FajoJOt}F_ZUqyp*06)UxmOMWdc2O6w`qQn_u!eN`QC ztC1thyya;8^`6yyg%!& zb0v(ego>rd(#8aX*xaFU&l+M$=xpW=dAa18>u?I-A+@No9y7Es@^6L zMpx(qTxWdg!>j!J{h%jI;~4FjZ>$HFF=y27mA1vd8jzhnn0&jna)^8hQNc5Ou}XQo znf2Ix^2+W^RidlY`|u+(na}b&5VY5VxtlGIsP;$_@o!N+WXJ1_mml z=m*o#lDOmmFQreNK$K7ubbRkLMJD%tYn1>jThc=LIE%h00iE8F=UR!M|wc@YV=1rc;A`+LT=2l z8YSBFTZ6^_tbxhVJ0jF-InK4PqvxZmZg1zsc(ZUBs!qJ8>mbj^(4$MSSa(6E>a-A# z(kK75&Xy++%iSsy|2ObP&oe!&7w{;;k zXCcq}@7&Vs<@e>rTOBc}Ds}OxR`R7&PUy-tw_bWj3e0szRX*Q}sp}-YxeLy>WpA%} zrrLXpoV`x;(D)Lb&eR~a1oR4vK!}+7- zoH@#6ejXDRTLMMr(c(slHc{}rJ`oS>)OB0h`aB&EtV`d?C8_jyaYQp`2(HkUe% ziY(=WirP*7nM*a%ik5rO@u&~{n=Mv0Eu@}upC5W^n<$$(%d$)izypT^TJJp}XciHO zJ6=1rQ+Lu&sV04tuGdq{*#q6DcTc6Z>lK|5y=}O!`nEf%Y;Es`OUzN4JfMXL<{9v* z<|MqJhEraixMUcN$(@ovB06P}U!INphx?dk>!N719W}bVidm~T7jp7-&-SLF( zk;h~>1z7yGpN~a+l-rp({x4t2!Gzcmxw}*9aWB2ABG(?v9ArcK-?qzm&ZG!r4Kp39R1@ z=)HM#m4~YSeD?Q)`R{kDs5-Kz*g(wCb>;bz7GHv3A^V|z%c0sQ+ZkPUcHEocryQ&o_-5@%9bxYF>(U;^SNH~ba(myS@*c8&8|jZ^HcgTO{NYmNXW(mz3`j&)auKZU{5~QX3vzli0cs z5;=cNUSouhL&(8dN-c~}Pu!N7XTtM2eYpzeoYffcO!(PhJk-QPg5PNprcmsn$St9bQ|(T*5s zH}bD_Hapf4_sByiEAkAVXlwk){PiD?F@2Mw?jUo3SmzAH-jJ3fv&T@}C)9a>~K3II$ zd-5J^IG!~)YwaRCdNY2D$4Mvd)y1sIALc+Jww*$}CGpU1+#nabl)uA~?FW&v*9XJ< z@;pCy4sXauGfUM(f43_Q zK-&=)kw{I<0QLZtT9=|z{Xi@vPO?QN*C5yri#PbeRvv|LKEq}_1Kle(M6L&Q+~1j{ zoo<9<#ZE}MwF0L#9=J2o9^U!$kgC~<_`VJ}FU_C_m%sXKu?tc(6aQN0<6pYM%7o`e zZSK9T_vN_Op2%v&_1thz?z!3%b9>W^wZ(6_{Yg)xv6h}`Xo#w9nX_!g{FGjO(RiH~ zHI1ypzKnqrJ%I|iKg0gzv-7`4^1iFth5Ze&y-)7+%#2Qg0dec+Zp>@UDa7dzA2{>A z+&@A`exDD9tm3noeF09yr3|?L?S?-_$v>}mert0|4?AN*G<+{r1X|RPdPP>Y#~R&Bx%e>iAG4OBb=`Dz`A?3;EpJUME&z z1+%b{XYl-~PJXj3eSNq;9S*0!m!2`{>%6i4$_~un8M~dI55ylqTXJv)xU$DjxruYs znJ%%Xuj7OFNE1FV;W~HRT}_>LhP@;2Q=7I1>Piop8OZ0d?}3q8|BIe#d`AWi?4+*Q z+84)pzc&BaQ@x8k*4BJy`Wy6C|I;=QzlfhqwC%0dQol9nsXtzH8>~LcdV4ATPo~Bh zt9?EMAopGX`d#R&ev#>qQ{-M|>~5r<)6EYPsfm7QauVA(ql+yhzkk_ONY?b0E$iD3fhXM484>3he6Z&vVypMj)#ljSNH}Zb`I+VG#pS&<- zA~U>JCZK?8@NaE=^rXs7takR))Sd;kjYtY8rL>v zRaNy8_8;e$vB&w?Kz;2z^ShUmf84UA+UXwkW&D2@+jdrauwNg*HLqdQR~=H{7Y%r} zRw)^#ZV*GA)JN7dMkeZkcn7T#`MlT9ywZlpWGW`#01hMjtMl5C51U92gsL^vr4hs_iM^m8A8{?cu&|jImNc1!0n^rF zYn}@p9ytovht3%Hd<|Zw>(pTlnepL2_pklj%cu|T*Y?B;-dlIJSB0jgCwesD?E6%G zoLIp;!*=xk>e7uF!=5PY#XbLhG)((>VfIk2!_t+wuJOV>nY}qZMY_?iF?KZH_ms^D z;2KonUFny-8}&5wmErnK%RPbGyvy!$-yW)YA06q1SeIu-i_PE2;q}3Kz5`p`YN^-q ztoY3{KmB?WwVRfHRJ>0!O53WJ9;ENrB)(sf-POh9u`c1~*+2WM_uXX{)mrWi+hOW) zM!qQ3vQ{@AqCURW4{Lb7-##-`om(Xkp3VKxD{i=Ys|$HdyXY@*QLP@y>;sEh0f_r# zp`I7uk7XzM^?9c1e>oAajQp|cQ8RV+OnN}hWrpmZ3s|w-6CO*5;g6>;&Z>22yVC{6 z+11tUcQ~Q(1Y&s+$JEbVR^w8S1%Iux#gE?Pv~9%is>CbW)PVidjcC=7HFJ1l+_v_F z1<&eHiM=^L_JmUx@|42H!L&BlllPH+u_LZ7Vs7COex}B0)IVMr!@J3t9(Yr^mrX2L zKQ!KkGV*Jt^Q<1wUW+5#8^tTR53inpZJH0xam{mYUV+C}Vo3a4<>h_m0@FXqfzQSN z1+MS+K@9i*ou6;9gzNmxhxr%r?{VZb{i}FxmW_Ld+xO`=d5AT-s-arNHQ!B)>shrf z>N@mtwlyYZ8`w`>y9R5GslK@4+)rJX{OdZO>8Wyapn6DjAY$WqS4yVpF8ThbA^D?o z>QMFW)5I57GFu_IrF!iTVwrnfw z7TX*v)ONpD;+nMRuXR4Ow>QeOHzKAAb($M$;?`dJ|FFjEYk5=tK7l#x?5VAuw$XXs zqz^Q!*j23->W+8dn$2M?(cMIMk9|gU?$v|WjdVWTgEhVA-C^-f^w`V!c|6bC{)faa z&S`6waBtsn5r!9tTc6>~acz#0eZ>cBZ}U8fI4G^X%9`ydF>voF`9ANvtFKsNJ+6fb zFzR zz?nni3VI_)byCOl_J5tl}wF!afOnmjn;%@4WhUpu!F8+Oi&nwwLzuuqt;!W0OkFV=arf~1Q zVh8!x}!NPW7DSs&yInA_J;YpHj%+{!QugeK__XBoV z;J)Oq{ro+mCl0*)*K?F!iyqZbqv`+S>Z_xwTDz|e>_!X_8&T{o;7mKPyRchKETp@; zq(f;?L_+H9{cJ>0Y)llpJFxSc-rqm3pJUu{&u|>VwV$(|wdR^@PI^by<()q8vg$^d z4bY7B*|o0n%!YPoHh>t;xHe)e@4I;3bDHC3iV{8_btYr}g&y?vm@`grp17sC*ua|Q zdl_+|T2*qw00-Q>#$03^BcIV{-1z!%=V@|w8|sB$WUcb{tmMd8m6tNt%sN%vl;`(t z4(pH?sj6w`?XfqGSl^aja6Ll*C7!J#*4)Jj=HIclnPZ)TYFpNZJOguMD&V<;cd`MW zo&Q%fyU+jkq%L}i#;6UP;oRplimmvCI-^}M?KpYeKOf`ANbVMdvX*%N0xEJwW~qp8 z4||6{%=1tCvUXp27o#nC_Z_iC)$dF2ZDENa?f2oum!}w&Of5BsooKjn=%|f9wqkho z4n%!WMrC~5fTl0k{S#+xr|#Ix9;oW49R}&u!15#3@MNwYFzBSpzl#mV@Hvhi)mt{S zu|)}gf7=IbM3bp@|MeG92{VM}1Un3g=f7FsP?Q_m;d(af+cho3CzT!A^7WmB+j4F( zb3gyPs2eLUOCvsUjM%8hGXQ;V8F-R*I@{}yzt?||eM#HrXD9&hG=_3X7XQZu2i%bHoCPG6@| zbnQc(OMli>qc6jHJoUDh*dgELHXf~`U+Wk<>?wGFM$Fqcr`Tbc`VMro$f+dG(s{6g zwbaVJG?qBFKCzHD^s8YGn*6RWzEF4c9Pf{goq$(7=i_?v>uuK(d!}b*jvZWITj29h zTU>u-g>wfy(Tcw4Z_V~1=zT6G?AnQ@E<3T?M03=W7h9mca3@S%5=WuK1{|5b>7O_! zJ}QRc_Ym|UUUzi_{iWRl;jBRq<)uBampqpDP3UXTWhB1XQ_n4&2?;<6QK*9fmDGfK^Y3y`8j!5qA!* zAEp;amK{E8#ABtkGaetbg9iEUiL;#%U&!~r2&9h(b)N6op1rPi$Bud`0BA2+dh*+U!nJ-33*){QDD+5(2;-LBWs z!_o0O5pr!0-dv7@m-iM}?%#{c?RJiOe`q~E=5G7vJo`88uWDEsiTlhIpWB2;7PeXF zQlIxqMjKf@|HOYe@XxVP@}Y`yJmft%-KM7;Zd{1|teLxIYRkih9Kl)ML93;PvPN18 z^mvv>C47~<*Btn-f61P5R|?xjP0`WpFUFmgR_q8z#yIxN`|~7ya$^@xV9c$OrGB%5 zU^$U-qjGuj8}1QL<{dXDM4HI`k`q%|drS?I&bRVGx9Q~mHQz5)vtGZ#T(rnLUfN9! z9*M7g_T)(2$N{V5dlCz-OS?W&XM=yQ6Vy$fPyMuu+jtj*n9CiOc_1l;zTThg<$0VR zCb_bXnz=zPw`8Bf^K)g|c-bt1SV0qddo^k+@4syW3lAII*G!QjYHC^i6X$sKcS(PDG;$bctD8sV8a7AKf@gbK zliFhZ@)PL9`_bjBo_LjY1x9?`G^3|jw%`&>_@2&RwZ%+31q=DL!wxkPNqcf}tEN4I z2LF*SZOOpR+U&uTU&sy{sRh9r#=TXg-0FNR7BX*~Y*{YfG>pVU=9b_!YPrkK{rKFR z|K5v7WycA@h;L<&R^!rSZ|V|kRoMLpv{Y z;Ip1r86_|K>_LwR&NuzzrX2hc6ph$Gn^LGOtPtpY?y{7uZ~JykHrQmfsz zy8RP(t`k-oq)E3g%{jg#DD=eFf`VE6|z9nBjt1sS93cxz%s5vKViB{Ai2<*e&WZ+ME>uqn; z9LqQ>pXBgXUeuA}>>%%h+&bC=TfOOJR`EstNPhHv){yVJ)f7j$4|j|;{<4&wVzv&r+qqEA zS-cy!q8xDMUZMQq&^GwqA?L*4oLY+C#61AcApR%LhvfHi&GckAGY+Ofo5lU966(^| zqr=TOVOqNat>{fNJXIEvP3~bO{Zq7BmIpXkAb<`V&HgR z9Oe0`xlU8;B*$q0?=sC-jfExokPS}ov*uG@7&Fg*9z^`QbzRZ39yNz3i{9xy$RTn4EE}*-xkTOm-o2m8zX~n!inaBiEtRsH z-)_|FLLb@QpJcgW8{EmYOFptrb`0HwBh)+k-#A~d>Ma7AW#Jaj^R?7iv3C4voa1?( zVt!Rzxp^D1rhKdp3h7ROyK?7 zdA1Gp-ceiNk|KLMZ9?Y(|Hk=L-&LZ@umH1}SJAm#XcbhTlriZQR!3=A z^BL~&^&soEivRKtc**w+@oua1Xz?1?c~=f!-Bj^9cpGmTv5w38B_g!Xp%ZI>yIK#$ zc36+O&n)O3*?<8?=UJ5x2+(TF&D%##ZKs{%E|HsNPy*NdnEOX6y@=; zSUHW)dZD)n^^L@}mAoIzZNzMiFm!jKPO|%2@%UCS5^~uGMa~ctY6qfOP3o(b8H(G> z{ZP2o0WO;j#I#4=sIB3M%X^xO?kBupz%%;x$XmI2k|*{1srBT2Ufx{AJuTvNucj2s zr5jy|MY%wH&6Y>RJ0U^G1qPnkvU3^l>YvW=9#ACTdSivOW6n63dr>~Qau4>b`s>A_ zDZZ{GcXS&4B3F$R6M{FvV)egqHZe^Qox&7^GPcc^HdXTXRACG2fx0zEDi^Ij;5qvg z@6s8{X8Z4$$@^%O`BX(W^8?;?;%v*zP_fay5Bna(od)SEE(+ z4SGh4t23j}&F$~J(nm}@8b;4j;vRMEMZk^_&Zbx+jae_WY`G6Hn|l7eX9Qnog1k9v(e5Bj-g_a2n!V1;YKqyX$sNshM!%_*a-M+)vct*Et$keHp}1nd zhAXlx3uW_aCoF2^iic;5<;a$t-F$L^R${p<)1OT%iCn(EFXc(M_u#@{`ll~65H4r7 zLx=mM24y>hd%-5en*ST;(k{i~b>kAOWS%s?)LEIPaT{%TZl%|=m9-tKv5R@~cTF?p zoc0fV;u+Q~T&FD4s)mO?Yt%Y(lt!!WV@yBtjqZ$8$xybk5y+uwndB3Ba5n<6t%z4XQV|Nz>PJbxZcJ;uwKv!g@osxU#a&E{S z^NFowxf8izTeaQbFy*+cNBq$GyDK)QU6T!TY=~=7BkV#Av0~$1?BF~m|Ff~^uG)dN z61}y2gM`C<;-bF)#@Q(IvdHLNg71uT{SHHvpx(E!iZ#`$Ofw~Tel@I^W6j$*Dc$G( zz)fP&%^dBO8e^)lxEFK9kxfc3m-`sVd*VsZ4CTVfix|Lj+tGEn@>Z)9PV69nWp9(`&Itod{z)_HheT}Ka3pJygES~g%q$MUU>gUh7x;)R!GRd7$(_)icH&dIAKcD4!sXry z@oEjZ+(k}E4KflZ80US})a*5HC9JqFdu$!Kj_I%Dv-drav+sMrz)jzjj9+bk+tJ66vLWzkzTjw}09fSNQFmAsmZ#P2|it|zGZK%c?p5Zfk4vOi4`Y>KNLMn69L&F_;bYpJ=`M1dyhcO@^pmtXfLrM{IC9;6HZ** zB^HhM!AasBp*mB=0P3G)r?^17q=Sgr>jf=xN8cRzB)1spi3#Mg-@kA{-u#f5OiOz7 z)>Y*6j`Zs=q1M0Zq}-TV5bC}jNL%DXM%J!*kN&$!pGu~dwjW)53& zQq!-T5Dj~n!8q^VIG zeA+Wt=SL{5T&v+YkoDMeZ{>adeXLNiRuLA8Pt8j>&ipX=fT?nLUMc1-AWpJnoN|0w zAx^9&PQ9$3(tqYr`Y#h}y`!u2OHZelF|k&M#)`3a5+)|IXPo;}n2d?XkV>BCp$~=D zw()KXm8r=aP=j z!m6te>`yyml-^?TuB$hF_FOUblD^ogc%jW*H{`wfCD(WMMBiZ^n6~zkywI5V68DyG zcb8;$&St-j;|@lyB0EwS>KAK4w^8@xy}Rv@dyBh@k2OV+!#>o0?GCdI>xAmHIR=qu z*1-CPkj*OvF3tGqEU zMA|yyas!N&ejAR$U=O*rbqtgpr_=GskG1iNHi{!PuVPr6b*fii$x_8*e>Jh41)oGY zeQms^kpJ=EwpjNi47SA48k?LFskR|F=i!KU6LW}x2f~9rf=}ZE;&B(&(yYx)n)!&` zjsD_|^f+F#RyZ&5M$leY`mXg61{$nGhPoqYO)W7!(-W>9Jh$U3qJs)# zOUVVN%snxDO@W;9(h*LxxC=1hy8M$h!WQP5f^M23L*Ei}7~4nP%|wRVPW+6a_Hnz9 z!eEve_C)_1=kGV#Dvw!%wP&2yG;vV+hTO&r#yNLzvJ!ur_Z{Q>T2-K|z5N648Run{ zIf_F@HI$*uAuAJ<b263TF*Zh@E9WJ4A2J!r1_R0bCQdl$2PcN=k9Bm6RnsL7L z(nR@VaTLB5+-2@NMEP=s=Q)(v+OjUn@{UQUeS%o4rlxYeZ9Hn%;Vl1cZRKJr^E3P3 z>3!dbY1H;v&OH2k)ivSFeb)1*Im7c2!sR3PLmhbEm1PLaQeV_&-TUxBu+aG94F?Su z#CmQK&hg&xq;8eP-~nR5NNUA{yz_~5#Ji)OI7eKmPU|c3(8cbk$-VuuO}X;9Y!_@M z_w=jJVY!gAtTx=`$O||n#}HrnU`gLH=O*H!sU_ZRal?d<8--8KPE6L~j`?E^rT#=S z7p*@&eY0L;1DG8kNd(cG}?!cL6f8HAJUDmas77e)N+SV$=4W&@pEnKB1Yijrhh1 zdPe^5J=kb)e`O`l^I^u>ynC<`Y;hY~|DNXzSqVz0MhWxt&4E{xlm0)jm-%^IoeRpX z9o5ieZG5>!v7!}uA1R~Q-+3k~->+Uo{|Su$%0T5X=O1mRGS5G9P=<6b#Ps>>*QTyl z&S@U~&yURY;&f%*@O0?7lGBwlLTNiE5lS|5(eUm{<*YcoV9mOJVQa;yIrZezxifjT zuF|V#7;$TQTLirq!4tVFe2DvT^KXa_8PxOpNd3fjvT(ah-{iscI-eac2IhIg<}1C7 zQ|&|rcL{B~a5w(WI1$v$3uo(7JH4Q*=&-{b=H%T)#J3i&T5^|yo)@VVT4G8b_t;__ z(f&p|v3)u-&8%CU;oUIY1#$o_HjYEQMP}5_vNVv2O4N~pssnA9#y1W5N zoR;<*BwwQl-B!Sz?t>NkO|L~I;=6qv+pa_d89b? zeuX7N*y|0rsC0gN6Dy4wXX%)-bACDZLsL+`} zpjie^5KG*Yuuj>$G7;{38UL@-mFlEe+>GK~FlMAu`(y+X-|(3(?XIL{ghC>3!1P%w zdXX{7D_fm)^1$IX{hQ`c^!-NImkWj&OT%Shxh?|@DFAEMAgqAzN zULGi-zU{=#0d|<*#88MnTd*+LiZgCw(c69qRvvj3@yi3_9^koW2Hme2S{Q4{AT`dCF06U=;^Qqd-zq^ z-2O52c@NH8^-!sAa0RaoIlnHY3w8E!c(C@kcP&fVGV>TB#&T|bKU!IS@DO(+xFfK^ zTd}{N2rpCCjY}<+3#PGXyOsEV>2k%aJRBdqIm_NPNmOWSr(6U6& zIPS2o8Y7l`HpgEsvSq+n;lQ1hJQFJ{9xy@}ja`er=9W0nqN5nma5-)e+Yg+zMJ#K! z2v!IFjdQBgeC2V}K_oNIZ@NoLR+2yv<7^%AMfqq~iAIdG{rCnYR}3D(gni13b#+U6 z+`ElH)^(oFpA>@$=kRePW4QB%lJ&kAEsgjrjAX_A=n*_-KJo6Js_1v8XAsZ!r>qdg z$SoEZSnutOcUC%3XZ_te=IV)N%3kWrdO5I$e>ziHq~ix!WAe*kr zg~Rlwze8To{N~E)kskQ9jab>iKO)qW=a&11G3gJ)^$-{M_a#2r@wg}%?t%pFj6b_@ zQ1llr@U(Nr@>~y5#9pv3cUYc~{9(tv+lTB)zSyh~>7aMzLh@ur%ooO{`*3yxIcH5~ zi7zlmZ({vB^`?sFOU&@DxfL$Y8ZO?Xtij1~mMAG`F1~~=!-4Hq*!p6O_+GIHhK2ve zdFa3e%8y5}aAcf)R-95M*F6RmjQv(+a7X$|?IDhFYPNFD!-qb=oQu5~sRZ`%hG}PFn-$%Z zWluSu;+#Y0t){Zl)&m3PQm^JvEoCL=gAb3hes20)Y|UnDn-fF3RW5cjAFHYLaccM> zQG%@GJ>7-2C9f;a zVRAR-vaq@(rT#^bS$kCPd!h6jn1LINxv9okWp-8^8u4uFXk{s?)BB<3*`7W$T=AbA zh{w~&t1x#_npRPhj5SHV^Co4;EI<6(WRIBa8A@4^4^}Z(?@k@Av?aDFh{air*HeaY zR$@Xv)1lUy$`k7Iq!>8j;jUWB%ro>mX1%H-KNr5I>D|K|GDh>9XwZiD+f3rd!?Hxe z5*PZ*F}79VVpvaGR$++^=&xL%y- z#UA7)xpAQjMZe2t*hD_=nU%wYP0?B;TUz4j#-H*Prxln$euhchcR8_iIofLO{3p&6 z{T3+YZ(?D@IPVX=qPWH!L@?t#L#0^~I!4AE#@W_PuVi|}S>(1RzLC?u1mPuU#ag<3 zVZD+XzL{|A%NcaT=Zc}AP9S4GOI4-}ycdcs%qJmZ)0Aov1Y6#fO>9b3J-S?>i!{%%c`~ znG@<4MTlx`7qlg&w7!S8I7wW8KDEdcBS&$8Go|O79FhEBmpHeaT2hCJ<(^q5S~cE@ zlP7F&yI`&u*Lw?Ix3a<>*M4Gv?|Rs`u!8xwhjQ|}RS5WGjl9Yd*(7ugG_7|16KDO? z3zXm0vD`5tW}baj$@m=wL&mxMahnpurFqC{#vI$bcgcu=QWUY4-abROWUXNiZs-!j ze^R@|U~fErcKnO)RVn(XLy*;zzuVA4rPJsTcrxZs=EW*&KhVE``Q-Cc4`pdWAnbTQ zp6azjnb$V}Lzz!@Ds$Om`r!+4CxiaR%Fvp====9E<~N+0g~EF$0Wxp%erNe+hhcYgSv?8p}l zbwW^bsF=k2vHssPtmh%3*hg;S?rz3MTTzeC*@AVW!>O%e;vP%XieoOFzg%32+=cny zY{)~LA}VKZgG^n~l{@u>xA7)?ZfQ-OptJIWQR_JKv4u*BmwV}L!gKRI|HS#8=|UxD zMBIOQBhdJo;yyYWS&Z{RAKjALMTank=lPBPppvL##hA?V?5m+wGCuSmg4z=oo&8=( zbqU3xPOSZuGDRDqnB1H7MrMj~BPIk(nM0mO`70wizi!POVsp+?dGk6DRlIL{NK2HT zn*%VK@lPE+MwxNR51Bmw=Q{RL4)^v&!+Fdz_1Y=Xh2E$YYma_S8Yv0pUeIT*mfw66 z>Te#XPIiD~bYFaKPtPCriHnw<5zV#e4?xb=vA7)Z$I=C57aVayH&(29$enKLUzywb zh!v-pw}~%1t#uGlmw4WHQ@68ty9oP1?IZ3J9r(UNv~OdL=SRqob)6+j%lDwv-4{Iq#P%OuU z{m1jS>71c_{J9?$te>}M2PjRN?x)5opV2Z);{ng`~&HJ$*l%{)l z53-jDw=+u@26%%NDbqX;ojTO`R_12x6_TK8k(My->G>1N2W;i5qi0 zG1#4cI<{rPb&EUBz2V;Xo*c2B{LfB9>GM(&C*tVuRFY4vmHED6hdE~@o9T1PbK80r zHNWpt<9ER(F?X>u%uJoof6HQF8BHz$=iEmJPZgKdHmG}!+{g|pG5(zeuIk#syP}uS zrT&IXjt!#q8VIwr?f7`Z7VDoU$(GSuFz_>LD#Xh(p6^5-&Jq9j9`x9~LRr-(31^#< zUo_^9l3Q^ABY9RsX6To+eQ^-`7|&B-8YK&zVz83uEm!Zn(!5bL3iug!dyu5`-4ThT zx#WG_@>EK@MB>>N<{V+B)X54*+`hlu@+r#0Z~M{6nsY|&0m{7zJpcB@soLu*gQ$Di z-irDEO+)3vGWr_rA|G|_H!)=@HHz%WGrxCF6z}xKj$C5n?aqjHrQT>m{P|V>G1081 z7jzt0@7X4aT2c|ZPLA7!Mtkl`tY^KaxkxO# z<%+G`(Xt7hBu-R1V>kWHZJi9oCgOjeIy)lZNIzjPoP51|+S_x}!bzPw0yowe)T=}T)jUs!U-ZFUa#A8ba6xmVcBke}}` zpr3fZ#0|ajosj*oi?}z%1uePrQ}dPd?#5c;jn4`!WJ6zS5v-xsSxm6pWWNO#Cv&&rf8tzg^bY0u z?W6zgz}C=ztEjRLBW^r<-p7(MY<329Xoydmdn@n$q~ZwUX+7Ii$&O0?k4voeWRS9E zU?Mcj$)Ww(S}7itfD<3dF&!{Y8^K!O*VDIn+)kF@QRpk=o>!H{LEru-CR(Lfm2W z60xd|587q2XK|V&ZUu7Q_kny2vtc43z#UC_F3Z2uADn(c{-utnuF+Z~k-KQhJUr92 zf#`RZS~Q25pOb2cv4>q?(vCU0Nwpl(!wFI3Z`@n>M4nN>eAb0L^N}~@%ojH3Y(`Ar z$Z6SESfT@;LCo|7`FqQ~7|wfHtePWl>`QO@(VXqNTg%7T;}|Ubmyh(}(O#wW^fAOU zKMb-tp?ojMMkVi{C&L|;?Y**K%g?yi=~2p8v%^SBZn~X)>c{gp!6*sC9*n>MDF*rt83_O5Sa~xP7dkam6Se#i)zwg^tVx@f) zzN~hDo#`5}VthEB&7juwpP6FiTY8`wQdjda#Kh-;2%p3qlLh@n4{C@_aH3~@lP;nj zYwWWX#Q*hMiG0qXem5pwI;Vj+-IMw;ya%<~;F0UQWHP)I;>I3b`mx z8t9H&D=zh^By_q6~O*(*mrTRYZlH6KBJ10qJOu;$bQQ+za>E!4ogQf zp0{JgUZQ`Dn}al z;+LKyZnV5EHw^JY$6bzCd!tM?4CWsFHR>{*%#*#SlljbtdRE&KgD_8 zUn%a$|KN-mOJ8}|G3w_~>%Q(Tcb-G?1x7nV$#Igs$VHl1=!7vFY~*dr*t7BuEnBiq zZokV0OWCU*%`=j7E!mq#u|AygTiW$!H{O@H5^s?tYjR4>S;zcu-gp;pquh{+uyzRV zK~qhose3+jH*$Wo@`SiFEf=m)ybHbu3*Bx<5p#h#Vc#|(H_T)X<1XLqNn&e*44C(G zKyl07;>G$jeCKR<#kuxCssR&r|lP+6n16U;dOKGUS9T-lA>fBNy=dC^?% zK~8k?HS)Yiy^uaGvBZfR)T;?kk-lx&1HC&Q2)*i8+~we2%;%ibX=6krw1Fsx_HRny&>RHH3CdT11xo4Z+uamnh zibhN?N4U3MEN66$z=%nXv@VqbY3y_nRwF6cB{Pu@~Kz z<6Nojh*(V2r5@&z94Y5VBqoiaulI#qX@YMU>a28PU05K^G6=yGFZwK47fY=S1JRs$ zwcZ$6iqG{!SK^$8gO5x4j6nwXh`olNlw7BI;a)ZMyJpDJ_~!HxqGsCT$#K$k`lrYB z_Cn@`)lvg`CTMr{#o%Gu(sKILr-lA~et*>6RqoJv6+o?k$7-#c)FtL_!@PYq>Veyc zmEH?KJ`7}~j5iO#oZnETQ3qhlVRCfJ+N+uoTYACT)ULyFwbMrn+}a$0U7rkawC-MP_6q$c z&HPjv7<+MyChCsb|sD`=_r^$RbHUJ_1d%oYCHCz2w!GKD@#i2K3bH zeAt7G*cs*od8O2&eKM{Lq5f+8 z2I6QGG zdnHvd!3f#lf(7k@rT%^a_!jDdMFvsQ(#Q0_)27bD_e9Cn*Bh`$&tWwH9zHgEJT3!r~(JL7eOy`dZlh0fh_Jaa3)WKLPu9u4}_M~xd zCP`h%b#Z2$xyo{ZRAYZ8j0ZR&P;Zqqd*dP0E9HFOW4mPGora-foKb$wS~^{nOl?c* zptW?8tiL4SPHz{?x!@uVFgk!KjMd5HES51_e2 z6KwqK1?#U#Xf(GSH21ipI4}u^wY4#rGa2he2T^>rSoQNX??nFtSh1yxl+GE;rV|O| zoSWb?YmdRJqW+1q-SRj|bB-EH5V7Stv!uYYh0yE88hzMksd`{OE+1#zRdOUm@f_Za1@@OshjhDy_7TY2yQdq+CJSaeQt0V)A|vY@o|z?4@rlq+8IXmy`;=d zDR@I2cFQ;Zl38*hMp5f*etEFe@Z|x_1U;tzgh=iqxU-buip0l3QiCx1)U)n7{?Mo^U-dT5?$TpYS(0|a9dd>uZptcYQ(QJ~k8>jSv`1P|KMT5Vh&P5hN!tn!qnP#3b6X#&%e!>=t6X3_I#in5 zD-|PeaAvibHiO6ls3(X!A|nB)`@7z z@fbaM>DiHZC`iiZe&bK}c&nRuNL6v6n5FB1lV_Zz@PZ(ymwF)9%3Heb;t!L(9@x7w zL27S6?>sl|{Pc>Jf;W4iFLTG0z;|j*dWub?U)xQGjYf@lZo9Kye~OVtLB1YXs15K%|=qnF3! z841{Xr5jpT?#7hK(f^!h&lho${W&$>WKw^!-a@IqM-fJ{FYfSjs-zxNfYu!xv24yl zNp&s{J*nZm-rP)@IxhzyA>?5u*h@PqvXD26pQQtyQnFPh>|45^eO8DxPs+g9lP-7> z9xJt}m4@j%U9sbOvNUF5GS0W<9rN&z6yueEs%$sT#iXm(Iokw7C&Q<>EBluz z4Z<-r^}CT<4>v466NUNTj~o9yPA=sA7(7shtG;z}#F84ZSh41EQR!`4bZ8t8llD5Y zf8jp-td)e9&)Z?y#og$&=9DG;{VOu1e8Ut>yzB-`y#ndz_(X(~r_$wXne;X)o*WQ&^uK;b zT04hlA;ulQ^?yt82g5L;t~)lgYa~C)4aR2nZnrd=%LVxXI6uG*n}#-(v68ye^q8+Q zswa2cpAiR7F&^uyW>DeASho;YLYyUQm*n?67iu`8cZjQG>zfVDZq&5R4V3B(&VmJZJVq{x zm0E@!rpGKjIG(3Ty+5X7XBoYA?&L@zCaH*I?=aRyl5Va`!jE|#NR2ornV&s?yTms& z-#n5wxWE7u-W7iyw z{45N@!#PF8fB3oS*CY%djrJLhY)F6JrctQ3*~$3BV`mgkjYadD^;D;4$hw! zs>iOgBaiq1W_;-(dkwKfn}8H7+1CjB%y+}|?!R#!G(1*vi;#d@+*5eGQ0gofBT%Le zl-*3}+nquT$Z*8LIm@J%Rrv^vbwY9HU6OA>9#)32mT+>F#_r33Yp@G6h6hO(iGfs; z8$W1BoOCNX6J=g*$Q+O%shS+ZaR=(ZC+117x2KU?Lad=uNDV@gVKd1Sv6&a8ecukk zt<)2#U7kzN5@U%%kVEjRj(nvw0xvsxV&f?-Iocx>tC)M&o9fDiquFmU{*mo<<(zE# zkrIzvtJ6wOqQAgz?qN=<{vplUK+h2ePrUb+q&d`GKNsVTb~_eHEACKldmcR-X637! z)93A1axm`Jzf>GZjXRJ0FvO0oWz?^$8w%G%;m6~N#{M7KC#{Y}yUIJp#m$W2zmoJudf(uabh@0N9f1$=$6&)W>DJ)Ga3bH*>_v|BEhQap^F1;9gDjbpr=ad6FWfS? zBsps*Qdi##ulB!`j`O@sCYMX6OMUr$LL}z(@=j%+sU_4=uG9%edQbMu zyF1ER_5skQ)_k5?TMnG)hdr}B(J`U6Tu`6BPMKb)J^Qp|!ky&}b$zjA-8$)exHldf z2Xa4AQv2-kg5I%E)Ty{#Y|g#T@Zbo1anUy1ZcYtj!CC2$=EfVzL(u;mi#cgWjrBd~ z^I#bVZTHUVEY4W=)Zh-JX>D0+fh7vJrQ&Oj2GU-dBiif#i*w&7sb2>flZhceiku}~ z-LFQ_FJi^LCrbK%ijdQkzDSMdNE+h`@u?^C@UZog!ODCD&19|n*;dM*n}^yqt~k=o zTPo1aLFYqmsJIm-oh!>i{#|#JoJo*=tjt6UEl)U^XG&HtGq9ie(Z8%nTJkX!jb?ab zU9$_)w>C*=^MJbQ8(&E&tKxC?0{ur@HjpD{MZr;@oZ6%|ay{}G9rx4o?pgJ|#Yb-pw!bPJI_HBd`UiBlv{Tx+ zmww3MfBjGu^>zOIzLw!|n0l``eT*kk+DD^9%&o$EoCPf4e4@&#$mj_9cLytDv8l7C z@l1F2yX3n>%(pOllw`;L;sBa-2$1YYTO!ab6=nk)qQ>iOxP0W_IJeh|kVa0Iagy_k z1?E$vhR@Y#M=a>>WtF7AsTi%{gkQOnr1J7YwA@B+iQy7y!OwggN~QkT@g0)p?>y{f z9{$|NMVfXo2bTx&3?~K9TjwaXjy%vQDOzec=m-if(nI1&igdg95aK#`bIx*1>gk(? z)vUctUY?Wmwk6?0CVd~)zL9jvRk&(TFOul`@~wkWu=(tbJJnk9$_ruGAMK6#lXc{N zRUt6rxoniHD{s~g!WKVo>>sTwr@HxLc7!*Q>o=9Z)$l{Zuf*R@-;sV#_l0S@0P0d$ zO10>-vz9qX?^v<==T~psD~d#MKw0sja8D%q$Kc`T>OwEpK?9z|VET)VMyqQRqk7Ao z#sy=Hn-ag-=NL<0fX~Khi|x?+QXCv@)~RyC_M+p}B$zB{iWd%Baa=q8pS&TScu77R zCA6>YfO&>}rOKIVbk}l3bhVCD<5m$i)9b`T(Um$4FT^fl5%G!o(&RPy=o;jL2jd4z zVXN~n6tBW!ohay+d&O;)V9D z?4@}#(om1P4U->vNiX*&!JPbWYDCHoS86mr(GD>7ZGN57QKcl>ZW$X=Szzz@}3 zg3$AOW2upYFaEsTkCzvgt1B7j{vD&>zpi1iD#8=B%VTio;srxwy20dG3>*wc8!h_7 z-3z}M#5~$!lvKi9t}`+0TSAN+A9F7xGnO1&UE?@E8-x+B2`{*4JfqHT=!g6p=byi= zq?;eq*!7FEzss7^h`Ysbu224UVzoMDTM_nkqF&z5XX^761^6(|8I^Xg)rV{6dcl4JZzEv6* z5ssP;KJ?hOl615~@nMz^`tP-t8Z8e(nL9n4Zf%zI=)1U@GxAFhjHPVej}F|G4f76{hrH$GTesFgWM|bP6;-&L_VA+fPXHvZ3{Ue?@rq5Ys4`-uIjPnD=`Of() zqbcv4VcItazF9d&0mK_DA4WsddX|v}=fhd!VlZ2E&A7uo>L=yvghdK+h3`aM}I+^$qdheqMpFY*c2 zyj3qJS7a+OH#GREesP|d66@pCwLjH+Mh4;vc}piZKUUj5_Q$$9zKB_UQ0+M(0I6RC z;5KEd+Krx2qk7W|FDIec<+2~FDk8AHge(B$igd&R-Dq6TYh!rhGvHh>JUO@VA?g!dvQeJkK!1Wd>dYfqsBmzE zc1oS%4(*Ph?^@0{UUxM5y6P|nO(Xucpv)-QCj&2sxxnIZYh$CVG??piZ}-PI<3@fd zc;DEK{Oqm9Wy_P0{ML=W5}w9cT@#Rf#vRMvM;iZ@LJ{2ezC6bf}qQJSEH*v4?`Nw{WC@x|dO$a+Yvq5;2*&uAp!1oH*qUs7U|CwoCSk-8uYW1%m>@M?yWzkmE zzEpp>sp)q<%25?}gE(h9Z+zUiMOB0G?{%O4bCdN{!H?)??ix%lnS;ifZhj~q7>QG% zHI2O+(pNDs7Kwl68o6k3uW)l5mg=`M>iygejl*JbS+AYZPSzWHwTW%LF*JPb?}!NQ zCTU9tj8_p$cE28p4q;;vT-yes`v2mrd)pfE_5Q`{EYzRWPUL@zQ=F^b6ve^h%oy+I zp6xcpC}cqvj+;4RZ=xYLf=-yaQwdF}Ns)}4;^>~D;Wkw>_`!UYd(^ON}AH?P*+##vCLiMF(Jh~BcYaG5! z^|Od|Qw4W`ds(YmZj2&-&=Z6RrPoBms)wF5-zHPKSGem+T(S( zld85}FtX_j*5Q?->d(|bbXww%8iSlv#gqN9c~Bq*yj-seXv^BeI0Ra6(~R}@`lE=R z;#U`pR6pzLk0&_^_%gh&x_E*&)D;JzoOn`HgFBm*`MlSPb{aO(b%E>~gBSNzMOUI7 zQI*eKyM3RHXK^;NdQKFkw=%)5yVn1YtM?A5@nOTqvq{-|MRsG=XGBf>Mu)0{qGwK zer$6AxJ3N;O=57aSU*e32qwSNG{4Kx2 zfa}E4xlha#{vD3Phqpnv6rU-aEhm;nKLlMmW(c!~N8>sDcFm(bf=)>!B3WZ>s~aPX zSs8)8rQCHTItst1(B@;}Ftvk+;`8|#uq7Q9Ymso$As-Xk zXlshxLjU*q+nFd*?tNugJRVqhENAMDU&+_eUmI}>ImFV#itb`Fg4K?TXv-3 zQsS6`f6ZO6t{|aS{jAl^Pi6Ev2Wf?j>4`ZecfyY1o3jVbxWy^f=^R0&=!qUy9~Cp# z9L9(y#6_*p6S8*k{{1?&?aU?$J&V}W?eT_kp1GiSzaRCs_~7DGFX6}Kblfxa#iadF zg4^DGILV#;Wuv`9|IMke%<#jEIY)$f27AzVzCX6776^YoCgIXw&gHJ176x*rk&??B z$zbZFAB)F!^6!NCT@oD5$6}a!5Mn|v3!S^f0FQ(5Ls2e#qb~PNYE`P%pB3ILkAzj9 z2z;u_7xoj!Zgq|N=6QRBhR?#N-xP;CX^#~qcf+xI>TX=yyi%Q^jKqeE2Vs4>uI7N{ z|F!e{$2~NbUjO*+qo>aDbG4}YYk{t*7&kHfHd ze{xwgKvMG<^yVJAm2NBi9ubN4tI0DxvJ1-Ug=08<{>(ysq;L;=ms)JXIeqfEhhX-e z5Uh-912gLo?9ZVd_VSy;M(#@5eT_kPWq)Bx?{NHOfBiCYz3K&PyqPz72eq}A`jtfp zUj50yKTlEpgtM#AR~fizZ=jx)(9RDPos-K92*5tBCu7hR+65yTW%Q)N=H=Aiu?Dt=UOovdXw2(AE&-;wHf{~XN}@q)M4>5_+*p&h&{%P+e>k~8{;=`jK@Y# zLFb*+1V0~!u4b)>?G7PsIvV#sxd|3y!!TZx2=iu5Ra&dVP;+!Iwb1&hCkzZhP@fDm zsW4Tqu176k+YCg-^i$6wpJ(9KGz7o6qsrngwCl`NJRhi3v>^VXq-!c7>Rl6b+PPv; z|8z`OM;8nzc0xi}Z99(_LKWj}ITLdrx85!t;oIdzjD5#@lYMiAU%z(Y**fyaz6%sY zon6>lN$jyxmN2ww0@U0q?44XL{Hcz^zjK}_?*3jld^;9?V|ZtsTAw)1SXkuqW{mrV znOCD>+JmvBa}R_%M`5Txb*3^0<8@60|1EFCyboAQ5zT+hM^BtFB zNM117G3JaPXO2y&|96^inA-`mG*9v z)Gc_Ip_!L~*=_XI>-PD=GAa$>Z!W43?}Z5$Q{h|Zx5>Vzyfb^1irouBg_}cN@rhgj z$9+=^43*^V|54k{KbqfHC^#2fOdP(kO<$q)&v?!W$mNw}DYP<>=*x`0zpa!dbEHAaCH;SR7~>4owj6+(%DGBxe%;K5%z1Xc-2dCI-O52k{#=VUSl4 zvWIg2HO?M8*snX=QXeJW3B6qdu}_s3jcOdBm2uPYR^~{6*LS(WMwMylX|FgYPjd}O~+v~QN8#R zV-ok*P2)SNho%z;TABub8?`Ehcb~skkW;q1x-jjlJGvC{=Hzh`!FiS|vD5pZ8Xi>e zK;#a~v39+&VtFgUpL`2CR^%4=J63pL6OTT3$-mdzMOeUmbZ4puhHOs}mKw&Pg8g{j z_|wAq?Xk!iNd4lB=R$Hu4BGMD+$FXi@5Z9x#Cdi2f>x+Bi^dh=;?|e+faUlo7*=~B zCvhmQwu^+pMsfk90&|$7s_&9JwfAhy=ov=L5%rL=R^rS7&K#(3qDr^KNEPSD4E_KN(dvK2)d8}x+ni|9V3rb#;#*d zYTZJevB(!!zwU*~=!i;V%^Mf?eUs;ys7|xz*fTd3xr?HUe(Jj7P-r@KQjcDI<%m+F z+WvgdRZlo`Jsuk3zCyna6zq1!BkVTsK{A&L=A0c4AjaGNrk^l$N*tEulV^FuJ|Q$F z7BX?3Zok#SQr58stlf=u?h0n#qj}Tdg|`ns3mKe6WCu_`*r@^Zl(aK7HF`U=#17t} zOkMAd$5CA|sU{qku2A1@qyg%z55w>Y)QMg^3Na>W>gM-VVi_&k1nz*{HhGFBF>gyOA=#lUmqC{F3b+w4B*f?M-aVs2jUs^Yn`< zgtv!Xw3E?H8LX;KAfJ5IF7)?ISH0=TJG}TrT-5EWo>j*MlU(;8tFO`|Io*-7-`Y4v zL2r;SJtdwu?z~CqqbK|sN6ns_yd~)}RydKvK6e5&yIZdjo@>Y9Q7&r__F~3nvB>P{ ziQaa*gf+o2m=o!VLjgyGGr7z&e|X<9pjdb_Ga7Ao5NFw{LNF1caO6JYMzhyK<6e=7 zH}yu_4mH9d`daEiZ%laIi1*52Fl_FF?D?(mgR`JToK1aS)fu+LTD)B9i$OPfV3)-B z%o}5q8@>t_+~AJ*tX4wgyEt+<@un=Us}Q|74!=xz=i7dyF!)F;rXS>dY5H6NRTZPesW2kpb{fsZZ!j1XSn8Z1%t!K1Q@I4AwR(s*iqJ4tTi%9Gw--1<0jv!r) zKw2Mftk2O1r>Lu5=E1q&oJ&Ieder-73~~5!Uzo5e1a~G<8(#OFu%|t>r@!-auOC7Q zF&M{Mv-S)7B`l~3#K@hDAr-%bXDNZ`)|~lo&^KYnfy21UhxBt6D*SeAbP-gZ|ysmc3n2GmhHpEgq{Y{CDEPrwF`1X<+j2{!a8= z>0isv`j@8)O)BG{wT_${pBo92w#UJW^|yIhUBTcXXX&h^r)TL1-G8~KeoKNn>k)sO6>jM8=mNUcD}I7Jqq@mhcqa*5YE{};$bTJ4F@|5 z#^w>2tVLYSC_iE8fN&g}&)UN{LfCdP6lSU3Slup3*rCV$-5+XAS!4(+P6t6hlH5Bt z4+{z30oyn4nh&*oxWMJYS&QeQBR5D&MQcjdV}2Q zR^hncb+Br6nFp@)3&GZ#EmVisx}nGHK=d|QuijPYh@D+Iv%b(tGv0JN%KHWL#;-&* z!hR>_F_!)hCiDN{WX$_55oE^R|8CYQ%Kj<_Jcz|p&N`Z0tWY>kh(%pu?S8~wRTywj zw2!s)0;9VMulwW*uI4R|^J~SF*3me=jJ`dsM&V~1g?6Vr(I~&6u#_Vm7YK5|+LTK+74# z)Yb1SG<7B~ddm>(>Kdh}Qx%L~rr|KIf4i_lc`&+qM3U=ooNCLuKwRSPyH&Qe>K3uM z9$&-Y5V%-%E}S!9=EWYZda5j4$qP%(E~&GZYREBXSXWVxtlK`dk{WJpcmAi3HA6Eb z#t!D6eBu5+MIF&}Ctgl+s%2-NxtoN4(XohK#vRP%FN(UoVlhBPp055!74BX!XsO5h zrkl}<;Wwf&&V#pOQvwuT-05$BN{zroABEwZD8zCGvdq_4@s{_kZDT$0te(HZkvooO zHJ(ryhAOH?N5E_*?;R>*6eEnn(VY77dK-2t+A5Srd^EKq`Ir)hF5ibux4JhYQe6ZFh0*arZLad=klqw)W`$# z{Jb<%rr4lmJx}y{-BZ)D(gEk+*5-}>W#%M=XgDt<_ekH&cZ#8=F&KZGeB-Yo6^Hjk zQ_I=|-S6^}5M-3*sQUQ~N18(PT&$Y4VYu%a%xGKRG`8Nv8ahrPU7Im)D-6S4V~yz99<-9-P9KRzG!LD9}RCJtHt zD7)f|Pg@$A{3f^DkxGB`{oSvyJMFy8JP6&j!i&~24u9bOaY)Utq8e@XI4eSNGs!^p zpAN#H{9x?quv~R;4)HM70Z6wGQ!P$&N5Ne3h@O#D9Zxu+sx>)n(&wmif7s*jMrWMX z>8SZ}b1UYqbA;RCeVV&NtuWQj2~#HcXtZ-|V5e1EKgH&cpU|d$G_|_=@F$U2`A@|`O z_LAX?RY8;dah`boQq?4t^oaL^`u@<-AEGj)jaNBRpZ;!V)gsn`k&D?A4)3OV^P3!B z16ePAoT#eEBR-w)$-73usqtN4Hg9{jnYGW1V2}Awiv3 zWP`shcBnowPIGsPCH6M9g=%}T=F2z>{G4D5L#tP#&-o_pXc@kFi{Bt06 z7(DRhOf%JuO~jcbP=kKkG}R&Qj)HF!!}`KS6*7XehlZY*cs)vWH$DJ|_)ZQpO;`C4 zH|R3K6S^OBRgP=?v3`Lky6se{Hf0l^Xh*F^<1?zzkG?p3h^{5{>1xo2!= ztU617w_{&DD%@IimwWqRcI0mzc$|9loF}su{p#ODeVSY*)6HFBXEj4T&D0L>58EN_ zTB+J?yA?T9tuXfKdd<0Hb6l|4gz2v;HUEs(qFJ*|i0@vhS@U=;LVql%W#>i5E(&`2 zb9kezPVA-nbCovWo$RDr)~Z0x^Gx58pC>6s)gq4=-sY@Th8$Jx^JjkP;(-B+ z&Z;gD7irdkH?y5?tLo6N8?|7b{rFr}$p3a+SMt}L|EStRyVjq8oE6Y8tOYfyF6Xx)gX}g z5aJ%+n5v$Z`r#b+Ql0<#sv0s@bRiCN^?>WD%_Dh_PW;=#M16JjlO0eU+kvKRws+++ z)-JUsr{pWO>++4rjv0m^WETi6+UeZs^B8 zeaxSFMcZUI?B-3qU8nCwbE$WHnxA!pC#eoiRASXm#-bk{s(JUwueOVPDPc*f)Q7w^ z;O913xhfmt9~StN+h=`=DuS~s$%Z;iI@eT2^?A3!&wFetRj-EgzKOR6<+_hl4_ugg zud#kjx}!Srl$SuJXqhAKtd;tW-siqxBu}h=QGw%EBxF zzqZr1=b+N1#>%e&zW95=S2dNfYG!XQ^4i=`wdCK}ev&JE8tJQrP7b{D+lEW)t<;vr zR`A(u0pmq))eSDJr?%oMT)5_}8L@38vYISM?C>|5MiZA{WZ6=5czs3lVC_PDv7b`Q z&g*sm2&Ydv!>|Q;DX*>-)|_#{)xLbL`?Q4o`K}nLAXmw@I7MiwD-s#Qqn`IvOzq@` z`fI6a<+8)1#R@k#)8~zPgclb0Q0LT~Uk}eHn)$*FF|5g(&d^qk$>AQ&lN`>bMyfRC z*l}*urg^$VC7z`1*&lUEc2J#_$+b3_d@gu9#mgX-6=$@E=aKW|T&U{R zTxw`~kZamMK-GhG-MEgr2C$$>>ZIDs=Mr$3cXOQ=s_gxEC%Te13-k7>u5@uhlrC}ktv{$rsVC^=WQ{{> z2C1LV*aWi+Yw+@`TAi4%2IhH7&~MEW&AJB5Frd{Us9dgSTDdMnC-VhZ{3BZ96*e0m zAB?YMXZcVg)H~#i&*a}QEN~I-6}lj+H~CDScM{^KxuWhEaz4Dcswgj{{^Jb#)!=Bw zKW$<{mQ%ZA>U_oPspRRU%?A~?Q9QMF!(`Tn<{e8-DsH*`kAv}b+B%a_`^m{^OOB(4 z55~UCSSy&ex zpl+Nu4XdUqYS}sHY)cH;?TjY0vtRE}!T6X92K8c%_s>LFGQkx$M{%Y!s)evG*A?xi zat4v#+Ae%9*KY4qNPB1- z`uPs0J&I8&?CJUaPy6pyXi}+X!u(q~Z;vA70D0G%Ge;arRdl3phkj7P);>+K_5ga*V3_(CA@ub<30Rpoud1f z0+3SQ2VpZl6n>y)eFA$=w+}DI9x-Jf-<=z9=KZkGF-6~QJ8>r520P39 z2*f48y4O0~5A_tx#PwKnVG&lQ1q+(x%hC17Ec_kaSxApwh}6VsSf2S*H9BoJdOtVC zn@u^G+20gL29K&`=POHlVc}ld^`sJC&!r0umDK;dOnvAI3n4$4Hh8RLKr<2Cld0oc zhn#+odJE23)Fz@$x>t1+V(5pX7~4N?Yc05(ASbsj{r_Hbp>-blDjJdxvqLjs*-`RL zyj5a-8(rZGzuu5q^WHslg+`~yD;A-|^G3Qt@@aC++fxs<;=UJ<|c~5 zy^D#X?B|X7ty?HuY3D(#)sJ;4Q|KF0L$kFf&Mh1*tmQq^l<{s@-78jT!*{dw9D6)- z{~*i>wnwao1)TE7KsvJ-@fVk%VHUAF%hqB2@!3e4s=-UQ6>ut=hD$C@#2)LGKsVbI z<8E9M?akKXW=q3bc7AJNfQJ0r6HicMuBKGD6i&Vk+TjG}2~Fs4Z|^H{FFr>|q)nt6 z>ZF7h3uVME&7}V~8hB55`GB{xZCR7d`z_SGBIj#s;>YT=K*$$zIx*%?nAZyhRs4EW z=D2xdFq%0ojXi%~zj=7gUaA*=e%b>|^ybat>nv&+ULxOIC-$BG)L-XpZ=50Z4Hi<9 zWmGDf*>lzsLu~h~Y+QckiFp>>&z(6ATi(G8)+HZfNgl@h_9s5v3!eju;LkgVAB(*4 zKDPiJc~7uEf;x_uk7CFy>d}v2?-R=#%MCs_!*@aRXa~HGlY4$ExrT0x$6{g;pS$nG zY>F72t=x_wt*kM2rX8ja-%6ifjZ>RcD0#PuTm=iU#Hxd6ddLEW6?3rVQLOl;Y8#H) zOs!?-A?Jo-Jmch-<4Ue%UJ36*XrJ>+D7QWk1p0Z0N+o-uA3`ecgc7Qh@Um$R9pak8H=fj(Eob9mxsNfqHq9yf?Bx&M93=J} zS<#=TPt(E&FXo>zCH7j?$MD_cOS_}Qzg`{Sr=ivawSf|Uk6`RztZl-%laU!Rev!|B zKD=(O8xmRnDmeQNA->AACu@UFw0rd-B(pYi@5X(4y)&pgm3>T4=G+|*v3VXb*NnHP zY<|OnIsYdA+o`5HVvdyuwD~h@ws#iCy0fn1dr?1bfT+KVxDx)%^mr4oX92Yt2Q#M} zoGJbq?TLOX$fe`HT)f2_yCiZ`%rUSK^%|1Tc{KB7i)~_YUEasgpQog{iBVsC@j2TY zpNc%h0ql2fllQ>Yz83&Hi4&ApzqdRkol72gO z5pUW?lE0b1Q|Yo&T%&FK_F&EY^BLx^WslCfA|lraU z#CZCVO&`W_TSGCIwyo2jwR-*paeWT|ts&$L?7v71yyStp)5-b2W|Nrv*#lvlSua{T zi<`B)@b4L)sm4dN=}!De9Z!^N2Z`cBKQy>V?1fvTxM)843^)&z;uFOcFMV*D{(P=g zyckO#f6RE&sjshifw8BA_}IxE=8ETtUHm-5lka9zQT{_M>+9qwj@$?L0$11u?LeSs zF}6kR#F*Dxpu78|_%Fd0V|%Zt6*n^Xn;?5T<7J)_OV_qSb64_Qo#h?To$l0*bcYt- z&F&mKygo}#Q0B6?O)X&eo;7k^+K2Zxy%-M%af-G}4-skKc%>@`}AUgSCWO#e(7 zTM4tpp6DHeCBqN1RGu)uEk#ICK?1vFG?tGpO^j!QvG5e3AV6&>V=> zoTI!Nz?#s0uK4RXVNKlqC&sm7qs53^@XB$)vTvf}?+w%l;*v7trb~dr=fMfLMy(LNr2qGi_-^weOuXHM zJKm+-Y39a>i;H|=rzCF8Vvo2c-WS`)c*C(lhB&yc4-S%JVfg($qK-E;EADd+lj0|a zlBey%Di4(E&lMvC*04eBE2eZ4I~;e$v8xW4d_ojQJ#xU?$ zp}(1*S>HzY&En3_1NyXiWpOc94q(S5xqsuRV6 z7r~s%WUq}8J)((0JHUC=xJ0pRxDS49q~==x1aYg47koB&VvUZk`0EV0noe@&P-Z4> zSfhl|Z)YU;94fZ7bi#)Sdl+Xd7iZYpV}#vSYP#GL53RRG@%}Zn>}*_@cAmoA#rk zv`-!9O8#2*GV@A@sI?+kV=y<>NhW?ih5XI-5_b6o4mc+%EfTy%oGX#D<+csKFvSk5p++Wd)+Sa-G$2AL9n66Pm% zwDHBR;a&){4-%uun=0i7Q##T(V{@H@lN~neWv8`TQMT zju20NppGctg&~G>MXlDn)#JOMcgbATcJM^q0@n6NY(%d#Z!FovxxMKYajF61MzkmN zQ*FgXyc7Il;t4CFgp+=HlAqQCAGfX$C*5FvSn7sJTSU?3s|&Uk?8NmS!^PbvcA#2+ z8(f=Mi&JDPc$UeEXr9ErTHS=^Pi zt{=67PlafPwIi<~{q4_ZJqLzi#?xoAC1!b#i>DCA2^vpYHM| z$%#FCQ|<;>=XBc0uO|`n&Sz3Rhx3p=kCDMzbSqfLe{Cc#XYQ`U82(GQyLfCH_Y&-( z>KYh}50&nSXu#il;S6!rIbsG`pY-}VSA0Q?{5bYS2UkrI^LUT0_(^|#I7!Shpw?0* z^KtS-(UWsv=TKs3yN(j=__rS+9`to|Kk@84XGBfffx6fGia+*lr*60{(jwM~Yl>|+ zSKb1z-&e$#u+2EMWPL3=Hyt+`eH<7M3X~|eYk>^bbUB4eOu5_^1IRlq@$;oCcM4Y0 zxAXZt=AVet#>^-wXFS~n9}A99}Y(1>*o zV^m6L4r4d-8|(IIiyy+weB>v;~9NfkFzeg9*i2m!pLWw>12ZED>PA%IO;d#thk7E#frwLYoWw$+FWowI^-G{zv-j$r>NshwC#@v}VXU`blAMu?T zW9!lue~BmS$Gy-qC64%Hq8aOL1@o`Ls50zhP1rY@+V*&kK@0eO{GHlgs)5aB#(Yo< zbyQ>ViN6Q51}kyMySeC-<$>6GO1w;OBSzh$&OH0K@;mKC%Z}vA>QBAkajnHMW?pE+ zUb647KY04c2T^=?2JAl#ca0xP#!=h;oEp&&eXyAEYU-{Fh`+)ba1!Uy&KKducp2Hj z2}_z^L0O0s_w5d7Gw&nJ1P8ncwn6vv2IBJ_+!ZEm#iBKbMQ`^_D0x|XKlp4*A!g^s zAnOc$*fkyfwPLZgOo^Iy>(Q0F>4}^v9euErw>KdOWG%h)y(KXzLAYL_gk`21GEW6? zAI0yn^e1PTKZadU;;9gUX4UL-X*Wk--d1k%!vX${4!cuv?X@q~GZqEiH~=p<*0g-4 z))#ZIq&x4l_*|zf%*UyVK8W6}M3?Ro+PM3mQ5e5R=PWtV$xrUdxktfySP|dx*HsC> zE#<6_yb;7YU`*>vSk9i$hW=dbe-WKGc@u}D#B9eR?CR!&a=xoyMcx@t_QOf$`&I8o z<6dKb?&9btqfHP)jPPR494?(+fcSXshU&W_c+m#vr6`d-k31&u#JUMiFyy^!a(Wj0 zUf830h%KJ|swXyTxfQc3Y%s4NMm*eP6SQw_tmV(eGZv#&Ry-muDe(~M z(bjJhnai&a zw(Unw?ihq>QHSO40OW)aZ@}+4>@*bS*5No+kALI7k#I~8#ddyuvfCIe?-Bwte*ece z0ydouLbIRLH<~&gwn>3lz#6ir)nc}IQF)ijfGy^(@y7m_jVl_4&M2ZbBlk=FH2RX znGXu?yWz#&>56BYsnhH3f~vto1t&f?2M0%Z6-Yv_Mow7x%K@*JO~Bbb_Nf1K8|t;q zhGXFtw61H1){C}@3raSkgO_D3JKwjo5H^$~!uL6!d)=Mt`GrT&@VyfC44P8hZ>njGJ#lT4~;2K1i)m_Sf3=HRJTt zaF~7Ehp`{jyUBSIJebd7$u0HTlwF7%##(>jY4!MyahS_oJ8537TIwE+l;Omld8euM z<04Rh1ovnQcd0*ZtC8ydw~0BVtu8l;Q(svbh^G3yO>MVV z-G*FW`&*H_duE>c+8aNl|5f5u;%9Y4ydU;GpceTEK~tApJ~DkK;l(CRu%92M@ckP7 zd8MX)wKppFxFKiGc+D9@YRUd^LFnO58ngCFJi6ipod+k?ORqa(>ztjK-1~z`-vE1z zYPKC%_*y9axdk=1cc4|rj^gu0n=!8Wj#_rU+oMcvwf4W8Lgt~3=^ES0qtM~+;M%uJ z6S=Gy{`9Ny_qs~scU;ByYR-Yp4W+2!3fTYRJ2+ck8aDe3!0(?mxQ#T=@f42m@9H?J zvDEc?HtNy0r+2T>yfoX7mGt4o58h}7u1Up&hMc|jy{Ad`Ou|OywJ|p?YvP^a@t(cp z2){F$Z|%vM)`B(62$iM>xh}QZv5%_E(_~RUI=?e@F+6fLJ&D~N!smXz<5A59;^{i@ znYQ?RM6=I`ye51u2Bx{1|2V+dtw2v*sM$!I>7yy^uTKK1Wx}@qIubT z$@$G$;w9N@ZzbP#{R(Jt$8l#)OJC9jtb>*}1>O{L@u0T|8trk9thjst3dF`a#<-{`h@m_UqD`~)D_OGl-tX#FF#VThQu>UuI@l#W(-j0R* zTs7;vW?i)ne)4wMp+hIlmkdj|vey59@pXX%?rMyv-E)q98(+CX+HIjmed?j#$cvYp z3a%jUCEvSG`O?i@WITIJI~Sjox?X;S3dV3xlM*R^;BEA}$LIbuPnuhL9?D97znm_u zyQ9K$e%8E*l`1YBgD&6MU*7|yRp$@kHGhu9I#=nqkd9FP{4UZa>G#z=7|LgKv0$+z zPE17kZ$8IP)1)SraVTm`4*WueRMjIIzd4(FyK}hYO-!N>{dU8`0g?-ESdy2qADrJ? zDnAp9#Zm6abnPL%dPg4Dhunb$=t*tY2B7_D_CM63DxDaByX+Nz73fKwI{RZ_7xM8I zcb9@6`{3SePejLdmqM14zkdbq6wwH-EL?DuUyt0j!$0>nd^_(Z?pwij#JZxPV~hK97kPrK#Qz z$Z@JfdBj&K%k>>zG6$8p|BY`4xX;=fP znFE;Da zQRmTb}a4gT?S zlYn+|OxzEA;rC?U=qL{!_Zbz8wT9J$Lmh3}rWJ~7D4&gvs))=9?rQc5U?M~dMSA|L1ZYk)= zxm>^Vo|4X(Bp9*}X@AgKdK46o4y@yI+ANkn&*r@b`>d!xxe<_|~m5xqQrQ=?Cg zuYM|ToYpSa^x#a|kM}ZC;|m&7&bkYEuay3xT=VayD;k|4W;nS*bAWr>-tOLrKd39c zsk04ZrjyU}M|&xyz7;;3)aEk}4EB;tW|uJLaYpdwwRFJwKJ*&#y*t=RKB)Bt{j@nV zKV&Ee4EO^r+A7+1gnWf$dwKM+6a5Wji|7}~V(##_>>xKDa}x);un%-=EJtRX;|&O( zh1GYd&#xjZ=*vE5{(VW$>^QozPFUNvR4N>H7=u`2v>b9mIxuuU8jR(-)1i+ zGfzeTjFztCCPT57`*D3g$>~`F_3@}@vD86&=RscEGR}gZuaxq4L}4y_o{4*>Nt2I< zquVjwdbArYb!i=npUZjoUe#Nw$PB_>`t7sZy3*UJ#Qf`d!z}x~=Dbb-RfTB&NH4SO5VHA;V*r1Okrbr%dE#JqaXhLGF%?m?gv`a z_q-<0l9z~DVi(#o_4h0}dw4bPN!e337%%JgdxaLgsa@VE*YSK`${$O%qqFgk`75K>MQLKcOeC{s9$kD&di{4V z&TOX7kKZpnBVW;3&O<(j#z_sbc99d2&r2B~4ILVX!!5~6cF|E%=tg65fCn5E>!eFP zBOna*JT`JHz|#6u40(p9PY(=M2Or42bQyvj9N9hB%bf?6#5-)bJ|JL3B>?!adE zk%Dh-!&K1^I|tiIA=9n!id^geZyq#N++!|pt@}*MaL#1^Myy8jOH%Je z`zU?M+q}62(un8eE6(8#@^q%u;u|?&zLQ_5dxA8NIv_Ka5eH@xBpn<}{O}j{>TO-6 zk5eLG$i4Mo?G4hBDqZzyy2O%VU3jeF9;92lDGe=iL|UR5H92^fA7&s(jHD8noj;O zZu&yg;=VtWn**Sja8Xmfz!$?9#~m76)M&Bx2<9E~m7`BIHJopCk^*qMM^kCSV)iat z0eGE0Q<`?w4qZnE;EGwc)HKZs8@SK?fBjki+e7J$RVgkrueB->? zDgOLEoY4@6u=$bHSKNcthU7a9yC5AjN<`~z9{4vfU%H4DFdIHRY{I1L7J} z_2Q*^))5%W_;6rIfV4Y=ToK&22G)0w1jdb$U7VX#Op`jjr3QW7|G0TOO4CyVq4&uj z)}!8Nta%4?a|iEgO)qK=l@gyop6;jR7c?iizb#)(&P=Zt8uM&oGTR2>+oP6JpXSb} zCj`Q-<8mq8+#XB$S<&yD^!b7nUdGh6^O1lb(we|h?uCf~S~g#f-}D5n7@rNg2FjPV zRw0CTu9}i8r$5#bMfSG$pC`%sBY)y5bJ^0Nk@AOkuaG_39X(1ssPEIInM8ugYETXS)=Y%b>Elm$OO>n%U)as*Xw>>~`@$`zdtz$%TOlN!oH zp6)~8ebzsDU!}6Cdyvdo-bnlVQZ+eXzH#reX+W9uAUzHzojhUQFHai5UAr^6Zssgb zlRj>UK-1CQD4rE9O<%%$%=$i97~&;Wy$Zt0o4hM;ut+K~3c}45e%O)SRf;0Ef3bT2 z9xLByhLDTmVJmV!PA}CQ>qb7tqe0L;b5_&8lQ$Ccf^fk4na1V^-?L>w7}d0`RF>|H zWyC0HA2yeiRrdJOIEc624<+k2R^(8xZRecehO(SiibU3~mTx!6*}hM(QJXlTcCoTu zbQKP;=e<&VP}Y3a61|x3?hQRCcb)SS^B60#EqBY|bzkEYb6g9TV0p@nTPT>!cv9{t zzse~?ySaRJ&sWM_v@}TPe5|RBshqw%4>J2T%NvHWN^t~%0oYgA!5Fgnfa0TQbUsg9G{MZ>OA=iZ(>UJI4$A zERITf2E1$D;f<7gyQL}ZLgCxi2j^{qq^-2`unOvHTCJ2S1B393+@}lv>PhCjGup`* zJuLH;Cgn3{Bcti}H)Kt_Ih;+!kk>dwrO6skEZ>+Q>M>MmUUVS`j8h=0m$#9OpE+Z< z7w^Ect)z&44tUXo??UBwsnt&_^iQd6XSZuDWiNFpqSz14ci1T#raZwE+Ih70UfC_T z3XUDwaRnA@Kky2jw3vU!$+!j@tv`xs&9Kq!X)(@EjW#?`OFyyp5@0hyC zCkytWntPX=Y+X63^&V)r7c`u$CHK-##IKp$>t(!@X2r$fO=se}!mdci2SwxME$&Zs zi=$vBPFGn2heb#|w1d$gi#J4p>mNmHHR^$Tq%2X(4Z6T9Ims(Tu~pN6RLR&jZf0zaG(7 z?&P))`u&OFSl(W~S+g6<*vBo8Z!DkJNyKkgPmJ0BT?*e22lFBSX#m}qw(XC?(ZgOy zPC6@Da%Nsh9AlfLqtaW?5OkZ$d)urS>B?Yo-3{=;w#OEd^dtxqFYyl3y{}Y4{x)0I z87A-RNWGu)o+6HzJnaXXfImLyf12EvT`p>l^x!SUc3+e%IIF2S%$@aA#`)BSQcSWl zE*|y5-Ju(#seA45bro+U=eCgB6j(xgaP2u#-^u;tvDZs+|C(8-%nJ~pRbNSEq}Q63WHf=WL(OU&$qh;Ymxoh zf&^J>dl`n(=Dwc(@;6BhW7>TFUpqNRI}Z`8FHi{f6Ju*HYYN;vGBi z?xO!yX^wXoy!&~fVo$!*;U#%a=FsMKlcjyWjJw3m{OM~i#WxEgHpB;~j7LcW?g!xf z7us}w7wPD8Up)Ejja&Ndq(1A2`C{$8bWInjpb4?W``vMR%pl2Vl@qL&xnlZCQCe8; zKzzLmY#ywTPTAPvZ*MoWTGT;)eRmUlA~x5mH#|2R%h^rU7|q$*gPFf67RFBX5stYORtnYU!iK2LCY6!TiVMjoGg1tkh% zIF}rhn7U6zzO-&P6Grtv~vV=B->#wzSI67iGtYMU4xVT+4i5zuz0(bC*jS z`%*Vn@PX+k6RAgqC$aI|$Fw$-MqVVYn=#6F@o?$J${i?=;r{f6iS%C22HH)Waj#;W zw7XAnQxHJd3(*4x3YtMCEku?KVo`SUNqo5 zjxr}+Zc-rkAy4T9_I*uHq{}0B=O+^pk4B+ci(V4b(@+-e`*nR6z5##+wq zoQw`}-08kvD4Vv7$E459p*JC)s>2)??tx>y2gr8o!_m;l6Jfd?dp%y-V6z>jmYfx5Op+qGpE9I= zcXVq(vioJh+QgCk<~^lzj%(0#lM}8MT1oERmLa;Vww;Z;PM6;u&qONid@VFjo~$WB zHQy7jLm%a-VfSE6J3pV>xcJHA*Qi4~zi!*O*vs`P`%7Yh#{8AzGj1S-vHIT0$Fi-* z>Hq0>KN?;t?^{YfQpS)EMLF`RHd)+tvJQNcET5>{hxRjxG4KzTPmtg8KfNc@WGC5% z`bB|$%()q>WIHhuhbvga6ik+9%n!wzt;8h750STT2__FEarkvQ%NtpLO+L%px1mjB zw>|-QI*{4{$G=Joe)uBPm|P?$Z%g4dy7Ke{M@^EpB()s33*dE3)&biZ(JOUntANUHE!~| z$Kg=#-~2SZUs-+tOf9x^Kk<1##Pb5T<{ z(tZAV& zmIi1seysAwuP07YUNQAuy@;zT-XyJ(U2q|hc%)gYBz;Q1waHcV~n@;hD5vO6ySRK6TyPR2= zi|Iz}4fj^aE!JkBu?h8yXBNs1XQ@NNcrx4W?b2a!ye;|9~{EuQ%$%vX?#| zA-#D(ewg3HhJN;x-tYGSx_P1aqn&i{s0->&#P9(m^^JQ%CLHv2BO z9F&Pt`u2xk*W`QL{i%!@tFIlGFX_c%ApLx#QIgzhZ#0tV+c($w%Rj3lv4=Jvu--ulnj>v&6YnFkhK=B&@&L9*)WirbAiYu#)vb++7&NgrG>t@|RWRUaFSadX1f zRl}v>6F1|{7e_3Z@<#Jv&IUBBa)w@Uk;ZqtIbvJc*Ru1DW;5g+Pcz^~JA2prKV)5X zSXA5FwOg^fySrh|8Wph>Td@*aJ)AT>E^TLf1jLXi1!pCw48|=YIk`5t?pX0K%C^ye_mLmTRok5C_F2#-yW^&=_tV)o^Fhv8JE$wS*4e!F z!g+IhTyJck+fAST4|SM_KC_IjuHuf%yceL!6Kyo_(+_qr;u}s}nNVi(ZuMt^GNNzJ_*=*qULdEnz>^D~7tQuj{mNeQj7%+hODN z`C5|)+fcrt4N`;0Ym@tLf>nzh^yBKRO}MiLiz@8E>Nn?=W=<<$Yqb+q-$f{`y;fsZ z|E+)FymS9}UFyI@Y~;N4y2nY~wyS$EiuFc9UW39>lhVldag*%yKttVuji zIO*zfmTk^wu{C9duJ@ckOz*o%)=&?1BD zzo@P*y_z@5jIc-fsPeif_U&8UWv|2cr8eq3`x9K-A7)+BzS`jm6VC4n&T6%djhu0z zBfS(hq-Y22V9#Tm16tG#(U#`DjH*r_p%5o+b$a1?^L)J0W0Q8{Rcg)snJsm9p|&!4 zLz=JThW#+rZhg&M-2fYm50|tJ9&N$Nrq)Qf-BcUid;|8{TjQ*otXP<=!KDqh$UYye zR4As`+eyp6a2}C1Np~n{A1dhLHG<2qbbH(M9#6@d?9__=1dZp!VjfBGBg!<}?5+B5%a zEPJ76mg(ND2|)>aAQ4x`=&am>V9wvOuxvkFo=*S{@%Ie;)k>%H@u26M?GO5@U2jiLc!WmVnw*(lLmjZWAX&R8 zg?aR>A>Nk{)q0Q%+Me1TuVcACS}HP6Q$bF?dX2F`V%U-|2C z+Q-RuxKF-XeP5OK;Hw=-F|b92m)*53H*drAMmy;NR72ac{$^-i?L_1EDN2byIp%Sk zyH$%)TI6iOgPMQm(Z|o5uB$z4KN?oxeW6*2?)B_sIJ9QXFui5r_)iIFPaLlQs$SUf zQv5%6x?0<>>2|%~ykikDf1R$o{2~UQ*KrS@7NGm|I2w7|Sr3o1)ZKp(iFr<(-|437 z2D}P~y)E})Kp)P5AqkQ zztpCTV9wnsau@es)P9Qf!387o3|}bPh1^44A10S>W19BqU1s_;bAWxjDD6pWH-zy0 zKjZDAO`Ane%`y%cxYtH|_%rouYI-;AUZkCK!Uc&99I>J4IPKwuyiYGA@4whkd!&UE z>XE-&aYirByQz60r?k=5cG@|4JK^ABiyp@sXse}I;nmxn=wJb6hU%)$jD=MR z*JsBzx^iEl(UA4q3?dU6ilrp=z? zj_2eO)#$TGTf{li6>@v04;riO&APe`XZ;D8{k2sRTv4Ao<%84OYgPPtm6~YF zvB%bw+KSF82HHaMOT!Jw**INEYbTKlNiM{Dqi>3X^A3#3rgoiukDr0t(6J@C4Q=d{ zMeMwvW^MoGp}(@=vn5W4+WfU|xGpr;ofs&?gZpp;^&_48^jwUXOioVVaozh?hftg6 z{t0b>&ZR>ZqWJ!58Z6i4G)>2BV)drbP&c+I^%6h$T5uo z?RRREmKbv;=-fl=VZ>Pz_YK z?MTin#j(%=Rh}`wwRoG7lVF7_JnR2GPw}^1r`u8KFt&E&ob-IL?qoHA)TKPL5?pmj zh52~HJ;yVDv@To9fg9K4gkddpc83pOJ8Pacx6A4_EXqKYe$?wVx}mLKo982Ww2i$r z+U^hbVYCHxj(PFgNhg@!LLTj>TmITr(d@;s&-vk&gI3cn29iH@CRS^;L+M|uv1K0p z|g6X}8jEi48hDB$scDlhU5| z>=V!J@!~)aW$%%#IM?0@7nAxZzg>A3=Un*TIGerQ#5(^N%z2N_sO6}WDixvzdpi}) zdg`)_1UwIMUoBrwXK$8I-xtoZJ)1v8#*NV9e72hgnAN!%3HMz3~Z!7!g zu|F`&0pshPRZ@LDp}oOg(@w2Y-NhX%AJLP=EM587)E$P49MNW9l#)2f9j8Y)A;-*5 z$(hf*Q}&dq9&l6MwxY)py-%;%IVy|NsWr4^pX8{uvMz`^NAmma>MvKuJ5pPDm)>!2 zj1C{-)Hu^Bm z@+`A!RjdtnR*=B^@0pX~T2spcm~wv@R&1%g9F~J-1Gx@cn`&LI9>Bnr)Sr|mM@7nj zQz(1#En8@>o=L?d_Kkm5tf8H2xerEs?k2N-DZy{|0u|}uWBFA1R4WdT`T0=mt4hm1 zQOp9RM%(|S(!O~(Dsf-kR6{5>XF?#j4|E@yr7V9N$U6n^BWn|tiv9di!k)(F$5G1h z#Xhk1bHwL|LCTlko>>2m`|Vdx#pRDXVwu-K{j<_w7&*Nc*^7%`tV~|#jyP(rR#hIO zH00X0uHyhF1Pvklxr5#($juTF?GtD(O1f6<}~v_IWybX`@qe zu$6bZH_cSqmj*dF%6ed9+uGW$8xLVRF&|Rrg)*$t0ralK-h1sLrOt#5Y#PV8(yVl4 z_D1d--h9_SMk?mM$*?cBhgZ6flFrO@vnmeg$8{2)7>`w~uO9W>sx&l;#qRm+MP6E| zO!kOk<}y8lo-R~|9u0$CpaZsM&r(J@g}~|#H9WGZGMHZb(c2u6Uw@3!dkJ|Oykop9 zH$u63(FeVTIOEtQBPE8J#_1hhaK&hVayi|D`Pk%?x9FmLXP(}W&Tg3etd4Rd!5tf0 zcwkuCOL70bJ4PhX11svZ*iTM%17=^fFVKoq>NiiUW%kOZy`sl?`u;K>Ys~khVx<-L z4|vfgL&-rM+gm>QE<&ihDknJ4xhWnm3C66O)WT1^ zBQ7)ByyiP+m_$7g!&z^Sge%IAc`A+%r7vru8!SgW72l_OA=ShKEvnoVomu;}sY7q> zaT=jI?Sau3xYtZ@66PbBi+4Ey)=j&LvGkB`%Z%w=e}2ff>2Kid5{mm3cFGHmJ3~D% z3@-B;tJ<(%b!<@>BDxf)j&p5~?iEgMYPhB)bt{_R>_3W1a8g^M9MAH9I78yx>CrK6A4>nnwJ275{KNGOnn)wTb&o!zj%4J)z1Ap*C3+ zjrViLNMZT(Q+g7O!)sPZDfc-?4UR$m5rsx`Rn}PSL7)BlJ+aou65k4A{=(U=Te9eN zwFqr^kMONGS)`UZios>=;V^NK*xX--36};Y>?5d95ZtQGxt_g)^pz ziy7i|e`dw*cER&%c_Qx|_v#zWmrOb$TDth6n*+~3i(*kk{{Jg0<~&|KDbCdLVpf_r zCX9&?t(fJVzajt~)U`w;z5N50g`(@k`-WM2yig=XV}@V0>L+tPa~Cp4=V?c&iZMC= z>2YYk)kTUTXTfaD9vpt`CRJ2X)6|(>@!C|)vuoBEHaP`uB}Q1h!xClt@BItsv>7Sl zMcEUu^d-+`+$?cv(NQdKOWp6$;bPQY9ZEPes=dWTnEaOE&K|bt@|}4mK6gZ@%28D7n}OQv>4n?cQ-r@sMMrWkpI-47x!QebXYP#2 zi*||r!3h{ePQ}zaQ9`t4J`8zo-`x|0yoOn<e0_mT-(q{tM^$iK${)zZ0k% zLr&fG`C^LZC~mS>Q)BuBp=wo#T~F*$<u4MK*UC`@(vMAh| zh~p71ShqY~n3%`oEIo(EjmQ*-Hpb#C`4z`+q>Fn=(XeR9+IMKG$p21Wf$WCowUR|y z!!Y`tvLE^~MeJT5f>oCE=yy6K9>oS?_i0Z|nWz=d$NN)r&g44`u~INh&7fXI>-B;&-Gi^7O@wZ4MohS24$-($=fac+$*fE zDz>{G=S_76D2Kc2aduzZ4M9Pc|9t1)=U~C6G~qz5#Zet+tV36dMz+ULjdwQ}-}$0S zx5F?nWv*e#8u9#!f+)`Jm$z{c$(|bYxyMZ2G+(jWBoCXD=xKO3O5CrJ4ZF3@_!E~R zGOuT0U@sRK7vzf3Y3Vrp+yyNhkBINCshGRl73Y1=h?>iIPane^srHw}ld%aH_{0rf zhpvmkLztJh)g5l@Z-_iFn~DCPkBYB|?yI9vojNy_Pl+gT4MzyMLrIyJ#URsNSeEVy zRlCO`ogUOPs(T@BcX=gys2^%<@PcpMCQ8ft-dGjvjkDz{DS21C@E|4t>4R*A?QPa* zH>2RRD@OkA?1NyQ9|H!S)-0dw^$%8o*K>z@$J4Kr*j}BSt@38Cwe)lH*Oqb)y%9=3 zhh>ge#s^#f^EvWf4eVR@U!1SFr3rP}lZd*&nmKumIQ#q}z-Ip7UB*wu;9E z8xK6K^j$Pu5`zGl9_6kTmDZCZF))Gq!??Q2fKR(np}Plcid!q9I1mRz-BD?B4`uaO zKRlg9@7J)wO56F~sJVx^5rYOON56XFI(1oxi}| zJVjGOfjMzbSk2t|ydDLp97@gV{8aI_HFINqTyXH7MvSV>ylMLP#T+^yC>hFGR}X6!dB40o%~B%Jw>m*hGK)OHJ!4<;%rkJnPaXmfZsL4*_TvT{DdScK!@7|>4o_Ao$LQ&OiNCYwaws#|_jnrXj?ii&m5st1 z$3O9%Pgg6~+AzyE)e{Aqn<;NN&n>6&$I9GzaeBHBHr9%S>%%+pSRWslwAhFF)n3U5 zReGEs#nlpPT=h6F>(yWGK+o?|%$+|s67fg%I6u}dR3=*LaenjVt~9ake{tR!m@4A- zp2W|O>~Rjp#f1EM3eSn}=3isPPz~6YZyDV~n924wk(j@+Tj_&9Uz27Jg4u8k<2q4ZYTr z-wUH#shB*3dP}p43NzRcmgPx5sfJ2~`yOO+F4ZEkn-beP8cmpUS>$V^q-Ta9W-&9Z z9*tDCFpD9AKD_q#Mk!iNATF-*z}cl^m1ze4Nb{pl?l@EB%V_4L?4$Q(%s8c=trvm~ zyik5p2PN&W7w(Xc-peLaY~z`zY8MHUcc10h{XXyw+lRNeKgjp~hx4hSwZsJ%J?v zbac)~$|-vM&MXuz`*JY(H}~F{646O}5F`6|;PCASqA9i9cNTdfEc=rvUa=o`tGuvd zZDqx$buub4zj&&uiBkA8o-+zBc*gZoMsM7W56n%8xHC*?d@meL4|?LX)p*5oR!f^RY>!8r;GT9*|Cqd8|EoeE=*YGTC@{d%4iP(!rw(BnL_{5JVge?88Z zx>OOh{J+W|2NJ>pZAGq=@bO}#=qaM5(NcCct3=Er*F%I zkd9%^a@NC&l`zaY3@d7oez<#zp-pvodxJg1DUsrvm4H`!?hilG1Wicsn03P1^NL8T zod*l*BwOITI5UFW#SYvbwfDsQoap?@N~Q1=zVtqrp5Iit zHYx!a>jT~WK8o?)7<`NN#y1yZ#iw>8%$j+l)v8I#ws2--l=X&_>s003*e$}e0 zvy{%a0??Ma&BkpOD^HL5Vq6nu9`swN6zRNi%*+RE8w^%DlBule@f?o-?K2X;k=3{&`uyZ{)siseE3e z$NBpA%TnX#7XQIH<42;n?s5uK$j`KTu}qxke*(qq?Mz>|K-|4?4BJY%Qh^)AEBhn3 z&bvl-u8T-$RES?=n74Z)L}bM%u*l?m;#;El(O5>!_S_GbQOmFm9@d@r7=`27jN0{)(hHRdP=w*&E<-@or{ zuC&?ZhmL!gF&(#D=@;Qc&9WapMGsKgjUW%_O9-0n$PkbAFlVGV0bdR*6b&2dajujz zN(^kT$GLLF7Q#J3k8`*5Z26g~9_LJl9695$9_Q-Qu80cEB`U?=tNkTO8?gC5IA{6o z6+h%t2pGyc{Yr3en>^O?9F-IwCnK18k6tm%sw#K$%{ry5D9&|zT zb3WpOyB3v(P#4pEw{U7L@P=#nVeJgjC9VMP*6_aYnZ2*-d6>#|m0s9-VdsAl5&4WG#1w8 zyfDK=X^jZX-s*>6qb4eEn}lLEGh*AMu)mkhnb#&i)E;E6>>KHi?LU2yTYrJlDAO15 z%>q!ktg{lB=7*cZ!cnL9ZgIO&ASU%l#iehS;#gHZ&O@Unim+~aoHvx|D=gWUD#g&e zY$YKr(Bu65u%Vp&zjM&w;v&QL&8Su3cRIZ~EzNGT=|4E1F$fV24xYql_LDW8B+;LG zv;-^q;+^a+?&cjsty9!1?dU67Ss%eP@`qoJ9wvTuDTF561&5bS6FrYAc;46z6XI8j zO4DTYX3w$zRa>#OI3FX2d7?=bPqAfSE;>D<-sw!RsOEYIQ^I|)`f{A;)g=p=Ttk{J zhXfP6QLUOk4qZMY4$nx!D`r$^U%wQcv*R%NydMf}%PHwyqG229hm~Ff!hABv zYJ3bO*^WqETVAX%ID!Js&*JT?h?P3>l(xB`lYbpCYbkwWU%5gR(Ok6rszGCBb32E2 z7E7%1F})Jkb76n+^;r&Hu*X}&MlB8)AHtoFa=cq){jv9(;yhpdHkSq=?VfNW? zf9y0(5mniHv#bz^VX9e!;~@0Qjt~L;0?>a7JrPnCh~NtWaB3OL`FnNo=5ydb z`0O@5EpI8-v4{or!APaoBUSd ze6qm}&C#Pa|9t-UIq2|Xi?F?X3^pw}Q|@0;Ol@}*D@Qxv$M;jRcf-S&Z{tV}`yu({ zYb`ct$z>g$F1Jn*_*ILUm|hw3oH-iYrC-dDUx(y8Y>aF(+ zK-iOJ!XP;i#!@h1CRG%s0|HSzEgT7Qw!Gvjwc!``ATGp9Uie;*bMU<(vd=|5&Zk%W z)|_I0uM{`f$QttmJ&E0TtniT2hY4hpV>#Gslw7Hq22I%8oHe1bT;WzxD7Ecz**&}t_4JB05qT$!B{sp)?_3lUx2v1hHdCSXzqPOstJ`SV!KZT6JH znSXh0OdE~y_hby^tlI9{mjeHJi8##K!?;#vLC>FYIQPRF*>#UDeoyWl*brcq0iAgG7z#fL8KHSeG6alW)*XTi5CdYr2^ypuPgz8>epg%(3c zrTuR`=XS_nK%H?ZwhK(GG(UdoaW+f6BBk}#<2+}*x2A3T|KdC$0;0(`1xJ69^IR=T zp4?p^p^O7cOsmK#^);wm!x5d+uN4e>o`(f3onU!wwoy@14!LvGdVKq6^xW(ay3Am% z=h%U&n`I9mkouZdk!w^v!ZJ`N#tq?HeN`Uq_QUwNI~EotsO+LskVyTWp`WZuIKw>O z&z`7v@rtUX-(D=|-ZG&1SJi;)G3Y}4XH}{#y?GOXTqiGNwr(fYN@3ntA1{2{*jIYJ zHVA!~-559BNYaomt#09swsVI|nYn(5Kk9=jT}Mg-Hu}P$2KSukuF_|3KTPYe3&-}| zQAN}1pc40^2|c^1D%{lLJbt;>XvhC>Mokx^UCaqD#q-X)X+{Ur^*9&K{9tI2q{n$> zP*y=MXBws7sdCWVM9CT|Xc3f9*?kjQTx-I`xMz61&P1l&5 zfBbR*){{THYC#3ng_u12Acxp7a;1Jf@Km14Y-u%GvceKp2O&7SQ= zHF{^1F)))__1S|8Czx6Mc$L((ZVa~U@8o^YJvJ3kXF|6111EZw^xLe|A)E9+{e$?9WA+D350087wt4D zs%01TIIr&BLUoZ|2c@|EvdA-Nc$mX*i=MC4} zqX+#(O8;!F=*pUj5&y-x!-O&-uUJ95Pvj(D&(*BDEo1sy`WU9YH2Rrb04=pJUx#?8 zB=bBx`09v;F=te3YUQ9^MQ6BVRFV$vKL}j|7X*!KFF6g*!g}7jZ|qb{XHTTVQgXvD zvpG`wh%{!ry2HO{i_|nL88;Vspy^Z>DY|wN8m{t0SLU_ZuHK9O>%HLiHeB*O%}na; z-bih~M{<>7;7y#Rpna0tr6`0xWX@2z{nDDf5m@9$t)OX^)H*Z_&a4|!f96Q`n|2|5 zSO@~#6sddNU^tuzMabrC$w>*s<4#d1S+_tk`^K#5@MPSM*r7`Ns>gZcw#`NxpXhO( zw%*i8*HFKnJ)9pIj?C2KJj89Q1C_neV zI6DqGBA>TVVEvZ9e;dmf_S`Nr*O%On5zAGEssi+;-{y@=r&K0yb5Z+&Bg&=Ml$!Zw zqxDmAi(mJZdUraAb8p#a-ZDeVKbVQsA1+7=wv<`K%a=*cuDfvY!+v&LW8@Wcg8sqE{J?Rs?5@6ket!Rts4zy~e|~)A zj&NljTq&O2dpe59A^JZ55Y=nV%({;M{CrGF3(Th^Xn#ut;*P zn}uhw^sKOPma1i@!#&ak_0z(n4aRBEg)l#;Y!}%$;dgX%%p5)lG|f- z^h?#lxPw?uo@&D2o;*jgaC<5FC+`fNL9r??0-QXh4BUH-Nr=h<~(|I*Qe5krhAbP>xRmAeoD0q<4|*lJ7nXkc;6}p zb65vX3T=Rl4pB&Y?}5gx+au_C7*_dk4*jVgwf7+?&pF@7X2al}$hw$)&(BxJ;C079 ztUTw7jy4l;pnd>4Gh49dn+e$Z$qzXW!El_@A3d!6v7lN6jtzP!_4*QsO`8*7TmPDB z>l^*PQFGG;`E?gP&dnzF6+5@;_l?;mUB%!EdYqNbujRmd`h6pR_D`cWclG>-}o0>_Vh~ZQt=2x9D zle(@=#TTBh`yO~oaqh`DK%Rh??>?z!ToQ(PIAM*=F)1@G0h=Z|WBk7Rl2dv-j?{L+ z(VM@dO^I>1O8sf_tLnHN9s^%@=6=~WhSkn!yfb#g=+7M>SB=ESH*VP4VgP%VVffB- zGs4LPz08;|+QkDO-pqgjHEs=hc|vz#3Cyv3)~@0wBT%X*wYr9790Q}h%^SNe@}$PgFT# zUBpRg(V#fYe&`5?UN0p#f6hMKoiNz05@PQ}BboQ~#>*O_ZpSEk%y7-`>42VVBM`gX z1#ZRtvCTUS>GWr?{$Py03wL1>_Zj5Qz_c$x^el42RQHuAyC(qd)C2FmY=u$O3LWU- zfp0&UmDG|PU3zNF&vwBlXJ4Ed0Ig&AeM!H1NR)XKDu4TcAf6KR?-p zBVO$gnc$DI-QrL?e5@3v)8kyHTB3Z2&!QBoUW59Hik5nuBR+HzqKqEr^!j(?DcAKl zk2$-=XfX2?OTX`Iku8l_pvO78!}5aUk^jY6`MgJ^P2GbifAYP{Hqeq#Ip#B( zH$r$=IQIBB;eCZJnA;=_Ar0w4RCXu^hV8-(?<(#-Z}vV7SnK*<{B&nDV}Go4u)S z?Kk3Cu|JIIp+DibJ(T8t@FTzW9reNYnSYC1cW8F{Le2hL8ndLuj6j6;A;0dGH$4%8 z5s=}Hs^)%3xEBOdYB}?72jDLG7YUZ$xc4Lk_sR~2XAb)!*)dpcw^d3@(&Mad?kR6; zrN`NCOiywAf9tu&#x~;8FMYky*#5lS?ehO{K6Wy{MUft7w@urmgERCv_xRSlAiMs5 zaX!)Zhbp>z46>+^%y1qeeP6o!pL~vMZ5*VWDLjM1>=E5>pEQkoW@KCP-wvOX0$)Wy zPG+vO`m1y^J{*a?nLV0dfNImiP)u#F>U>)~`ne0S{g{WoZU9E?4goTlH6Jtz-v$Sx zDraoZhnnGjP#~^nIb&|oT9o0tenxVE1^eJS=0*N|?SiKC4Y{uPz^@MP@-hBs*VYF? zY0Pna7lNzQ75>=g$!x-K1lh31{Ky+vKn{B)W_L?|P|t|K3GU^y*hktq#Rn^LywH4T z2<&?rV+4P{-Td8ftLrWq#p`h%^U^UwE}^FC2$QTm;K@6YubcaZ+f-i@zz^xLUzDw*U* zBZ7DErfobW`|DAd5OFvt;NR6W#) z3`1<8BdkYvgz36a=6pHfSlVEyhU~&YW_xL`j>Vft!6;hejGaF7FnVeb?pJi7C*4NO zi3s3a*9F?4+!I>)W58Zl{IK^xzj1!(+rS-mXZ>)9wX?%>W;I#{qfeMGl52UR@7hrG z@8yfAxxVo1OC6G@4^Afe!>$|un~C1Ic)c_mn0^_N4p#{`p7GV|+ECpHw)0H|AN|;l~n4d()%g`a9Q2yQbke4`SJ!-@-FPF2$fIV9=aEdS5&1d%L!|mwtkh$kBK4>?32lfy1 zL3X+y?(f}-p;PD!u{!|Ww=aOEpEnerV1!O=h{+S!{}>pF1!X14bhtlOtx7I1Oo9f8 z;^s8^sw(L)bRTTwdTu-4-{`+^o^)=Qr2W93ZD6*jC z4DuCMcljV`EA2u&=i_&KR)pEfV65THcyi-9m^ms4O%5=RC$9w-_y*vdi3=*6?TXYA z>aD)JVA=SAoR|AzRSW7LK1-6$)g^);AguSnC~={`-eKB1?za9=Xvrn*24DFBeAQM zkC@zgCx-5bg_r+vqabEV?~h@h>tE}6WSFVcc6l_Gte}Q{U>j-MktlR|O5dKE-KDor zB9TH4`A+MR(u0o?n8(`VZp>22?n^jwwm6_&4@b$6^P>u19q6APB&|9Zio;gSO*2i9 z%J1KW-`^aObT&sawGTn%t?a2*J|X?0kD|?2CsawjE?vA6hz47oF~;JRw4XWD(d1@- zN+^Tt+x@Ve_Z{2tstA<0SI|>fSzjA{f_-p}HP+kb_2I9kPL}-I^Q{|U60@epr+8uA z!-kkU&>OGGcbV)|53!uz?x^pFp+CM!ZS%Y!I6M5lK1fvxy+oK+*@51*L-9%4Q}9h^g;Ux8kNA(&HKaOeS;de9yO&7 zZOKcSMa@FpMv|&Gxoua7^QBJG(Ej0QJ)7BPPYos8&S3~=9hrA}vZSdOiV0I#S0}BI zQaOL?eww|$>$Z~b`C!~6ujYh}r=&^do}BN5TT6FI=~Dus^m4{hRlKz7s6RHPJEM7v zEa|p^9}Ep$pzEzjTXTJIq^>KR=AMu)ePurKEH`p9&Pgtu%?>W>f!nGQX*B28Wwo9# z{c}NbiS@!t_C~_9ilwi|J#mOL@3cONQjnh)HlOsz>1_k0n&3>*kJ{1QE=C_W`@p_R z1RjU4mGAOgbtwu*-9x@|>@8QUVXZm7*JL?@-fSnI2VlngTbdyT^m3zbY`qzV;^}o} zBd~UywY;vugi^Wo|P zmAX>|?vT^iuGI}yz@TtAky~!j>%QvyVAj2Zs7vboPW7dKC`M4rpj%%~`q+LKN;7y= zM`}tt4MNB>b3}#mO{IXhL0DSG3F9wxl=9dg>$;H|kV*X|m+$~IyzPX}8%Id%y86R@ znlt=IPLsZJ2K(haIZkVqNlD~wzH{N)ZnIe$J=z;SajsZmZ!J09r~i8gcf`BfNx2SQ zn5OlhpPHRCkA2p8vza~bXemvc=ZP72yb&D&Y5Gbp>^kU&OAimJ0FLw|42c`?pvzE-t`&(}nQ^ro}YZHO^iM$V1E+_T99*#(v zSt;a_X+MP_xH~l_i-T0}%7$TDH1iDFIH`QAgd(>#InUL%tKM<%g^dGFp4qAz`iuV9 zPpN}gutT-tT@VVmwx=I)P%Xd3elO==Ya6leM~{LP&AD%z2CAB8_~VZaIi)eXRhyUi zVa^NI-rx4C&Oi0Rf;r6CxUE$kW1rzE`&8{_pHpomA7Sbp_NltuR8^p_lr+c;>|Zd{uIIIv}te50x}9(E+prh=QS<2yZIoI9FZo|A`=Kd`B$ zGrV-i#rg`{V8=T4RyS+q#cp5VcGw-`< z^V%@xZ_v+VOQ5Qzb0}WaAvY;;uHusW~?g+SSmml@S1J8Ay__@5B<{SITGZ%2q{`Qt8 zC6V`+?|zt{(@S3Y!2{!r{n0vgjofCvD;{nn_p589+=ZI&jnBv{%PNuQF0;j|dpuLZ z28zlb$m#O4L#k0#rOlMhnEY)gA|0ZXgl6lZoym-_rk={8Ih&C3|NN0gtqGKjVs;^c z8rYzDKUH16Q=bvYp8t!Ts+CPb@P?ZGdr{Yo9`_1H&#}y7ZT)rVboRL7_fkhW-bXWk zY9MmIGt1{kW%={c0MwsEZEu1kuinb}Q7p9;S!?9ZwSG7wWX3r@-kf*}#T9JoZmQE*_NItRv5h^M!KZ z2juIQ>2u4zchBo-@(DM0Jn8I;h~hX|N_B@V`9q`o1V-1nB0Jz_jhR?$foVrfSx{{}%FFq`w2ih7Bm17EPrx^M|7%4_S4OpMvC)Y8rvSt9^WealtXINK} z?ap{%(>!vSM$ebqlEX7Jm~~*)AbG8)CmNh$M&OGBvLo*n?>{piYt>nK;smarHmp0h zJ(lx$hd#@9VUhVaxl$i@Bys=Q`m?-PPhLu70c)6HRfX*jW(BftG+$CfG+5w@JU2&- zY*|w@uFd%v=ati+Ru#LcMVmgt88g@Zl()05QCO4O*BRI4)Nvj-GS(fhoU-KHfu777 z;+|p}EKjzjhhkkX=xjpdp=I6BzR&{+RS(O*=rePKcl3j&YKcko45-Mt|Ln5UM4$PV zXfuSGOp9#st<^@{HDqt#@f2n4g;i+0b}b?@FDZ5IFT;f{Yq4+oJ*DBhrPyjd>o1&Z zy55pTn>%4A{p)fn59NHs3A3?c-@hnK+KgednA8MVU9d| z-NpmTh^0=B81S6_f!nH!)vFwFs*FAAs_Kij^Bob}hF;lQnhG^F87_;dPrTGZjNa~u z+FWN3X0#ONc^~rJ&{2XX5HPH%}ovA@kF_4fD5Lcccr)LUD=59kzcHf#vkn{vi){qlx%}ZtG9`q z0TwuVdou$3OT_SvYhjkT3M+1!D+xKv5gEE17e_x-rYu^7=f%sgq(f#cOySm-nWuI+2qFmymCwSEwo3IBla+V*Ix8#yaO)IR#+Ch zNmQP&2^U7J!`Ouv#QXOv;dg#1%+4%R9F8rSJTv}BAtkDrUX(;KsRyIj17 z&!jE0zy|uu=E=;c;d4BCBu0Kxz>Kh(+yg76$~r!aECc$|9Ltik8x!*$)HCKBluPK9 zTXre^$CCET<;GLX#r>*gizvDM7*{MXcSOCWZgRad?$j4j3v*!h*}@TTJ@?8D&eMNovMqkKd?#0aWr_Tk%=_8i zLmUWSkCJvPQNB~G7?QXg7v?X3xTIF@4qbrCsb+X@a9pX;b2fIrnT70#P^GvXvz+Ug z{Dt$dS+((Lw+$*3GS{HkQ7YoU>)mCpSZs6YcqtxVY|&-*N!3pJmvrFl+&I=rC7aWa zhx_?LzfP)+JLp}XMslZ)Zcxk|QS)0n`N&gp($6?i$I?{x((sI1?u^BwE6aV| z$a5#B)@j03&8%P-oNnfXn_2OiDkYBSK;GxGTo28wD$Gs{qTbTZQqzHXq+NZOnQq@* zGq=WCoa(U@Ka=*!A5Sj9j^<`?YkE#JTRIneji)0i!&zBcX9jvUn~GD@y+!+R6A+W2 z{tM?aUQMaRvcZu8=1PRH_F!(<>dRcu>m(_$1#@+t+oE?`bt&GMI!@vW7an+>?PUvX2-wP6k$*QCj53spBhi}2sJsBgPaHIdJv z32}R?oveE8O#j7XTa+9%QBCE$VCctZd>N|CnRaMpMZeQ-hN>0M_;Vjyc$@W8Rkfz3 zobOuCH-$zEt~j9!y-1QBE)*Qw$80SVM|{l6($wSGdWRbMJFPUDgeB}*GfVoyu+EyM z9q6S!fcY4k_CNV*5Jcq zFDch`6;{<)fXk0Fr77DNVZ@7RSiQ?f*T=o^IE0yl-E2{1R+?0H1HH{8TXbHyO6p8K{njzeY%?Dyy<>lRCGYd6;+jY& z{OLPoY>UTFD@*ZQw;OBNA|d*-Dvf*ii;p(!KipTXw4>M2WgCbG=T)v-?C>Yk2G151 zs#>qK!-5?)^e;M~y0x5sCw**C-ENP{fX~aNvJLsqZmK-?W!H?gfyt;gs?Fq&bPHr& zYP~qaD&xsz;PYtzxU*dQoGTt3v&W)_p>iJUxYYp;h)mrs8@!?3{S*7TeXeTk$xSQb z9=>iw1=Ticlt-j8A2G6wG;V@3+>Dt)bInpZN=@GWN6aN3E~E@{IS<-zhi|2-P&M6w z`DHd@MbQ}K#%w~m*)lXl5PmgW1>Bkq6SHEBskQ_gj!Z>$|2pc0wdUjCbW^mfeqKGc z#d4Sg4fzY_^52G{VIn=!y3)tB%?-)QmN=-Gr{#*kXb4 z9cen(o9|fW=QaH;l^md_T?0E~q}pM(vkjIw@$N!Rx!+KF@tMZ+oulV2eJ9<<=OSz&{bOK*+22pY zgY)Hmk<7|5xQjE+&T!>_Z*<0cMDAl9#~xSUfb#0b25vYUn1`p4WO*=)DlPf}5+Clv@L-lNshV4OJJ{+Jc4` zr~HNUJcAK1@Zs6Q^?W>~EIMqZ{}yq6_3F2@$DR8G*R%J;I`EBSoiNE3E8V-{LoR18 z{5;Ed9MnhX%hk^oiB~tkp7q8nV(z+zT;~hS(yYzgpS|%|bBWmgw!xQIGW_{D{*Ddi zO}>UcSD1ZTY=a9?pE2nw_wr;LbnR4Kz4In(_N_M9=G9!i={~cq#@L{+VK4Q0e|wBu zZ-aa9hN~M4cSOZ7KHsDn>JoC2PxHTb++d};es5RUzGs%8Puvmz5K;>kY1fbxNa*dZeKyIhp+niiLLaupZ6Ee zW5$kR#v6Uadve__t&8}D^eY0h+a5MS-cIg~dqSaQ`}tzJs6Kk|>i_1~pl$@|Lncl73U-=ki9+65`pq<6cKq3-aG z`w8dB-)6|_;vn{`n$s_3#u0UscI-)vAuqp3R)1F517m&TJTg%|aw=>48pQmilX^1! zY36fJykj~yeTOpDdQVI0GU?MZj5*Oedf~JM{Q|jHbSRpFnc?*R=geSiW!4%R_VZ>lx0n4< zGp?hZqu7V_%z@2QJA`nb`LpE;Zhxky<6ve8w)~FG<%v~aW-rZkNZy2oc!b<#4m#bD-rb5HvcwNssB!rGR#{)|3e zYU`!snDF-;b_`da8s&g6p5N8O_NiYLIKpyzX|0*3_M*mNTQh1QuN_ybf>_gWJ|GzISx}=`inRlfCX3eG@P=85vK>sdw zz&vO5Kx!-Bm9as!*#p!^^K7v#$r2k3I;t1vZ^x)V8`$$dt3EelGv-zL``$hG?Id(% zecG8gm<;F)Or@9b2xS?_|-nNz0JCs zdv&+lC-8y)k7nFYcD8$onpMeL=g;E;tEg>>=QOVQj=!3z&AA@xaG#lx)?4kc?TziO|gfi;Y;_(dp!Rx6~4!+ zpQ`B9WJYi8`Ww{k{B7W$wH4YftJMC6R+w~qJ>--}>IWqoA;~NT{fQBJ8y`BBCf@cVTy7i+)4-eq5jT-y}*0aL*RR`U49AUzEOvYIK*UqMi1Jp&s00i^{uUmY~g^5j8zWkwbOWZc0e&P zJb7iH=AXU}cuAXYV?0iCV=#R$pGR+9toZ@vANtf3yJ(>qz%#vq@26p1H%)>Gxz5HP;uA_wNe*RMR}o+!M}N z%6QwX+EvYz2QIkJ-0#PdM;fnct~hVx2#eTvnqB*-VHNFwuw$<@zN~d6E#~*7eM!@5 z5V>G|ZL$7(vZk%dxa+YMJ`Z%)Q0Ns!Z?|wB%3HI5K3nr(J;GO)YPv7mhUA^2FyT>sG9$|;P7y<=}~}nm@yV*nDs|v%E#m1~p zOZtJe_mAt*UIcTH;ND{mZB{yDfvqqy-L zhOJnmc|3tJGVhrDUT&KCd_TVQrOLf<%^2#5O*iIwOHS6TsY-7Cbl%xtj%mK^aK@qT z^zWlpO<4}PUj1nk^-gPyTaa^QlLM+QI;~ka#tFlF(r)aIX&&+WJ@VNGwTfaj)96#b z^=Do5k*CJQ!wOE%HlgvrC{5dhEoiZD9mZDtu1UJR4ter#oQH0hf(N`q+Uil`SgQ~B zt*LQG`~2E&EK-KCw!!oMTR&ZkJShDZ+2Lo#_v|vp2}5J)OP6?yK%V!tUzp!rIw)%M z^Zx9>7%t69^dQ%o2QjI4{k*b;=iQuk(5uI_q0Q<43W-Vft;VP_)&WJm8UMi@_J-tJ z;`66((qxlFb^mmQ+Xr`7rA%d~@g&+GgSGYgb zhJX9W%oNRL&P;{Z=N-^BMRRQs^%HW5OW+O-rqZYB+F(b9uO_88=%o_up%pmQbf=(Bi-RhB|B#N_f_*(P#QU>xv>j5gp99~G> z3C5|MPt_c8bV7w;tO=}i)|~!*zcjTbPqL||-pFlm*~^@z?n+JK5DWY~xB+3YUYhvX zo8fU_Eey0CYPRdFg*g2;&L=;P!SE7WTez&SA&%SOw(TA~j z&j$R={yVexG52Y~*s$lUT*EDl8;A2Om^7J+6#CbzckQ6_GZvqC*5@#0>JxAoUHg&S z)zuFDyH(L_?8W<*IYfXzG)KaKN{>jyYHMMznC%m-9jC&I`*LipUIAlu>-ldu? zyhqd+Tj*}ttohBs(6Ke^W7ZorSwFc$_Kr2HBic4vmUl^R3>QRi+Lv$TariGSfl4^gDVzWu>6d%#$}l~yq~V8PchY0ciw~@(QC0~ zVv*+J@-^I@TJo1Y*BmqgL$=r=gWuhhVU2O4yB%Uj65AHK=or9Qn6}+RoH6v|IZl{q zhqa!2m3O;m4Zz*v#xEpua4r7+IFg!^cm>fdA?}D~?*n|Go zoSMA;)QMs&v1I}^<*TIP2k*WE%#RYIuA(9R`P*7{_}A+zO13$mJ8|JIgnov3 zN?djmP1ZriZ@c+kJL+nVUvyx-&=#$VduXQqbU=oWEo@c~&?NPC{FBS~E6~@3uOr_! zYmv)a7;3V6lIM~+>FcL`G)dfHx{yh|^07@cFIgis;2CJ}ppGW6qbtHb^K*@9ph+`k zZ-N~Cmv-0FMELW253@k?h&q}JAFR>C*%SsFnrgl&W@xl+J?1Bj(xlzqh(h{{4V%(6 zE+UiY#9`f)|{1k$a+*@UJ^!paKn8)_A*`4 z5JqjHZJq3}F;ZauNA9(>WFA^@8tXYHpHKTVO}dEqfvl%#^L+Kbjn|C9>S|Hzq3jX< z3E`aSTU%5+_X=;>oBeUe79yh*o$I;4_pvR$WPZht>(o2ANAB^+AJCA`a@KWQe0=u> z&&ks^{HrZ>La(7Md97BgVa(ZZ4`Rr_@_={uK;38*@^7VkvJQ55H_~cyuie2KOKOv+ z`FD<-WR9hmxL4|Fjj8oa(bVNKwKdG}Gk!fHf*NWJ$8JQ~&UGlc8?L#~Wi|3YF8d2- zheh+Lr4|AU#u5`*+iP`TA8u}9t^55FjDMd=o^_t<^<&ZVRtla5GN-6z0PF3$;2Xpo z;n)Bi8XW_BcRM^w?vI=4;jrLy`(p!fX-Eh@x=~+ztUi)0gV2-DlWQ2^$^g!3*wV); zqcC@}AD)@pp*U^=^tfAJ!_*Gz_fAK(vE(7)d)WJa4vK1$Lt>pBe7`S5D{?0WFn<1b z-BQdWN9%E(wc&4rs>O28n{O*3evPISA zHF0vJ8?yP`h1;4ME(qrwAHS~y7Gn(cf?QB+x($ivd<}0FF)u%1g%2jeuzPpb1Xi1K zcS{@j&8-n(X-dAErTACb3U9Fi3$?Sb@Z<(`8L|QP|7_BvWvs%{dMp3JIr~YFVLShD zoC&2)^s-?}y+=v77(uS%UZqNfH(BV#J)*-AgN4!E0*rphcyGF)u-kkBjlMBQ>(X6l z&r8S8Qrh;w7Gid3GSWWTLBDEkVR3CYy3+R!pH)Fbj@SW*udGv5d8xF_jYJ4vU;Oc^ zQlVxTYQ1Mp?UJW7dKru{d~R|%Lm6chh^l3yz#c6Uxw_t5{;^ygMUu$Z@ezd{b!G>ZId%|^?k2HMVT(rJq2g~sm zoXgHrBIB(vu{SF~^L?`J&fJP%@@o(OUTj#Cc=uUhifYldHF`f+qussDf8jj)N{}*o zNF*|t3rzA46)&2kP{WWuT6rP{fZTw*zHWd2Z5*dsoOH6EFrkyKV zPOwJwX)CzdMu|PkIJY|A5+=pwqT|tx}a{3!PScO{3rPYez|AM*gGGE#D_*Fb3K5zAcCpl z`NvB()0~3eOP=vSJK1<|CQk5o?=M&@!=4?)cH*|=-5j~5$3A@c#sF zx#$j)YDP3RR%IRh-$8Qu;&803MZWaWy=DE(?U>V;^~usMvJGc!XE5$LH>!i|_|*@m z2eF54)J|p{_CZC)97o=?k?RyMcv`YnII*pqr0t2wz3dq;XfHk43%GrivE_&^a!Yr2 zBr`XhWYb#~n7eV-h3!cp5ymy^`vZR6&`Y>+pKcTlA5yLo>d2C4aF7m}f z8+epbr}%3#nXu9vZ??0aw7P*zP2Pm-Z&;_Wa}iIC)y^!!tW|^zMCssO}hur^LDVfohMg!y@9uk|E{Mh zvJz{ugU&K`8oOT}4p&jcIK*dctlV)s9aH(5S(-qZFm69y7t_vPxJswVdvW}V9gYsO zlFwb@u#s`ysjaKz;e;p{@H<*Jn%V@OVcfkS&wtQF`TU>lXwi(Z;FOW_dG$cJGI!0k zfxK+thu9U28;9u2@$f;<1jc`6gXQW8Ua8wWg7KG_{tDz07=tHIYAKxjcWr&)^jAdUAB{80Mo;nceK=(hr5zzqKuq}?fXfGx8Br_=d6Hx4;gpW6WL{~5sdC4n`(QYnU5oU z*6KQj{Ucfzgt?WEOgSF|R+Z!ff$#hfE*}_Xj%lXYTa`1GPkYO!tJfikHQE2-oSAAa7n4iPoo93O*}JmK?z#(#L$T*IVRM-A z2>WE+uhf&B#%)1ozQ$(uNa?V59iDvn8|P}4L2_GU0dCRWZnv+bHhlX4lX*^cp7ccfza5{O_E#fwZ*f+L+OM11 zs;xT};v4hi4I^~a%LzGXtjF`-s*>7h_Ayu+vfeuEmE0Ad3J>C0yUta)mHQvV=?AKG zKOx^o?Z(r!^u3x?>2iAqj)w6442qKn4n{%y8tWks0%hZGVHl*(nZ0_hvUkFE7#DLk zyUJGS|9jt%T<8fk7sz?H$=$lq3CG`$kxqs_C?@}Tc9*s*cs7~yG{CyJn+x-3u2MVdP{W=q&mD7+T*RU zI>a4C5$$FF!YycaowLx3x5)ae*D1Dt^TtoG*(XhUoc(k5?@VZ@j@$7NdbDS4^AYNT zc3 zYB%KKAG`6`jhao5PRe?N;?S0Lij!52$k7#|F_m+|oppD~(Zj+K?#H@twGi2#aiAf4 zS2Z5G%h-p3xTeb;nPV36Su=ms<~+>&!iDk(=gE_sxZu?6vGQ&%_qe#D@o-#sIc2a1 zdiQg~;TGDm_I!63Uvh`0;J#>e+ZDIEd!p8si=qj6YCR5klKb?o$YM=cC&m-gCRCE2 z-&v!14NvON4VG4%cYf5=6Js>nW!HM^vE}36IKML#vfZS!DB<1bIIffGc`{hz6weRyXzE>aB*ZsS7_ z&c4`>QQh|zq7&nRIgk6Rw!KbZ%y7yu;cm@Sd%Sy?Cp-2dkLx7rWyGe*u4}{5`?Uj}yx1+x znuK6Pjw7m74wWAo1wlPT?c>YtGIzK?91lAqcA2@%*yIDxJ)HIGFki-VUU!(4E9>8b z<)vs3ynpS6o_*``{&mO8H@|tb9t*!^Zdl~(h4(twL{5q`Mt9-<%cZBn)|d5`p4=tq zQcEs~vw^F>7aZ!3lUjGS;?gQF#_9*8+3@w8fBbuIqTR1cQfxenc*ayZBL}N-pB`e_ zJ3F{{-lB&4enBGdH7k8z)!U$=CW`)f@?(EBrO8j2HKJ~8vWL2@+Z*n0vW8z|uDZ;> zjc&a;H?Ve|dbh9;8;9B>K47G}ZRQCa7|oxD^i?0$$%MmHYLNYCqq;9YgnlbnGo7!a z?*E>IL{FXzYJ|ma-GfUxthF_NBilyBA+#wqK0aKRR+FMRU*v%EoleQk+*#g6O_`lr z)8wKNAy^0A`+IiD&6*(U!8v2>gJ3y*nm-DAQ~x!?RfbTPpiY?!lE-h9-EMheoN&dU zWyVsW4O-cfUmEq~hhPsJ;f!uf<43~afg3JO<37fLD^s~D+ zc|#h@k@L49d7KvxR9hhj2AE-CiWfZQ-jg1F>p3IzH_m3gwba);iSr50dg;znV|zb> z3-f5R*#TOTv9;uvv0^fF%UyZjBNbhO9(NrCFx zz}slg`;PiXYLf~@up!Rr9;?*T-Y0Nr41Go5WYu$WCVb{FhH)`aEiw+_(l+K4`d!s~ zgOYLR2>Gj06xsk~7Xj^iDf7ZhBO z>Fyy|(Z(5b9TXYbKL~psI-~o9WLbRC4+}U$vvO~QT%qlQ7w=sV=HM!a_w_>IW9s$l zOq4#qsP94E-4~;4$-CSc>_q<3U&=+%Ale;|j(X$Bs$9`~8~G9Sz0q~hU9qGY_sqVL zzhYz~X}f+Kg1Ad?oT-PQ~SdpSet_F2B2%o$#jzx{Jm3}PXtE(riqj84$#i!k0yNL)TK3)l8$ZY2Y^d(Idln;7>@Z`C zy_&S>5mqyIuJ4ne9&Y><4PLQUoP0vPX;)G6llEM)Cr`EV{fYC;f4|quQnz@%!3o9~ zg+U2woA}$<+Mm6W`XTBCogx_MbDpNAt2!>>1TyKLjr(s@UvJICUB;k|2hLQp4jn>) zAM=z@WA$2D64sn!Tz9pPnm%L?elpkX;@np4?-PgYubi`KRZo548jVnLAofhDq$+vg zh}q_Z(Fw0)?bq9Jx6BD`)?JZy)YNO#n|tMNgp6$ChnZWQ@iuCo%;4VD(3jNT{p>5N zbKh;x1s5FaVj?TD?piO)4NgBA$Ucod@spZN4&9%LF1D&!NHtNKZvslOe zb=Qd=s_n=}c*uI=wTegBs{R5y)`faMEmn8Tt*H4*|2(VVC3WM!KXH*c$brIqb>+x6 z=--*MaTSiJcjw;5!EUtk0XtOd+(H=fPMlWPPfg}M*b?-;W9-$})p-xjwnx|QE7Z9i zi8KAi&1I8S*VRd|IZZ$RYN*=a)ovus=d5#9H`RJo99r_Mc8_VM4w?{+HQA16iyCST z{cx<{{{Fpj-{oxW?J%0}gp23yOYcR$`RlmDl7CuuT<420?p;i&a#;R+M-EOm&Z5r? zk;kkUKi6@_ml2EQlYcz%b}hApo_CXBChjQBbiw!0&1B~~E*Q-Gdho=S@&fzvGwj%( zecD4dJ86TgS+=z#Mt3<8}2~Bs=#pMgB-zbR5uBo%U-r_V@o=kG{d#-ee_L z5xawZoN1xz+L9YcqOX2+>ZE#q^c%cpeIumjBQ>Dw4^*W+C)9YRMxOeFg^ZsqSKn5n z-Jjx62io@RQ)+g@tFR&FR%cSx=85^772DAWj6E}eNJktY61HzS*B;zi-}HvyAcc*IQDj!~5^KR7ar+&Jjt6USw`MT}gTdXiezGbcA!&_&R>M$Or-#WgQ=Vj>tx%Rmg3~sUi zzSdASm~0B;dDNsa87V*gTmzG8ocDUEk=|pMA;7>Ir>pqOGP4D!?Ebf|blzuubpq>Y zm1C%FI(C=3=z1}XRMvZ)uBxBsJVqvK#a)WNGL|kyW%_5g7C+UJ%s23*-xv`4PCfei zKGJpREB0SkPb3%r(X3zGI!9f-DhG$@x5Ld+)Su%sP)L8WdUmARbIRu^vGfp6QH2X$MbPVG+ajC$-N&L5|~{t|-QXE~#AbfCI=L=d{OhPM4s zJN0&sA5L|0!q>xf)iCNQO=rELk*k*aV1_%nkDS{7s0QG%fnTzFu#ar zbN(nfW!7d`kG4T+BV%d$YBj`lOI-WfS%!38ikTm+(DnLSIbqd2v_!v86%6X%@G6?4M+ z-GnZ2*1i5*{odvb8u58(we#x33R#%hiCW(Jnd)HeRMhIje5C0f)nsS_{D$*8S{ket zFsEKLop3R60`&%zF~K;FLnCw~TwY{hTmn z-VtdwgLqD7J#AWuY{P;uS5@Wzzj&&2o@oiaNZuW# z6Qy<5CfJu*Q)h9Qv|F_rYm+VUXmv9=qF@PnU$erSVvTImXFi@^{Tt`p2^!UiI1eMv zM_e-0Xy+{G|He7@liIY;B`hS)?;F+4319gT&4}|q=j!F8jJl6)O*sePS0m@+tV{4? z{5-wG7uC!(2gZCJ@aCqPnRo=Ji1~>}Icl%(`_P7YqW7+3_4~#+Y+)SYSsJEJn-GC( z{5;db+|*qY$ZxilvqOFx)wZ{O^I#DFjnmaW-1W9~;q3h<1NHJUUvwf5%Bp6a)N5^h zFszjNMDrS`?MHawr8#HBQCXdH%pFU)d;4O=OPMy^6=}5j&_fsHK7D6ok@K*-QKmf7 zfVzTZtbyc5%a}G!coWSUh_j2#4RORP&KeKxw?U@W;A~x#BO;$Jl=@{Be>AU42F#S5 zV>UrQ(HhO_7|SKTtEtIli5=!T^4o}|Xj$DF1^1fC6B8HWyWQV?s~i`Ns(mvFKO@+y z`oj1@{}8GZ=ZSAB+N5`y&s9CE8&t^Eb%Y@y^@;9 zAIPDd<8F-!7a%)Ztof~pgmbT|$nFWtaB&y;de*!Z*VC5pZ<+oTZ&W?0QK#QYqOLA` zcFz^neqaJF2==Vas^#nrQ!$1(UwPgpXGDcd+$pCYUO@t~c^B}R@$-(8^>a2U0_R!t zY-_HS^Z5FHjQw5z^uMF79~zH+e14uU)Nj<|7|y#g=kRWIIyvYJ=tHii`K$Ln1>-v7 z?a0n{>RhcL1hDRLM=VzRH4Q*r`s$%C$EbFPslUcqxFoNBsw+9;&t9Q6UutXh>trAF zXJ4asQf+n7HZQbo!C3m-FL{!&a6o^F+J?uPw16hkfB6Cemt_ zDOzV*9cnt_~iWymDnN2pmWZ*T?H_!#92YhE;+d-`KU{rYie|IbVeV-$u_KA zZ2qhUd&T2NYt}-yoLAk-wL&>B%sFX0H`S}*c1)(t zzcJpRPH7s%c#uBi-86M*_W;Z=WxejpP_?__hc*=)&~IE9wJ6pXwdkwc)M%_~&GNz6 z1=Nx@s-|{#r6wDF>x*aa#h^SeK%w%YdNDgJL0Y8qzvsz-L2ZhxyAu$#61_K zDd(h}L**~#>vxJBabljcY&eb@r1T^2ke8PUE*? z?|d5!PwFPGrftCEqtCt^=LZV|%{ z%kQb(Qlp^9=WbK8)kY-|SjXp;ZQ|8y?YxpE2b(&>=o)A22F6Ku@}w@J z|Cz1rE&GOX52%FmyC2Qujds-L>gj|Dg^T2ZMAoZl&-+hIk{73J!xGv+8w1F#*Uj;B zHD^2~w36QEH)G)RZHWFSS17^jab^s6QGW!8C*L>0DeUh&<@odAs@>Q9xF5+`(C8f1 zuyqnjn0HS!sF(Bp7qtS}!#e$-U(Vvb*^mvHJJ+e3lbaQfL%i3f7(G?@t2@w!dEZkr zsn$_q@RT*WT1Vs6CL#*18tx6oc&VLFM{p;Mcc|-Twff~S>@;G%?(H;n{QeMV@%@(; z7^oMv1mhB8>7T1P z!gm|%)z!QaMc*1$k}G@pdce)e5l$(oa%Wx646tw2I&_Ep@r|?nN2tZT*;hKL&N#q5 ztZknym?J$$u$<_C93O)mIgy*Uw!TtSh6?a*hAVGTcPq+ zTWk)lBNrrWMdm|W+-P`61RUA)XU`>5D?)^aZpDg<+y1iWK_AAd`74gVB*_l;QTgh} zjt61R+R=mbMmal2C1Vcl&EQb|9DBQc=sbwA#H2^+h_QPyekOaME03vl-t2}^=XKeFWvEmfjeWe@jIo4`i!czBSs$&l26aNp+W=d&E0g7dgOx~&78Tk#d_&~)`dFS z>VMOvRNsMLbG;fo@~sGsKe{Pgd+f|MImRW0u<9AOSv6nI_@ zO`&Fi4)=d{G{_me@h~iClWPZESJk5jk-nC7o>}|Uta~ZY3g`ZjxrciAb0Y2?vxnWB zWvW5r1gK{@-`U+*?LKxlXNT<3JFK(1E1bUN33C>w`l|NBSX?c&$Aid?aKJXWvbl6dhiDR?u{WsWhOZY-|$YH zx~8+-w%rYWjHkQbYbuvdb43p4o*#zPk**4R;PmG&EUL=p9XT^!z}iliZ^FBwEhcF5 zvkW*d@}FD6C4o2`a~7qI%n-#sZ_8%>qVp0gns7mU?m*{Lw(Z1%MFx@ykI z{g~g2Gv#w@s+B(_;{Ip{>^Sm4x}M#Ov_%du-f%@u3*3c7Gv?H_g=||r4g)rFPQ7We zY&|m?rkwE~H8x5>7Yh)XpK-6Ts+q|ZU zyudjj2>9V*PJYJ92}(qULpu1B{w*hCZ}FOt9xHfHV7{ z`;)}1CDzCt!}~&if!Jzkj;8@m=-OwCs8E5qIP=;6;;a|4OkLr57Ii*xXKm>fb>QAS zoEgU1o~}OXuR}Tb?#Y}kf0Ej9yMn71n2&hss+!gU8_L>hOl4lI)IFGpf3v9%Nvr0bqA*s_1UNHbKfy|EpmmN8H1+Cx5QPc1ywl*(?m zk_ptYng7ZWS8CRi&eUJpe1&#yUsYDj@`SIABZT@{^kI+Go$;`l_B|1;k~^Z1e&+UR zp~pUKwM^EXrX3e4QdECg=YV$qCXu;ZrfyP~p8B_p6 z_LXd!4N%YQ$pd!KXa14a(_q;$U^nf^5yoy^Wy=I&cBy;qi0L_Q2<9yB6E`REeUuA=sykz)#zx$F=!lQ2S^r$WOgt>+z0sBVc!!}v zd)PJ{X3p+5u1u-)&;pw+T;cNdpz?LGC5~SIdrl^x+FG@++Xd8bLf_lHl^WRO9CVqN zjc;;U?(djS4s-TIa(2j^)hA&1lY5xG9OU^&3VDFJ`_Xx(Jm#8-9M%ojzZ)!-N$IFd zJA7@_UZzhugznE78%5~I*ADyfmi6(DuPezRn-lRykNL9Sd$FU+9vJka2K~?boI#C) zO&99pytydy=tEu^J3@0IPjoE}XD!ze%|>U6Y2QO|sh$&3i}#E3b%K%L9cZup> z$UXXmeX9+T;z56M2{v@b$A*Ez48by4?I(3CYsOofLAH)^`MEE zM2?vwjI)U1+ zQ9i%ghGDGp-#HhlOw+T(LlbIF<=51=-fn^Y7!`eBoq5|9jGaPUW8pq$5m6#QAB5m>6;Ei z(m!PH-z5grI*9XHj;OB_A{;Z4v3Hmwyox-9Mc;iGZN zC>1?1JJ1X5g6=4_?vTT3l`nU|@|0HO@)VP^UYKU6x1a|ylZ**}5VOQrkzS3tlcm1Ty zZIOYlXNY0aYi0g~!*J^6ghz{?DNW)J;9vT^h1DJ_t=ZSky-RM9caM~%S_#nYxsHiNnDy106iN|Ofj!4zP0p&(%Bm)S5*+l`uHHXzz3I~eNf&pulXKL zO_0ZVO0=~XPA?3?pqqBe{>t81?G}!Cqnj#0X`Z+@Fa{H+_+-1?al_d3SQxCRJ9MmY zhX3(cYW;p5x-*&g&xcsp9d$LBVM5zpvlE$Dt8ypD5<}la{Drge&P>H={Y5OaWj2>I5dK=U&*xAsv^|5~-1qx5+(20wa1s_3sg2&xSW$bacyCYs;HU|T>(?xdD|5ub zn{$-HS4UBib+aamRw-eX)9~~q^*6hkDVK~=(P07gWS`nABO_DDr{xTX?{13mp?%P! zt&A8Gpp-f7#(i=X{a6;Qly#4T%TD%&j1rZJ-J+5Elltk+)0FOy!*M&?75bADC1QLi ztQu0!V)rTKO{MMF`oaT;R$Ws5u@A(fLNA=`ep@*{o*HgneNZ|1w(@qXFFGtG*XY~} zO5sg!TznFUkV$XmY!nabF>TW#?_XOtrQmBCbjUkr65*#@8cbi!K2TKOP{loDKkqu?SsJ5c z7bjvA?ej@uf>M~Z2OIunTvabkvD+GtRj#gB^W}sxRxbv7Rae~JQ>?foGOwKAhU4{b zDmn$Bn7WW0F{2+U>$nS@Lk-hjrtcJ^E+`+;JnyqzDjqRbY0IC7 zXU-K#>s_FGECIj9EEb!aGfq!Wz^#q>B2#}G3KA0FYFnyQYH5iLX@BE9xK*~&?CV9C z@8rBz@J7WXwFrgd$SE2+Tj@NdfOSO&VEaO)ef3kA73+vLr5lxvw{mcBloM>vJ1W=m z74lE8miX02*>E)z_1U)=-6>qDsFi`Ly4n*2tocO9G&&L5^a-Mj|BA4{->@ z)aG?WT!=3gXM~`>msFCp{n0db2l`lc7tO=UaUQTBLyY@aj`Q0dr^VWR9)B=*U3Ez4 z>d+R5`60b{(T4ZT@8_$D_k^az=FfBR!4~4w9g9ED|Gfw2)lih85tmRQgL8v-&6Qz# z#qij|*w}5kl2cYd8)O}(>L#U4AvGW0QXA-vqf$qnfZhSlUOM|J4NeJou5sobN0gHH z;5ZyRxR8@EQR&p^C^mBDva~~n@@3%>9P)NW*~c8kS{%fkf#fP*a8B9VJq3{3hX;GHe~*Vy$m9JRH^u*)Xmht5XLtR}q9mjoXOADp#7fTP{eI05 z8y*=?N@0()XcNaNMQ?9YD;i@GX>qf#u zmp1ymiijeA?{exVrQ6mKO{wdc7aEAX#SKK$ok3`IG6bhi)DeB?!!0^Tqgu}<;$&{% zAAG(yj~BsF?GZ}tDhx%PKOnf&b%&fQ^uB+)^cKI}a5a+y=Sw^X9$pQC0sITKpADt%l} z<9N6ee76QGYT8M}x;djtwcX0cQWZ7KTrh1LIUx<0GcIw3Ugdmcw_he^QZwR2mFvo+ zSLrx3&>c;xK2rjw9maId|J;oFtaQ&gfbp+Au&hx<5u=xkwdB!{uT)L6<9ma^TmN}(ao~)y`>y$) z=l}YRl81^?Y4v5?dT)?6ke8{P=hrHJg$%ZsKF5%hIE`-iBK9 zJ-#S*myh5|J5O|(URm52$@%BzUf4wpHJK@B%=+fBk@dyNoAe=>?6Xd4Dde`@2&&~n zKFzLznGHw>-@n1jc&@U5bE|ObYC0GA9UGXcY9Osq>HX=Z)9B1{TkI+Fm&Ta-SBI0B@ z&Yt&|i{)PBI4=pBBea&35D}0qYjH|8wbw+)wSY<`&Dd=qA9Oi>Vih*S=bV6P6V8$sW z|GQ*=hZ?3;ZYiVevf;}fQcsh&%3G~WRBgf8!8a8|TibN}F!mw^KrJ!YS_;uN>#&mzN8jjB=d2>=-7T$q)A1hBMj@5DONR z<81OURm{9zj&tJj=h@$_{uk$c>#~)114+);ob{-DXJulwi!kD>U~La4B{ruB)7f{Q zT-9IcWqp?1TF#hyJx=-B<23iAT~MQ8x-#CHCnYcMIL37K!ok=oV(sjscy8y7PhmR3YvK_MjPgOK+E!E;c>v4%`r^VqJ#l2* zKBQKsmh`?!qQ7P*#>^*YamZ3(wkZbsrR3zb+bFs`jDS^b-hHji#L(JdunDLB=3^TX z(`Gv=H1|dAASW@OGhkm5eewCVmw0LDhj{V=FVV6Wj?4Y9fipUZLXcWb!F ztz3?C+@^8j8TFlh<2k11FcF_xj`OG{t;GxO`uzU6+tWIt`v2SWsr)ce;YvBq5zqG< zwATAyoWm<*DZ3)Bz=`$Do4=ftjOdGSUBkZcPe)~3OfkF;JK^dPKjo0`In1o)g3PmV z%4V}O7_@@>*bCB?Hq%d`ggNSvE@zd}F1h3r@POIE5+&@Tgpx-db+a!@_e0r;9_J0q zZ&iii!b~i?!rA&Q^~LBV={Uo<_Vg58v43(Z0!#d`(nwz{(o4cFYQ;K4Oc!^{c42P| zKTQ0(TD-5igEdcIxczG(`pt;Kz6-u69$_acEeuEU65@EuNemnr0?P}2c$n)UoSFnd zua`gCWCV!&tm$p~?2qY{9EDMsKkju4L!*gC!uCfw&e3D_#Ec*0geHb<3;T!|+QskZ zhQ_+$!jW>E)2CGu;eO>ff7${8msI$Re;*hToGt< zSn;}L#8F~LCqMC5WX6;=??|KeGsY7r(>7(*Z2$(tfpjTcMA$_yZb&MYx z->)a!Jdfh-X==vo*A*j74nv2!Q!C00MDn*}4D_M?&$Ag~SIQnJul%8RY@L{v8i%y# z-&#M`;#Jic6uKau#j9Ovn~I*6#Y#Bna- za#bs(`os$;WWC$U$z6%eEP`%<3%c2dE1At0hpcmBZ#zY)x%v#8s7LUyQ;xD@&naY5 z&o1NkRmI_aE*B`N+j#ty67hsFNg*{FZdMQjE-UcAL|uloI^x&COxRPyu1iWg(QsfI zcC7s!9~cN->;0%}6om9!CZg+z1Zd~8U-)Q^=(lbsCLaz&!buA;;6*GBn*>1<;~?6_ zMPVJaQ3C3?i}V)Z_^~z^(JceSVa_$3^bW@CdjaCLR}fyz4u$WK4WeTVb+96Ku`V-7 zoGL2ExuvWZoD%W)nypq@zOdHwzK1upLt(~NSQYmAbLmrps)GfLWv zPv^>UUj5wrsPh&jOs60L%Y9Tc~IpdUfNT$z`;Rj zyRR7Ay1U{~=Ky8x&_c|8>xR0aJC#RS1xPx_+CoHz;@#ymyz{(J;CfcMWXJijn?CR< zxvx|aCy-vtA9F3fD1-M&d>Ki<*|>(NVVH%N)q>G=N^9o1>FE9>7%L|a7Im!-02#rk zJ!`V?OWcPE)G0Vyutcoa-;MXLg3%&xgDAQYhfj~UV{soFamhFa*_<^${lG=6TONU_ z?C;tg_7#tJhG6O85IC>!6fR4)quCc~VQH@uvulO^!C|f5H1SO>$GMN6p)jK#`i zfA_zBW6jo`O6$2-@MSqUemhK7j#^&A>wDw}>90|W`(J?124|SZj8?9kEyC~y-02uL zN9jBH9Bvl7;qJ4|O4O+{+zau*!9A|ZJl%YNwXj(c!Ajz$lc=$aT3;pc%7erlbSv~j zz|>SF>4d;R_MBdhIH8QcdmQy@2jfflO=Z$<&MM5@j@0lUikI#|yboeL@VJhscw--0 z&)JR%gIWpW2fMJ}aXSvq?j$Y`jYB+ZcHiB42=i9dA`sXr}KqV&a zGBk`)?zZcx=smuORQB4o9c`d&OgN89GdU+8QBRpTx(K~XUC^nZsj~Yl=cV_OXTha| z@^0iAIGa+(B&na$Xx}OFKzN}`Q)6Y}*IYcG?L$qlsmg-EIjCgihwnX?D7BXfY)PlD z)G<@8-#d*>|7kq2_J&*eagO zHky-*ZrrWA;eIu{SGo#qGv>wHA7pp@rBL&fb+MUmvo!;7m&=a)yZbxt7e zPtsP7dL2RGg&>@K)kIm*;sA!zuf7hTmSv@V=wud*YTxvg(GPbb!;Q}oqm-@{cR*{% zcI-?Xr?}3G#+&M)Fx)U+$)6pG(h3nUDj2Cu9UcMSZn4-Dr%}Aul;eDCbYDfSSdMeO zA==7?|F`EuPB*jbO)JMaT9cN&@q9VX?>~lRd&QUIeEX|Qw$6oeoZs2mWw%&fj&rRW zkB9bU@A@~+?XTU>s!rb7-_QTW+2Z~>WjlLSG5tBWruR5|$fyE*G2{HhnV{@%wNInY zDel^Io5sch0Xa+S)qrI!I5{O)#u4sJs+kc!Pyrs`np-kyAGpg6MqzR_;NgT@c~pB6o8{< zDaTEEC&K$+00NI09pAlR7iw+_!1%T&j`d{yzt7|VJnL9P|M7`Pbf9LTosFNq_?OyG zdO@5=zp4LoODOyfZpWB*4Gbz7hhRt$`-{Wd8+=I!M^5TqWEz)b4!*bj4-Qi_tqmIf zQ*O^rqn!$kn!KfeC%UF);fxw9-i*2x3^~y zYeHQoogL~uwNB&0!oTyly6R_zCy|}Ro`y$i!K10ik@U=)v&dkxgO_ErF!#m%yhe(o z5n9yCq~_87S&A;%g$QpFfRy$DikRQ|^q~txU4tD85A!3KLoWEsjk02@{UKatO%XHy zp5l7f{doL41iB@^6jtTC5%MV%MNx)AUnvU@r-b3^({4g)`!ssfgy9sA>o4x7l(UZ+ zFHRRWc1yrB&R=7!7YTB$IGkS?fyHC3gc;T`@UIpPweDJB#f)eiDT~AS(G!K;p>fFi zmWcVi-&Q~rD2V)Je)EIx(*=lMa4EX8|^Dx6=P2vzL7Q-$;FR9}VBo+_MISu9ax z+^fQQ&9E0{q4rfcziawI*uAp~=fO+#3#IJ;#knG^n`Y=0_AWT@8@6<^de5~}SW7Nt z)5w~pQJYRe;HB;pfeR_(M+ZvEdfN$2a@XNF4&tytTr- zpX`we>_=F+3rEU!Vtsx%s(lXXi&kerT>d_$6mEHOHQ1@`gR`pQ!Tgf;o(!roWL3AU;{<^h?BUjBKJc-Rgt;B z7_-%!9ecf0+%lBWsTOtLdKn45Y&1AP?I+cf;X-y^0eT$rhmqw1A^81KwB-KM+mp`1 z==O)1chk2fAXu0y9)!-TV3;&Z6f&mngC*ycwac@GU5obM$E8q|9mx|~Z{CShi^Fk! zt}JNwWC5)rF+b$2(7Qz@mJW!<{5e;Jb~nJW=2o5OfoJ!b5f-8f=bcxx3k+KSFV2o1&#Lnm zoxwQvH^LriOjnOOMHNcwe#iJIvZWLFy4DM)KUOGiw=YImI(yCm?F5aZgfME5E!;Ul z*j=o~%$|OnjXDVXbqiqY>W}=nTLo$8QF?j=V2{f-L4Ro;B73uU^!tGDa|>r!LBU8a zIxge{?4?c}c`ZrTgmK$;qaFK|H7Aq{`_JT{>_r$p`+pQhx5h4ap3 z$A!J?t8h*=JD`}{t13PRZ;8;f8(Y=i2%A=++1a3~|Lk1ztY+ozs{ZqQ_xYMVmR0>{ zeVw`LW}#I$t14<^)yOKGPkksUIC-b47yWMzkH*wldD0Z(fwMhBlj0r{?> zH;*fXX2tk1f;?;=BVmWH1jE&g&u1qIJ)Wy!7|Y$opGqNZYysAu^F^(vF@kQ~QP|XG zpLtlW(DHsB9NFur{BT@|YjzOL0|RmX!)+mI)IKa?uRf#6JE8Z6J!suxE7mmBLF&$( zu%|A`qZM^=hjVa~-|W>tZH)AwOtiQX4u4fEoV89zpFvTu{MsIuinb$$T6_0ic7f5F zZFv1TksPgV_-K&|>*DRWX4Vb!8dl-F<#=bz>RE+zaA`Hj{i|>uv$41Epjs8q*)1Y9 zJw{aFyl}XIb})V1{+|E6y_#!pH?5kd{8r!9yylGP@8^kjBQ@T4s&IBIdm>C-Q-$;N z-v*XFz53pm zAFdLr^~guvc0O=^n<(tdI}C%N?CpO)B6J;m2(xDS!QH-8@XX#%ezZTlM!gYq4fo

6r0xE93+ahfG+DIxI42R>U#0;4UER>-i~mlR@>0vc!)EcQ1pjh zv`B%=q~)+(7l+$k*?9cS7z?>a@E5C-@2#nES`|0$jGL*>+glYknso1`c{!=79yGA( zrYSP0I?ooLo~w(Et8iYiC#g{Xzw!CksMkWj8dW&2`JG%abJ_pme7CZ>Y4o#voF~Wl z&)gG=N9{*yY-iSZWDciu+APY@r&;#jAFHGB! zK@H46oOKqEc5^$@&4S=GZ8~y}(jS~!Y4w9wp~5#2)p+JpdpP6Kz<78brYGPpZ-gI< zCD$k%$E^clcsGVT$0&MSh9Flz1}AmtP3sVb=tj{99GHYjXMB+RAsRZIftA(*QZlP> zzH~lL*m%4OXUC;F>Q3}c`-}gqo!vCgrd8qmWOH|o4}Gower{%2uJ)#O@!#hj$-#xU z*HoQnh5l)w!{@4;IpNFFf|1?-7w5pkf?|#DK8%sLgPEZxT(jJZSZ@#9oHAe7ad{7R zPxOTSvM3?KcsHV&Qv1G3f#5l3C(e|Sr{Pm382e?zb}#*3w7NLP-r9bp4_-PqLywXS z{FvYiuUjUVa6JueoB83Zb~yB(ZKGC=A4cj=Mv9z*kw^Ve>%>wdk4?fDp8(X4-Gtf^ z@i;gy5al7hxY;uno1KFYZqHrJJ=9X4L@()1aaewvUM9tyKfO%GIPPi%U5dc7PHC95 zCz5ql459~Q;Kq6G7Cno{@)-$exG@ro9JV3#jU`@0d!fGoU zd1uY#*;P23cI~P$B2VNmwrcx3>R10g&wsu}7oN7N!r8fQim>iY70y_wbIku+RZr>v z#^?CW6|l}g6p+xdhd8}Psd&O?30D?x}Ny6ZKv?8(GKWpJkeEqRoE1g zf%D|DUO(|$c=$Vw^$R&VW1674<#u@8^v0?;CeX=G#ijrsJR7RO0R0qf8Rm-*ou?yp zUJ{PK^F{uNl}KAgFI4J#4k&TK`krw(VC9c>QUJ!Vj(9&R0L%2EQLKo<&~4le-k*Z& zv#G5S84R)i4xD=)0rST6GVHe-{rw`4^@H`x;(hr1I~>zZqETsh0P);&30O?;Pip2h z-yV+6Uy~6$+7(Cs(1Vh=ZD{>S*z8_~bFJl$X5aoBH~#v;bzW12b4c@cn%J&YIRE^5 zPVL&O>O4J!CA zBa40BA;l4hJWL)J&-qVvGW?PvFyEZD{DmDTY8(OM5y4nlFBb*pcsK3~LB@%LaM>7+ z7OTTyJpTwH9)w}SfGCXabrj>-Bebs_i-6;M`F)2W=OA?_YfwL;M%8&XU;I{RonD2r zB;}YTKB+p-mT4_CiOE$s&rNTxIWnsX=hKC1wZn`moOik2D%?g+*5B{T`PO~KDBY^~ z{C59BQ>(rIi?fNnLbwx}L5o+$=dRYmrOI@qbnrmlpLii#k2s$s_xoY7;P+)aqM0v# zX!BP1esvp48ADbts*fefsi>vp&Qgnxv?EHv%r)M~h!~1u{bZz2AAD}oWVjtk#3jba zAM!FR8_xY8e_y=Vy#=k=``ON!c(WINxDX$M!$bYCxG%k?nGXb#V_?)Q8JVt82wcwD z_lpd)>=^|e_5cS@+65(N*-7SMSYCG@M!7_ysC6X#rXRrLJrPh{iH7lw{rGk?9JRG^ zSe%oCXX|;MJ0wF~&Hdg*QS{o$My_7D@IyBO@A&MN*u|_rLh*{vqvti#G<;Eov*YWA zn)IkDocA0%s1|*ya8}y(Q-32r`Y+CzmH~wcMpZcLt~-A$h+brWKmWgRqhp`R!pY?s zxJ2Im8{NAIx5g}T)5Y88O%G>P+BT2c zGW`7TF*|iLaxVTpufEn$qv^;!Dn37Xf7i6{5tsiw|6iPo^%e?kQu{X_5gq3+T!ip-C*1Z*)E(Mu?@@bkt^P;P}tNY6{nP5a2;|( zu)LFuiuT@^?(jiq6rBXOlioOWtQLI6C*mdN)J<>Lrap*PD7~?la;GE5N z2*Xr@@8t*>66c=n6AJgRNB;L&`Qw)QDfxAOpZnc9sjf>6n%aAAsiH2tod@Ohha zlv;;4H|6ua$=;gpj2nMHPtJ8UGjw)APusMA&hxb&YlRne(-Ae9T1M*z2tF=p2ruVO zWj}>b6uljZ?%X$dKUX*&x(y4AJ+VybBuv_vis)mUxwH%wW{geYZmAdISEUKZ8z#e; z{N(!W4+}>xC!%C4IilZB3x|UfpzcjCjdS;eZi;xEzV3su>puvQJ7TfG)fXGa)u85X zG`>>bth{kUs2fJ1Qyczl1yUc67b-H6*lL!QPP{Zp@Zh^V8#e@pX^k!qeK3 z)T_?MfJ0t|9&ba@na^#{r>oCw4n|i#A7~V*uJg?wioV$x+g?{~yw4l`->2eA(-O70 ziXLY=DX?sGLesL73j0$sVB9gLu>VPCY5{U*??3;m>esECp%h9gwqqpsstyEn60$6| zqj4#98!C;26&tr9)QUb39Xbk6)}>;|59WI_1`3_#rr>axC&D+67aI3X#zyXt_B5~* z+SEuwdLDgSn>!0H&L+TQf;X~%1_(<-%)(%D6xCqR<{8&&ZLoobL6rNUY7aaOA zx2{aUp8LNPPOMY9$7bO4!zG1xeuiQwv5mEGq?AYy=B~)Z-ny&QyV+~sbw3#c+{z2b zvpycJh(*b(#+tCc+;tlqjl|b=wC<@c7*L;DZ_2uw@Bz-OpSJ#kvtDyQp%(FUAcsHt zcXMIH<5Z+*xR2KBv*OIJ6ddBt)Cz+N#oZsgLrS^xYyMK<`zi^;mQbtn*f&KydEoWA zzfretEn#_10=}(hzL(QTnCKdh@Nd*a&1)n0OpL=!FK>*_>M2Za6^qM;KKQ!VRA_cK z8r!$|Ane8@VZpd4c4BapVv8ZIe?tv)fkq&LjlGR&Ix4!b0^FY8pRAGW*+0)z`Cp@L+!o zj^9+MYu%#{S9BQaI4#$--J^tsHG2gqL$rUYIYE3Bh7T?Un(4VtSV5lj|2@xN&x8tx zkEBrRiyAL$8wi^^q+nDQ{WC^Likm}{QARHG-c8Yp=;7RN&7|Mfccr3jpG55LOy9V+ zs}wJrBw%$icc_moQ1t#02mMymSV*3)FuNOz+Hqb;y|z?wH9rPBxhInGWUZo@`P=eH zZ-fj~DW2L!p;=>k+Jyuu9utG2G#_l&Pg4A0uC-={FZMOxr$`zShJN%zZ&gsFxJ=$w zJMNH_wY;WiUlzjiPOjsrX9|(~$Vb`)<4xbMiV1^55KKSr*WIcK;qA8~WppS+y*G+! zndF7l4@a}uM1^JCR@^9w!i`yd%nBBVVD)+Kz>IFCE?Y&9d*ejJUUpR9o$8P6gBN|-5wKIUCB+#XHc`V$$5#9ClOt~E1)|pWf!gMMw%~U8 zzx%Kg55);yoXa<8%DZn?9YMEV64nM&8+>`JVkZC2Tfezmy{4N&ZkvD^cJ%wXv(2nS z(|DLZ=1$$+b*9&A#-YU|Pw2%qEIjuq22b<3%VQW{`1El!`ZC8JG2>>T|K%uTMzUrf zUqjuxI1(@Za7WLwsro}cH7aeq@v}x-^$v2t`&4+tvqyXNr1|XYGk>aC)Jp9{uGS=C z{%u4-Xl_vVZe$<~rbBC>Xmg5hd`Nf5gr~zo^$DeV6Z{dme!RSX0SZgn%!X2-u z*ENNDYP}j4T5=~Sg?t-hMQ&l=tHFr3i9q}5-POyro75 z_wqpBJmbQg7tzoscVSTbI_k~Oqv)OMfi<@*)Q0aP5n;+4`+0~upM0u{NKceU?N)!R z9)Z;_sRMKBgnFV#N9|Qy zP2)_Qnw$Dye6Eh>;pkxMWcy&{ARW!n^dO9(=KHPfmFh=6?EmfLy?OtI`qkJV%x@Kl z8ZU0Ddt9d$8hM{*M;EK_lYhEcxfN|T?NRUO7)-t5FdQh^rcMu_KGhq}#ZKj_ix2qY zh7~zWgPw4f>W$myg3#ni2hD92H4$48_ff8zHqK7y%Nd7Hc?V~z_`9CCIol5}SI*TaJ(MW8LvOimS(=!Oju_v<30u^Hc0glW zwEN}2UhR3Ue#UCNx#EEM$O^5?2P<4Yv-lsJ4G(`3MzXIQ=|XRgZR3UPGkhlImI(z4 zzw_+t*Pw<>_;<6*h2F5};EwGFrW8&j2e^}hdJgjy>Nn(fm`9ecBkBxU)92Okz52#oFF4v!$3Ua6IiAa17A3V>3|eZmfnM0=#XaX*M-CcC8k=HgU&b zC2xNJ3WZF})}_$5P8_Y6xRn|_`ED3nUuk-b@6DR?ZdfwrLt#+?y~0Z917)>J-TnlB zFTbN>^|q-)ONiM4=I#qmsBx0}{<+kpnf63I=M?pOGTiVZ_m|p<`-s1M-4JlCjwY&t zb$>8D^}ZNrCO6~07_}*8+-a%H_?2)?m=w>YFvD5sJX)$;dOrx$Z@(F zQRxeh)n0I~{ak%0iQ1Fory1WpuU;Pzh~qP0Lf9~GJczEO5P!o+Ef4*FvhjNX*X7K*a7+$yuEgltW=B~HJvE^%V zs(6Yv zMn5#p6_UCQQlIwV9>#q7(fHY_d$?2AXFPS=>_XI&`1#r1Zm`WsRqOk3AN{wA_4qFJ zoOo&*zg8hx?|^z~F|~3H=%3!@fO?cZeIC5%6=JzZUFpyL+UoT3Se~k0-NqZM2Y8@K zw!eDPXn%MIaaS>2r5?~W5KV^qK#{&q{can5ZE}3@#%_~3*2^DjsQb`shM(HJp&usA zqF(v481H|#LEet>3{ zv=;XlS>fUc6K#0;3Ub~oacg>^_WYE^NNu|m6a5mjBZFq66(;?IbG?17uyMHxji}`@ zWOEQ{J=6%CMK6!*?F6g8JF>*w$o8b-4RuOfH@G47zMWzpbDMtlJbOKADJqt;pE|=0 zFDw?CtzFF><-YVjhzLE_iZP>UE5;ww(S^sCQ4{5l3TL7+3O$z4Z~B%B32jOX=kW8K zL={F`y(?V9xYEl(h3c<=6k4!%_&iXBzLsAL^Xq%yGk@>I72gVvlJ{5MmKrrd)z!Xr zed&GVfvX<+>Q6NS;A`Op>#Gga*_^k(xx`pwQcHc0J}EKOsk7WtUmaA3{CCz+VW(=T z7eD2W-8?TOeZ5xrj(vhk?l^Ze-CEcu$O8}c_#G$pDje|B1z(zOp%zJe!5k+CxVuxM zeD1r#&&$`q{K7IEo06b;(svn5>MTO@9DD6Z^949mF&}yF12n74rXj82*ne;! zMJhb#N3R*fM8P$aY1M3I@gQy=rkKT?4&MK<$Y*+I0C&N<| zH)gRWVh?3%e-{NTh?PEl0)|ddsOL}X^0Y;udIcSti@A)C^5ser*LsPwR4Q=p?1EGu!1;S>(EQ@ zK$+s)XnNJ=DB;&ht@zA1+ME7-dk3c|B*vVPcU^Ia0`OT;`8E?C0IT9i#5mlR6uP)NZ)GRXt~hKk9rSZ!P+M;V0(Z{%t(*Y2E4B#F`Ih|H1PlK) z*!7C~FrqDLZr*_{zc=7c#F>7T=s%0mr>=8eVo+}mh%ka`GPT8rR*XPc*<2z%W{v|+3` z*V7Y&+w~C_ZScl-)&fG-An`2q4@T2ZM?1(&d`jN)fO#u zRR}q@1>fp^K)*FkXmi<~HMy=hdh14LKd-@uwS7gco*mY{UxECvSg}|3ChnvCo7asQ zIUDocRM^r=i61EjczKonKipM5RbYs>)R$WLR*5_JyHPWU8c01~|HlOeG#W*DfkJ^n;eiyfRwzr%*jhm~uJ5J22|9+0Ci}`Nea>dH% zT4MPO-se%SFf%d|k3FJpjWcns)=TVTN8O{>uH@5<5S1q0m>s4>{(<>o*QMOssI5YW zfVK1(~6m%qjE}jHh;ub*N}he#;$SPi$-%D+W@(A-lvA z@AsyPW2XARiMnbTO*6#<)v2GsJK$45mS|MriK*0k5wE0+w>_9ky13$aOt6?njW@e9 z&M0laK-@K*IRkYA2N(7dm%npH!zlVpylf^OEa6V~$qkr)W1Dz++!kEFvf`ifJfi(V z40Kh(x1$m|i#o!ZIf6})5;hkGpxDSAmT#1J95WY97-M6Ib7)h}eR#)Z_Eh1{t5jqV z=K_A;X~tTpoLM)?{Jo`R_{BUV%}I&2Mm59({QS~1YEnD45MMjeQ=*9yu_3+1zWn#c zFdn*e93z&mr`K+dD-42{hy@RsL*}}oB*9r+&R%TG21@K}7Az`K*rVF3gvrCaxaL zShRuOGd~`PC9dAMyO8-|##7OWcjM5N%vt@*MC+rTFgZ^j!y}i(rtBT5wJx}BnHy_67p z55Tn_DvS(O;`xBd{B`ujrItqtwI!qx?g-;Ob=N-uIy|58L+NLIxBw@Kp-U4LmaljS zA3xUaPn5{6QA2zc$TPe{iQ%V>#N2T9UVN2^IoenJ9?94;Q%SzocyW0Ye{X9gRyA2J zj*Mm8rYBu%b2l+LftWvWMMu{Vv3fcEtoht;V2Zfp5jBB^E3v_TuNX0ivxTcln0_o0 zTRAi5UBNrI@|IYibJ8&`d_QYfi1w+}OnXj$&o>{$AIwii-{ZUV`~A%->E5^3F@MXuG~d95cSM9Nb4n5?K^?phmJ8L1%&u7g?-3q_n4q}Hw-m_g9 zTWln_;PO0!D{G%vxKG~rG^(2Ssn2(z81K$JmtQ7RkM~0E(!!uEHPDAsQ5%g0! z!1{D%GxO#ZURXw{^J&bbKYVmS9m^)>v-q7jr&B|1ST*yhjhJV;Y(kwqr$z7S z%(=7{X@l$r zj1MoUHyA_@Oy(P5jLCCXAH+O2sL;)}nb`Uu zJ(n1_%^&s>EhWZ^Yf2nve5l3R@bx~{03()&J+gLwvn8RuW*q>J@lGY?#(#M@r`#MZ4mU>&JMw_gQf1a+0(4^hF|v_w40 zK78x~H$=ZG6AP`pp<-S4%jS<*Q^yDOH_o3fipEou5QM~QXTV>Oy*;+9MQ1oy4ax>zgza{ zLZi-#S?oVocUgyb;f>5QZ`(oln&m&|IrEYgcJSvL!G2%i$qD3}yFrzp!~i2Zyr@f` zrRPf2I3I=PdU*psLaF6LoJ)IF!gDwO4J}k~)Ndem&@$g( zp0;CSTTy+D9)tB&%oqBK;T5dYfAc=LCyEm}hurc~iS(ptVlC!W7au7xr_EBaPiyKX z@_astuoe6CrN??-70xg95ZiP2?uHfr%$Zxoo73rKznglVNok@EcWc7-snGpWzPN+j zz%R9_fxoO&oHmJip)PKC)Afybl=~lvyEyB9sB1p^sW&JDkEv(tn^*tljXiva50^GI zPbCkf&wVAZr@6UlEVaJAIg@ADz+AD6dRkUnsN3>goX0vsFWC{@BCm@5kGi6FZ#xVb zRVqrho6#*|Ep_S}oBvR5ps&QgIBPSlU^tcfnS6hv-%iBZ4sI~pri4ami=UOe&x!L0 zQ3b0h^jmAKq7PFi)ZWAVdA15Q6;Bl-ep9P5T7|Nvxk5emC2nT3*0|CNU%PmqF@N@# z9oFLWAP+p{o$}Ho4W=SvA^RzjH!s6y1U2f;sL(8qo=$u=DNu37&{oW44`)u13MsMX zVorZ@{r0m?Y_~#e!9O!NmA=L=yu_78>8*&V4n(I08nYq{S zz*^=jPf{DK&;{u8M_fLZdPUc^;H=`Y=oU;3%#n`Bo_tEQuy;YU`36+8zbHEWbi|ln zHuyNAq4|;Nw($P{&U036D=acm!eE6GPt3-_=^Ou^EG3RSw?+&0hn^7U*LEA>+K1=4 zIq#QWEnvmi<}pEqN3Z?WR=4TV5yGF#&5BITX+BiPU2ByTypFV4Rw zE{0v8D-yhw_ocFpd+@QR zyCz{iby#gwm~ptLR&?d;D^rE0oAtFxUd)XPRmeEdreHF2zaNYVS#5s_!8YzVou)#o zF!B}Wa&Dkhp=41Wa#`ayW)0xA=MAj*?p*0h-|eKvVsUqB&l9Ub-};DQ1DH>0l-OoJ zN%Wtw{I|ME0OI&0}7D%1ykolU@Pil{mjDNL*LV1DK>lyl13%&V)M(F|1Gf z$B4^0H=DvUe;_kVT>IV!Bb)GDs~;o^)VBy=47qeaNbHeL{kFcY7`Qh;to^r+>AeND zlRQP^bxQnM$sglSA1fQw)`ahu_6ZZzGRQ{6Z4R3{m}Y`8%`OhaFIULjhH|C_ERC?&~c4F-(@Sl zzqLBlE-0-<;5hotMJVyCqOth%Ff}Hfm1u6;Q4FI-<{VMk&$JL=Zo)emU1i z31RVgv4Wh|leBlZgM?lV{1 z*lLe2-_1oE_B|eWuEXWMYsB5H?XlF_1{R}aaphYZ#JT-jryN~$46hc2;r0>sH0o+$ ze=!c#nadrhmVuM2xvxNcw1-0RfgHcu%rVTkdp9M$W7mbR-0$(lCZ5~KE!D-RFX<=au7t_4TB3i74?b+l~FZt~3x&lQ%1}PH(lLvG|LzR}NHSyF(N4IC-qs`Q0raT37VrjPWXS&OY)>l=kKB zNnI5-?!JZcuk<6W&wS%j84Q^pZq#!|U6ZFs-pkr*;U*m3`2v4z>396v4jpxLMcav+ zkveM~PS5KuMz6HPSG5g7LsP_*{x%3-^>5wX;F}d(XGY=*&zOJP*{E?O6XV*b5O28> z&X4mja}m$*P77R2*@qC`L089)$H&Ya=;WlrxiKTr?MW)yTC32c7$15}L+cluYqOTrYixl#&q6VqmcyoVka*caWwcY*c5Zt76hvsOay<_stg`XbCqi7}1p!nv~_`my$@dF!6wOfE?` z>N~`2t&XMS4;Hm^LO18;DBC~{`%*`^ydH)Y4_LdLvqO7w2LsbL!Tr=aw-xV1t%2X2mH*_=Z{iLKHTK3}FXQs7(*~O953?|kJ@zgkH#J`hj=+F%wRlE1 z?JH^`)qlqxPW)JHROLxLZsvyj-v?>0{5gsz>^Ywd?V^4Ag}TJQRXAAILR+vV3$7nj z)I6%EHTT_)2OpXLpRcZ6b1DfnDtL!>c&C~DFb+xAm>=pr(DY4+hQ|pN{5&sd?vXp! zhtF>o9@l(X8;10~%%u$rG?Tfnsz;2o8|G;&sg;uJp~AY02Q&`6Q+M$D&1#pYF?8e% zg>`G|hHA}~KK_U-<^A&ToW{Hn^%Yp}N1Upqolh;dDV45h9;eX$x=DQtOIJLaIaRAq z%|i3eE~wweRBICBiPKNFV8)`>+9A!^pX|5^hlFdITRmK`@U%VWchTyyZ;o)XwuQ;M zgTm4k8!+m*Ef)Cch)?`&a45s}ADmyd8>+FfB|o0M^xx?L+JS~S*vKCKw9hxSfz^(p z@j^G;E~qbUF*t#-Z1t>V;^bTatCc7`*oKlmucTG42A*c6p!mZ z(st(Fvr$*x*-=ll;q-JJ!81_M__?;Ufb*0R)-sd7Xg8C06VDvR{&EdThg`FvN0q4S zR9jl|+M785`}_xWq!rvf31(k(!pAS#sjWC0ig!Y*=m%PaxnQ*WW+WQrYn`M`ki#6& z<4v^oQ6D?pD|3WA%26179@h(`ur}xdO#gd+52JU`!L$xk5rSD%;{_}4remq_p zurdJ-?5*UbjgZ^}VvugY9i=u3$!r9@1=;8MV>e7%PY#%KZ{{e@LnOV%AxIj-dHRAO z(w|zvSYXAR@7YkPAp+sW{>!bFW>R{tKiXt5UsRe)w=?|UR!q;b!ts({TR%L##lLIK z6zTIyA3T-mkui0ORPdE`r5k%OZWE;}=9z&_na3E8lH!A1G3gKMwW))o@ZG!{!x^vU z^pNrz*<+Eb5|)w2v?H_DB4wWQKR7=N*rDBUAPdqbH`MO{smI5Bq!7cyhy0|w+?OA9 zle53vY^mL%>lnmdL3jgM`YhZ>gA;C8`KCmw_xLuBYu(Vss5E9y4hm1XF_!yE*LtR-vXpaMBUi~l zhkHQ$j!wm|m(0`R;mq9qLD*0 zyjq$d`JfSZA*^j}B@c4C4~2X3zm3w#dF-X6adr^vD3x4ipE!YgfBiN{MaQ>5*V+>= z{OzST^&Q~2l^$mo21-A8H=fx4uWr2QoEnmg&0$RBxmwxIS8~cagU&DLi7+`|@)&ss z-R`^Lmim#@KK2>j5eNOON~z@XEBxRLV%)}`^x!T>_mkuXEP5|_o7_S@_PZ?n?n)W& z&%luQYsR0F#<$U;h&UU29hQ!y=3$wJ8uev6q};1}U_#9Mc8QlpPtU@I({8YCvsGGh zVLO~2(2qXHQ|f4xjMc=s_k0KGxYmH;g%B=rC@&6g{3^d`r3GwPTL--GhAzYj4z#nkOAHbVidI z^c{0tFBLc6i2iE+n!)p=f`;qyZ0El^+pG2rmaZ2Rp%>@%*IMODhaGNm|I!V^qFzZ& zrRVs?81iJ8f!w#=SM2}Dxc$jU4!8LVhY#!(Ollz;HG7Q{e4bs?K;CY1AGP^j6!xqx zrwq7=BcItf%Xuy}>RF6_-`ue6Ua2(HB_G>=uve*+qzdK!|HKOOZhNJ%XLrJsv0_?i zs#LvoCZe0LZ|N2; z-WdDVSXyu5i`$&hrrI`_Zr`I;cMW=YPirPs>ql=rda=CN(^86vcgNNOU+i4cK{B;= z!QN0`l$(u^uC{f=$BVu&Sv5z>PhF30t^VbUHduoJkGO!RKrRs?edAi z_EgqIovo#H_K`e$o~Yn%N^?%mUtKF|qjD|J5T z4?it;sP!61+I_xo;0$J({8_ss&qK$N*&L*6pR>Q7`7LsXmTb$VZubz3=>_EwyTEy2Gd%xeRlo0+DgBdIC z9_}iiN&bem^!4uiVytW)ts|cK%~(BYx_m}cP3%(J9h#XF<;t#~;KF-K+sRbUZT1*? zE!^?5kBR(wb1A;J))i4wezrR80+x*kE8(O zTuhnB8QAvo(sncIdafbIOem0Ys8O(!_t2diJEd4DgNpyZ=Ugh(mV*Q zY(8qO<}0E9GY~an+DnB;=nwlV5I=4^N;hq7aVXU9pL=l9qf|+qei8ix>EB(;Kpr)) z0uy$)p*Tm7C$ImGbBwp+_brou{L~Q}-C<1LxmND2UtKg}&JezAr93h66ZJ&dyHA=S z_gMHCRt?;-vav#TkV|o!dFNA$?(#La5@dBCZm*4G+Xyul^<;nFrmmd7Fb^My^LYJV zQh%phsAur3zAKlmZ_6g%AOs7Z!`Sh+pLFFc!{~kC4Wpe)0b9op7@=4dB3hNwH6JjJ?RpRRVQ9(uagh^ zj{1auy3~@qnyFxMhu+ij5NXAv&A7Tdm|Wgy>Gxh+%$nr?56&lV9FkHpE}|)O+7?#r zm2zbpU2)}6H!S$!CEIqYE?&6ih6sB%`EtQ0q!aVH zo!7{X93LZyapv^T>2lXcrT>}7)c<8B+wCZ!4+yz3G2P`&k{W5e%T~>8DLX~w!N!yx z^iS)`1%y9sW6_UxNbo_bA`GI$-q?(ZmZ=T`AYDLnPxrzAN z-4ow0@0UU!Qg5S)7fPn2N%byqx1~K}>xxLJ!^d!h4D*3$fRA)ZpZhC)7)y)nr0>Kz z{{?pkCeM?`Q2%D{aqdOT87MV(p|&*tzskCvl*he|hum#DS^bT+Lx>MG5(g%NIBabV;`sd@2c_8zx#PP0$i@Y)t{^aB3DxxRc_vWmWltXgiE z%y_$eP6Z~LGB<0oR&IUqJD!v46YvA<(ff{(V6$=W_gwT;8!W^7|*|Ko+{riDZyWUWaGxB^4sTXEbPqQlVLac^XWWX zG^Z!5k&#^bI~NIdJm>Z6${X6|&`X8!A>fyE<7Ya$@{Zfv_?a|zODbgEab50QmEe~M zJD%Yjk0NQE3H{(=*~k2_PikNkjhEcjxxRdxbfr}UPUQRG5%1G}Z$j|Q#upYNy`(te zEVtu6T}NvvjC#GTsFU1JHB9Q?i~Q25ZGev_+pPT zBy@1{!uG^6>G}3J+;H(mveh{$c~~@-OearKl`pN!p^oMyA960Ur0vnnH|BERSua`| zFfbU4P1vW?x=JgL1fm_eq!(8Xl~$3*+h<)6E{*!CJslYU(_dRbUt+C(HnmhQQg_$+ ziS~X=_VM^WOgC;JC37y+@D+FNbZn(Nn$5T~B>)3De3zoh-5tvB`v2|$rF5$y?_YV5 zy3s1kDOo8$cdNkNi{!bziIr0aSE6Gt@^bwT%5`0JMR^Nr2l1FZ)vCJa5$}dF$Afa3 z(PwPQXWhLsU0%MIIA3+ceno^luisUqzGF?@)=NIs@D$t{lKXhrMoyie!P#Cs+u5^Z z)2@eMv(TNIc%nSM_g*aA!Tdz(Blqu;19e9aL?pM9kJrzDEB7*bPcoFp-lYc_-`j=h zHRQ4$NvO`6VrzqUQd(3Tile>pCG3_ojk_?HjeL+&=Y*8cU9ECg_B!+TNyFELAc*h3 z`Kd%{;rL+uxW%3FKkiaU?I6sW=#RLve$qOlAPjN{qUKAvR(QhtF@<|X3axezdmx3y z!C11aRC|^?H-#R&AA2{JdcWuV|9~I#>exxK{+lt<%@<~SYRg|vuE&88kAHCXKF~lm z<~{ghrV0&=Hp`Y-6==a8-GP4T@~S13sO;p1w)-WyEJ#&ICH^=`z$_EawfI1e$jt=nnJRl&)o{=0MuGjUGl%}k8A2cTn)db z9rl2Fa^3+DtoI8ym`{_t(L*$-n)L z?_G@Kk`ouPj`M{9?Y-pz85P)^tHR8gx$-g7N<8e~hF%5d<0CgK2K#* zB#l|R6|1ihhmzfr_DmptUG#$gx~mxC9q_1>ObET?9s!*D!jpE={@Pfb&?m>M7h z&JL2_bxFj}$Mii4=_vOZ8H<(vUYJ*{vE1Jz5-W~+;n{>5a%rzna_zj3vir4UL>;En z#r)jis^s*^9}}owLHQ`DiMcOIbLcJoV!M>P#G9U| zgMHGjnWoYP&N`ZM7d5m%lxCdYgkaXKyOvFq9u2WY&qm~6P&~I{q%|_OhQKWsfhUb(920MeAMQ>j|M8^d7;ZJ{*r%}6j$Pv~o#kb`7=`xadC%PpR$*~oAFkp{5 zs70>EMU%yUD%>nfTEZvVj$AP(B0i7f`m=X*=JCsL`6cdu&}!W^;C=6TV-Wd!MIoC1ef?lGR=4XFgrng$PrUy8z1_@(VjGtA%kT@ zUwXsq5oOhBbdzZ=>JvB z6by++H-*+-zkG%J#P=UhJrD=S{lZn^nZBYkKTTnSka5ZujWpk#IdQcxao!Om(06l7 zyG4QpZ%#f2#J7AlT<~~ehUedDM*K=ou)A%7+^PT0l~%hkP3GG^2ZsHq7PQNj<#*w+ z*O|B$E8ogA%W4o!&(yAQJ&G=UZX%Bg(!QXo&?(*_TwZAlpOKV{I(Vai zQAf~;o=tzu776>FnnNek7F{j-3759+#5!%7r7jyN1U=Y>bM21)>wJFDYr5=mryOV~ z(_Fjpj7(i}1|oZVL>&Gp>$I@~tEm<*9HdgDm2nS8>7ICO-{7K^-S6Y$aR<~tR4MXm zUybHasy#L<6e;x;P(!sxfb%O^`14$>pxUFs`nt^XVJcqNlkUavyezSAER3k$D^Q7- z8P|nk9rg5fsrtxb3+cXWNIA$p$7L=4<)dU&d$<_Mer_WVV++bUJTza{eVsoP)=(zq z_ldHJqy6wkD^LmL>63tlltHWi!<8u=*Fy2Mwpo z+`8xBkCHt-C(gCSk!kY*@jP6__Rdwjcy{1)Z~3r(PBpEB`H7dZ+a_YzlxxCQS9 z?iLz0(_H-$@%f_G3ypP0VUX?sMIRj@llY1&uGyh!@h|4}at{(lP*&!NvrKK`9@Lmy z{|o0mC#TDrdgq`{(H@$oWi1mbZ61+T=b$g3xjLy(a?Kbkzw#6v&WwP(?e-|6^C_i?XdZ)7=Paj46rb9iZ~Y>|HqQY)$6Gs=*axJ2Ps zi34Wu43@PgUyd;}TP#)(%gok=fzi2LHq=bkPdx-~)Vp5LWtr@CuOK`yqC5Ea>9X*E z0EB&}J+H4SJ8A0=lPi?rThUvlJVxm?$kS%gOQCI(C+2r_hBbdv zFdjv{d3tV+xF8kYQZK)Z>hQhKP70M&cSM%bXE#4o(2$U}nC4lJ1DyobaT0u{yZjlo z9l}y|XY@>@y}e?UAlvVVLwe+wxEMk^4I2~@UvTQ15yGp+BXE;ABCF?Bc6;VQJX=q_ z7dJl^PCWB@8|W_l4?mgFQf--f=ou8#bFe=4qHM;aY?_-BKmSYDq5&G2D53K?dEbn;QeS%f zv>;i?o)~;kpc-D{AWI|fj&-!o-(ezqQWFk8x{s?VEtDNO5Q=5QEjFm0B0H-VjBSS< z=?*zew&QppdNdQ}YkJD2>X5I1;Dn!ze+0!_#IbRtxk<(o;URg!YJU^sU~;AKoV>xl ze5W&fc%JYk!5u4I#5hu)Dr{WgiVnTSNV5$Unyn>xl1F;0)e^yx`qO!&J92xyLpZzB z1rb#9WsO)aj8lkW*L9vPn^2fX8MwsHe8$VVhMt3I67f}1dKGOtn2STS zhjly$6ZJB5x4b5$f90`L)n$~t)HUI ziwh+WJMxE=Qfl}ddOl93J>2_+@cLpP>5@pdu%k-otsH>Q^en45Tqqp=;tPxZ&d6>^ z7mjOtV?Es&|169UmRXT*-dl`FCr{zc1UJ;v{XO0ExZq1?NG0+17CzoA#N4473s1fK z_H%?JXII3F$XjyNWTEJZ1Pc@;*xplB$fNJULOOpGmZ%7Vu>(q;5|2>!mwhWf4huSS zw8tc}Cx?%sWDn&7E{jXzt%U@|3t2APt$3XkEOiA5IcI2P9ka`yn{tS@q9Grv~6;xO3>@4%Y9fyVoG&h|8S-9aGjS=mM z&#iG+_)dNxdUQ`&n0Q5)`-nW0BB&-*LD`G1@jJ2-}+ip-y;?Sr{nnp>uoV za=M$CON0aDQ*mybGjYT>N%d>{!{H-gR4-qA`Is)i*aZ1A>nvUFgC4oru?ui zLK$)Pq`uTgvtBG5p}XOFQ}UIln;{%%^nwd%V=KFl5&HUiAkbY*`mh1Ql}~QS-6qBX zlPuJa)o{@4JOZzhW_w>RO{7>jc+}QCPH->Mq$_q3k*3p>&}0^NptPa$qQF zPMz_iNmcmqfcP6(^xU#m5t5Q9$C&yaj|{sCipAat9^edvD}UJEW1bM`d@%jXR&EJSKL-(3(zoe{Nt~>Dyh-1+0G;^|dMO~l-KHJjSuNTf(QRR&KwQ=lA zvJ))n93HOk&P1dIxvn9>@+s5Uq$$U7mw1z1*NnP zswg`ppL!QMZ`pIoYf64d&#YeeSjtp?L>H6ysa7R>yVVCvEoh!)#IvKsAFiEBnYLxw ztlEMyQFWZ*tsTSm?1>jW%HW%utTBsvegDL{qp7KE`I|c! z(v37q>qp6MIM!kHZ3m1|zbEwkegnk@q-QHg75-RN5VwwIeD7R@PMTK`N&Sb~o+d)# z2pKX~IKk|ao?vB6IS8Tjj98{29Di_uy#JigRNXk7dpQBi zZ?l6=QcT!QI;c9v6a(|1EjU54Jd=IMI)`U{$op$a4D%;X)#y!h7ke7O_Fg&#mtZm4 zM|rSd1M24&l3#k2Gi%C8#x#1SkGx~g{FlaKL3d}Qe>=h!)JDTGfcE6qeJrqhBu%=o@%y+6!$+!3XiYjSeGh29Tgg`+#iu=3C8kX(o_h|i3 z?#K9YYdt%#qXA2|I%2nqm<^s;hx-lWouM(0&D~dp0GewY8>q&9?7ND?*Qj^u!MA(h#0}PMmQxv<-W4ArAwH3wYvsGr!*U90qhJKcn)W zymT)0J@!j5b7M2FQkaQ0OoA&{+ptN$({Pitl_)X0 z;+_#-BySJvmgasR?uz2`OFUAqx_el+WMwBkPvzK!i_EqW3I-oUK}(@1l>wAX50Vcc~bTS}R5=aDyNSMo$(G2;P0-ocN~9O}uA$zqMgK4|_L57os3 zgb9niFf}nAXO@o_;%Bzc<}79!;^DLLO;~+b)lX z&(0Y3*~A*1Qse)Hv;L;*{4W1SXeSa+*v66nlyw_hTh7}J+j;X1wGh#B-}jywzh=}8 zl${jAXxI^6VQ2-6>F!@POTyP;Fm#t@;edy#;H<_qPg>1r)1va z$wh4W=z>(sEPigmS$O$SZbHvI{_FM}I4BVp`ByRDrZ@xbZE4m&sE#-Kl8Urz=|W9Zi$G(^^c1vfYKimwkP2Ih!^b5Js*5A zO+ZDxhS0c_@?O>?pyuXGL6v;l7R^h*N|Wir&1ZD3ixRMSz+|Bt^#GD*Cg9%O^+Iro zE&K*1VA7Fp!Y}H9)M+RD3+EU1H~7t;8X;Vy-up`le{0RA;;T(h!H&4#HA{+$ycN0_1fn> z1%Cgr*7ZNn=RGD>{0ox@u)9H?Ca>K2-@os`Ad~dNogMk>gKmL&l23)3D?enxO|0MR zjE#2!`4YEEkFcUq)Il%0AAN@%;x1$a?FFKZmM#oB9H* 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 (s^59m;yt?&@(g~zY$&5H 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ℜ7?;bwcGiVK36tS=xIgEclvmI^i$P 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

jiW2#b;#%D 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 B%buB;_* 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

J&%)>eTKXA64oUJt{CP#yF z^3d|y8F~ld;9U858toRnn}Xmxqtr9QR6h5o;9RHdW5aXqk)rU!*)lydtZQeH-Qax1 z`=cQMUM?A&UE|VdhkT>yJ`h7*xN7&dM9YCe%*me2u9YS4iskOkd?lYY_7WOe8?#rH zi)&fXZdHBEtjgQ++U*xH5|y1<_+HgDbM08UM1Ga?T0L#j*;wf|5RZakk=aak2u9T#q^vY-94p%I{mja4R)HInP(XdDzOq zwqpIz74R-BF%7V7Yk;<&yv{hQxovU<{DCVIe{y@+uGSBgm+;Khhwn&;BTw-uY& zQV*Qx`=>{bwh;GunVn+}-ycyW1;eBsVxjj^SL?{%&lH+;|Nyw6d~&ZH-td zTM+)Ch?o6&P^?tp-k@aOvP|o7KQx zvR0&&i$iNPyR7|V9_F(u@^#O5w(#os)uWj#(KgmLYAO6EI2Rn@Y+C|P7T$`xFe+a{ zWpEbq=e|20{YRVwr_IySkYj{`^Vk;e4H=jvw1V@?&SeZ?)%hL3Iox<5UQMP32WQ_r zm2G+kco=f@^&Mu|qKC3q{V8|u&EvLVd(mm+q#o@2-PVD-&$~Vv@;o{1`|m}IK7u{+ znabPWMOpC?Wbc4Qvu`XCBZrQ1kLPV`cUWR1jvDZWOJDmNpIC`6#{6cTG4?x)V#Tiw zHT7(h{i(!B4?pUZbYb?a8{*^}dGCoCk@k%1|l*Wm%p>EJstDW zqseomQ!cxE$xz7wH``^%Hd|Zn$wlD&;Y11BF3#7D*7V;yYY825!K-Ct2VuvY@&74q z6l<|eI|t6e;G8(eS+mY#2QfHrxzpK@f!cpS3eG#vdp_`k&j;tDhWiOyGou3p=k%xh z+J=pxH}MP&-pm!Yya&)$ zEIZZ=v^yV+lLef^r(H(c3)E7QhrSD(gSJ++M}C|pTgvhI&i`Q>&z|3# zrXV>oaki~Hcfuaxa|1oIZT181|2FjL)>TUAniG9iCVG@{_5LHymrrlh7BSZr2+p^j z71dl9q}JVQo@_CUqDK}C&Zm|%GW0^<^#PnCX2pB8$xdxTf4SoAj-JPuPigy{e|LJT zgsjJzTgiiNdH2PHYIB&IXiN_%HotBD_h{KXmiTLYtET(^A;YX_6b{3`B*8%bFJVV3KL zwD9&RUI2@3+%~*&w#tMF>~P%u*l-Aq)`}Hy{uf^vO0)4FIGC&r04@w3zdS1s@DI4KBLqk`SECP{J9i#Xge zI)k0pNhPBDlWHoVP-Hy=)|DPe!h4@^oRXW3Sf9~50%rA^qUM@G_K|7?@ zfW>pb(`RL0@1XGih;zjKB&`Pegn*Q|(KkeUyC_oDg0uhbep*@HspH^$Z)ZQPU|5ta z2IrAUW3_MjEHdgK@i`$#n`mZd(@Xl`WumnnSJ*9!=Am|md73l*zA4S|&Yizf%ahG2 zV<+Q{S$~^$Qb#AS2Cs%tn|8cAIR>?MznRChZ)alUq#L}%)bm=+*jVxML|0$ux_0np ztgIPIK47`8y)(wiZ|c4(gPv&@9>qz?Bg}W-f2oZ>A1C*p5pO+SXl1oHN%|Qq`vV_n zBZ|bz;&066FTSjWGVeC=4nIHZF>Pc?i}ZI;zf3u(J#~+gVdQlK>nCU%-bF~-nZ%`Q zi?kCbr%8#5Bl?hoECKs2>-4YD^spsI9hw^}TYT}leb`1lze^0U zFw5iWt33STHxIghko`_r%J|2a2d0lp6jcIWr&5# zGs{x%R9h!z#=*So(>kgWTA(54@b14>O^v_9&QR)*Kyz-@<{)#L zZ8`H3&uOKevD<=Kq~fbbYClKt*-|g;d~w{cpL0F8C%lI9A}_Q1UmYnQi0vyHp49p^pf8DLpxN=q+IqAxrq#rvZZ0aSs6}dC z#shgt9yNd(u#PLfzL_eh5!cWfX?S<$Q0i?gnyzuo?7V2Bs@`W_avh#jVSQB+GnF&% z!hg;it9re%%A@@77;gjB%PP$BbfoTR7p@wgje#4*D=CvzW&a){PYx49yl1F;ePU($ zS3E`Q%~6rdV`X!Bv)J3tQ(ADWRA4T6TbsG6z}pzPJ;E$C*3M8d&T!MinRf`cs1e@O zO7x+2p9)d2v!diMbF72Dn$?0W%xP+7>D}I>oaaTz#Nzlz7jLh+H=8C^IonyXWK-=X zhRDzT?Bcw>MC+WFx|2F^^~3bqiZ%2``fw+%JMXoYeu_IdtA&pL7&m^rdaE5IXHG5) zXMHJIo4+wqt`l=2=DpFfHl@cJh)@0SEUM7lD5<**ZN~S~Y8dZbd$`cwOO?9Hc^+91 zf1!9^m5unkfHOR+z*w~%9oOmDAQ_(=qTXzXmYwuZdu5JObMi4WNPHOj&jR%Vj?TFm zJKBD)RN?fYj&R3}ufAEO$rdB8;A;85sedoUtNe{)Bv*B_^!cu&0q!|e)=gG1GZ#NTjZGc?3KzPYJ=5{KRN8qKc4wJoXrIk0T`_bT zYnWf#y;&7%g|2(8SsGVgtpp$1#q237ddjRk@Ubrsm$7_SMdf?aEbqyS0&m1?uG}pd z;g61}yjq?yXlCi3er)!}%lN`1$(-r32?zfp&Sl?!*1FG!uPcv^#rcgkdpnxCE^u_u zGO9ap&abAybz~}|-k|ZTVna*zu&IhJ!`?AsMUOHARmX6P6sv|NZJt@}Bd<#yMXzN3 z47Iiyx|A(wNBS>UU+DeCzhSTOs%qs`K`*b~*T8$Iq7^zZULRRf6seb1Ps+}tOs z1YC;8JI?K;hw6G3G)Ngjq+!q<^#!ir7=9>Ii(FMb=Af%b6rFKdvU-TGbr)B>N;@A` z2iSFMpl_4IK1-F4q}Dz}?pIq=+tZuz*Fmcvd`xRziF0(D`ZrHu&4>mzzAfCE>l?4b z=S<>4z7hQJ$bZH;^rx18ainyq2xnb4o!YxMQjYK$UCLWXeP|o??=Ij;^}SX7wdB&r z(5#LgtgPiM5=$@p@y;;i9|9-Sgc{`Ve06sV`5t`Bt_qvgxZ?CL&fv|MalZ=Won4xX z_kGlPH3G~7dvd=lxvO+I|4wW0`ip$6#!ruyE3e=v4*gKO_$+SL#J}=zTB$ZSTF%oC zUBA{v0?{GZIg=xDxXDg<`wCC-7U<$8cj=WB%8d_Zva94;ZV_kZ;xC@dAamiF3wGn{ zg`8!b5cdX!$jmlQa`FcLsJ-x43jL(cE(@15)k0*V=LNNFTbMYeo8^YbA{8_=L=G&+ zU&Y5;&Cs|@;rV|)KB%ptFS>s}TA`&~qO%*~<^?Etlw(^Op$ybXwUh+K!Z>mPF(c((KDQ@mNb+`zalLPC8(@I}M zv>d&{y;3%#gn2~E-jZgi>Bx?k9NJMlN$zjVEgv3OWZO=&T>P3}F0P{v`bckdVj)=; zjps(C5Lwf?kPPPiTGTy6(ibZzRhC7`s6gi2Yvz}F`Qh*vgh-wrx#U}Ov{lRSt4f^X8AGIE`g5v&)liA1_x=6BY}Jt2!6RMZGV0Y(yZ!Lo?LiN& z)_UzSe8#{TXumr=HLRxhx~epKfSpFK*2_#XlwQ@a9;f~z&bG4YlqYxJ?JC@rqw}c4 zMTg=)YpRVR`PVSIbl)kw^4H;{ZhSYj1ZXQ*Q zINNXG-|j!Tql%s+ug-!$dEyuKCD9_~dsB7__+#gg>U`ZbgIQvX1!QOh zIRG9bp%+U?@?^BrtIaYdTRHq7s3~5WCsC3aEzF6DHRSU;X5}uJ zrT(D0qQkL_%!mK}E-yJrty-!Bd#xsV$?PhTlHCui9@LU1BiO@*x4`on6{S@`xZD^Q zB41V)5&xiR;>-N??JDl<`U{hjP9aj{-glK1Ug-F8vvgQ^T3rF#&*X<+q_(1(WRYKpX#Kg4c`OCK-TVPqCusHadr(>py%;Gj!|9I<=&I%pMVq>b8Tp%$YA?Olf}g10 zt8P?hO5l@8P5sgRq}t8wNg}*Z>7UQl!zSo&x$kU;oMl&McHgwXw;^{ek2aDgvN-|+3wOAKCLt56sF94k+^VHVbA}scn9k2QOXEcy!uFQOu$J@)b zfs`-7E`X+ZwvO-;FNIg0H#;X*SCIwUG?`aCMAly_DpTsS6a1A~{3~aZX${!ZgrCg1 z{GZfsd^qPFoD4n*X;u)OYB;DdupL2k7{(pUB{;M|m?>J9=nqI~1j1=!$ zDZY&r)r1@5lhlA24gJ)jvCPQqgbOV;UDZ3wotQSoV|JIyMx9cY{Oxl7E6S&yMGTwK z%{KU^M(~awN9XqYdKQU-Yq~Ok8U9BFCHM%l3EbTu{VT|%Cg_ULsy*9U8+}lu>PntTlx^W+r=QuOHPyYU|6wd6>0w_RQl{A zhSo14!(J0>O=h{$EwdbV4iT>!%U|B-=F(!PN(kg;~lKSXW6!jdi5Yux{s&Ub04Z~Q=`}?M*QhF zN9DT$|C|-x*u$dl`9rddqcltrJ$KBJ)F6NF87a@;d=^ z#*7HVPX%4pl8Tb!IXPM%@@ z=5F|TzrwT5BTTJ8Gc^?*QSV)q)#!QDyP45QAKavU+Gdjdy@>-?_8ID4Hi`%F*Skgf zgcEa(vUWl$ZXZ_}rK2hJ*$B=D@lZ>_@FY0T`*XI7g7dNK|8JbPw@ahClVjYko8o_4 zRqbGAFlI72-oO!R6Wr07!_@LE=Bpbw@Zx~Gs8;!as`4vJD#HuatN2j4eO$t0y%sg-iB$lX7=GhO$#jy38t7WJV97S< zx*AGtdj1N%u)&+ueDVRGiNw|0eyZaMlUS)$`xh&!?({WDDdNDIv5U2A!6s?S_qALa zZD_j3D1oa|@yQ%%lpMWMpUccMO6MV|&r?<#W#RbL=i}hKEim=@4LIjo|L6O`dBs)J zzx(LF{PVZIZfEcB+WEui>&Us^cdo4BJ~40Q&+mF*xXKtw@9Y%!qyKz${SF%J(r^(6 z4k&*#g*(jn89F^uJBTMs9#Kcna+YC((a$uYRvndFCS8b>?@Q4-G%m^PeWZMTOaHom zWoeldE*}fynNz5`lo>ls_EuwWZd_%FJBH>b8$Nxdic7Tw>fqJEVvf%)|5Of^yxx3v z?SCjEdF8|-_$)=8Q(ggh^0mc7sm3aGa)eQ~ykG{f)+qJ!bby?T;N9<(TTPoDAT6lB zo{x&vqK^m2$ipTnejw0LJBzj~)Y9&%%Pv3p(9tB$ts=D(9{v(_$tan!jxl_G;V)IdDCKWY?`xD^mW$J|gwm0M2(7bEerxe|F7O8Aa}q zvX6dj+OdD(+`QBSt!7fBbW_wa!Nrt41NC(%^Q8X&s6Oy5m2QxSG>KF1Z!@0)M>KTU zZq;yolsGS@{%n)1_L2J?NJl(e^HtT{6e({11mj1VQ3lM8__v-qALSwI4dK#~y!5lm zEpwVO6OCTz(hqlLcS2-dFZxiC>16OvYDYN#asCg~j@KrMEldxqkwaDT43PGb%t1%a zRvy*-WXBDY1a<4C5-&`VdC5lRq%x^TiBrV6rcw59iO}9OnJOWi-H3}phR@!9a%4w} z=G)0>z+Qj3q*8GX>tVzfF%_#jMk6}Z)aRqoMydVptdx_}?gd84{|EDOYdPobQoko2 zoX;_9obof<^IUMA>EC_yb>~kI-wURH_tBRvHsUXwohO~s_FlpZ0-X1k%c&fNm=6W# zMdw?nJ=6uS!1+@`h`Q>IU!{RQb&=I7-&6bw<}(Xc=&%YRHw*uUAJ_9cD$nCcQO)sh z5BsbX`-7@-K8<2gv2$k(x`wWO2;& zm->C@8se=}q+OK1wJ49Js;^N>USk~?QA&cpf;lbuqrx)x}ZGFelfYs46( zZQ<1CO$&`O{}1Mg;2hE@_3PPp8D&aWG`Q@eZ?tfVs2Qez_tC4ZqooNPN6J3>)_n*6 zg>&0I%e9^4%s#}8-CwS1qY6-)5I2&i=TN5{#AM>en#D@>C$FdgUzF@NQn`?`y|OS5 z%smo_?T1y}>uT)L?i{ z^KMmj6ZM1(e6M|l>erpmWH9qnV=ZcRCHx)N;3Ls;km?>6AUU$|PA#scx^(rEe{LFO zW722s>eDIG_D+D*xHUuDW}m{ouK>C8;j>{-g{hJ;M}Rb1QQm8KB|jtsFZAKy4Fkoh$y<|9`3v}-F4<5_nS z&yY^q)ZI7H7d>jF9-%#GRt3GpihfFCzGL86 zbZc$LDZe20+Am~ZlK&L-4?8Aug~2T+jaBmwgi2f^v{(&#Dj$EdJfLRxp4LFMYK8ub z9CA>nlB)eulXMIqC;OFF?JgG}TaV&7u>XLTeUhJCJ4&2&4bufLJrdg}A?V51cHk@}pI`*F8RDsICU zbB1%KKKqbACzecouD+WXj!$k1woUln(|_*7G2or)Q0mvs`BMJ>|I{?jtD9eIe2zIy z^5@J83u<@K;)YE?D^|~-<);QbPk*Y}mmyk0C5x2Eho@PU7%c`JV3RTE68o;vj#jlu z^l3D8>Go@nc1AIOfnLJzlGZXy3O|NEe8NMmTz0%Bz`5wlm)fl<;cz?jLj#^`3lhV` z3NKo{#tp6D8aRo}XfO&K)>ciXUgYQRs=ZG8M6KV8Tw=iENNs5;le~mm=)AJCcA$2E zcv2&jfCqjs#9wM=G0E_gdkml1U2;0yD4*&VFyv_NFS%+MW#aPd_1-%L$ihacc-{u* zqHj~58=1LVKc+rk2j_QxFmJfTD8K(;UU-91K6s>JcpjV&l}LTw!vEfKaO$%KoKyV) zot&O=_x^93n}p3ZB%i^fpeBBR+no*b-J`^fdN5}60IxbH=v%=99$z=vvqKGhaWkVo z{MtMI_8|D8zMMV30trpKTBM4dT`=25B$(gen?xPkvE2NGZ$r>BQ7_E%+mnzPjZ<3k z-r$mF5;E4HXR(gFx5ABtDhH-Xn?>yMD0L^{(j~O77Wz5u(M}|lTbq!(oJp#6L_a(yE@7^RQToD_HLEo)A%0u{UIf%>*BT}~ zH3Z0#*G7prpFg3*v;fJb8^tpFcYL{VMp^eKKF5Qz`yb4wOgD<*59S}iIr)1k{+Gbn zofwgFhDVcce{fHIE}Fq4dY9Da_29gNnkVIZ+VOM#H_q;b+IYIb9o4PQymp(#wqu#7 zHHI=b-8q}RB>7trdMNh_wz6lg!$gx4J(0a3_DASKk9A-sV%1XnAo|^EV~}K+V6zV) zw*2#pncNAN><5YM+u=8i*`L|hxkbrfD;l|kul93rzYDg|>o4M@zg)|H3b_3_Lx0#a zf5x{nhPeIhx!vVOh%Df}c>D5_y--WIiUjJ-N(uH{XV`PnfO8(d$o>n= zqe-q1>zW@^_LMVN368hXwBNS;<5zOR?XyN{)txzqowwp2 z5T8H2OvUpp`1Ig&Nx>>~sZmb7OMM=_(I^35QlGzq^XxyL(KK+5`4g*;f%CkzsW`{_ zq3dcD8VS4tC*{B&khUjtC*$F$6-j=Nt!>F;~zA|Q7WS{mDo{~OklfF&t z8^)UCQek?fiHB^9rji@-*R-cdyic_dYnc;x0+~j0$A>8)uIQC%X;Kxg2-=^sC|a^2}Jp!Sm<+blPqv zZuDBhJfM3f-P034y~oVCr>myNE@Hm5CYr7^9rX~qMe@)?3BEc>pBZM6<>&-f23qtZ z-SBKFjTS3uzHWgVae>G2?XX5ak{%rh^-D9)E&4BSbl2zUDd*p=U;oAKyc@xiwb5pM z_PA*>oHM^PYK6WIPyPvDzUuZ&J*i=cRL_C7bH7<%n8_>?_R&ut&{rQ9%dlhB}zGc;&F5!PqU9%%^qP-9JH<`m38#~IroV%!TZ?r@=_t^@THOanN)HREm zB&;Hr8~i73v|47AmXA`g?YhY*b04NYUjXN6f4*MR)g-m5q+1Zat{>9sVaJIf^iwK~s-h1A=Tg`4IGWj0_ugQUW$^r+ z^MvY!u302Mf1}Hy1$x|8dMJm3r1FNXdiABur+`UN*+cqbV*8|??5=u!K_3u-FWh`; zbN#kH5(3Hm!AGB^t2}*>b)1Ti}N-ye8LUAQ<-Vz&WD=chk2;NIo*vS|IX z!q43O_|V?}0zCQ^YWRA??a6OU@)7OIg!6H>`oxUAElpx9v?X3~p8MQS#dZTYr@fu} zTza2TmfuKyo(j%i|KuUrrW*;tsg-r({C&DDPNLw zC$t=Qe=yf0k8~G$C3mP_=4Ab@_a+Z4NX_!Nsk7q;{K?Qn&i3Yvj?No7+h~WfuFULM z#V)P>zk_AdQ#VKVk@zrtWlw$Yw2s)vVR9IL_4m{_`b6eZONTQv<$P5?L>@kw{5xv_ zT_1ngEW>z@dOI)GOFlt2M^9wv4U_(|Hv8zQVS9&Y`Yt%ACEYmx%O0|77mVTXH$=C! zcZsIXxNDLglN;EICvk3brJm16;9TxnDz-zwdH2QC=Uw33sbK2&lmh1xmel8F4gSV? zX`|`(k~Tc+O5ve>{gb`q+eoS3hIxSQRrSWlc;BfFUmhExTZzvj$noZ^n4xz(h%Pie zIGOf^&bj3Zd1R1 zC0^|Al+)pwm)){=(Z9`cbp*QN*LM(o-H4C+h|Hlfbsjo|m`i%Aydh%g9V|`fZr8Uq zH_Pl|>=#>X(brNZ^}T_9a<-;7El=#phHmHTd3z%9Bz-&nUhh)&_Vvjji3NuWT}_z3 z-zZ1_#ODRzyzxvb&JV%4!Jp5fHaKVHpOpAK|M%Z>$Itq&vzLc|E?5G-uBDq^_C+LT z58s$f4Rm!Bj>tbyCc6jfPwTR?em8zEqnGLJPgx`*T9FLK{rXUP&2EDCd)d2s9eS*L z!_d^#baI@+C+8k~#jp`s9Ts}uE(MumZCub%`X0V&{Ox7hmT{b=Z##up-Jx$)$1=Fq zpoj2#HR?G2nS{Sw4)*%^)pLZ>i@)V*mUP|fIKG%7WF7jJ((|e~1{lL7D?Ij(8vd?IHG!n%Kpp2vT^M*J!*1@Tv`TCTl#>0teaUph+~z+ zqW^e}uR}CBQkAND$79S)>-gJj-(vTn*Vn?GepS=kwxkRuyn;>guAe0ICO7mxpNexP zH)(`oe#-G+#;#X#`fY(avH~K({migR6&!4(F@>`-MVlVq^ zTIO|R9K_5ZT+@w!GLBV^qosc{W=8JTaJ~J@6xStId?_qqsd<{n>s_X&}JYs8j$4t+2ED=#QwA)yLpSentY>Y|JCtn!P!oIl!9$ra321r z7f^KS-#A}CaL&GAN2C-Z=UH>Mu>Rm4J|{v<&fG&kNZoDVo_>)jR-aG)oN+OE(e0gj zl{@&&a+iC1UD11bMT;>n@7>n#dLW)%6?&kpotVwhK#!)s#(ptd5l0s^jhE;Xsq|GH zZkzU*M=GD+Y@;iTN+*NN)Znb4U z9Bio*cH?(=qjcnpH^11PXD3%LW|FX~YZ9(eBRb&yUNXI93pGhTIPnzBqwD;QbGhR8 z?WMLw%9;XbmX?&(7u<@Jr*It&m-g4q;C#F&pyO+@4u_kS_v@6G+i149~NulKD ziF0djlnU_e_TJu8GKqw+&9bFx?LS^10rM%ea2h|TR58Z z442lo&C|mk>?>KCzJ_nqKkmH>yIaluq&aK1H?bXutr*AB>lURNIg+HwgPfE6!ShUC$8G#KE>XYa*+0x-K$~};SpBKkILDoKe2yK=^0Nc` zCcatZUJSKj>q(AlzUXsKnPqzW@s3R7Fu8u??Qm#>qX}`Qa-k5pcB+pfeQ1Q_r6->3 z?BhsgzvO)<_II?X>S%T{R4TPHi!D{4NuO~PImz1`we)#$^!(8) z-uxP2_a`U$Xf(;FrV+Mf#OxV0s4+ti#%~NaN##H1c`d#W3*iA$&UR{D$lcogu041y za}#-aPgdvBhtgXaOAX%Oc~gBbo@u)~p^a%2q(5PfdoH|L*^SHeG-zFlQzs5t*hLxrAW+EJYxC*Wpxa?h1H;^TPGl)3ehW-0Wwp<_iw_PLKmOBPw( zaiZTev7#+FS3j?#jWtxx?IO3F@KnEpt|6HC*5u4QJ^f2K!;C>PU{GPbqlLZkb*XIv zN89T~(r@i)k{`K7+8Tm$P4pa}0v5%e0Ow%Na|*I|_V`Jw-~SWmzH5@~^ZDEZ!P#{D zhrQ}ic6Nhvkb6nJ_8NR_zTYoU7!$0oq#mifhPd%&zFsnYw0ylr?$K$N zo=9Hd4WGH7eUfflhqp#!c>8;g^_eT!>tSS8CEUp|<0yCHc4lA)XL6)H5-nNydyK|h zj&YO8NyvLEJTB~bYKoSpzRWruDCG#q6D^OX(|;LV!O@d^vgKjk>+6*r%|?^|d?2s$ zsp2@B3};@(EKa2=ImW@y-0(pocdm?MW${Qk(Z?*E!izZE+0pDd2(5x!4u@NZX)>vu zSv-Tk>HEV%d~B;nf_?-CbiVFuRzlUk5f2gw4UZY-WpfAFD6;^ws_Okg3~KKVX58*f34bZ zKDCDL(4U8s<4t8|^Yu}^9CzYZ>b1(ZuIOiGWb)OpV{|%{)Dr z^ZWsv8!h+IOVab4nw>h!<(mCDHSsKOG&2iJ+7HIShts#J?ODubshg66&=cHNF}`2~ zaT=U2&l*#&-QmA+UQ=$nz2u5ioMVzU*aP)Q-a+aSb;4e7KK?1--019QyAQh7lHmL^ zV;;Q)@2q(hGvMv2>DS4JTP5S8(!odnNX%@{ySAeGFg^cNX1d9%r*}8&VWXmDEwy>b ztT;UjG5qd2Jbb<_(uarQ-Fgq*yD_+&XH8J^;^$X7no?ml&jXLlctXZIv^qpq`c4ul&@! z0Ug)alNWGbk?TI(|J_!K+Isi^lhhdWA)x^Mw9Vjr^TCCE4Z(RGI5#Y^pe zcC~%pvQ(Ta`9#_?qqV33&hb&R?Db|w$$e_@a>gz8t!Q8l!aerRdd}VsZTYE{XxF{p z*>_$b*M%$ics-N8?+H3m^b#4i6xK`j=RDK5J)l?B2Xa?#9#1V`ZK&4=bC1<%FPuB- zbI7X;-@<1mq@Qjk&UeVkd}XDv`goq3H6oX;5TG~RXpvoh@TCpR`f{{+@#{Hz4Z`#T zP8La%Ob+}iOuvktVXUiJ62e0DjSJY(R?#d?mj>yB&^8}2ke}?Hq_<~p`x?&q*9rsm zZ}nB!_n}GAiuw?t;Z}iY|^WJqCYX1b6wv?PBZuJ(M znrV{WgQ#IHtx1>*&V?$a#^E90ybGKk-n>}v;Mu=%ewlu;y$W@15b=3&wI24Hd+^8w z=kmVo?1|PWae#AA)z7~30eVqzws;2F%b3{L2F}%I$Jrx}pq0JMbMaO71@If0GN2c& zzRy0QO^OzmyJXuby9NF8duo8GK6mYj_-@55CsvGnZ}(_Pj(rt{(O!P$`#H(Wl|`+oUvoXb1SwLhY^HG}hy&QYAzK~?Qb`FhtS@J`FT?DwjmEl11ra$FO8%ynjpmFVQw$`Mf$(n$vp<`>Sv#dPWa?e=BJAGw+|~4CAHz84AuJBE47cr&ytyl z3f=5ohO#@j6ndwsZS4&vhfBT+>{i>@z<%vXm<%mVelom*eN@X(S;EhJddk&aW-j$2 zoQ%&4o2@$Mxd8RojXOTJa>U4hR?Pgy&PwPs$0Xb77hF>V;@g7rWpMrhL9h*+kAriT z))_o&-uxTqir;416PRTS1Lqyi+3Zc3np~^9zF?0c(40hWVWSIhkBd9d?@_Vy8f-aHkFH(R&|)U`x)=GlsMoug1mZ0 zdP8D~Xc@VXySz#nLqWb?`#k!wB~1)Y`|;~@PT4Kk&tTm{%!hYMsN-j7PA{@MywBE; z(+ob(*|9Z~IjO5Lh5~3y4(s$0H_bG(hRZEXtx;#eY{R2UOl)Og#-!9NgLjh%89=Q) zI(wX9mT$N;FT#%AHj##}XTqcz_vSmNDTXXwp`y(q{=95ycuYQi8Gdi)`|O4dpV2;Z zo*x}w@8!as|D-juITby;s=zUS9Y)W!`#+w+;9Q`xNlyJZUGF?Np9klwEwgzJzyCMR zT`SD8Z(%kw0-Vc?{$jgS(v9%f0WQooJO-8~Z-R4-&uA&9e;Qoaay< zbl^Q-dyN6-$HU<@dS&vO4$dvX`S+8wo^QeV8aSW(ox^k0)4y@9aB8mI&fQ@F=Vj+# z+cu&pN;%K_f9JF{3_#-z&aVSZUWfS`W579E!x4sB-PrdE&UbblF!Uz(C9Y(=i~en4X>GMDd{IsOWV$!eroXj_aR@z*3XuGk?-_d--cMV zO%{vvqPMuP(gJO?(IOt@>EVu9rL}iw&o8z4n@O9sQtQ!AQZo+!xl=3AmOGk!%)R4Y zEs|K5?>fBP%)Q#4NBFwKjU*P@r5&b6Q^VOT172^|EP2CaDR*T$T$#?z4wD!cvrKL@ zTN{vzdoYX{Sf@$aW3;O$u9J(}t7>h?>raqxwDdk@n993b6`aQpD`EIW+!#Cp?k;m( zugT!t7o10z%jTJt`sEHde;Aa*^VRFWaju?gsr>=-R&n4wAXhs3_6@1=`TL9pwhL3J zyTSQFJ%i^GxV!P-obaWJVITK?DRAxgB3%19pxvuzYH;MVhxqFHgkJPsHL!(a3 z($_viGk>7}-Zfa9Yc13kQ&W!*hUXu>Tw78ZKM?xndh#mm%m2sLSwL0Qe(PSuMp3Z? zySoEe@5K7-?(XhZVk5BG0T#B{tr*w=d#|!iA=quf3XN zkmzs^_C5auYReSbv19sFFry5Tnuys?-39GyR(-{yHC zcz{rMJ1hEDAkJNg^LEd)J|&6sBjUU$G?P!sPydedL$%RakT}mJ&S85CIG>_#DaCny zba8`Y>x4gX9$l)E<0W$weTj3xr7;Ot$eABjfIT8p`Q8gh%R!tcHhbjjW@QHrarUn7 z>-Q#cDl>WTj8}vGQk~~a4&ZzoTIyGZuh-1RL%2(V-;M-)ijHz-zFzk8>%q_Yf)~fn zSAGSXOqCf$(0F`u(^g$4C%2=1spO&E7z&0DrZ%bTr5!*YvJ&j^dTmba!$>r)C+R14 z&aG8hVV4=tIG-1DYUTIZB#@ZTWHxH(Rjbr}Pi)U-)Sh**$fws~a_4BwvpOKnt=OiD$@eAQE;pFqwUEM4X>4&E`Bi7T*}o^X9?7 z9E%)q{>1s|kav#222XLpT%6~?z~Qq^j)L zo%QD0qzo}n*ig+mVwaWOWIVf@Wt~xe7I_aJSiGXQ^TZjmj2cQW{$5Jwo`&Ige&fqp z%IQefj}%D59D2ttj*&CzH8o&I{F}`QF*E4{at}7}SsZ_zdhpnPaGgJKzDk^n>q)g2 zr2IE8IymPU=YG6RmJ?@>jSUYvuC>z&SInKB@yRTrzSZUfup(+=Up=+owH@C zxQKKA88Ob(yzi%p^PnqRoN6pFB+ll+hn(*&Fq2X#R8o20aQ55DpYMmK=(e}c^;_^> zraw1lySqM|Ss~LwG#NuZ^~TkvN-THJp-g%7mU-FVP5+9i& zE{~icirbm9~C0y28Brcll=)>;WtVX=h8EF?yE+e9mM%#trN8$r2BWAb9GCvr+E}C zS1*Q0Z1v;L?dD){U(K_*c;30Tze)P@cZZjH>&y^kl1wc^B=f;cx{TnytsEkUmzL1a zXUCfyzT0zBUA;vQcmOm!zq0n$=km_QqAf{THB`SBMV_EvU%&oreH6WmlxadF_|jT^ zCHL5>{Aek@CFo1g?|*F^B4>_X(67T^dXNWKj!D#4e`dDw1zP!}l*Y-p2&r2QTvRTr z(RsN=_DsS*yni7h$z+vvC*XM|RWfW1ZPKP3o;J(t7)Q(4CGQ;a!1vZhfs^dSOhsK2 z+{0*>^#18WxN}U>C1omS^ET*|1_U$9v$S@`VS&=Hz@OgM|MH@#A7s*3 z@ZU{WLu6a&C(icG(MoL!k;ug<^sc@p+01i_UY$pG^e{;*{7JuQwe-yOL*S3$0T*`F zJJFXncz-J94Au8*V30B)k~`Bpy~=Gk0iMOV-JA64%|oRix$J3)!}>NCJX1UHeaKz? zH0QML1Y-E;yY6u`OxACqzVgXr6rIH!c1nJh)7$W@k7k4SYu&_(M%kxkIWZnCcWqr` zATi%=z`b;!pVEuE1FRc3b+~aei&Zv+kXIjs8HG<<#r_6-c7BEt+}|ek=>JBWmKe33 z*_b;7lV4bGG(JGjYaF_S+*^$m+?B`nv6FiI7Ne4~NZdB+mZS~Fku_$SPXDD>s#QkD zTH(@y_hoz2IffPeX8S7mlHF)&JY0-kAP@By|8wUHb@{iyiS{A#YGS-D+<}Gr!ENbR^zE_eg~o-jf9<2b92~I@Y!rJWgV8?$FN*^q;$AVo z@rL=+G;Z9*Cn^|eGn!=t+O6M*>l!-_GQ-*n5Af8TjDH42$V)KR#d{5R>$Igtu{JiDlsQbAx7ci4U?0aP&TaKcPNV!JyX2#m zIe6}jF?f|-95LZiH0?d(epxhW>`ZsHer5bfVUyQm%xH{08$}jc#HSzL5S_jl6~CAz zKA%~#?)_n8olD($6|8vqx)FXA&s1uqgDDVv0IpWYvI)Y#Y0jvpKM;QMPvSfX8Wr42{pm}qRz z!91Ofo%OxkT!##DNLI5%XY+I&=FE3nV3uQryj`i@!G|#G)!etF>*{EW^!&&kK=Yi*_Rs4m?gYYjQsF+lX35sRVKqz zJ?`f)=Abv&17^5z|CF)L*Dghi;(c`Wwz2(!U7S4QCiUJJPg+MxG5C=39w}X=;hlU2 z<0+BJ)Ab~Cq)d1WU!Bd{Rj{pHz6>|Zrn^;Ku4Oj4fwr<_^+v9_1FYiNFhYtnYvP*T zD?$c;Vn1)UOs><7(6v(6C&#(RvE&&4tz+!y>#g_M9W3%VLuzb)j_r{OhNp9)uX>2dd zj3&=@?9QS_BRJ!_KhV+E@-gPp=kJ~qFZ6V6j8-r4+$Z;5C@|Fc%o!fifmzY*VaA$H z5zHwwQyo3icnLNby^BBdY^l*iw@8Y2XwTfX80TkL;mMQrz)r)nF&fCp?EbiL+Gz5W z{U*ogoxQqa9ACKF~jw50&mbzjZHD8%4>Br>=!a;O%_I4=`!q7wV%_RgK^9 z4Glfvnz}YMPAv?_w*xPxU;T_Fjm`439=_-|LySs~@E#aQz5jTcaXKMFcF(4FGjp*~ z+-#AY2hqaK*=SrSYL%Pc;RhNf7=?M4x6}mdjy`Eriv?p4=kPl>jp_~9lgnM3w?dLp z{R6&I8L4Zg{4#v-UcS$Jb!BckSI@U-Cw7M6%jf0#k_JCdPv-Pp1zc~#B6%;uMS4_l z#q77kb%aamVGUjD;7P7`WyZW-UzZK7!l~0{<{E~%f-_pA&mJ@VvLde4OYlRb-cOEm zwYY!BdEMi}`sVA*BapiQkp+o|)e+zJuv>&!-r$K1EzkDk3s8i_mblVg_Ol-l3e*M?qnKD1=#IvXoF z!@I#|0k_8))mM^-TeI`aVl&*C#eOsvO-T0n#`WA5xw8cQ>OX6Z?+?)YgV~zI?lNA4 zS|!u(DdMx{uyL6){0p9{WYT40*KZp;*5Cl^J~2+svCGVD^d&oeHd6S|>-@m{g;y%q zQu=Xwe9`G;&*U0YEJ|L$X*8Oi(^a!_lvvR$*(Viob*JC)gC4=~`;}d5?%Mxnzs=Ri zrmm%p>~cSqS%xR}cRee~oc=&&5AqLpJ<@iog$Fn{dw zDMl!{ZEhEMgW@xc?cmj8fjrAJOO0A1Es_yj;XQe?(cH(1*B$rnYlq=R?L3Iup~jt4 z#*umGcq{OXpWiaJHlz>OmzwC%OXK||yF@G^SJ(Jyc#epa_m|Nun$x&0qGywAV4aVi zu9|h>d)uNJ)^oY4H^2jmdS`ydqOKcgDc8aKo%mVVb(p;@$9=-3>E))b620tFh~DAW zh5cO7HEi+_-NG|{kSk|Civ&Gl_W3~$S2^;==MI0)bE`%Fj`Q=+Mf3yTgXQ{LYLk&o z^m`k@7*9fE(ng!UfEwh>L*}-cZqqMwFU9b6$}G3_fEs*0Vq0QMYNO|Qc%xrn=Q_i$D#y-JQ2b|Wh&Tylz#mxLEJ20M@4L5x6CxY2>E}U%~ zPl}KwA@G5bD~*-pVFz*E@L`*g!cH&mIR2%T_8T5W@XY_f`QLxesCdmLZwt}$^0{Yx zWX@<#OLhRM*T#`lk?a6R&k*;^n2yJC==M;FpOwb-JtevhIQ+~0o-T7!=1Ixh{YvI^ zHK`9D)t>t!wvcPUx=4A;xjg@=g6kugWEQpgf#^oAX+!ayXo{BdeNR_ze`T9_S0X@2-Ahck1zUh95Q7iqyp4}e150Fn995A}Dn_%QKX5K2CH;S{bynJSKWk>HCrQ+-oO|IS%n`Epi z9x0c4(Mvt^-Dp66`5$W0YHd=veldUgWfxx;@Ni`ywl?~|Ez^6s7FCUsmRZsCZpi0~ zn+vzo7*4x(Y1a|-*d^el*Z))3Wgcl4^$L%yJe^#{>)WJ$wQvbN*WPt0gGIvOvCC%s zVyL?KNpJd7rz8gbJI=T371XO0G|9=&?4mWA>nGnci$T8FFnX$*npu z+;FcIefALR5jbY*wF#Tkv-cd%(gR<@VMUBfOGISwGiL5Vdsv+P7cm`-s9|6q zG_PGBj5aQMqTwV5Wp}e0i?6`__Cb@-e6DdY%p%i*sHx|!GTa*D_p*@rqk`Lw^xQkQ z!HyZSxr}a$$ivsrK6#xn8u{4e=~r?~^iAVFv-#!0lpfyCj8wjnvO& zZF)3=YP) zI7ijVr{AhbP0jf{p0cTaA6?#iV!q;Aq<({U`VHSNm9$fTc!7Qbm}5!Qef>A@VurMM zn-^!Yq%ZSTnW?eI7BX^zE2`yX=E7XtDEk(@TPeH_hO{*v#+s#WE%Lyl;YN?<5%?cW zk?uCLQJMR0Tu(Hab!His!xrf@fn0rgnIREY37WyZ8NJzP)`)v&100Sm-grsf5pbBg zX6R9)dr$E2eYC`@E*dY$r44>fky;6NjHivjW_jt|oO^DJBhHmM=iN)aH#U91JEaX8 z#XLWay!r9Kr(bz)s=MpauSmHuEmS59@NkV77%8bZ^9wuYa;;={*duzf>w8yl6&!>A z4>6C9@OMr5$0pV>aH@-Ix@tU$fG@=#U{!)Kn?Ct4?>})4>;3OI7hjS?KPo1f_%lS# zeyp#*ugRI^>&w3^`T}^G1Y$dHN1W~kZf%w-*}L_I{`ndl5qY>LyMsGXW5saaUGJ68 z(0QMBQFja(RMjY5$}B@mqm?Sv%&7ImETNp|a_##YGi(uZry*z3GsH-0kH1!D>YR~N z4SOo9gbjx$%(>90>a^lB$$rmMYm7lbHug5-j~cVhxb)Q~PvfS@N*||@mAy!nkHTAJ zJ!YgOC)@5YBNlt!Sk)FS_eXZ@R=jCcg-g!_pLOKk17qSdxZlFeh?Pt<+NFz<*0u19 z2z+lGcp51$$?Z?}r*QRYABj&su|4DAD($jM1@8DWy$ib{C)(vAeM8T#m0c5g?oV>y zS-QTMYtXR>DMNgRL@YKI?q){g-k;iJT!(+hxnE^Z{X>gn&VwFnOJBWYM`}PYL(4`} z^fsKS9q#CkPOa6Kk_%UJhL24>tM}yHnvn^to9>%F6^`N|_vO|fUPi`#+{51JIs!@? z>AIWcBq!*98N|k2Lzsw8&m?opo=xQ520(1#(D6zZu5D zx9~q;ytDB!M#5&B9Ew1j?YqXvQOqvh3z$U;iZi}YgWQT`uIDfb&S zd!j2igQg|raYJ#Q6Z!0$s+~1@+>4~o!n62x*%G%iy2J7i#d@ZShGS;pO_uGhG;sF2b#lD`iugTyn76adc+ag=NerO=n+5yC7qG zF#GzbE0XiZ)TaNAbKdKz^nTq-_Lzx*-MNHf_gQSH#@lnXNs6}3q|VqUo6R3p=En{*n* z9o&7cai^JG2AJUJN-s4+opv#%a-Q?7HO^Fyl*cj5wH@1J>=@4M*m~ZJPCJYsddjn? zC8MkEHMZQr18P6}WmY(i%H)ueJPVH+2aUw@k<$Mr_wV=9Mp8p~?AOU>>zesRtL!@0J|rz5f4>^XX0( zoX5`vOC{o*?SPv;VZTW#rzGFLD6hXN&-o(eDJ%8T)qMI?e0|_kq<&;9_dH+UE4fbJ zL4BQ$d~zY^kRD;sXXE?T_dn36n-M;anDa9S{?20T%O4>N`M1gsC~R!} zir$;|DB^2nBb&=2PHJ=2udeYjihZKoxi!ADF-{Jp{^BkkyrPfME*pFrn8&Ti7~|45 zyKJO}?c95cakWpRw0r*-jn;H6oX?4q#`;*hWS$PUf9jgC zN!g@b06NA>dyI1(A|$U3ja?cqcXgIUg0nhn`$9tx{H9w=-{=9=-0yDta)zk^NwdZkamhH#3E?9}{jgZJ-{F zPOVH9zQ1m!egupeNZw9Ad9_}ulUV}EE!&Ro)qAFhkdd7Kvl~zAYp#Loax*t~@qs=m z#v-;n=p-(G*7pvgzUDstH8qVXP<4h>#ye*W=m^^Bw2=q={rT`1nv$Q8}3 zbPoC^Q#%+D^k|l3gX>-~(AZu8?9FFcJu=+*u-q;$`RoraL>Zf_+Qfr%@^SA_<6z?m zS^a^z+K>ch_n5=}^e4{w{r(;2Ii`-zSBHXS3TJOn%0^BbbxHwZd%E>-XJvlhg2dB( z<4otqKz_C-`K`_tXZiMU>ijEz0sPG_R{q+!G-`E5fDb?x4HI!K;(Q3tt?pZ)kugaBbfG zo5A|0LewT299@7-&v3*h3+j-Uen;!`@vM7apMHP#MS2)9F~~n7d#}>{(EPk_OntR- zqaMm0wE0cRZ!5OzEhpg_-i+Vv%|5;LDllGiH1nnQ>+h}j^YitpDyQ`E$I%P5fGe1N zOV5&r{bDWg9d7W(pUOB;%qBtqfah!6(T7xvkQSBkB#*A78>PYQ{_a64wSh9xXFT6whvAVn&A#HAjB_Zl)P=3A2Wy|Kd!RNZUB! zdjodZ@(kYfT^YX`PU8&m?DlF~?Zi+#qPY8N^n2!$Za}z(Pjra3s z`u;j%mXCtZ|Lc9e^XF1)6Q7{a2fpDgEV7@^6_qQs->4#1dD{`~`u^O0+rC?63D~c3 zOj$qMa+~BI$eApm{Q5Sx%XxmMB1tX%8veG+4erexfxY~qLYcLhOq`F7@(baqKkSp23hjFPox&Q+P|erdv)8@2K|3oP)DagS$Q>o+D>qzs)o zMZ{hAD>>UP*161@Z8+}d%w&^9?uA#q*7?=W5+RfMea@h>`jjVBLW}V3vyZ-V#ec_n zYEoK9L3q(q)O3x0O!u2Khdvi)Si0rVPI3ok=iCN)}=-Mgevdu0-!HuQNX=Utl z^a*@_m;HvCe$_1g+`lKXmse-qnE~aqC-0-5U*O+ycFR!5FaPFXNg}3$iYjfh%_LpP z59LQL)y8uddFJB%8hcwi*owYML2%u9Ph~9*_9&CQ+oGb{n*aw~oqO+J-(dXK%WqeETSiEQiM-c44y*VSXez*O zLt0%|d2U$5m-CakLy}60vr4|zXoGvF5RY~?d9a<&UMhpwGTJ541!mirja>nD$$ADX zu{^(IYle5w4Rin-ic9rN=rbSFm)}=j(&3@!{~G*Mp@#IHiU$kvHN{d6Om&^lHL8Ieq~BLAk+amktu$C+m&QNfqo($fs}=E+BvzZ=4wn%I+Wvg# zRC5K$H$P%atagkHmzwA^t<||#p4#PZ2s^UDZ1b+pk~|k9vCRi$@=UKEptSua6k|N{^_c=LLHgHf<0eW_pW~w7`ea#u(T{lb(1mpMN zp1RX!nVLBx*`I+}1v^#Wl4uM&5vx77RO3(R2ZnNQ7W}E^!;3ByD2$) z^9r$FHv*qJ?x6NnB>fh=0Uf;Wjq8iTb9L_p-l@GEqh?yq|-*bcIFQp^eE2zV~Z6Lylyj9ua2JN-mJvXnrbCYfospT+)_BlS$m#JXnv8 zo1MbrLS^%+ZD^XKWFfpqvG<6Nn8xb~JlY>N!!hpBJ0 z-gw$XfOD2LsHV2|n7;TF#-z&gF8l6P$Aw zdS*R0g0Jc8arR=H@0Q?ck!CmwmKT`K?PK1ZG$hP(LK{sxY8So4NyxZNL zq?2NNR%d&-NA}TY#b4#XwZG&1`27m4Jf1egJm4Zad8i*9O!AnVJj}a=+P{LncM169 zDUr&~8Q)o*e7ibM9pX;N!x>ID_=>s@2U&vLd+_`()rjBg)kyBmLD?l;e3;DQ9-mpi zjF`GGXSoc%?}fiSN@JGn@nE6Rout@aa`k1j2yvt28kqkcv7H)cmJmKm=PdAM!=j}K z9O-6i;SkTIa%nw2t}XBj{T3@vCxG#Wp`E_9M^q)dtR|joh8~iw$M||3oPVeDvK5|x z-9hfBskfPjp&q{tP6~Y?eY&#a_%l7kJD+9SpeRWPFKT`3?%xFLy$hXcpDZ5!jW*aN z67I%@I!iT z+*!XijF3QT^S&?f`8JIGtWt#d zM;3o41(%s+7I)I-GOH!!H+JE^V5fHKyDIuBy%FxUZez=?07e= z%|t#dRYqk(gA_xpadhJZm1`{X;}yug%U7!sN$gA}SFEpbPVE36g?9iyzx=5hRVIgl zW9!__DOou?mn`JxGZiH$5DoGwVtc)@JZ2VZ*nVcRlKM$6?!<5R!76jOckv^Sbmx3l zo*_?D(@!ZGD(gxw#qWW=U7Xw8TQ`fo4qQzxJ>u(>`pvD9eF^j9>a-N}#v|fTsLbwu zTS{NHvCjnlr$v$kjixrIKNWlRr(7r&DLXln?;fS`zs%fCjUM;{RU&SMqQnQRf4^f+ z|C{NfB+p{B4x94%*YP4hb4C+wx&1rPe=KAo&dW3S7vi~p_Cj|u{DEv_Cd-{%xy7Bm z)>YvD_>3=Fu26%k;s4AmRv`Q6JBI|x)dzp;k^1(3tr>%Y<$x!-B|{ArRt{fN?!K0% z!c@a9Xd|nD_p)wLma}-#H<%*dpWak~lG*dcdDASN&=gIbwN9pQ zM;k*w0d{p{6vW9as)}Tf{+g+v| zqqqM6zWQ3AOdgAWLweq8d<%Me;xEekFyYG*X|UBSsk`G@dU}iG<4(L!&nB^>OJ4hf zrO62%SuV)0B#Sgo0^bgMB&qjVC0#+zSoY5{3oq_+t(nidm&(6`Cv)84^g$MT`lmW! z$Ga7NK4UKbdo{snx6qkY^7emJ2d{uP=vsok{Xa~y%iBA6b)L=c|KgZcdJxAXuQdK; zmPfGvFnQ0*JxLpg&&LF2>hmv_QVrR?vw(X4Tqa5L0}s*$^g((y(oz?v4|Nw$NcPdU z-8)H=WBPyN4YxTS>NWlD&*YZwrhnArM<$t76kPEuN*y6*1c2WLyxOZS@}9pXCkJeP zrZR@J0~5@aXJ{tbRF++rHt3|$h z121}t98%+yw4j$%^dX#h;fw64wM&iH%*vg=EFJ1mC%)pmExs!6s@tVqBJqj4F1LHx z+-lu>PZF}zXW`GMTz^iMu;aMyN@|nB+htK^i*zXl|M}7;y{3mt z9^P3myp-F4uUnwKoY-<2JIc|(e*6>9Qz`HYyA>q;*hl|++<3X_ldR4C?>(4jb_zB7 zYq0zx&Yq)7t6Of&EEDI2k%QF$^2B-Koc;I$CDaYpR^V8FLmk-wwxaH6xbvxsAwP7o zlUv@UlXFGzy2i-56aKxfwPU1lHM_(eM33=(xzsY-*+s+G zZ&piLya*C+!rQ-GBNwXJ<>=K=d6svr%qV0R?E*hD$69fc6K3)C-k0m86g}28+?Br` zZj=?>m;r~Q=~sG{>_^8~Y+I=8J7|+Bkrv5S0c~Qheoy53}>$RcbuJ)q}kG%*gH<`Ki5-T^Jb2gIQvB?^}Gu; zy$>8h#tAClIr=KC$-{3KsLp4|58QpdLiVaOR(x0^c^3v;S7n%`ZWT-I@BdvzwqXCm zX>xM<%rc|+AIz36rjQ)^Lf?vR7-o zgZfDOEb#4X&_rGuF27rWjmaUqMo##j*!DWkZm$yoVvMuPiIdEgybO>u1=&GE4qsm- zKxXAcyJ&#xMo*G}3V8nOa0Iph$piMY@ppfxGRgZ+k&=PuvZvTYyaDWT$H8vIQZ1wo zzJ)J21LLk{m3~K)_>qzf$0Q~mximE7@!5oE5GBis)Z3q49p4tB!=j-x! zoXtCKYG=WF8Hsb5wlB4jaC&aV&=@z)rCNf8lXnY^J}hcTBAf(qKA3BmI`;N5@8XCATqDhj8|moCV`mzOGXBjF7nZfASO}d@3iZ6M?ePjU{I-Qxy2x_#`rDT6qyh>Jpd!>?W=s|yf7aE-| z)x}EBt~YV3wydVS;rq!kbiAw~9n#w++a7!)-&B{N%yv1*`HVhLRaTZn4;IJwb5)c6 z3B;M__1jckPJ;b5@Ql7(t0HNh^Slm(it#yzwCDXA+6=6ypI7_8GLJX~&M-rOsyTr7 z58Xh$KCiUHC-F9^W|A8L?wU7o4zK#(IKLb7cbpr!PHBS*<4aGRBd)r%Rjrw^AkI$) zJ=0>ss3(Z?`D&R}rPS1{ZMgs9%B#ZQ`XW4o?}J;Yl~>UNPUU{wKT4ga4jr%=?kiQK zy1c_IQ_jQt*ZrVL3Woq@Q+pc`BQ(DKd;vQv`W=}%!c>6 zr&8~<$$B$5?PZcmORuT|b=^w+hq(jOS%W2)ab&TRo;sN?D(j#1O4-M_Vk_lq(0VQkNq>1#h&>Qt1xJ0`LFHyFmNe16v z?|1YSoJRlu#`*1zzvH}NwM%PT-Xyt+bGNFCw6W;N8xiNM{u{NE+?ZeconZ<)fX%{4rV;@CqyuBIAu&n)JPQ)Elq7Ao7p z2>J0DZaG_jRbj40F7vbA#RRGu1m-#_BPcL+92l{iztc+Ga@s;{SoFA=TsH%6d z%km}kqem@O>)PT!5F0A3>aS4I#NUIM$DCZD_7=0tFJikb$8vS<61>MM@MYLiRpC7| zu*=~eRxeV8;V6Q5UYqSPDv3T+gH6mtcZ*SG6)6+}U}qrE$?H6WjLq0eRc?62*-fZl$JNdgKq@%xd8*YTqN#(C%WzvEnH z*&c0XEqW-#dF8>0+WiprG!f_6B_p-RYseeK`D2MNtwJ^S9<)V6xMY^rtts{BX!wm$ z?1JUW)3Hru9oyl%$6Pm7|LTD;# zWm3%+TP0TmK1-S0sta|&%YnT6V+*SWPi*Wegdb~ATFvTdmkh+&qf>b`7Hk~N`D`Cq zQ5CMt{2DRuT&JQ6bfbs0mU;Y(<-*rL#QC}H(L*~r zgR_4hz47AXe*4MK&FDWh*m~MG{R?IvF8nvnwd(%&>txQZ!mDjsp?dro;#@Z2AMN!V zG|$9&;%sm2*)Hxe;_RJ}RWmha4{bZR$Fo_ri2lr+5$7fzxwUK>JE5Ydi1}7wtzsdw z?AcClad&y`3w3nLYss~VkLI4kBDH>^``X$_>;Djc{-R(uTL&#fw@UFwXg>S&)v7Z; zvS$cf(5>Ox*$>3rimyxk30j}-#E>|bY&luGQ`#)dp2! zZ`wh$rbl{eHHdTkMQ~=ApEi*=zoYKkKEPe`8ex`~PHNltbN$}T##_scp179UZwhhl zdf6mZdVcds3EoJV#w0=i*+)N!d8+>#*SVdG(^57^TTYyl>J-zKtPhb*#QAFULBDH< z=u`R8)0sBjuYY&u(unhpm~4JVaF~1>!~GaI%lAcR_W8_$qdQsG=Zcuwt;YSByGX*@ zRuOo_(ceiC$NZN?%BH~2Khe#x-rXvPOR$%4PASK(o7{s<`CNILIy!@0ON~Ic+;)&7 z>ZeWCM$)fuH^uQ9?)NR{b7xPR;|SQJ8gaf^VY;LBJM`q7?QSKb9UD2r2Uo%ieTa6L zN86+)ajqXY%kg3@-zTk~?{P^3VN_gl=Xzyc=D_#qW-ok<1p{p2AN0JkFUN zEYjT_j{QUx=iP!<_K(9=Zf)Z1{sAp$OL+AkJ)IM$+N8mlQ1Puh+Btwc;6EMwbl>C* zY6x!z-Z+yO=KT55Cb>DotzMX&Tgl;rc=yMiGdmN(Ct<6>cum5co-NQXk%#L(4|Qg? zfrI&a#s!nJ&QY6G=gfQf1vz)4&Ebj8=I|T#hvc-kEuF15 zS>=Kao+_P}GnTxOk{lS9xZYu!3QmES=u;@aBm4yOuZ7S;)U1(k5k8}4FO!)5vyVQ{ z`@iF?*WaTZKwDmgIDa_lsoe#uBogN$MVt6dxeHHBoR2Nek#Lk}n~8efJhqQx+Ise3 zj;A(^Jm{D-HC*P-#eX&^t@GUkv%K3&&A+>hGhbAMyyfrLF5Ap`huN7kX+q`Lu%XT# zweWzdz~^dicD_hwlg{nf7g;{qsTSHK8+ZBIK8u`+IP097MrBty>(;PKb8tf23u~Qi zZrEfi_uYn7>zxm_*d#q?veMIa&e%aVi6;KztZSU}%knIUdGo=moD=x|e*Uia`(@6G zn{2X>T(PmpQm21!Jk=dw%N|Rd+qwHbaE9mZjB!o|Z=9iKZ1{GHv)g>DWR7MBeWz;9 zYpu*uiO*6$%Q;8ZFtB_%^b#M$;c$h>b2##|^Lix&-!+M+on0*d*+<`@;NSel(YE`w zWdqn7LYy<~^47+qF-cz>&SF=%pC6dHpvGR08Q*=H&g4EP&RfQ1b2LEfm76;Ba;;%`(DPc7$+>t{guH;$h}&4!dDm_ca|Z4sYeVN^IJXy7sB_x% zcE;zi$-vH`^8Efprw{e@v>?vg0kiWFd7~(tr(5SJr>&@6dJ>=DVbh&cb(?(I%6ofv zhV$q&o2=ZOkpI*#{6mFVu{-#MXY%z)DKl|v5m-rDLnmC`%5#ZO8+}5!p`m2X;e5;*emU<%fV8C3TC%c%{g;!}k z&XTZg6}%Al#oJS!j!OF?#N!F`;F;Pw?k*+Ho_MqLA;;2(a@B-K>ap6<0W9~k2X)+j zha<;&n>aWt(dwK-eIXC<@2#kN*Wn^3UnjQZ-amD8S!I*w)FAyECOP8Zj*7*DZ)d!6 zG%941{(S#Ml_W=<7glKxuKs-@(J_&;J$fIwqV_Y#OZoyqF7B{GPaQw%&{w5quhHYF zBa0^*Ncs~4em!uUdWSDc8a!>XIvhRe19l|m_fuxajr?Zjy69#5csmyMrFO4R&(6Fg z;XQh#OW?DOZ$8IAy-J=wPY?S)`{>(_{X5Q&T0PX-jWdZxoVVJ?YSCzF>JjHGEvjqN zf1~pv&QFHq*V1uDei7$glf1N^H`$>yiP}6%7OnkJd}?Fx-?*1m>%QA8UM@6aUvg+4 z@HuQlU(Yf(pZ1AazhhqD!kL9NuaWp>`;i+LmDHM7foB6VcbQgBvu(7=ZaejF!HQbZ zw>Ejj`@Z*VMXmQQa>ZWW@tWne;dbIitn$n$twps&AA6AV+@_dz=r=zTY<9O}0Zpf_ ztj*VT>gUmhqn%!N1kNiwo7RI`{?i$9U!^RXMlOnejMk@&r60BS_4n_REp*I>)bk2O10vBUp?G6&jK`GOaAcr$1a-0 z_k&4t{AVBi#YKO|d2Rf6twI1^yTti>*`-=WFiTJ3JUI7stz=VOzkq2QQD8C0sxHn>%MIp$_og`a~Nc;9z6_fl8j%dQc( zq}N%M6)dss1RO}GEGl0$n>-?J9gAjCrUzEp$=BO+rdLhr`}aCaEMiityr1B!uYmDJ zx~ck2(KX#gAHVgNRt>J>-e+{S6MkrWh;zrh=zI3O)6!kBOA}^n-se1^rGV=`LY^sB zBTOqx{gu_7XE!s8c1a7BirwHDevJ1Uj<&8^LWt;T{Cs2Zb-7d&2kTb1FxMVgmq9w+wz^X-iXp=x9psV>|mC$|ZcGrj{{0k19@tp?8pHJb%@t=M4|Le>Bzq*1^rL(BccnS33Jg4$} zrls&k7teXl{P?H#82<7p=Xq_$?5b-5by!#ON&oWdAX?mHZa<}aW93iY=uDg^pYN~y z>7j0>*3Q%|RP{nTcOW%-n&UH6?r4iltqqqtWr=#;g!=`I*l9$px|6~t-@yi-qj#yo zBW-f_Dj0Z^Q_XYP`Nis9$rcSz0bW|Q$X+2I>{P-R2s*1Q4U@+n-Z zsLLvOsZk5uh*u|gUs|@r-+0t+m1-?L7kJwlFSn`-cgfp>m>#zs}nQt#|8b6?9x{j}~N_fe{U zw9d>8uZ7#ZGqBOWo8ay(VuntReJ zclIzFIN+=Lc*81fj)c+6d#8dw(nq*VZ@6-jS}@xtli%Yz{q}`A-pDQ|@w*G#m#8K> znXAH6#(C|mDwGo(h}LJ9$2?X08}owY=w}o!ukyX&EEFY2ZCR-8%fubU*&B3kw%@Ne z?7jgLzuNa_AN}OezvEnXX)bm87`<0d_N11}tQ^!h9)-}+Im;^jC_aSbks5v4s7KTj zU8x5%%nw#sdWK2I0JJoR=Bk>^!f#(q-M4VF%Jm)J8{)jcIIJGOHp`XF_zRW2qZ&Aw zmuU`fkpGh^$$aZc^05728hC1}th&bgzA~#Mp0Ud3!uahZ=9MGE_>6*J+%xd0rKO=@%um)j%qNzJKze*$``W_jdcHnjR{*{v0sR~pQ+%cNK6T)SkJPGL65 zcpi^#+ckA<1sWdyUFHo`QGT!1@BqP{PqYYfY7y?H-bWtz%}*a9ztX~aKK!$feiK~N zUv>BIyz2T6cJT3Rp61T4(k{m+`c!>EN4Fh}vD%zcCbfu=f7)}NYi5;9%-j`P z4p(xjpj^O5?$~SUm$>q>cL+O+>oX@%*hft0CE6@Pvp%$eT$s;%6EkHKhc}lF;O9s* z3XMOt5&!%6X7Da$zu!)J67vzO!lhZ|w&G6Ae;#1I(yNsW=>-nI!#vWSCeo#jO`3dU zC%F9|$+dvz#l6zBcs;34{azl8RQKKWrD0#YWM51l=&L3k=$$fcG0U!Hxy054E>{ni z*}3CYZr+1fA3T3nmtyq?pA}5CzE?>tz9_jFtxJ>KfA-P)zW6)NSKfH5qiAt=dr%{n zFQwiwlQldq+RLE!Y9K#nXl43?V=O8KHOu;@=$1FFRt31X+rV!Ojya@a?aVkXMLTr* zv3k@vT<%b-w|nd^5yj2&EE^cOaSl0jn;isQ;3AwQWES;HCpgJQb!*9E{09c63X_QD zjitdCi=6Mr>{zkRk`QZ^nJ2=edyYZUrzW|&0-rJEIO%M|S84_x=5PlEud@I289u{@ z@lb(BimXacn%w<7-o}0_vt%aEd4d&_=Hs(%50-H7^HpZCGryW7@3-2dGCJ(VQ^v{b zM>aW@D?(1zoB&5)muK`ZEBTF+ArJUIUI`%&TguZn7OBUdztqKD#!Y4}nfE9tbhygC z9bFIDsqmRW+L5aCR=~g$I{n#4AM)$(IR9)`NX?&WlG+*2b>*w7mimXtm|XBe=?AH^ z7#D4_=w5`pSv6n0$^SD8SmfN!1rk}#E~_Fe z5`AZ(+$GNL&n=RlS*|I4z%cZTyNs_aGtV-g{vljEQY=%hlVD-EtZWPCYhNm}AC~w1 z^6LNpKKgYp3#+E!=UwU0QP1*I$Gw>O$W9LFKS?$7;d`aY+trq-lGDgV&LF(j*b9ZENDsK^EbQ6LUQ@=WFiYc}coCm#E-q@B ztBz1fouj{`VwUhRSmOS;ATWM}oF-Si-AKNSu}HrH>@r9{SH_mK$}6-fpZYDsn}Io5 zAG4G#xk0uRvB~hW_>5S$NuMD$NzoU5-o8DOe=l|S%Lr-L$sztp^s0wiq*^Jbgp=ow zoV3Wz2#5UoO#Kc%9_*DM@2P_VM_c978mBz2WtU9v*vnGakP^pjQnok#K3;LMs2?>8 znuBGt`b!t)xl_AGNcP;v)ML)x*Npi8wB4b_5;tdeu-T6b@&AkE{_p&JXMGX%V30}5 zki%EjsjnVAF-dVS-l+`XYHJ?82dA_$>ju@Q7yE>L>04#Ipwd*J@5KM_YV}ioc!gRQdT2u%9@j}irV>{=lU9Q-lNx%s5JevMy<1dK&b&CY^-?HGr9JnN07G}3d z?pF`g9nP9+$UN+;IPLBcv>f1sjlHh?f8#v8OA*z*6MM2!qrte=Slw}&6(X=`T50<`gc4}h6_u8^nfmx=C; zw|Kx-X?Hh5`e!jq$3}+qqqlhG3i-Co8JT+?&HqL`g=gNPV{gU7!6Hu{JeLxS@R^x} zzf8+d(&rIcWzJ-i$lsFA%O*APm#Hwv-G2)8kpVZi>_KY(WnJ+0K_~56lE!}}Gd_cv z{Z0%`;hzybl6&qb>CzbO6FY{EFymdk(KN|Y2mXUOu?tgfsd+JYy%b^pb-kHd?$PW# zt(ok7asB@rXVZ;BYIg&Zd~*krq;9TE^Oz+hS2u}|QnT^j*ukCHE6Z**irCLCk2i13 zL)DksI%jKUkshaKUn9NHK(x`di%Jqa<@#;(P2x5ASPy^qALQyuou&FAux%UWe0xuj zJFUT4PP75cM2_9b{f};`)~AIM)W9rm%!fbE8Y{oikrqS)6n83KwpU5Mm(Z0iIw|cp zU4){tH^yK1L^L;G?Mj#AU5Q^jy8 z1x84JZmD!4=3bZhZyC1AE4-j4p#i$&eL%iVF-udSEg)`ZQio43@g^9jyy>-xo430POr{_UeCg_0n~D)V?AnS3!%~$C>01wQK@>@|NW@q}!G-SwwzracsGi zD8cF^9kNI(uTw;*5?ERrjT|%#BCX8jHMY^qqOR za4Ei=&2Yz3`Ug}CmvNJ*F*c?0|Ax*kx&JyO(apa^IA;>v*3t1sIuD>9cfy9o=!9e` zYmz-f>AU}&FQh)sE6xYjWK)y9O!AC*ipE##tJ-Buav1FA3bd&s`Pp}q zp81Q(J5-7~?7`t|Z@h3{Eh0~QR)xoiPA{Ly8E4`Dvu!CVRd2xc*}&3`Mb^@{C5cH> zQ#VPyhQ4tr`0+l0yesUVhbuVYHC>{r;3r3Zn=)#d97Y@4;57bwm$r%5N%V%x!sXbQ z!%{bYxa^sQkJ6W`^dhL|mPE*1Hr}XW-9zM-2WR!_Rn?9B zU9lwG^k#Rll0R-YB)31yF9jBX)2S10$JUgOaM$5F?^iaor4lRrP3yx~>m zij2C)Gk?v__4`-Rc(H$=GP=^Fvl3rDNG$Fa{CVRg_Ru7_A~4?lx$>;#czKUr>bRq` zbS^ShYMx;hBQUL)yN!`5;MEb+hO5|sv9g4CJ{*3{ui5eOGGp2w4MzF}ljL)$KXFd% z86X}R{>1rhLZGaGv+(N9bg0tmVvCsV52aUlxAiy>s-CU~t40^7zB=f#Q9R9>EJVjlt7oLoc(`TY!gT zza`T3C>VK2xTw%r8MBtzF*K3&ymm1j^gYe^; zzgR-j1ye&YQ+IBXG&wy{#`9eJgjbcKtH(-@&-98?-&AipkCwZcf~Drz+DeNbC0{DK0OaB%$yB#Qbod0GW@zHhCX?`rH%5wHGg* zN8a&0>kQ{T__L3GaQgoLigW)3C$&uxXvDy9{fGS4hHW;<8EW(S@5?Leb$n%*VgJyu zuPVeH`1E@+?>AlflMgmh%h;nftB2fgUX_^f>3v3->2HL<>6!AsRU3vedqtgC;B5wJ zkO-&ym_B3o0um99{+aU~_^FCS5I6r*aCDAF=(q5g9EmUPvYry0oqEm>PszY>%=dyX z=x6x6qK`=ZK4^tmR{SP+P%m`DJFYPQ+iPK%ti&(7bp8O@xPg0^yYocJ4zhQ3kTm12 z4QX3kX1|;$eW}IW$3Ig3XUEALc;jxzrzmMSR_=BVmeDKLYr|KK74xJ(c~$RHeAjd1 z<@4lZALkS)yf;jeCyV~Xx#-{kNnG{kY;VrPesE%!{AZT$50IT5{_LY~nPbeq;@tJ@ zJZ(XgNlv^Ak+*XOR0Y>2jI#U*@Rlyfz%aK(up5 z?x~C=%yN)-py!G2s!zOG637uPyfRY%p#4Z6F5CR_iVqk$=Vd%GXBL-D%OYeRxq6Fl zc`4(DFHK(R$paPT3;4QmZ*<{}%Su{m%8$&q|6Gz^g7@*BO{I1p<0j6dK{B)`cx=-F z)#}Y8IYxhBe&JAcci{v%M2%p*mO{BsjTaj;tIb|N@LOn^AeqbjiEX3pyc;e4e7$RA zfc)8mCG*@;i_#;rU}doFO&iFh{d+oT18*H&{s=C6KMdp{EX`~Q&j)&WuOTl=?xEeK*K z7Irr<_rmT@u)DDsdg#U$J5jK)6PWuuVt03-Vz=Aw_rvkozvuY8{&VKA6^1qIUU98! zU8@3nRn0#bvb1UMwgIC)VXd`D0@n)0=Qmc=%7X*tI|2^1yP4LRnkuv+{Ox?*wfQ~S zahnHjzGAEvg|4^}T=Zwn5N+&?2N#Kc*eXKr?{n5iFjTdKLVpzfU#&fT}QT4!`T z0!u_lOvDClPakeZz?IxNZ-Z8~Tews_6CsP*!NI%BZ3@2Ejl6TT=FFWIq_Vr%YmC-x zmq~6p({JXjp#|;o`ww@q$L{ln&u4t31hINf&bo$}CO&9J2C@q?&Uq5pQ|s}6?CfRq zlT&5>*g2O&fE)gF7cy{KW@AES|vl}aT8Z~mJ79ywl5UZD-@kp(iH&h~B;Pe07 zkXrE&cVj%k_Xb^09YSyNU^g@LfjQG^zCi=n8orQUskAaY-`Tw2ARVrs76)cF;s^M7 z&kkvAk44DL_2^al4@+C$gT7;Qn7j+~Nt46$d>Vbbb!1wO^ho*nJzT6kW~R*^8!6A0 zMM&KRaFY&$lh`pc>p3^=F8xjwc);JY#ib1%m30pxLdH(@P8&gu_v0V*;xBhhD-sOO zMs4ivQY>wDe1K$RvR_=(lDd*O(3WTO$F@Xh~sn=@9Jufi-gO^RZC%xWxZ?Juv z8G7oXNQtk(%{5t~Ppc6nY1!cWW>3;DgIjb1qnp}wt3JF_lsK@{@_XWLJ@f~?g+rti zFzwY%J;Ar5;Pai?srMdFOy9=$eX&lT?!Yd8fBL)Yv-JMp_Qk-nx*qSZ=LA1^xSGCY zdO_XMCQz1Kgp<=h+`J>jU))mZCG5k~UKR3}M#SgWpVCtLR097p|FLuITa&nC{IT=< zT!FHR+BnP4|Ls#sSDK#YO72@g?#sEOlX(=o$?vaXPs2L%jB;5!tkj?<9-A{J5_d0B zd&Csc=Tv5w?HxA&?lsYUcCrgXz4v;tyFQs7`bBkW<|9FRuk2y6c>w!#o#*S1={fQ( zU@stIy`Dr5J(m8Z&XzQN1$ix5z)Lq@)H#;Py?VIK1D@$Wn@5UGM`lmq*_6$lNICkJ z*WLxyG_NSBdVo8l1xqN~H_Wx8!9w>}PzSPu7h$UrzpAO;U%ACbUH3Guw)&9>*0(rP z#@Wc*&j$Kt(Jkk9XY~hlkJzj9W1tQuLw!1uv>5V9ZoVe zk14U8-jG_i6tkgYlV_WAQ8T+<4wSt8YotBw5g=OTA3Jw?XOeKRq%6yp*k_WGdoIjNq($jgVKDHM+oeuEp%I(%aRA6?*bJw!+Ila+A{4oN}8F`_*p;vwX zEb+aQl}fY5wpEBBq4sJ$*l^AHa5gGbQgPG4$JnXN9NbXds=)n%1H4XXrGnV88ab62 zf3@DKMIZP@V5E&K!__}aqNN-5S}?&wSuw*sLhQKH&Rg{dbFRksD!$HN{p<}N3|luU z?60!)oZqtZ**9Q{GUjG~EjkKa?A|J2XapBjsl$CLsvK|N9={HkDD9}O@R!}>=zm&N z)%y=I$)&>d5w4}puXYB===NFrX>C%6elp1>{B=*|_>?E3O%j9+|J%;rJ9ampP=Vrw z-R#ewGJ9r6{}S8g=vGSiXvF>>HT0-2-Sq<04p!+wa`98Rp58G;iW5UtCauxWJYfHc z9;epAgL*9waQfoRaSz?sSGD5yPAmG`joFnmbB`TH-mAU68bJM~)5A_{Rz>yFz$lp2 zzWmZub+}3Hn;Iexl{%@2P=TSFNMp6T9Gn+U^&$a{>TycFu8bZw*CoQ zxop6fuC6lguWFL-tKst>$(dFT94V8!?eN%$lm;bDvKS7{f7`is@fh>a6JSjbgCuj; zCv&+%>Qa}0OqYOsg(v4*M&5AX;WNO@BW{g!aDE$CSb?gwXUVP#vUr;-;%@1wHVKNt_M@ zO31UdX-&X927Nb4#L+G(-vR@q!?8cH`rr8M8+yoG_fDX+yhoipx11haGf3j`;T-X! z^@sF!o%Vo@99^RKP|RdE&>PlB*H=-?#q0-H>hn^s3>LAGICH;DL3In9J`er-gqsyr z;bd?`^5_I_C-n{furCd(9;-E?SX;HdfVK(wVw&Do zjVC5IYLcJK@7E&L``(4|!e| zaX)3oO+AzOLc0WTr`1+!&}eQP5l_sI%cy(5;WwV=^|!{V(P#MQxw&QVrki?Czfh9e z<e5K?HaEBmpF>sF{iDvz3?^Tjql}*- zU9#B+R4{wQ8=3oFYkX9-c*0Kc7{j?0hK#W&m?o6ijX^g|W2CRT)a9@gicDi4pbA~S=gZ;z-qtC+K& zfWOf-POYrQtY;^6_Kd=+FSUQsfpF}H56~NJ50sn-Oj0rML)s5~yWa8uxq0u#foaSA zrADs5?VNteN;k1%k%!(S)3=3Q04$`@-XK}BKU)792(Gy%NJ3ig)_3qZ?wrLgR^11B zz%lCg1wrhp=2K5Yx%rIElRs5ZMasiTF@rTFIjj3+nEioGwXfS(eSrJ$swCW-UQ<=I zc@a{!EuUX}q{_oQMERgSwJKhj>PJc7e)hqA*Qhpm(c;U)Y|CxCDswMd3WK3^Y-m=w z*?S!ZHX0gqLUmzhX9n2y^A4AlGx|Jt@@ zqG!xLE?Qk?9uhc=xG`a&`aLm9RxjhTsFbLzTd+G%FQZQEP#;UP$6ALy6lWd1&=~m^ ziAKbi6RLl=SQ&SZuYbFwN?nN+TNgBJOW#u03dD&ip7~eZd+Jj2I0=4CtS%5-7aQ3>L#;sHwI_9_xx*zjYa#RQC)^UNvQ0f=C)&CQuWL+JDM8%w zZN<-Z%%K)g`{yb^t>xBPzlNQsED4Ziy)LGCVrTFF!T0*)@s~^M|6qOp+Id9RociU_ zfpVO_uR;4-`eSgupTvrVlP2oJsn@neWB(RQ^|RC-H%4+J>AXeH&U|$he*ekynLcI( zvy2Yx-&*BYjup^jYzt=H#6b;%12|#;eBb^}m6=#w3eA)k-MguxCj4bJJLEOTs@0>I zBVXlbTnkpVdg&u zUom<~lTycb#mYb9(E+J>LQUcRWADT887f~;0T;Nn3b#35>}9n(-wfG30dC&2%WC8s z^pW<4%IiDlRK>pd_G`2wx?0p?_6n0Og^Kgx<;sJ8C11HvW(~cS$8W^)mt^MUr!N2|4>ghYPn;W+euygZPcKY}U zfieO+&)L{QUqw(vuoveX8yY4%E06IQ5!4dU;}J zKMngY&ZZ`l6VG*LzEIa*eWvgJ$#c>!%u!Wt6)yAVP&cl0Qa9iYT|7iS?bl7EvS06- zhdelDq^j~fQW`r`tGxGB*Pg+RnU2Pnf0XKw8ZGw}%UteVcm4op-}{ZXcZArnWzglOovJ@MW{|WxgFr zU*BWJDpif|S?5-$*jtCGuP3;9K`qsHS|c?Z-~YjEquHLrdT)Mr|Fl3cPbjUsoeGo( z=L2Niz}0EzuyeQnv2AmEf9W;xZ#(BPWtf9IqXUMW7uvovSL+#w&x2$1DW$JoiLM&4 z!tQJ<{X+@xjUm{7-c;R#-*s76VpQk3dTHu{C>AQjInYN8+LommJ3@sFMNi{9{qMbL>KQxQ0lbf4UcqX^2Xqv{w0kB- zs?&4h4Ke|_rEev^J8Z-9Ic6Gh4tgv z;KB^Tzn?VF_pM~7vm+Swu0DFN+RU|^Ve{aOOPT^C<1IafbSek_aqdtFY_yEh1v zF3isF&ra3%T!I5QE$i;&Mg3_q`z*weUOAuZCUB(okN6yGW>?YlZA~jvhooAo;Um$2 za!2cVK0lve{U zM@o~faHj`6&@G3;Wce@b+saS({|Vm;&f?B<$IN*i1xl?BCP^sNHEl9>J`Aq9x9sNT zQ_K5H&tiYq8xLaB&3hXKVh`$OZl-%y;@-r%AX(63o7uiUck066Bt@MwPq+k+lz1Ee z<&$|_D7mX0x7Zij>D9@PrTMwT;;ZYKej(DK8uha?cjx<}3*CtORz8FE%xqzDp#^cH zk-z?EB{Mp zn^({3W#Ebr1NUogeNVrb87(gN(Q3Q)R{wDZy+nGn+cmPOSLhviEn>#gJ&*F1I4ScL z4A-roDwq~0-v)7iaI=l-n;s{_snd!tE2tdFiN}Z=-&f>RdqT;xz*@@s>9yVqGRS;eYj6j0XtX7G@q@>-6eX<_2aVXp%>st6Hm5^t^RHT z`LQ3Lqg@5PAsFe*Ah-+18t5N>giCkDzirk=-|_<9kq!IQ{{8jw54cg%k{QGM3Hq*G zQSvMr-0(_}el0Ot94|9JI}oE^p96MOBkQKiJpEHI^vUCh&r6o+we8}#zY`)83a`;W zEr}E9#|^5$Bt11bPUdZ678$=*zgav^K9L8T`Y+L^PUjxh6Yeo-A$ricNI5VReWVoz zeZebg6KbA;t*)9qE3hZGf*amWwalA;1#&;!Bz=k|r?&6IK0SIeBe_Ta6TQgetN*rh z`sE#FpYq&V!p^;?wlg0`!{=iXcM6M@H=ioOoQhc5zE2TzsX*?iV4vxqikgdd#m@LA zM>b33nFy!pyDW+GPT<{eBhcUc=LRl%bYBDR^!PLGnO z0o)$8n9cP^!|gf-Zuaezxfgm7;bn;xvu~J3pbOd|2&_2%vH58RcMTp=d#AoN2TzZa z)Nb5poA=4wAs!9J&G>fH59Y(%uNn9fe*4Hr=1Ro;ZjZ2k(RA~Lqmgn4y?{+a=9o7! z2aagLbJ3uRxft{Pyl1#ySv5SZB=ud~HIqDC^e$yHcDAn%e%CpV)6@q3a_`39c5b_8 ztNC0}xE|Pf`S^gq%xV;hT3{ z>XofP25W7x(4PEjG{hqK1ndJgbU=*4z0( zE|!a75=#ve=^X8nKbE;3e&Vq*!6n&TB<#F6m$kXT6_dDP=dC@4rQNs}D2Y7Rg$m_O@n}E}?9DC0Q59V#l}97c8J`bY z?h*&~=3FsIX1Hd$WH6t#vBUm#iWsa9u#aApcz&#jp?r6+rc&V5@7)Yx@atR}VcW8S zhT#ceGLFx#sd=v9b1&{x&Lqy{O)^*v5%S<67;K3HhV3=Dxl@r|cflEh`6JpL)E-B7 zJ}{Jf5yi7l9g_2lq2Bdqd1}SJ+tl1zVq%Q=k753|&sKBsjurQ_;N#&XwQ;56I#NC_hTV2bcHCrDko2gIoeLP{PYZETt z2Qj;xGtJP{jU6&ubS66-clkk#JW>Mw#)@&yt*~>SsV2G4J^J(FPc8qqomV#7Z61Rj z(`WKrJNLZi=))#?pBN;koNA;cg6(AzFQ#8y;p}QlpGVESC2fXF8+yBS&B=pRpSpba zMOV9AmVcHvxDYS977UV~4xJ48LUvfevTuL(GEA(g9A81+=c8pLGTXc#yR zjbM75MDK%!Dh}b&p3k&X(oKV1Ugj)(?*89D7^=Pl4zRZ`^c{Grjk;(FR%ii{OOoH$*J{j;l(Hk4C8L?s8~nT-pIz9n&4vy1 zLm3sQYgbtt!pJ|H>(JNTT_LAW*WIPbD{5_WWVKmlms-Q&Xb_W|RL*0F z2cNLY3l@E)jvg{lW(92rxO5|)aqF#hwA*l;%kx}4%y81W?~9d1wb+Au(MlWk5uIn=$84{* z+Iev4qU^hkzv-e?XXj!+0!~YPlK*K=?V@$KjG9DDth&ySL`}5~UQqoj z`3ySGcvtYxu1l9YkHXFqW|<_Bd-Qj^_{%78rT>l_vn!u6&qnJm6FY}4XlypDH;ET^ zo_gy@+WDn{+#sc{9^NHwEVBS#`nyww;!+y=@J1EohgG zrXO!#)$nX>xa8i)@8BqgW)a*5%}f1uxSyeSJ9u*)==n!aH7sz6k}+U?%^pV>(ke%@ zi$eb>^9}FWpSns6b-TIRQ2Anvrd=WXrE6^7j%BjsaH{9|FTA&`7MW(wS%Oh-e1utVj7Zyk$snLrKY z-5MLEJ341+n7lyWIfZ-lh5PtRZ~DXkwsV!^cg&^X9^A&xbGMH(`=Ghq7CR@#*D^Pb zLUS8CSJR4`Pwr=bxf{=ZsI_?oHC`QJZ1(~-<_FXQN682Ny1lta6go87sLe{3HQ#X| zF8(Gr^s8>}#Fppqm2GaGD;zHVxQxz9KF(%9L&q_27UJn+Ic*!k-AG{FX+S_aCFYK>BN zP;ZQmGod5&s`=D`{!)w{`@ijMnfcLdcxIC8*twzi67vUq-vK+{pB88KHwMc7fFP-z zXP$W@^Tyru+S-`}^T-&ur93lscKggzssziCBKUTn^X9|U0$+ZjoB83T*;I*H0QHJ@ zpWJ$@b@UMQs(w3*>suVrS0;v(URFcDavscvIwZ8D=&j*A=kG}#Y|ux)+A&M@h$v=wHp-sz(Gx%Mfa> zBhk8^FdPhIIoRTcGkP!f<;NBZ700?abPq$Ucz|^jJak8&4F*_aJ@bi^m-J-t*md~% z&^1bb#*8Z!e4}OVL_M9ESRiqucKcy^FnMP_&(!`Usb;sTIVPf&osL%o z)%2mvBG6ZiI#5bYT|)m_7%tuM(|S@1lMMdpE02;~^|!bE<@OS9S^lD|x%`O$$+yS& zpL_JFx}Q9ofW7|nCyQrCtgBm4FIC$pc`e)zEA-G@XsD;8dJ}(rf17s{_mp<@dZtGu zbPG0L$b9R{`=)xfmY(u_B|T@Y0ebbpp0clBpd@_>)^{xQl)^=b4|x~rcK1ES=dwv` zPHoX0oQ#r(cvPm>5q;BgqYN2klA8xJbdSPba=WQX+&cWw=b!MB^s>BOXsxQP_ofav z$yN7qYUO$#ajImJf~)GOuNl5Fq>D+8E@`cLQ=`_I3qN+2yLz-KKpy^M0<)c_B8Lac ztDrzRW{6bDMbV?>{dXEYM~x1Ln?uY$S#yDUf(`rr;CZPsS6P8|HNQw+c!@&hD*oMR z@Y^f1)ai8MB6Y=~PxDpOfnYf>0vyR{hB`SL9(^fx&1#QPS9GvsFy)Y3)l?rBFb25n zS*G3dIY@@T_xa1tcY4_BcUl^y1^K;D#ccZ1SWh_=2IuT~F@1!)r}(xcPc?6@htKnr z6Xde{2Zrgrl0D_hQTUD{qV(FgJS94gTTRba=|ig+|%h&o=P$6owgdK)LisyTHnzV%Xo?RL~!t5zw}Crz2s6?v>g{pFNqtZYtjlU&(;yV{AD_txbXhKAl|- z&tO&fqrW8YMTf|JmYOuyB&Eow2fbIQlkedYhg1LmOjd93yKFYp@#QS)nn#GpMDSJX z%c^T!=znzHf=@kDVY|ZQCH+QBtDoxe9C*{0&?0V=%TnV5H;o&xFFz%>Wf(l+gwgbm zb#qu|{R)#h^enH-=dgUP7bbP5gi6UwE6Z#6Dgy?RHl~5BqcHF_PN z?tt&b_0MCBGVUBT%BNELj60t4dnwP($Ci4_8=f*_EPa`;m!7YQQQYVO+jm^7TcL0K zogQT5lYRQtBSw*DU?|sb=mQ&gN$PQCGev&sdAEDXLYVZm;UfnH(yuZ^H7)Vg2UkUTD@}w zqbLPe{dW$F);C-Ns2e7{EM!TKi;&gSA%TW67OUV$nY@DC1J5d!A?(h&=Z8aFy1L~T zy73L#hru(cY^k?2T=LatN2zit%g18WA*aFFBc7-WUBG48i_G%p-o%p^5C6`Cx0;mJ zC;J*@0H49PqE+>BIgL^dyl&F7zPgUzdV)dsvyahNg&1XdZ*b%Mn{?wvql~Z5j^g?= zy0M{`jIjqp-t}JJz0FHLP-FNOu~AzM-jehpP@-m4Qax_4Q8vD{U9It@qk^> zIX%^pw!Tu0=i*EEiRwU8Klzy}NL=oPscfD7Wk+55@yL1VaA<&39M3Gi@fub4HF4zt zxx;#wO6Gl4z;C}bKBBfzN3Ws=sD1Ui+8G5OdmgiSyVq*{(ok`F%KRlVhsBb{Or$+L zq7OC}*H>uy?xWwBRK~IgZs~q}_(P4Fmgo-b7Vl>+aHYA$?^TqfvL`q`u8n2LV7Pcm zJOk3vvKQXev18m>T-wNDg#Yf4<=^I)Dy292PpAIa`7U@^=G4FWNV9H~)y*@F()I?s zZ}02tu8u}|u$|xQ{#d<7SEJmF3zA$>3-p*%MmaN)KJ)7Vy*e)1YmDM}7k!gf&id)j z#NJf=eu9tQH_|8zm(vS(TCI1mp#}?sf4=XSK0Vk=f;_+kufNk5{q{nCnY=57R0nFD z+I`8>mmO7VYadyM{}CX*^pmGx8i`Rc>gjHO zsSkeDy6_TZ{V+h1ukpFh+o&oxA+8sspRbszYVkb2f?Mg9aYotiq!)z8GyTzhRd7Cg z{qX;qb^NU6FzfcX%TBaS9!uk`VUkcSggU|A@)};^cY5YcH5@GYtRiLnRs8;KZOfB7 zXjqZ|Iv#YfTwymnbS)gg&z&tj-$u(o=G_%m4zaWdi7Y@}gvbvl<1 z_m$v(e5k7`DIeJccAb{3qpBL^D|TRURVR*81K7W7$mhMbYKR&S4$z;^H1Ehc%5_wL zOw43%Xj-jSCz#}X0e0nLb|@n~Wf5@EZV88!ZKq&))(d@#J6F{h`k;QH=y>;fq0IT< z-0frj5}nO*yAb<9@6iFUE@-Jz3%*%X_LN*pSi*WnNV!mO=~7iJmx#mf$bD5eHn7++ zf4s;{!oFM!id`@ z-i>_4dJ{Hu>!I4^^<%GvekW*>Du%ZEE53i_*a)?h`)9wvq+&`fP(B602C%Ibnxwu` z8(yW)ym4i(8ll*WqR;&dXJGUW_9iFLb1uBCVrH>Nu!#K^$9Kxz7aZ;wxZ&iSK-$F2 z-{=ly*jOgAo3)$%-#N3C#e-dp2=M=>ldD>Cy$8cT#*LY{MwT=?^dgFc%IPsJEsM)C za|GMBAKb%oftjp(3iU+J;g-W+;qKb9TXAcmWj~ruY&A-msr@Wf;Et`i2iBB+U4?h0 z=LNsYvU620c*-yTwzFSwdA-3EqYUEfH$QjO^WxhR@p*$?tX_lKOg{;Bw``Zb__UXJ z9z>g?@jd3shlPU_(rU-@>1n$WY4S`+Fg z)$ehe_5M^$yH!TmSW&Cd> z^+RUtDOI;H+Cj`y>R-C6Lf*q~2N!jAe6Ktopp`}!A9oenVvGSH`N-9gdTiBxRhwF(GT6R#+)0%T z#_%qZ`yfN^sAgbk%Qn*+JG@i*!B=}Y?KOo7Ee0G=;>3b*&cHj;rdQJ(8*h>JR-J~%g}4R@)i?u=KI;) z>hmTasq~t9qeOZ2F2q;*e`OXtv6=ch(NA_-!E?UYQym}SPfS8rqQ8gQ1U^xv3_Ef$ z5$Z%F_(x6j!Dhs(t8h-zs2|3)N>oKk)5rCpo=DxTD)Qbf9_(fOJfaRALIYt2_jd|h zSNbMqcU#a_efnJWW-b$d4z6|3FXg$LUGR@ty0ZB!LoTx8S)RKUY4(@%Zh zOMQ&3m*m0bUhO0F1@v*l-ZO8SnXKDSWQUipzwLKjpHbaMc6@_NurP;u&d%e7?CeCm zFR9vG_La6^#g>*0RKpW~vc;C)H?EU9d=fijJO3M_)YMx6a%o_7Q zo29OFBlfq$Z?CLS6^Da;4rJ$cQnI>ID?|=Y3l`aHRvn3>o9SuQ zsNa6_>{m1CdCgw@U3MSVB8GpX!=pPys@A7@ zp1Q!lDIc#s5_cVju)7zxMtz&k-YRxZow-9T9YRkWoyB!LsK$3fKWP;?vF!ylxjnli z%yRbMzOQBtiI8c;ke3JlQ2_ywvhfXE>-X6$cb7zoScgc>*!-5})D;#mjfRf)mIlO% z0{D5=Y-KDNi{MUAKvVQ=WsC2USoszgB8C>#ExCrpNX^x7Q&yI@)MdBs^b9ziU7o4L zO<~fF=jC)kOY|KPdHvh0WIL2`*_JnQwpcAmU9hwf|VC2jG^CGBeJhgx|_?wr)9 zpT_Bp?t96xTMgVLVV{&V{p%7R8ALB;WysVoP4yM0BKYd^T*@%kPg>x& zO?#J8?YObzQ3(yblXX>UM1bt6g+@)@w(8P4lXPkdZeMDUT6!l?>{_9bWoJ}p%EMLc z&gb|mQZ>!wR?A>^<=)O$g}`i<@c!2gPEe1Nm_G+m8@Jk~lIMrX`gv$6FEOj5aG4LS zV`r(wY4!-%Q)3QpDRoP2ha;CreoQa^T&;K#B{B4d={dftxO~)XzuEPDm(#L_IBZh_ zjA>p0OS>D~(W?)3J-x8ShB=p_e|*x?-qHu%jwjR-R- zI6Mg@l`A=X|A0SswlAAy<3F$ewezxTXU!w%2eBWMP5m;0?d0H(lf_DLfZB zp8nRKhx@S)2QD$dR#gT=E=#>pb7}?UkPskaJ_O0GRt?oRW)05d;>!=(sC$Fp7ra2< zZJ3+tYofO%FO)btNsaQLE+fzSEecWXsK4@17x|>mPzyZSAHM*HXV7Amk;Dz_AUZG%Wh)GFIykIVuFt>%ENAE!`Zs6udhrbR#lGi0>w^R!Q;9c{2(U%@7|9*J-ysma(m@<3?$KZRG zd^S~0Z_Tb2KdVW}5Otm1x8uCe2(K6wG$~ew^Se~Yn4<=bjg^M{?mma-s7~m!4JWQH z-x92%21QDD^3=U64b&L+V}hxvri3ljPh#h6|5IaZEDqlGf8s`g-o4CW(MHLEZIe#6 zHjk%IdBgWleK5}a?k%seXUL9O=5-6a#F6)t|Ho!?OigbY!uyO!I%Q5ej-B~k`Z~Qb zpN{a68q^hg+UC`d_xF_}c5uQ@l+uj`KZzi=jILHkpJniu5yi3Xq?US3GywV$!@DH) z(TT3nZEVAcNcj2ARYfUabl2_$oJ{!#IoL};&Bk+Nn34h1(TJO!=@H+WrbLe`# z;tlG)lKdfcy#6I^ZX!@vF6_w}o^6A?z)jGf~rj7)QyVU(WOwoyX9w5Cst zQXkuTwA!2+66Ga+_(OzmtJF3nyyY(OdDziqDGRoH%M5Z~{jqxUvEzIsp&0Yfr%#?F>!vxg+v$U`%yC43$BarPM7-V*F~G? zi6Sg6vrEUy&M-6q!cV!Jr^d@4N&KvF(q)xr)@@C=d?U8GxTQtN`VrKfx&2*6Z-?7P zA7yj-mUBFQ^qA)~>mL1tyg~8>eCEINpnuiuX?K}@^u~u@xX*H#jm>xR>?Gf}H@vt_ zZ;0OxjT~S&;_W2|ux*uga}BR^dP_%pcwVo058T0>?cHVv3%Og3n?XlI?k-zqKdr5&uy{1CsYaCW>_ zF_<|(XZAqmglKPxXC3>pgWrFab~qDX7{;#M@nzc7i|EZy;ypjys1>~o9uHnOW8;3! z>MIx<_L-gMxRzEIU7z{vhkm%GjrG9JtHJ!cJk?t4;66?=`XTwgYQLV)r%d)*Z>mL1;4}tRO$lrF}GNP5s!62jjz|P(JxEMkLjsLlszJ2?0!_f;ySxHRD_vxmg z`WP>HK^*WkSZk}^c*%C2{l_nBYaN2Tr7X7Xysw*}R*@p9?%+m)zxA5Vzs@%x2vfFN=0Z%dYoeeU*Hr<>DA|%m#0O+&pCn zuj${*hfJ6CzER@zlKkb~S!|DoOT&FUYvYQGv=5bpspPWS5n6+rV3zovk$d!R_o<`E zv;XbS_O-sc^a?OaBA>_Y9`g-$-bNXV|8LQr7^Z+P9ma=$&MT+Y>+2<@iejrL9kmI! zyd)R#==(Vz?b}FiNw0(sp>wS@S>TBR{e2h;v7^*Q?#^_ zf0cVxM_03QjHElE!Iy2P7!Gr@iTW*nt3+A5DN?q8 ztu($F3x)z`<}$J6Tu+&A8!D^9$uHw~Y8__<$w%U9);;=dySQUTee&OSo?5t-;RUws zNKF1z_mDxGY!sbXQQ=7uEoQ$_GHua2>ex|xNnI_(hg=VXwFO7Kq`d=uu6c#_xxKfv zAvbk9l&V#K=`AB0659*h(kdkSNTNoso%~&M_3@RW*tTw_jX00-lNH$3oZ=u~2Kh_Z zF~Jf%xuGa9rD8t85>%|6*dH>5ckGl{_)4;c(Ew4r5>)* z>oOV!=pK)z2b_9K>R|J%nc}3b*F~LThj9p8-&^TY#mrsc8u0Xru9utJ(878Qf3g_7 znUnOYanwK2XSDq_gQPHcMPu&KS74Var0L&wp4&Xs&~v&`-eTwEr>_hjM;pbKSTVCh z1Fh3$qx>YtZA+h`wWv=mO$8U&^zlLRo_qA&m@Qvpzy81dd4b1jL$rrc;&YSB&gIj>2N`9cHTCViPFmTOMkz|H zm}V2B%_`?5qss9;pCoHh)Od5M5eFt;){5IOvu*?qyyJ)VJCV5+@uAQNdx`AnBXhd( zT#T+R%_{gx@(@0EPgm)d%MXrcR^8iQtls%a63^W(+iBvNEkF(|rH179yWh+t`E~`% znAmu!z9>+doq=B$uvRLO6FOttZasI&hA-5%U>8eEAC|3;>CN%CRvB01@>jG6yN1ZD zmO2$qOP2&R^E1#!d^KNs-X$(}r3UMiuC;=P8v*Ak z>mGfVG!yfjzwLa%Da|lroKc$5U#xK{rR{s`*kyf;TmyE8! zJY$X0Cir{FY~pbKZ_hL#Cw8D_(5n>SPCT<$eE3?wic-9)j~wiWuO>RlrGJ=VjYHGb zp||*4@Rfn&GX0^4{NC#)@8=Oqqax&h?k~$XgMki-mv`jE=|_X5zfGdNYz^;*oV9lI zZuti+HU*w@_O3^z#Bt&rKD{!}4f(u-do}bh@tH5B?m;v_ywEazna#Dvi!k{GE|Hio zzw0D?vKM&Ywxxw!3)e%#_!7AEjzX@@m_6k^M%*5l*Y#SFa5;!Ss|CO006k_eH}2SO zc!6#cb6Vo_ZJ5nD|3Qm|ym0Cw_X)Ah68g|;ITExYYtfL&$zIT-icVqqP4WuP)qnf* zjqO(qLq;0q7Iu#4Tulq=0RBv`VJzaQWvAY&TN3=|*Bb50CnI;3nb~(dtF=V;Hkw+u z{*mw6$g^O28orlO6s=-!smka3aep1@`^}s9Mi2P5y^KBN!~HR844;uQZ5bFf@!{?s zdOUx$4HL+5A7@JuKY#fOF7cz_YAH)UzVilsf&C8YfbP)rZ`2qS4#^5n=9A^%N%Xub z?-!7NhzUQ<&m|bV%@>|wMzd_LOC#xDR>IAgmfy7_w+?no1e~!(RZo|p3BiWT`^Hut{ z;ttjPtocYD*A3O+j~_%=b8R8lz?JBuV_VxA_O4%o!BOusAG}e>HEch&OkrnfL|#`v z;!vnBxXIG&uKg3)6K%lE=KUwJBQ|*40~_y_AqMKf#RK{OYm+42joIdNw4NJO03QjE zt+NBfOV6RT+#4X>$NNbX_vrJ~@{>9@{^orR{wJF@)y*j7^I?aT2CYG3I5Xrvtwxj< zJHjZn%F=6?c4_BM8qv+;eQbT8`PcB07R|sA4Ebedte3d8Cs$6cEc5a*D|F|x_$HEl zxwlN3Ow4~fP}VbZnM-YUz{6isnYlDsP0l?rQ}%xIl^kjGtLZDn?Wvy}x<$RWce~v9 z4S)DI`$d*RvPv__9!GXve_xZH+t|_TNqxKUmE0$8EoZLko;!!Dj=yWW*|++f-?i>I z{`)m{Hq#2ZzUa;!A?%#DmyK)9#k@zIm@q51>sB};b3FNM8vGW+J-D=d|E9k`uxG#? z<$2~`Wzg#`1E**Jb+zk3$r!>OYhf@A_vun_V1V@5#JsKDIc+CCyPjUR+}DbRSIjTI zzvi|8_vnAm^_Eo6EKE7;&!2w0N0I#6DCSlc?7VMyYi<7rqimqwPF^0X&FAkrl*j(9 z_GxXJd&^~hw;xv?YZtQl$X93jqrieP@)C7L7ciWwj#A;AuUs4o&gs)q4!`h|FVqsc z_Ym~C1LXW{G+x2v+Tfq9iNnu6%#xQS(D5bCW`Bb~`XZr5b+p)h&Ne;ZQd1-d)vlq}-5*~;(Y@)ey-{IlU3@5}t?L-RFK zb2&4L4(#}?9WGzE**LT)nt*P(q<*acxv<$++O6rW4Q}TzV?Dh8W6$Mo0a6=0ZWQT#~x?Mi&@wwGKO*ws+4f=MRAQU2G5k40u_jAs4$ho8SIBxyZNl0Ki@_p_qxh1;vPkqcflk%^t? zU(aA?y_0Mv#v0$EzcF^0lo)^(BYi;n5pVfCgBiXnx^^w2Bq@`7GVmm>Et@C1nsRfN zI_+8g6=H~qlJ@D$o=zmn_7HAK-^RA1*UM>eHme)lsy@4h`{7ZNu%5c&cf14@Lfap{ z!IwL55Ne}4xQqMFnL{NiikUX`ZIe3<#g%*;F)&b8F8Qey6Y%6l0diYgs?8gWZzuSQ z)jzh{1CIbnw|L3Q`^601o1n+YjhBCITP9@c|9hQf>vHXH7=o$UE@S6+7oQm#wDA&~ zBIK{LMYW%=y~Nr9yv0t_eC~ORXC3ORp5wUz#wDInWWlVxN95E8b*@?OBeK( zoC9vS3}hbnw$T6Dd1Hsa?flT|q+wohFS&`G15fLQ!GpY{4tCyM@v&j6y|)a+&Q|ZN z(LDE&oOQv?#@5nG6$5h-o`-H-w6JP^lHP;&R(p!JY^=YW9?fSoK34NWi{BJTU9otD z=I$0K56MGz2|Kj4_{%wJx-VfzwMFlU_m{zT>fhGp|3sho3wxK5|7f;Vx&Kohj@D`` z**FGW=MKaWo(rE7=;M;V_B|~nkIK+HuZDYE03F?EZb}^IwR0`>y}oBN{hJ zhd!ZC*;iBg!pF!?pPW(DLAJr!=;K2SA6Gyk@$JLp1; zlGuruFhO(7f&Nnx`vtEGX$cceQntIFIL(hS6q*+xjc0mGy{~g!p0tDK9{#^}PKf{8 z&O<$Q!>@|)60!5i8A}Y!$bDV0bHn)?4ZWIp%O>n>clVefS4$t6kDY&8UK-}~@RcgA z3ZN_VJsZAyx zpjHV8)wYt~`cNm2?mkD$+6i9slUy9MQoEC--%^E~b#05*_(-_4>Bg-8TZ&eh{rcS0 z%GrF6YYwI;*-r1~l6+Z9dJqi{A1#iYcQmUH-1H&758j-i4P`#^{slYrziw$o`^3s@ z;`Xd2XSHf|W2D+lwCjC#Y5mgBhPC3B^X<7>E#~G<VTEK1g z-ya9aho;*MIeVGVI`ETmy{j7Zr~t7p>mx%N)OXp8Kj*Ch7yLhez;c@W9iRIL?lByx z?In+}bI;O7!@(G8W9+=S)g;5)zTWZ$JGajfV%Y8BBaZdRRrBT=ykp?YwSe!Mm}J;a zPdBCnrDhYL+ID2zEsv)6`(#J5VT_(YZ2v=lhBZaLW}xmQmsdY(R)9-&z=S8Z>J2pQ5B%;$Ait+ok$eQLQW4+d&> z=cC|o^7reE)7qe~c;O;E3j3*AO6^#wgl!kqny#%wH|fjU5V`)-Lz}lQRvhla5e*os zg|A0%ieARitCe<&yO0Y@quJY_tk$t9cP>V8&Ilk_4j-dW*p7FnSe){ciJ9}Q-W_aAxOP*urf^%CN zzOC?*8Q9q_XBk7Z(OcTmYj2riYluaoJ_S2l9kn$aHIoNgQor>nZm{|6Cl~urC-1Ic zI5Y%1Pb8k~sACvTA6JN)xyf3C;a3uSRBNd5s&+NB(D@7x^1QqsVt7qG8$nOqc>gp* zZuXIPfLG+O2{UZxmV`}1e$PuY48ul5h|gej)w(P+oI4gNFJiH6;Z=q<#iFJ49%kWD z>kOVF(O|sEp7Y5~hIw!>n!aOqzT;-Y!ZWdA{7kGcuQ!xnmR;g0wRNWzh7oU>p-}G~ z-W6@g4==GPzFTybo59>4K87#YRFBezTYPO}!yq|6^0dpSRn#5q4}3d2#ihEvNtQFq zPo8(rxxr}ajhf&Hr>;7cWzXjKTrY|LpL_JlXQux@-_FW|Ew}!ER9$&kjQ#g6T2v@o zS)!yY$&w{Y&2xsxzGPR~358HI&D6|P)1DSdmWWU(OGu=e=lP6%t&ouHYskK@{cf-K zd;Q-2_+HncZ z%-MX-4#|*gH)-X*4a8DcL zlnpP}Yi49cQp{rbfVA7KnQR2V!u5CujudJP-Qf#{S}wQdwB{4^{c@0#7YCMWE+AJ- z`UdXe_X?t9N^q~_Q)#+|r!%Rxa5}Yk^}m6&;}av>=4+LX9+A&|9y~QPR>OIVGn)D#)`mn6_PYC`p^Fpl!L}8S4cX zx9SD00t%#a|N7BqWc`1x{uAf^6Ap+5jh4~}#QEiRQ&HFnDfS*PAG+)BatJ)Shluly zp{C9!AIYc&an2WgEBVq6SUq}eAD3{Avk$bbW}x;SdP0+0gIaziYPHtCHNiNWb2EhW5K5l4{? zF&{PL`OCF&blwV}#nMw}~7j&K=)`n8u0W|Z4o zmGsn?Q&=C&qsPtDycixt4Tb|3GB~N}l#ZSVy>>~FA+HB4rKLY`hxrctpi1lsC1HjI zJ>E&kD~WlS=|A@8hvH7tUIwOda1GxEb@JfP;5SZ9=RZWjo6#EnSVejK^0N`}Bn+d8 z35;LRJc?uraA*gY^9pdTQum@?ZhME<$;IC54b;*`HM}*vzncEQ-ooQo{IKvix)0o^ z;OlFC^y@f!Y=PNQ+zUReE)KninzYSt^Sf}KqpI;aGy>lUeT~hcFp{1~<;~hf&}Y<~ zCFPU(H#fn@0Y7%tIum|YGZno0u+wxWOOpT`i69rD+ST_nNs?JI8P~SC#nPoNw*bh<8Eq~2i1Y3K%A>BKM$_N{LHd1 z>fxu&HB-S+Y~lud=~b#`_r+i`@j@N`v|3Z^iQRAsa&H$?-nAuWZ0m4Vy?gOLWvI>Z z`IGG?@aKV9`dtUdY4Zx+F%rA6s4={&qWC%3fimcZKCtBmJ{NmW_om|=KbFbA=c1se z4Q)o3e4Yn)>&h``GnxqemUHmZeS)9cp5+Tsvn>YKyij|QuSJ~4cTkh>>PvhIv^D&? zfaf{$9KYy89CgEfTI0nf{DQBsREN8=&z2p0#k^>GgIe)Go`Sc#4bPENIAbAw_`Dp< zE8c;JeCVa7X9e~(eX#F(EM616K|vdErdyksXqL58kYj6TTHu1uOI!9 zK7af1KWF*R|3pruq9=2uREIb_=emdzfhYg*{qc>w;i7&UNaqn}H))_tD#@t`ab6Mq z+L=oVA}ip`TQ4RLzKUJ5l3A$pjeMh(vA7t~be2A651x58->u(ETRwVJwik@RjpYUUGqeD6h3nB_uG z<99RuQ*ku40nVut)1L4D06wrEq5t65nRmG#OG_|Q*}k$nKR6Uxc0Hko*02Zv9C|W? z2C3;ye|vty9n{i}YTD*w#fRYhfBcEu?r+3z!VGI}1bT4(hNeMMIB9VPX0}b!G+2#Z zsu^aW@(G%{wWyi*s;KEe9gVXTJG(uU(AbPAxzh;x{Frh6a(P;Oyb1VJ=-Hqq|- z{l@=lygzY1F!8>qJ7(DpjPV@PR*HW8kkSCeSw5q$$f2Q(T6F^6{-LcX9lVzr{ZN}p zn~C=21(6f#;K+5Rq62uQvN@OwbZ#y(#BQYwy|&v<3z1DIbbdA?w{*1flC;TEgvD;DgsX)vy7F?CW(4RMnQ`* zjJ&^jidtNU=iqhhSr;x4ef|(bkMyA*HED@x$KzPs`@n`~EfJZ@<0xeaaO49EMQg6a z!AlacE%p?7^N9a2?ECB;DN;tnk~4D1?T%eVlZv7!ADHT!lscF20q~}*f#1aSJQt?{ zn6U$&42kh_sU4%FjMpkE&3xw^J551nqLgIO(b>7{=U|F5{)^}L0++k9I*8i*>qqbK zseYWj=6@BHEyMg8alSKhtH{3ORj6oNan<73EwA zqRFFB1CQG$8YF^V{k%VONhWdt#@I;-9)q?*WU?RcTsk-|mCr>pfnm6#mRlU6!=0^w zhT?O~*8&=I+n%Y(s};^9j2=k%qb%40z z>*AnS3O}biJvnht^ybJRMa!CVr^iJ>#}1sETlYl0s!&`00QSXg5e@$sLicdj>!*wq z-7>(=C3^3)QBPf34OGyn2THmcG{&X*qhJb(QqbKZbLY693QC9mRHMZ^{_(}Ltd`e1 z&-xL@TpiBvd=un>B^N|pSL4pKzznpmOmrtqMh81%Hr=R3)b+WXS`Wtgf27CNP70fTf4hd4Lv zmxbA4FSYa-H`6qhR(L>TCxGX^Lx0r{I}WX)1@6`GIJ&+aJm~}tmkjSaDL6w*1CMZy z)8gpuZZ$2so5>ZI$B^k_Xxto*DaJ_>w;eU3G%~H+b`S?Xa*Ac z^Yi8nXdbv&8tgBad^4b}ez9~9x}d!bjA(4LII5_Fuh9BNbR1`UCF*k5F8c7Fi=(TZ z;LB$Dm7AFoOLxBEPF!8dJ%^U5LJ5CF@7-L$Gwf<%7UR6cmrFefEa4gI0W0_h!q4io zHF}4R`J!{%;I)K)yrz+@sL(_~n}d|}#I&u;EM3HVgo4if>qoyAyJY{(&z6SGxzJK6 zy*B{1Gg^l$Z5~KFo8nIF(2|S7e4t}n+?PguxH{AuXOXW0lc#V6(}JMDhj+h5&UM`y zO#5cS7dd+^x6uT8S2zQ?y|cKk+f=ka1NkDjnETWTvmxXT9skSR3=`CM_R8vGZd$Q0% z^Sm6~T=zb-=_Ycu4gUVT0hCu1OP3d8{<>fwZFhU7@5lgGbK@(g8CJo_$P1lds{!w`*T}yLyt)5fF5QXIZZg@ zC*U0+S2q;fa|zIAkl}2n)lTHboRLuoY7glW1xI(GKhYn#OOeX`(hnx<3FvX&?dQ^` z;#vD)_V0U^I|Z%_G;io|#RG21NN6CTUYcwDi!%tu9rzvf^!CQ|7}%s{5NhLw?Pw=* zXKgt8j?LZZolp2bo;B4D1L@P62>e^n=l60W-4ozoY(cNVCR5W_Q52((nwy_P2Eaw# z{oqN~VJS@nMzj|CyszDt)9$;mw5)9e>2u4ds|)Hn^dadz7ScLv8*mm-I2j(gtD3Oe?(Vcb^CgpT99@tbI`Gi@3OhH*i;$sOkPQ)ag3lvEUp=w2P*0J>X?u7*1z;CDOs!F|-gk2Ok{oC)jayImYhp=(d{i*?Qz-jkzSwZq-|J>a{>gi}oS@ z&%sAJ4Go7Un8mCYQCmxJ$LxX6zji09THq)u%$lEh(`R6BS-|I|vlXKF9Ums6;tP9zOn7*4~-Y@?%{qNvRe>|A}_O`~Q;Q-jTj(ZGY$FfN83^p7OV ziv_fJ0rE+HByIb0m~Lrfp=}>YL4o^d95h9b;OCedX*6nR48?~>((QgS=-z_s zxDK31A|*BU8n!QWWD6_n|R_G0Neqz7i^g1rCIFJq^hxfHR!u5`l(Gc|J zj!9LVou`~Cy8=rruH$-42%=o{<6BR)psMM?RD?QYM^IPVBUez6jhay0oEJV($A zOqo4}7V2Q9ygl-8nlJEE%u*!KkE%kSW(b_)F0jhciSW$8{g1jr*=P$@Jc72|bL;|t z+)Z)s!s#V;uKQIL(9H&s`1=u*Hu^X<>={Lo;J&mkzC@Q6p$>$9ijMttY8oFy$0bq3 z`BYI^f9MZ?0mgd$8byzT=0A3OhK)K+jW)%Q;o~T>j?JQF&~Wp`-o=T~mE;iy{rLXS z<}flNQ}nooW1$Zg7tdV+=cvUcoR5APqQ0@Hu_Lfwx$CbVy>(IjIQze{;@Bc7Rbrna z`PN{r#0gxZSI}fAmU5l5q_iJ%$+N4saqF-Hd+jUsF(s$Ck?mv@WC)Bjzm|J(O-8$s zPtL72q22rBv=%jXzM>;}qy|xsnW)1h1F0r8n2yH)8(c6EI<=@bahH3JUrJrBUw1c9Bqy96 z_qu?cQOx=LBIu)k73n>Tpxa~MpYBvc3tPY!Wgz;=&!4D+TQq4A&uiD~$YCseEA(P0 zf2oeR0=&?o=or%7@QGq$;nM`2f(8~hX@zw(^@2~3Wn4DxULQeIkf)M2Or*;BxKGkC zODikovT%MIt^xN+cq1yp-p58;eD|+^{pdr6*5@&v+h@%gPM7}Udo?q5D7PHC1g?*u zkvmY$onDF@avQrd9yy!~IQ&EL`*jIdIQx8PFJZ6HxZ5vo?_?PbLQVKY){3l5<+Ky{ zUaD^ovZ<0&k73ZsS>ZVp;h3+RHuWp zCA=Ynjp1}54Zeggb;Rb`@LxE9yRF5+_6Fv)2b+l---x1E9o&EU=3-e2;*t8mwBc=&ZEP%F>JGdVnrp(ghve=NN$0#`fPZeK20?0iRRj&PkCxcyhi>8l zH6&}Cxg69TYzykD8Grrg-)7d2vudF=R|S62Fq~l%yOG?@#}X>K2@M%_G^gwhT>|X& zY3&Yj5f`Mi6+heksOI*L#oX|E2tDni4}bVT=mCR|wW&S&0U2p=Z^qdVprxn-6CIFe zUb)ki2jGj&KyG=poH$JowZ*$A=L+Ckg{d1ZT# zc(S##6W34_ncKxf`^!|EWEx3>E1}>)oxqV#fQ;HVNBtJyL6Obn z^al6E@^69E?IQY0obBikcs_(eLk4xon#wJd#|4uOX56cr?I#lp1tkDG(i_FdS5Ham zUg+IYuaXt;$#!ql@J@b48FP^5pp71L^(VbYZ|Z#?9NbzXvE(Q6X9xH`HZd0`9EC0i z<|VGDZNyE()pW-?mJB}j5{J(W#|$x!hK4wcyO>7M{jKqI@x&0ZC3;fdX9-l+X0Uju z4S0{Q6R4Gor8uMv{rJN*bVgo9pYcv9ddAS^9V5x;Anrlr?ollVb3?#gRP8|TJmjw* zJ%=5=|Hj$0qa}BuGdQ=%38Qb1;oQ?D)chps^4am+lH(HUo{K+USI9lYv$%rZ)1u)s zXq-xE_6BG`t!_+B5%VkCumh;=OxLDkSEUGisbxc{bt$-Z&*6a;K8GHS0#4Efb6YDF z-N(G3^El++{z+sQB&S9xm=}!50KYtlQa*&zRL^|sjoped!1mqaPty(e&_1 zcd`CO)RLN5a&>hUZ}34qQ@)1k%tnjdFdvxrK7pS1o+8cy&R2aTiDGKUi~C;&??8Vo z$-mi)mu$z}!!v=b950hD^jFhLqp5%IMkEDS?MoZfnc_|&A7KBH2STVkbRGG5Oq_vuF0h@D@2EF!wGdCfqM&R!d?KgXh{wjDcMxOlV%bOR zI0e`XW{0!AT*Xc%@U$$7C$sNU#JSkT3>lL|P1np9F9lXmotR7=d}fHh>VPZmlT4fA zI*MO+2&VGW@pNf!8a+HGqa=AGneBGtCcTu=0@SpJD{71BRxo+>0w&_!tYn<6KPlhT zk8{@ZW}Kp-l*Uwr(4=LqoRg=7hVH{2=!XWXs=s|^)GS)#iYMg@Bf~%l@ z0-uHaM7j>X-}_#nblg1y9@>F)C;@rK_Aq_N-C72`)NbNg@;HcEy#VJ=_YP(Cm(!-T z(D3s6NHUEaJv2P)Um1vVy9HtYG=ipIYAMb`-{iCz+;Ib2@$xI+w6BYynRok%BQ1av z1NRTe8X>;i4|?Of6DX^zhj>_{U}_h)mVEtZi-k-%>X~HvI&7%8bN@i1`$_b=>=nuP z2GAOKx1^3HDM#fBxD(j;Wl4p?wV$C4whm(w`hU;jPN zw|W_KyTD!Sc@25s+90lQh=fuy5cBvj?jraI4Oil$Qyg6&^-q!x%Ug92t$7wxk^gw z&_f+4fF5=}a6-g9Uw;d&{3<2c7~m>t`{^Kb*q-8!F-t#Aw^xGOuo}A$LvK(Y?3iB# z<{5VWHJ-1Gx&^`KQLHEKF$g^NClOS*xVd<&n~Z$&qNs5j8*xy78CBhlp?Nud#j%)K zB!@wZf7USZ&k5kN4oxI8*U{ps*frbrG>J|h9W1VWw3>dkPNGw5^~BQ#tt4kdU?OTa zYLn!LIU0KK4xys(_5PGP|8KAN=vg3zVy^$kk6!eB1vPjHzsx}sihmyPrq&zl$N92I zhiifF-lQD*IGXO<;9C;-79l_M_2Y&?izC$&wRBZFmlY}{XY9JP>wA{lS|g>0KcRa$ z>;sp8d(h$rxQV~aXm?E@)d|q|F6u@JDj9u02L4~2E4{IjQ|3h#bd%i$?7XNi`oSOQ zCtq&=B?^2Xp+dale(pWE3LVrHGoi(&yMTL{ET!FDp~-nLk*ocUdi%SI-c|4Cx+nsv z32?#JEo&Jy;!21c9EmI-p&4P0QZs}<$f$;sp$w30{kqYKdJ z=mJfUfTGcqaU7n)e`=vq^Jz3}1k48W#i(yXXpagy5S!q`XE}|& z^+qjQh1uR6UwHLkJ^+8%Lx}gu3u?MD1N!o|i4+L0b=g+n&efZ#ha2?JbmM8NV+K7R z5<%9b3DkSs7V_s%qcu+?N6fbQcyRr?uOZiYjcK_;P6jt4s8(skO+xQH1~t{6+`AgO zTYaIE`{!pHV9^6!{*8H)6DrhO_4{r+s}Uk2)W#JTah^907Ig#{+A0Z}X~FYFnl@58 zJtc(7-o%TH3#Bx)6Z8|b`$Sni1E~Xgw&<90kxfw``QX3V^43RD;&d5#;0$MtY|3?N zASat#?9nai#LYPdzA%38adQy2G!Pu=o9I_d+_}zUf~iM)=+gA^h%ie zdW0h9^#tEZNak*7vGZ7f^SW>cXJG=2a0zCGqI~Z78O+e!QSU80#mT`th{P_+i<%o; z^dvPoAy>CJUCRYH!N-0VeAgtp)Vc%qSo31&zHt+J1djSgc;gKUGNEEBfE`-;WZ~Zv`9#H9`RsYrX(mmbRCH|X)#wH*?zdz_~)CF9-N$3-Un>v@E zAN05W`y8K-2&CG#&|f{#uw+41AeEm7rXS*0qC}n67`qL>B63U8`pBXGsiHK;s*)3L z87uMMUH#?Z|O>#I4Dt)QNv;Ilc5)$F*fq^#D6>GegL zRSwW+T@S2#eyC>VSj-{@2cLy6u~c^XgJw+({FPkesZ8@zlUN4r?gt6< zb?FC9GWtX*`jknx&uh+rgFOu13A;m=X^bWCe>RMy(WkeS6rT(tMGX34om<5Ndnzaf zURQt4_Txq>iZA{9^Z({nOHH>s=K>4OJ&*6WB3I*uIzhSyXFH=4e-(9d^NE;0&R@aD z-39LsXYXObR(`;IXq&uJQRmJl`8U|BYIFwLwl7}r3Ar+g-h;Zcqp?7X7b^n^Wdg0xGEGkgJ&5qQv0GO zLUCjGVJ?fL^Y_0Ao8f_Y$Re7W4mM=dEigmJ`Mmnuj6G}xoj{{CG+?;}tH6H!F>O3K z_GrnfM@3VU0SOe^yiUlYNV*TdJ)^Xp!tRA(l-f0lw3#>fP;jENaF0AWI7XA?hr2sP zL2nZe7O&omdH9|BIRB7)0azdeMt2U+<=AL`EjZ^}V&Q4EJBxS3uJPV+@QPjdlz;SI zN(pW8jz_l?;+28qfSsc&9R>);!AmtqK8msP6doWaSAa9TX-=rHZ?l}9Zd6g9#_NSC zi=ij8MMWXUa)d!cpeIuRfAj7Tbre^HMHS7jG4<##SYgW1kxal_Rvz_b3`eS|?p;FUCCo#(n4ktJ8m<#8- zvq9kzRD>MjXSsk)#Th<=oy?W*0@%i^DAKcrZ~7cHJCPnucOSxkw=#-lcg7C#*fsQZ zUIe>wJDT|OYpByRZ#M8vB)kveD7VgnO=$%W!(4cAeOM+)5zjVDF&`OV%tw^~D?f?3 zZ1m3Je)ui{q4nohwN;Jy^0m+aM6Y)INE+Xzm6Z5s=uq)*dAmtca=~}+aN1Td#4eQr zwaTeilZ2<6pjv>#lQKJYP&>CEbk;0?k92UszXG0bY_ ziqVfRAH$q2!)PaZMw65|Y{z%#c=>_@_b7m^2QEE&5I6=qBbo2ha0(g({Z^M`=7t_| zH*(0}R_V;sJc>#$MAG|9Ijm1Vcy~^LcXg+H_7*d*jup`H8GnRbTms*UO6Z;>=CSN5 z#<_%>#e}dEMh`Eetr_jg@=RpaaW$*%i@n;2em4m=zSzo*p z?`HV@`n-b1Jtpw$Qn9;z2G~W)1>VLA-2O=9%)M=d{qvyZJ`y_v;S+_A?SU7yL~mFV zAq+1JgdQnsv#UFWK8vBT22A^c=?URcFXRfG+g}GB3Wp4WsNWiBur6xAE&&JV69){! zttH!28BG4rf)<)}VgBI!pTvB{`SxIzXQHCIHX+oKO(*=TB)aD&yr->}ER81mbCo()rDhsZRB zo_5M+6}Hg-=>wnOBzM*lGoPI@>>^$+6cX^6`vUJM*cQ+4XsLw9hn&9nL>5z~f(~}7 z&y#uV5W`2Op$9n)4HTEcPD0hu>9pJT85g_jdkkw>_(*qv!fPq@pnvbAwDQX(^s+=vXiKMyf;1`l|k3B9+8K%^fBAJ_x2RcAI$HPPn_v0;%!dWyLuYfbq_#&tsfA zESukl{k0CKuv6sPL>Pj*&sYt;Yjd38FmRz=aS!fVBXkDlT-5|RqDF^=0iObCY&Fhb z=bJ*t5zJE#B0q=dFjcagJ|c!Q%3Co5MG$RMs-W%Wz-B;GG)o3Q@o}!~djN1P#J|yg zPj)XFyA_$3sST5`))gv>dx_t-j$!k9U_TxG(TU+3n2#RzQ7}`O=$OUiKd{fb0N?XQ z0ekledhLJulWwQkUR_|zQP9WuSji&0MN+%b&?JBGlx?34Klwh;d|&;AWv!1UUCf@w zX6kCwafX9CVOF@Jf%a5F3@t;x{igGkUB!+-xjK@T$5t}a(ny+znXFfn9c)L(aN0;} z=+wKiVc@MK{D3b^lLA3dC~1ivv;Ypo@wZzkX~=LXJ-;xnxarSes!giTf3|pcoY%vA zs_q2t!JziSA_9*Q^;MaCk+5f-luU-8XPLfPSc=(q2x_ov-;WDdTFGd}4QNG$)(Qvj z%IL{n6&bE>%&wo5Q|~qKvEI~)9WM%^cq#6<5@&X)B$!hD(5Jkf!qn$*o)Pm$PQv zvyfbzLGUyde90Dq@jhOfDjE1*iz0`W`$EH z%!v}VKVao&B4|R#FtWP;f&E0?d*BrGEsGmyV??OgLf~aQ)<}B=^@UCMaLW5=to4`z zf49VNYBWG!o0}RAmm={I@La@Vs&xsu!gwKLmjwZ&PIsVx%z|LdL=;bU=rX+*8s6DJBSvh*dSpndg z3}4Tx!GUds{&7Z!Ojhy~xH`VijQj!?0)FVGKnHPq_xinP#M#O~yIB=Y&8)x)xNfZd!_6DD5j?R7Bkj<8*dHuZ zljYUl>;w3yPHt*S+<%+ZZNM3yi+#G6hgtX~XlxFJzRIRBHntjjB=eM{SJajrnWv(` ziE_%{8X=5?&g8@O@P?Ud$5*^kP?_aw@MNlr4j3S31LOPCv;415$;xOb^gb%3?F?D~ zMq**$0^Er~xbJ_#8wLBYp9jKAI{UD&3bWTXI+z9Acp$V_$mr|^;BS^jtj~No-9-J+ za=Hx*Togp*$O&wV3$s@Q(~&tU%6>DQd4ijBdlEc5y#m-D@0tyh@ppg5FhbvBy$~9s zt2VJW<54H4z>{KQ4!hVDyOjoVU2Dt((JSqIdx5!BPo)K(TD3V)X`eO2Xl{G7+LH#(B`j;ra^_MLmC=s&96X@5w)Pbot`$=ESipB zo^G1|iiMBF4!9$B+{{av1RSwzbFt66Et_Sc*OV2isL9Y3%n`ka<(*)PJ8R7LA6Jr( zNJdw0E)>L0z`48w$T7A7U-wW!Z{Dw@7wQc~jgAJ9y2FZkao%XqL>Q})l2U+2r0obH zW~G#d10Vj7w??q8mQo)lyuX(Ug|WCxqkx6}N_;AKXUJ$KdcY=UOxVD+atcL1@_C{i z`;`v9?rIfve?n|Ab_uhl<8F)cWTo#BXY6=bi)1XdkBWY}spwkcHS7oap+|`Mp7b>K zXaB}Zh24azJ?xVocm}BVcJd{xlP~xw-O-0Sm9l8m4tB>dbMJJIT{{e~vA*E3_kG8z z;ZdkY4zc}J$1>hRd;b@9d1QLpiIQk~g8V-Jb3^Soil&Mw*t=i!nXSAF-tTK@ujN)V z{caJ|YBadqUOY3!8K2S`^;O+w)&TX}jiJCiHPhK69Trp?$x4!(ANgD>=MjDKHCd5o1xXS61whf zeTC-**!#BqqYuAX=!`l=?=JjzmT84)=)td|etR<9Yp)_ar`wr3*y=>)HK;6#HxeAsyG!Og_`cq~)RdYy&-!%S%D zo?FY#`C`VqR7q2IZ)dVxV4~}kB#b@4jIZEq-oxzk5MvkW;Bhww&*Io+rtpZM_$n1G zTy~H7B}S6LGI&#NtYKEeqR8Ynd|vWvSTTN{_Zm9}bvN12CXv($_3GX8TJ}^CPS1yf zi`X}twE%~@i6gk7rO~Xf7+ew5Y-`34JDCbQAgkH`sF3 zpSpiOq&ap~K|=Y;e`33033gU=>!0V4t#A0w=mAxTbFiJ6&?{6zaenB#lf}Y=M9c(% z(fPcR3I29c+J#y!+jxucbsKhA@Q&xkmIxt(v12$6UNh(K2(e!RX-Q+$8~1hCqB87& zUs2MGB6xn4$Z23Y_-BD#Sc_ulY^+q$xUMd2H+q(%et+?ANC*cHJWG$f5p1fOxVwTec_a#(wClQtu_H~v+?44@5Y zL6}|Y^Q`(6JoWP7Gh!n!nL!kNsf1>`M?TAfKl?k}YaeyDv-=CcwV8&R^KL8~-d{~; zyuh#Bx_~X85Jp9P6x4E&4Qo^ZjeIVM@=hHUR#+(Ma9kky_AnKMieQSyuCe&`2F=Bb z&}J$4d-r+xB5&B#&(D%+cle`?P*)(%EBn6TGvN(nh&bN~Xd|rkkf-Pn% zOK@f$Hd!T1n~(W;l8RP2CJPq8J#>&06w~$!Lw7+lP#?JT(=$Q@_Gj0b) z(_PF(qPyy{DMNy2I?k}QT{D(AF_@|bW1sVTN47j2yJFqpfpx4ed)ozCIDM4Vf3+Jk z`wlM;cX%Xl9_&r4FbZ0)ga(!$b3mW%{aH!plGMx={4d>Lc*$wv*$L<%`7}rWzAA+s zO^u{xG4R>ZNo9FjX!RrKOi7Pt--HOVMIALGH<&#e29C#k6_uzx+3_xFvQi`ewi&?Y zdtzq=dsU&~dMv~Mx^#z7KbfZrjk_u-1YE;&w`%xLWx+Jg0b1~PC7R`@kv9@nQ+N2$ zFI*8st6cw{?f>0_T~bT=$3G=B3USWsd6FMBQ9=nT@Hstd`EMg6)TJYQf~GeYTAY>8 zc+|`-)qMnMS783AllkbW!o_`3YUrw>jo*TVj7fns@VAn#O-mLmF~1W8oYisJg3nVK z^@vmwEz}6oGQ=D>%bYzGLi*((dXLY2(z#a1HpAVGT7OIHhO7tjL`G}Gu)>TTod*A( zKfAtjt=MwxxCG;Dzr56w302tfEW@*CNz4QM@g|sunr8IK#U}ViQql%stgYNxN_+&RI-(}8a%ShPz(+-0Wd6XGjR!_#xC44jdL~Q{xZEWM zue+(2gaXW2T-&3ky}C%aHBd=^df-Ui!@N0m&C~M#voU$RWf$aXYxtobE#qCcNN5`Rh{DC6c~AWL zOEJJG0-6bekCY~H$Qv2mgk}bTbny#3@6@isW#Ipvjw(rGI7hf24$c60@0WWh1POZc z7Q>Y!RwoE8ra?yt@jQ7WT?hic6riglzRLl@5C1<&M@dDI$AwnFPR8L~ech;1SmKSH zn2Ac-cj37Zpv25@x01$|)d>x>YPw;A9w*b7t%aBC)neqdHqF^@aA!{S4I#ZvE!mUy z;7;Q`-TSTy+Yb!H%_;h(eJX2d=Fkim(h>p zi1YZ*&_#JY2s_5|-UVHH$ z@4)8~aW20woFCatLK6{ZMe7cH@QVPl?*N?rKns4=X!u)QLCu!fivJEBAmeb%VViZ} zgTSA;*^3x>N>lm3_rX+$S!_}7OuiU-{RL{%xI>5eS-@+*HOF1K z@D#tj6nzcyd`r*k`~mD=SX_m+;JO-q+xT$mjXdx>>k~h!YXtB~;Dp1!^LxN$?%NLY zi!X0^FL?g8twG)1tD4^c9k$kgYWuFI_~pQ&`c^7w-Pb+*p2g4v!`|ua=W5;vT%K%T z<&(a*;BPI4$Lo1HW(o^5D^CQ|OLyq$Pq|+F?hx+GdC{y zd_{}lS*+iYPyLM^9d%K0KS8svEPy7Wm*}11qY1=0ce$*h9gPh&JD}MZ910KhLyJo$ zL4(u`HSt@&M}x-nm(qi$O6atxo$q4Kb#S|q(raHkp9%mUX_k@(BzJe|fLU#xHFoVT z&vtoR{EIS5=-v64RSGZwk*hK~L|(TS8}gpepsDE5dT=LiB97+2T)Lw#91()q)21^nUaQa- zdMjxB6>pdB0nmrQetVlQ8s{#U(N6?MyeD?u;757D=xQYY_|c!n9-%tFK900WwV!Wr zQ9?C{bM*-mzV)jB%0`^IwR1F?1pyRm35?Q9w>YB#IACSq;(OY-%<2P;I~8zDMSq}uzvBRrg>4{xo1&zJksc!1^*|DvD=F@$ zN^}|hPQqQ_0)gv9eRAYfRRY}*k8F|U59rMAN3TAiMASPB`_u&rXtQ4t6{B}I#XM+Z zr{^MBckCnDD5Uhw^lMO4&NCJGL>m>&ac<2uULH;y>Y{mqCASFNC6iOQ zU$(a9VzJk90=?B{w{HMj@S7jPk6s!B|3tU?d-PxW=JO9v zNa!}=e9*#>uecpRa}eiYga?ra-AP2;%=gDL_O>_cAcnSSRgc|l@zMY z6>Y{WMvMCX@wgMB(PHepAht8Q-xhU`4WhSO6m&G{i)dLx=(}b>i_gQD>x0~&kNTaY;fSHTD(Vl-#@h{{8RC~JY7G9; z&$9}mqP?OH_rOU&JfHMGDVp3Kd;0Ovc(S}L+8+-sz66}}tk0sScvffeer}I8;@o>- z=2Hud^>SIxXq$AN!Z0dq$K;QEK%8bHQj6t{N(IjQRRI2vky>_z4vZWLvX9x zzfscH@7qK<;2EvYh3|It22uB7=-6$+-CCX?N-@Gcn1%fRc!{XheCT=qnXv^o7MbEa zr|b=)Y9Ak$GiRWC?=7QG8*QAo9e_9GdFbB3kN)j8Xtsmv`QJF}_O0ff^CWZ zTJV*fCG-tv$=kX;|0o&S(Gf~o5ZI0PZ3d1y`aToUKz`E>;M<=RG=>|+TMQ4RNYq0n ztGxKco-#TWi{DqT;xEpS)9aPcOt}!jm*oeM^Ku1kd7R8|_f*ix7zJ6*$lyoVsYnlZ zrFhIi{wBB{U6AwTF30%>m>HTOUnTS|<8QyjU4}Zd!>|f|-V5l;G{iZ{yT}h}h?xL# zf>+LQ{>5T&^ZXFc#YOya@ZUG%o+~ps$Zxq1J%BZsXU|UNN4P0(2L@0&_%P3=?cmeU)0axncV9fpw>%g?ZO|hO<}UNQ zeg@Fw%S!6m=oSBUu7tet?44H|2(NES;NuF6=z)cx#B8_S8wI_*YcF*8C8b};$uD9_ zNWB+GexVAgF`Oop=*TI35%@i^D+J$(L9}^}f}UnZ2rjRJsU>FQ%SWdOO;BHyBPZG} z*d;h&#^FAJc$xogU5w;5!lN=huU((86nUc*a&j(#1tl2VfNK$wvrmo zIwsUYS9qB{e8c+|2s><{uj2~b)*?^XwI`IG0qf9>PZo~hIS$5N$1FBLC|!j2bq4mz ziZl3!*zeBKkx}W#`I;{p1=V5}^%j2gw{bRvPW9tlzU(KT0qp2La8buY#e6Ts=er!9 zI6kNNRedE?4*r`s`4Ml#!zcZoiuRo}5M(n0C<*=GI=PjQXdeJC8u07JISV)M`%^9A z+~3$kIJ?Uqeh^BUmK!Yi=K0gRCQ9OL*9vV)fFt5=4l&6T!e07QXUr_e>?;!5x&%-) zbQaPauL$e$>D=WPLi!T)wZ7Qb@@~j{Mo8&A_A9)?o3pb6!K1bgrd4gNSksAt zwCPR|&E0RuMzxhv)>LqyC)%*m!TuBheB9gs9+cNt(lLK%+1IsWp^+=;u%3*>!)#g8 zm8)r=rHt0w+OoHTKfxW0zBg;m_U!Se1n`G8b$KhSn}l;!3Es2y0bw8qE_dQ;T2$vE zylE<@S-^{G7j)oXL}4bF;Pa0kefPdWbU@d;-g%zbtAX&oiG+@yL_avBl3&~oeEx_K zGMx36FZvNc4O~O$^V74HQK$|Qg4 z*jz>5@2(Y&xcQSe11_<3xA38_KP_F2evP!k%&z`)#tvGXFK-Ej1O4d@>bixOz6g&O z`;*&t)D;OPY~?|Jn&+zkj$p|Qtpmt*H0qG%z1R=j9p!`I)ilACeUVA1!bL$#I?rUG z*kj6_35}O{Usf{<`n~fp>wPF;Z_zg-_g0YZ9n8?3{Ha4mFpV6yl!?t&(Nvvanm=#} zJAZ#A#XJCC>Wx49ab-36_YbCl#R}$Qf*REWI~%Y4m<8&H?8De;FQ3Lr(a*jNk`t(% ztTpCwt7G67IJ+ZT_YHcCs2l#|io>5n;DJ*g7ya=_UkGa}p?J(XpD%dBheMZmS`zX` zSrb8ve7hYy#$(@m3if9Z^H$)EyH68R7Y0!6Rbch@VM2>x0q}7KCh4|Wu>9>$&&PvH zu>7zv;G91>nyAQbU%7Dqv_DM)<`ZuHS~zyzpR$oZhszCF`U`(DpR1(R-P`tnL(*E3i{@HBae$44wz>9p<0oJ}Oh}z3l#1$T3;c4hyhJa)IEt@p~hF#VY zeOX-;Te1{>4MBgkAih2hp)vjH=Z(q!MuInby-}s`cwMX~`~Y5eZZl$j$wr8n0DrMX zi0#C&LRwt_S@nb`*ANAA7izpuDzezJNw~NrfL1Z|Q*)09Qx^qLVl+6SORovThahje ztElYMC&6@l0D0m&KEBYH^`8?!t${T~=vgx#%-)|=D9LtTKUVl4fIc8Tvd5#@K=k;H z_oMH)KA*)^N@z_!cvOW7wm(ry=I3!w&5LLIfuD?i4}5Ru7B*+DjC`HYtB%>nB9r8l zv<(<|guveELRZ`#y?WnrHp~j=9a!`g?Jd>|_vtlb_;9Vc!&V)Ghl>sNVjfqr;+4QN zn}RDTyUIdJkz=vDKuQI+Hs#tj#*vJ|w&1)K9AMSMfk)vpv@tuunqyaPEI8X=tgo{p4HWe1 z3G!a=TGsy>`WVEh4X>lk^uS&MX6ncGG}7*MfacIQ?AF~e(VDp8esqB6V8ce*x+>_F zqlOM{q^~UkpTx8`u+k6EF^D4`!_Sk0qww(o=rgAxB8z;dHPGKBG6CG?;l zK5NwpfgdQLN;7yw^3Q}f?Xg1y9%=gxhHOG>30*~B6TQ`vc@lh+3(zkZ^ku#9-+8}7 z1#i^RY`|gsTjwjTv|b1Ir2_`(ZCw@e2hlb%8#>Jss^y^xT7z z!9yr-qKyH*+WiZ(af;h&L&JbGqu);0XR9?8LF?um=IdNHtsD3Sjs|L4`_fi>MFJfZ zJvDvsveGsKUsClMIzlU3YNKz1x04B-1*a>_K?S`-aMb?E&pU8tpVjA!YVS7_UUTp} zs0Oy5YA3j&?p;v`EcED1K{zI%RjI(2rpF6!H^4X6ADDTs1H!ub66!iBgifEoCY)2@ zKI$JrbAJ953gB^*gL=E;;}+}!-i2`u(M#^IXKivN$cNCLy*QM8gJ;&A7l@VIiy8Kn z(kGn5qDz5HFHcHw?~zLb;@Ajh?7V<0lJIjgvw-$qr|y_tZr;Oo9LE{Pv%cc1VLq6J zRc;F*<;HS$p%Q(;N1UNik68~J18CaH1gFCUv7JuZN)h;vm;uik;i~3|u{TOZbOx0DL{gwXt} z;f!J5aOzO-QO#1=$Wz!oL_9B!+{JuxuYHch^IBiPEWJ=ymtgm=#aVV6Sk9;4(EogP zi#e);sf|4}-?+D|_B!UF&?Whv-B8N`Q~aZ^7}3K_TZP$plUitP-Dt1f2HwGESL~0U zanPP$58bsr*qgN!X^(*OSY)ZD{KjLoYIuJ)%0eCfHetpfE$Ag?m? zIFIIaW-$7pFZ1E;8$|5pTyP`jh0wGgGg+rxaDctR?fEHTpG^a)bTx8*X)No%9b8|0 zzGTH__KbrDayGoJt@p5D=vi#8V$bes3G4byPPyQpiw~5sh3~Py*%`fD)kAi;y@H-i z0LLQuE4w7eJXei9{YQpc4j4!(17;E0QfrV1ElKDyjqYuu?VSUz_*D4XG;!3n`U2iu zKJfiPL$pulMNpuHnoj(1*FJ=H&7d$f_4_hQyEY<<9Lm-3?3k_{xB~n=2JJyr5A8N+ zRIEfkS?9>JSa;|y=l_lK0^Di8koW!@=U>fQ3cj8a;%h?a=cYkI_8H_@%y;+P3l>&_ zbDn~;J)=RU;A#v{s{?pX2b2m8fqxd`J)C6xO&EsV!0HXaQTMfA=LbtE8Z}|R<_@eA zX0`G0&@MkdoN1904y?s&u5>P|s{G4w}H*H-U|qyZb%#8SFxy)g4q-G%vpxT8i1q z>fM5sJ$#Ulhfq=Q6@lv@rB}$|*$sXR{+N$dlspLyMsIQ zdL+yIAf;sV^$(gaWWC3McX}3QeoQE{XMvQ0dm(d75_6jkZsg|>61CpW44TL(rSTt) z(*x|}ZTPLA?%KWZIMcftL{XU4oosoH4Sfl0!3!Q_@1L=koiIPd9i*`N#eM>BzPBG9 zh0l$&g{URsfm5_;W3GMO8Msgza9{d%(w+ytbZaKGh+Q4E2ce~5vJ<|#o?@*6x&#;B zK(*&eDk5P+<%1sav-~$d}6zCZgx6 z!~0t{`>G%r0mUBK*(f!$r$-GPs-?}u~F?>dL~`D-p8 z#c}PmSKjNsk2>j18=-qe{C^ZNR!^7@M)(8o&PqRho((g_CdnF%5EwD*_GzA{(r*KBKw@qEed?TV1x~Hcqr7j>QCxXv-SG|7f$j3p_6s%;; z2@a_P28BpTusEAbcTGK+94dF&e;-`ZE7cp0`n|2dMa?v(wwnyM2R^@KN8!}>9)V&z zf;+ojb99fb`0yBXv=0tAbhR}-3-!SN#*JH(3Tn+J!@2Q=`$4DHTG!X^qVVk=n|-x4 z%8Nv*5T%(z1^zB=`rGgjwcUrn`_l|yL8JZ(?KkDDf z51W#~alOrvYFtZg{209SmqMv+jR@0iPXDbIwBRBlnrD^KV zWg&8P8@F5EBsJqfs3bmu7wb^l)X+Df;`xyq#dh^lufvP5i+En9&JTT%Ew|GC`Ed<>89r>ap>LXN&`&P_ zrv%QkdHn(UqF>y>G5>0Hd#2tR?Ywrx+sA!E^yTOT-J~8%?7K)`@&azFw(!#bUaK46 zHS7sqvHhrBdcZj}e97z0=O5P7n5`BiR#ez1|JR?t70ae=q{pvDjnrUh9nBleOyF-n*=09H^Cy?t{AG?eX_@9c2frl-)qG;r z?7^Q`CGXcS@l+f5z(WR*r!KtBqbKHvhpiA8i?ZeQd|+mp;j1f4G|@-0s~lM#AA9Ab zSFCB4$2H)v+cZi)waF|6ux-s@o_e_ z^TSWueI_yF;U3+;8CZ`Xp5x4;`Z4M^7jn?o^ecKzo^AXdfAQ<^R6jy5GU@_YguP$& zzU%=vzahyIzMcA24+Q&^TpI4C)_e8gozTcQ%w5}oiu%JSutI$QOxs51MOQjLtDWr= z-&xPOVP|YuFR6m|JO}SSKDp)BK<(i)?kRH9*LR83rqlm=W6uM#618*S|5M0QrXrU$ zzYJ!s#n7_J^Hm!T4_g&{wL*MhJ!m?dCzbe_ma2N%RqS62AIsHJ|3IwBhHbz1a@MPy zGK)L&f!Z_1=qvp^rAlY8wKF{RXYIWtFFw3~cbNXIwnglTd%-Q1=)NtzW!G%#;NI(W z4V*%JU?%7MPJPUNU#YglpBg~Z*YFG#*vB_d&guTx!bvS#q|`O)z`lWc z20N~`*taSc{>T zxy$E5wPUnig+1gkpJ#Y)(K6Vlr181aCQZvmY+uUfFMF?OhsTn7OKpjrS@QAu z)WmH1jaOzl&fn`6T2OED%2Q_Yc~h4%diN6O74kiOj@8t=vwQL8bGgFJ_2h5tf%%-b zeFyy_&n<|5*Pft$dhR^z4e^KHPsi(h2M7MkH*&u->A8=>If`%mZ55~wx*9Ay@dsy{ zK>bSI5IIU+l)8VC9)2xIsyqW@bJwWv9}y_sslj@6DW?CVe_wNko@>W6tz$lJ6L_YX zb~b$Gj)D3%^Yj1tbBiGcYZBO)ZG4|4y_#B2PKCFGe@p$_1FWO4TLI$6mE}R!>#N;m zP9AoaU*fFG{M_X=ad3oZiZvI%K7#roH1&>k3_ialKY41yFYCE9W=Gt;ca18dwX#8v zjJQ2)NfoU*_4aFKk9l32Y5s?pX;8}zY3igEAIO}uID5Y5!?g3c&EiOGFTdVJdw$C- zz9r!-O%2vsU1e`bT*`J~zE+>O?OzU!hUisVPxb&kDiW(pZ`C@o2M(-)R#eC#?K6J; ztvdej<)pUYBj2$$Tx7ntw5>udOl_U-*GtWLagca4Bra9T&=UR71>p1DB_Flp+y-T* zm-o4RU3)l?-$Q;mKXb2kx(0Ve#LOx+=4u*w*6}?%Yv+5`Jzv18@V;bP_QgB!ee|}O zpa0L!IUij}$%ma=;sb+nJEfeNLQKGy%BOxv9+?>vuxGx@i<7^va+eO+v(@sN$^E?D zB^Vp_$?uj_a)rD6#fBWFx30Dl>@Id|KJZzaROTLUuv@#T?HxwbkEfTQUoeF^c=z&< zZ`i8G-$aKFU`?m<{VVRg=Frv2Bn>Ll>wW&^a3zD-j(uJ&DDIeg+$>G(nF)8P<(M-C zem459Ri_;t$30@E-i*6KLtn=s_1O8hp_jQd#c}OU=GkqT8>a_2epty&-3gnQjdl#B z?pV_cj+$1h96MA;|8Wpph0a?Xr}u-ChFa10{4U4r+z4JDMNTQW!?Eh4AUQh_y^JZb zj$4wMA@MV-28TLMzfV5od4;a(?U;|cW(W4!vTK7w3+CuWm?vlI(I;{9QF(AyJI7Se zk}t78J%XKk$A>%Krj|~_hws16Z@5BCcuS14{o-tRi#@+$+v3CL80whm8H+GCITH_$ z4O~6gGqK_s!}>+w9`U_|sCS0x``zU}bMlVs@~Lm1-KBG;zwIlpzI33+tO`f;l13{3 zDi3MMcfQrXqng^1UZy^OSK*;*=|hvu#)b!P%vLtL*n^NOhr9?@N7s1%i(~v|)B^SF zm=`*$+_Zd%Q;`L{rP=`eu=aMAeB;+vEs9_l z!@JzK-53=CZ;}=Nd|oe56?)+=^O*TO`LswiYUKf665P2#o79O&@Obni_MZ-^ht*87 z4SVM6dtMbf%kH}aoEO?-bq^h)VLkk%Y_A{cWUwbZt>|so<&!xZ;2RuIUOret3cP^( z&V}z>r<&9Q+j!oe_c5%oG*EtWW4^x>{%n+u)CF(XQs;f`DOGT1t0Av&IX5zEMLubmpG1KkroTKdNpYo)v!e zvZJWfY2Z4BbF+pX{ZnS`m9Av%yANLaLauRHtFjZTLu&D7 zw;xh&x7nLF02}e^vI+yEzM%y?=jONS0R0YKx=36uxm(yIUAn*p(Zp8j>@~@NerRDt zRF#hKEZxCB2d6ZVDHEC3&7cmv*IqmWykwIP&#vGA836vO?L2=8nlhQ2KyayR=)uAB zcFND5ZXdSIhqhHXc0EnJIOCqx69_@=R+sS-uK*b;M={X)|04D%yF^Lpou=}Y)v2eQ<546J^C5c^C^?F z+PU1;Hiq6`-DET|*~7Hokj$*37jf9tnqRHKhnE*7e@$~#xA4{Xyd%rn%u*M47HfzJ z(<&@d#eI1$`0a^KJ5(KJ`}gtNq-|$aD)FQfww*lwwd!<+yoqg3q~(?pr9C8*f1q1j zN!db;m(dj)cCRfhzIw>T0n`=G+MsO;U(LA8d1eo(GTJPiUC~Z$K2`>FM(-&IAE@pr z&O^bdFNGhhO_(f>v2Y)NK3Du=d6UmaiXY~d>g!s0#IE=+_KY8!C|mja-(jO;)%Q#7 zIpo71X#b7bFRnbp`Jese_@r$T*?@QbD)s;5^%D1#=d_payl$l=U0}Dc06nS3^JL;Q z-j(6pFs|$(*Qt|3sXhGiEmEuQ!cCO`KN5QMCA;}bEb;n(^WdzOCPUH}_Se`s&HkRj zWt6*k=BKBqP*X)LbQcfuTJa&H)YB05p(W}2cF$AZBdPZ)@J_8tR2}GX=2d4F^y`9Z zLJl2W4=u9=Y>6%BkMBWKoxNEU98IlPOWbU5wfKo{87TJmz&Va%XR$R_ zZHtEUBnLZC^ymYhvOoWpb#Ijx6Jz-D*-cF3zWs68)Y)P9D*3MGAA@=siEk5!gXa6G z6V!6G@!_!U>s0apdJud#(f_!*L_GgUF6%e_jq1vuO>4~0vCA)s__iDIHu*(GSx3L~ zwiCApY0V@WT)Jmpem`2JA&%fscn9@2W5xEchnQwl_Y>#rhf{Chw=)|=qSp;?Sd71% zby*>=|Cq%O+rC(yAU5z$v^~K)s~wU#Z7g#B5q#j3mO)_9n9=>R zdmy&Lok0b9>W%5L{EL62;_r>zG_j!oXulwD`}iZSXDw^^HW`$%0?tj(tJKJxuQ);;W^ zA-fFOKeQ->*gX+*qTTzbgZN}EyG-m_l&azBE=P#N@@Kco*WF!iS0n%4 zysdf+cNZt>ggOIrNGiWxswMATx6%?go_yLC{~y>;*79B)>B0NHptD@O#XgaF#pa@; zr9m|hIm&yu^}R(tuH$Zw{63^sq>N!dcyl4~*?y%={0=@Sfqvh1t6aKnmW@ZrciB?p z;&pCB?h_LVoR{8tz=QpTkGlRn*>ak@Rp!jOd%h6sB5;P)17!cemojiL`p@*?({JB{ z>%k=HZ>bfgU6(pPJfsxQ>tMuH8GQ>}(`IUk57++n^YaA46EyOKY^!LI4t2;+!CD^7`EM-8|JBb0znnDOe-E!C zc8<>hu}poQMINL!dv`5WjcEseV=Z#l!Plw|c#paG z@bk$9rMH2e#SvevR9&3dg$;Cq$Fh(?K2dLn6CZ|k8z_qolS3!)zJGF&r}Qt!P0V46 zhRLx2a4!+WZQmHlR*G60U;2J+v$$QN-b?0rH991%wxSVmlbEpej8xj-DYd>)^Ms^J zG-tjRI(AyMo=yLv@SQ)XYT;57DT)DVwE zcwN9aUEJ3jn1e;a=6U{0k6t;0N5enj!TU=e>AiKfg2 z>f|$}sE2Z{RevXfktSB8Jw2ngwWOBd`3`UPUEOT!E?RSJ=xHbG>rzYO!{cM?%Ry|u z79Z|h!bzOR@m`F8v-j6nbO?#Lyo0k3@H}3D)4*qTcA77dBRnKv88`}kjeJ34YZS3D zywz^mwh3*%bKob=9h3Rom9NJSQxC!E=ji#b7@I5mGdTn%Wpt$gDdh7;jMRjK$}vyg z@EopV=DlC&>AI&&`Vki~>C}p)Z^@p*F7j+K`+}i&C3|*PDMwBC)H|I!Z8sS}P8q!I z9NgBtgA?GMbxx33{9F2@aZlmyB7W?W5)v#j@o+YI%1kVMsHc=z^wsdQ7`GnnOcI73 z{qA0#5_TYS?vwdn<~)hmp7GI;^u|r%u=BWgjZ|b;a2n*kPF=m#RpzB}#N>*HH!G(R z?$VQ3QBSU__So}eeQdHLyEr#?m#3{WXToKrdTDoRCVKO8&170_u#x?!k-U1z34Z4O z@zm$LrlU>ZE^W=sNS)v?JMAtLqsaYnOJxIfwQMBzzTYfgnR|>(g~z#n64)RU^Gjmm zu5&WZU}ipm{`C5E3A8s$U1IO*Sp>{5%H_Pl%4=n^LGSv;gm-%1AWBj^!>smj!&uQ3@8;q6)P zfb7iK)lqO4HK>_wdbd=kbF$Yf<}XX#1JnR7`0I$t9o)AnuOtsSQG?t!<)%6YR{U=x z_Kw+eiNgSs zG<0UPxnA-)1`huM%OnQ;)fId=y?uh@qc#)reyndYI9gvZeuOhH|5+)rj@^4fw0nuG zWh%0>C=wvI&fbvo7repZ@%{gtmtQ}?A?#pQGyA0E+2SFJx@Bp%W0G`|xjMeOV%QPc z3Lg6qyXIZ-`=xRmdH=Yt9BjEtLb#D?Y{w4F!A*9zaghvgA!Wwf%kI?KvWRynU)l{d z;GV0L?e8J?rgv0({7iCx*1xff+rjwzeRq)w=+S#SyU4*VS?>oe!S4)Ph@W+_^OW%N zstoVNRP6jT#~`(V+_WD%uh<@?j(>o+zb5nHx4Tp$uoj0JQ)>;osS?mn&oAslXJ?Zz z@It?xspXE8kh_V@f5>+g?d!>i>D<81pzhq)UQRl}6G$!b)-+7^ceF@FdakkT5RxLe z|JY0K|0hh|fxlaMiJ$KkBb%`8F5+snn2q8aOWa}({4i>VjNeBMLaZn=aF6)q=G}xV zDaYzW+5X5|rrl!ydS#P1q7l$xk-v2Lv>J{>v$#=D4xhS0Y!XaT=Qa4B&kN*Hv`HE> z$1Ga_9yew$=fFc=bL|MW(oH)40TkhrQ>;g^TO+Vgt7Fwao!s~tVCX~3s%Ve{HkgcYEczYxow%JuG(qn3hx3ZpjP{JAZB8NPRmA4jeldX+BO3 z=Vs~%cGmmMQ-zondp6;@4BDn5*h7^t;;S}iRdzFc5ya%$gWsxll|7{%G5NTCUU~Qt zj@(()ios=N!F_J|d4HRos4r_XEOHs!Ey>nSPW9rBiFf>>aiCng?kk_Jg40+rT`awc zmtXn2$^}X#rvOP~j$HLPx>X5i2i0eP+BRBJ*>!xbjc)AyC>h$0o|xEjoVZkuTTeHh z-ODKMOnkj0`xx@<)fp06)>FK4^85ToO3X1hB-xp+(%Z}Kb#O0$2VK^qw0xp2ebpP? zyU0`O05PCGTnts;Oi`W}+~jh7cUfFC-7sOeSv>Q&$fvZAj-?i&8C&+hwq3s~D=)

|!=Mk>$sFh~p{nBiGOnKWP*f?uU+A=yRtv zk)_;26`<#uQsT^R_-KB!GeiA5ouz6fy38@N(?q>#?<3IArw58xlmoVQe{Y#}iwum3~Qo`^@szg~Y zdEb|wF5#$ByUpk%a3|k#shUDw-g?I(>#ucHi?}8E^w%sicfT>b2`BGo&Wlq983L#? zPnUF|uNm!_4b7?Si~noqO-@# zo@~gz(9kc`9oRPb?bSJ|0vs(Mt-%^ zFFB^}z&jdH3{LIrdsT;0a2;$14|Z^!I+5K+29i?-K8serHi8c^antwBP3=6(?xq~K zA<=DAVff`1mt{}m_sh^N*$oXiPid?c8)|NKm&)YPCng(1JFx3Vyj`U0f&7m5H(KP$ z%m3Q>Pe4{Xhg?rEnD@F%N9??2+<3#Uc^>i$J4e(UVMy;``qvzz?XB5{D0-!{*ty=8 zFvF5Q)K|@!H=bE(h%VtN2Rg9VZokWL;{-igKkD0sCk@x&y7ZFxf|ux2ke3cRz0 zPX9Di;!a{Lz1~y3fa-4a71wRlU`}P#Kac$2-KD4Vu~#m4n8&}y{ykbNmru;r$Z`7W zF6vvYAQ_z*D;f+^D{2MHn&I%v)EuMo9tf5JvzTKx8mD~Vg(xv0K+4w{qWXc$vS9}I zetjpE?;tvvJje218moNwdA|5VtVcO@k-E2d9Q-r&a;O73F|Y%(j049Eo3W+sU^FuG zh8PZQcasI@!S3`bZ*Y#M*2P8}(&jl9!_KaGT+wfx=g@P#MQVHfH$L~Z%^IJF4BcRO zX>}()(*NddWw^VRKD0RhPGfOH*i@4YWnQ#!v5mnkn^}6>gF7jm*H9~n+}i@5^DAs< z(A!gfb)*gtFKy^wnAtmhpSf%egD<>lFDJ3HSklz6x;Xj=zSPfa+Z(2K_L133nVshC zZ+L!?8|z)f^DPq%%XvQvUPRw*s>RTq_kHmv{%p}OgL8*KIYS>^_xM7?72hC#l^bNX#=Q-%0^w&^Un`X4>|G5;SwQn8xr42O@yVS=5f z6)kND+5^rII}c6U=ja>?h7&u#lJSmPs}n1*bJGp^9f$5T%b1qj9lVdXmiQu<$j z&&dm1#G#0k#2L(#-m#b8IWc9oi&=7Tb78ZxVTxxgGhSwYBeYM+=|kOQ(h4u>v1oC! zKYj6tc=V8pl}x_1&@3&6aGPWuo>XqJMGEGdP2a!$P-g%4_UZI2c`#w-dc$8Z0DZ7? z*I{`KACJke42F6uD!!^Yi33x6RVN6*!#L?kUrfxm|T) zjuEs!<#B|U3>`vD@OYn+7-o?M)Xd`|Y^~)EdP_95T;pmDt;?7l&Rxxn=v-H8k4Ui0 zR_frC3D(I8)`LZZsoBw!eZIwduV#p( z1qVpv={?r9;4Uu3qK%cX&pOy8L=G+CHd`fHk7Ns$9mMS)MdGX;CqVp}58G`&WPOy6eQ4_dxoSCMUF{q!>xdN#^WL#0 z4GWQ`i|D&Oo?08e50S{N0pfV_nYBweoJc$;FXy|~gE@oc=M3r)+Y{Ep;qa8wOHSCa z!&;Slj*K`oGMg;5`ZpkdRi+Q^?P?8t$?bU#w2*w8S^wHFLtwu7-ZLY`>4~dcnqZMd ztrw&e`HgR1hC^g@{*>9yW-0Q(UGBu$C+D|Vq~T8&ne!h#dav&P?O8JITx{$v!|rr< z8H}BGt73-Q58<-I&QBM*I(7ncI2AirfAFeJwg59d5)PMBoo#V6eBbj|QL(M1dG7LL^ zSlH0;iQZ%hcFte?lw%09!R^?2v+G31s1;`UiJedEy6@1igQw(nAf5z;w=p<)$#;6~ zQeS+N*HpF0-ci&l^Yik4!8c&y^EBs_UOvp&7f}1fhNc|mrgjMPhi@e|rF=DlJGjIQ z)+Q~*uVH|!`pQ0T-Q$!!&Dn?2Ys~nR&Dw4Q+y5JiJeFza3x0+G$dV%+r}UCs(jKtcJ^r-~a7bVe2CLn~L_}71#ex`BMZ= z|3Oa?(ZtMT6xQzB@dH3 zT9~Qk@)FxW)04Zx8{FC7Br)eNBw2@A#I_do#DDbY?Mr2yBYpUJ!I0yXyNtxn=QoWs zgnjprZP>YHrCNrU?@jUnJFnA<8kVu&52?rZX_42^4t(-2>^%BN9zzc9M0|VDzxd@d zbYTbai{5t0&%y@xao#eNT%)FxGz@@0AU8EeT%SsY9c8$S+Q)2XqP^iG&*bb)_H#3v z8NN{q+tM%RXlgX{9)iv`G5PxpXM;_2kklGY99}xe;BhKgtlaGM4<2o(9Umg&4|6B~ zY@8wVGu)Lo`Souj3}+gLh~HUi=E&{_rhGNd{>7DvaZ*m`fNpXZdrg%)m- zu-Z#f;tM)7;*Ms;5VL$;A8{zYE1bYi;5+}LM}L(X<$vd*W$d0AI=yGFhn>IFU0`^X zlfDl-7yBpB;QH4jO)3!wE`=Iuf>$Y0pPJcmp`p43ZF)!M$NSeBO8D?>dr|iu+hZ6# zliO>)^WM!T4B6q#*zE(xObp24+8*JQ$K&4f5t0K4AZ-7gIfF zQs?Fef7z>|>gpLNi>Q<57OJa46NBUg|L=a!ma5x5?7S&J`t&xcKkGwe@+E4IiXGH% z?sPglN84k#s6`KhB@CNS9@I!}hX*X@3ZB>R@+yw+wVax;_ouw-3N`%17tC*MpBsF_ znIHO6b6!1QxXO*~5%5JNM+O^mbCcd<8T>WN>lym&b&=29rw{m)>i7nonuqLBN<~z5 zEC^=)LJPDlD;;a|vK82Dcav29j~;z|(X2e%WgN082N!yue9Yp$B^%ms!@IRgc|7P(20beXVV8j(P*7I9r!C>-WT2)mJyh=+KX3I}n zs%)$j$o?Ka~ zHrx-CbyL9JtMzIfHHN+!Ev1u*%Gn-%{U^ljcl*_1xc0N#5no;&QbYKBxh}kcA$!%R zt-*309+S8g8`YGt=+fUHZd_las`6gCgKZA&6`(fH@RsehxEcIsh)QZry+qBkaajX3 zw>3CGVs*YsKMkQ{T%|oYfm_z~hR8`S%wpg-u(mYR$NrHoEK;d>tfO!@`n|lDwCOy< zVN*@Co;QNO{Er@enUz`hDV|$%s+JSc;kBWDsCUgUi@V4@MbTt*e`V;x40#*5YS5T` z>T-rzj#6*5y;MbwTkk2U#0~IQ>Oh>AROpS}77bR%LoKp)GV{8NCbcWZTiipb(>6t@ zn>T$Vgxt60+e($cF?}B~xy`k0YV~M(KCs`xjWm@=t_$V8_W5){WvDlud8ul7QYJvXEQKJ?=l$ zDLA6_p78kWd!TkX2FPW4%hsN0suMT0m8rKIb&pr+-_dj@3zsqAQ4nYj~x(l^FnH_1(YweXfst8y78QIFN*uH){ZCk`#~@tyQ1nR)m(|W?tJo;N!RUAA2A{C#o#9q}lV}CW#ZLLvlRRdyAJjY-YpO1L%(9>wyZ-B) z)uSGsGO#HLxL}WXk~gn35Zg1Ng1Is3i^;le6p5qB%icds;zU zj|a(9?)ysjwwL2q(6e$w^U<%dtfH2i%T3?svCU-rq7ZR<8YnOBG>}H<=T^JME#>k` zU~u7H^MeofV?pUikCg}B;d~`OsW$NO1X6EXryN)JwtC9iKg{=%7OQb_>_n)k^4{pI z(wK!d+y<{ohZlzT4c(;;{eY^~%MetIzIct7d^{?SbC}_n63nvtKYH}JdS|usQ*(ax zPgf7=oRb~L`JBpZYm$A$>h{$tsR4J1&&7zzwjI=Wcb*l#edp+Owdj{wCgIx+dPJ!r z?Bf3zhzUP7sK{V=f%+3ebgQ~C8vPDpNYk(zY7hNjt{8fxZl6>cIA*qx>-*-kk$orO zIsS*5V^|5vUxWKQW^)hgSC{h64vlHJ>2aXCEZxLXGUd z&`;P+oY8C2gMsB}7${p^^GjWmMS3rw_l&x#rcN`<6TWBs^ZDv1w`SIP+!qzAt7b6w zcs$!jmN>>5`qHP2>|l|O)0aA$##+F!c*^)EY5(%)__(Zg4vsFQron?^pPk&4UPPS( z7Zi~T`wVTWeD=U!RDeEW!6>z(m08*lw_~P;tMl~rk1NyT^xdF#GskL$Z};Ansy>ms zW4kaD8+}i0ISpqQxhH$y-|C+|7ReXEuj_^7+D`6O4=`(Ttt8Ljis(qqyzY1-nOKM0 zacaAk$?c>nGoE4C`A@h0a*JAQ*)8-tCQOnJ)!@Ev4-foH`0pD9$&V!X^E=D|lN2nY z+60Mbu6g3iozBS3L2zQu7w2*z((G-J+^!ob;Z1{OBezvoqJ8Bew^PAh+_TLcA@@46 z=YNlO?=%OorOtQj8Yn{}ZN-*(qqjS;rTRIwbvygG5zH-ZJyc2XX``pXF>>mO;nO|# zapk?`!oJ6jmv~0czIw`_GN=A!=LJ2o>UvCXTU3QJ11#`|+qAmn)Y$vnn`C3xaTI2NvnPg&01dr5w5e$Lu3&#Vy^y3i-;>ngMd}^eAx} z;YS>WAKQwq%S>=?chUaQLSyOFG3vp{oan*zOBI!Gr(wQ~XK6X`=z_d3gKS-709?b!)d*YOHlhnb`7v<5qQ!xKs(7?=N{lxo`ofLmtSOshL{Da)FTmF>-z(wR{NQ}*zaB?q5H~*AoPx!!|5@2c zKltzkbG?F>q;`d1={SPBh=ymR>C7PcJtah{7e6SkPjXZBIaqp3TqA{yyhlBPOK|2d2j_Q3u#pmgD!_4oOls zPMG8vKL7pFLp2DVyr@Fppb~ORVdjeasGn+jmJ@euev}$%R{tj49(l?KYQOmQUFCLX zFNvoP8QXQNoXub!lFEDG#$E;f`*ZZ(OD06hqMP3Gjy}2d?iF%`o-CO7{9#jq^fUTN z3O@Evk3&*qD6`uy;F1$gi3{;&I(2r1sM~0ZQiFt0L!W#ht8NC$uL08M4%^X|5JBfA-=QW8VumRkOTFT$#Vu?yy?T9Ac6&eC|K+gxVWOAM_H=aJx^+_6@Ox znA2cG5t#-zTBgn8XV)VCnWYx>NsxRACXg678JpQ`fFJ7F%2O5tBNI=a)GH5OQyS)Qt^XAiX=@L2#KLVws zUAjyv%iiV~8m6;9$d#AOqxPa<8j;;-NDPoY2STK3`@BX282-E~LdBtW0pqk5{JC~$ zegxz->cphzh&l3O^H0h1j6Fc}IdY=l19^gv>_u;^l(QxV_KXFNg-C@bQ4)6*END$) z&i>MJ;j6bSUqydp(?*Ss^p-KteWm|@^ynR)WyLW%b+c1*xQB}3X69U82W0~L-6tKc zhFX5=_)iaU;dXe#vrVdKZM1REqyM<&l1eq0;9+G4(d)1JvDhRB?{Twyy_D33D{Cb_ z-(^^1sm5Ml05-4X;4DpsnWa=cX6$~GB++V?9@Hcy+3y{z247YbGri=6lBRn~>~-q) zI_sqhIs%QF2gnQey;8FdJ7?@wbLVlnoi~%8I8eU6y#$ z>?R%N2dJqFnVaEP@6-ORM<04ED=zoci{h$uVRkexh=X;Ndc=OvmcK9HPoPQy=VNmm zj*C{?)P`>!Vo3rYT=15fi2YmbLu1q{m$(?gKUm>*cu|3xj+*eSpR_pFO3qo>kH3PK zqhWt3M2?w8@3W_ptIQ>z`r<1)2Zqa*c4!t8w>SMgX_9qV#ou(`_&+EE0^DR7$1uv-UjU} zX&hP+%@$(q{%Tc?ef~iYCmx-T^Y%s~GnT(Mz=*wbr2k-S38)6Gug>9$M)A8;ciT{?%d6Qsx zDCFOI^gjZ!;>=HUE~;X|Ao+5;U67UUN`B6!)9?&<1gktc_r(YNB>rKdx_;V2jO_dC z=Sf!^Q@EF32A_L#8>tT#uK9BA0WDRe=R0l#;frX~&mc{IP#^B)*821i$ypiwWnxaJ zPo6TXy@`4p9R92*89mV?MX0Ox-HDS?2dS6lf^F!wOXkBtyOQ}swVTHz+6|quiRjL( zx+P8Co25!#`VQ^AETjgwcM+bQ-8qf#i9h$w1j&UlMUC@zqotlRgnOil#*=Uqz4Z>2 z1EF<|N%_GimkX1jmgdG1%m->N4wt~Mt&DjaTcq2%xl->=1LKI=)D_`#<(EqdqaV1( zs#U`!yw(%B?BXVMUx&)PTv4*+t*f;B8zeVQ-BNjrgWqPxIQZ~D!_p~UviTyp6FvGx zv1XaW`|!W<*`a+wRq`jha^C&({*G$FQ2HSFA66v=sSfMmd)bW6V`!q%SA&_MR?n!E zuI~7G$YC$upGX^Nv4(i=0_RV|s?ujJ8j&;6G4xilz{f-Sd!p~=KTOJm!^^=fWRwUjBtT}Rrpx(R z%xRfd+`pFrSBFV@Ccr_Qp2s+%EPH3Pt5$TgGfuZKgU`e5-;=7wIBpMZHig1{+1S|7 zfq73Lnn2GD#$;~xEuH6r=W1{K_0%LA6C&hMBS+&oc7p5f@%d#H<6Wbxyc#)IW)IAe zVcxT4)ZRJL4*l<>?z5%+`yeS%B33nA>Lz*dlMU$6kI(HT`{3eqLXW=CsM(UCXSMVD zeR)*a7dUoqlLzfus+`^6$i#<(BK(yXcDozHUFzvAs;7sCTsLuBntoHQ<7Vp05Mo86 z+;S64{yitONY+)7m9^0oX~XR0oP*f&j;w77A5-dJxyR2>0Uy|Csi&;q-x6#_ljT5^ zn2)*3RC@1fhgM6`v*3T|H*37!EnnHAEp+83bovR&`G{M&5AZ)sO&9w=?h+HjoVm;w za8e!;GK;&`;WkFwHXc$TGDtS{E@7O|58c)8!7^!Gbz}N$bYYH!%IZtaj4P&6yQYW9 z?SAcym$?&2eLq*G6zFPf!902Hrbt;cwu8~Hmy6`77$xV|*D)@`Z%r-klzn2X` zZc>r{aN6En#^+Pq(3=R7Pw$Ew=fPXp`Bt!uIat-`YU?I#E{BTq+@{9qNv=|m*n9J5 zTVwbk7daLcA=e*uHI}#IJ1vcp=Dj)@SL~Z1U1gq}n_S;Gtj#pJzdKU?ets(luVJ?z zbHuUy4>fbSg2P#dc$4`;e@8@b&07 zh79iIe^Ng*DNsdiy2Jg*I&{ReG3q6=yJa5SP=8yhqUc#N`Rh6sO;yi4P4Jxg$?RTl z)cnKnKfrai{CXkj1IFX^5nuUUrj`u-3~$V8@^togGQ2f84%}z{O(SF$?{$M1_H*=6 zMJ~X(k>o3DZqAdkZ9F9+FC0paYp9t#rPD%o;g5GqEIaf}P4p4Jj!SrM@HThAkX*eh z>D1eAtmyC_&5&sN%2wY3#cr96@lkfTAveIk)1#zuH1FJJ?3`~~4P!rNu#PjrWzdr* zMxA->jgpblrKy9_O1(LB;yfv^wz+W-HA33Md2;a}@#hCM?dk~mjlNCy{xhW4jzH17 z6*V-kJxvOMCr`2#O&&FM3Vak^(*2@+a^ugVW!Vsm^sC)Ad1(0|ax^(>{jAmo#`mvB`F3|QM@neThNN;?k* zjQw$;mZ#OA*I<>c?2A9VRny63N0-A@1m?=9R!5nnVIg>C{QE19yC#vxzQP7xRbl_q z2kcAE=S$SGYG%GWzO`z*s^=cM~z~M1%W$YO4Sl@p*tO-wkJW zQ*e!~r^{z%6s{3LvXNauEVGuQT|(sjZ;F`g>SY=z?nd~ zmp4j&r0$cqW$5|FM9Y=md*pXapnPdOUrx4&lT7}Ho`vQ~yP!@|vIY11W#IAIDk|Fz zI05eZNb;OvZ5$?f$vBUH&oollYg}a3^S^e^alEPFHFnNV4>JBjJ;Mg}-Bnhx^R3w5 zP?>r-{|tKF3ZaH$9%z&~VCP304O^C(Bu_pxU+$hXOvi`E-lH$w@y^iB&MYs$BQ9Q5 zK&30Q42(i6)=)(SQRlehXHM-~sRJ4C&3eF@uk})e*)!(Ew_T4*b{E9xj(f5kHcn}?h3bRx11^6t1zQwt{9uWTuS~JPnqolkF;acl&MwWAJ_)Rdu!*E zH{d`jhxWeRuBYl%3vitDdL-GRCEJB=(G2!R~uS zV#>F?>}Ynf7i^oFVr9qcRW?`>246|BWiQq+Jwz&fdY*C{-nsp`!(>XGpDFjA1j&aH z)NkoItYf+a%a+2Cvgdg=>o{t+dov;>W9qY%?2FJ0ik~a%I&Dj-%3Nh!&rq>mZJ5%m zK3HFR-k#ZT-Q83zydg8N z!2y!@$`x&UU+@C`nVk-Op}nN;{uLV}wHN-;`YJSDo5C|ytbjgkP>|fJI7gD)O~=-4tv6qKh)^@P zjbCN`GLC!6@$e%V?^-i=yPF!J!+W8yR)89#FLAI;wZ_`0D%kS^93LI}Yfsp*|5(dh zppQlCz1%Dro^V0$TcF)5>M6a(!bx#slQt^AlbIV>!75g5LVhplI2z9U_^aB(crUph z>?QcIlmm5Hx%>P4O4$)@(Rc~DGOJ$+=>Pd}NTR9T&k2!gv zc5W8m&E8AC^yje#`bharS@Cr%J#t%fyTSQMuN}5)q4n__F#JpW zWcAu7)^bx#;xUF^!?}X?X}L+h)MGBNu&cJ}0(;)CXsLAd(oA5|#-Bz%#d)db!fvZ& zEE*-}cWS|h%p$~!%SmUoVH4cqmK=d73+5Cm-_~z z=Nu~c-fz=)pFoRnT&Qd&CPChN!UzzSZi^T58wITuqj#c;P;G9R;xQbAhW->OLeOg_dZU{UYj2- zrcHM-$wGRQ)H|ItCt`AEdvKNc{InwXO|tki+~9RrX-&GCr6YguqS-0h+4*Ma3U0pY z_;l^h9dKgA;fMm+^oJ8X<#``px!JS0e)c6cZx1duqJ~~>j+fXo$EkU~wI0*PBF{&n zF>T*d@5%h3H#Onb-Q)F3w%kzvB^HJF=wq1!J1nLy8XckAQP)dDxEf9`)7LQn4^CoV zQ+Ts}wLf!CGnkFG`}K<>17*eZKxw%9m>x(U(}x}5VBZUR%s)X=#|7THcNcXFyMPmq z+3Ef~s$VuAjWP=r7l^H`jN^z!g7-``9f>+Ei}D zqTv>gYqQ7N+umEQy`3h;X(36Ta2P&YH8G2w%Ulewt~Gh^+_}*(J-2qx@Q@x0z~pqU zuXXlfo-m9XkH1qij~&dMsR8OcF4aDv-v)R&tbCa;H)=bV=9FY-biapBd$? z?D|w@&g;he%A~?2_3Ml2LAv@%vEFs{TvfbeKlZAe*jBG|3S1ALUo{`B59Pa8@8K)% zKWFPB+1r+;_PdxrRIlgf6TOGE z_7T0!Uho}`aQ&rR*5|WpU0F0xs?>gKq`#~^O2FLzkQA-QW56Y=@I%bZdMlgp`EwEL0|A4ty1nn7nRhs+3W<< z>bS_8`&+D|*b{EpH$`@Bo0b&J+|R4W_$+oFc43uu4>%nA6Yyypa%(leGtY^JYcx+s zZ8Y=z!-Kic&j{8EB~wdRVa_=}L7ST$TFGk@bp3S3EM4ZJcl@iE zex`<}#EtL;`(9fgcnr?8cJP)v8TGP5GBx9T(f1v!*Dqv|Kx&{EzhP$Jr5YON1*7U8b6TaCWBD z5R29AJ{*R}CdpRx=#R3e_~<`2i=90p4p=`j1FTQnTRqWE8~g_?swh7>TY0dSk3H(6XKz&z-o^EYv=Y?G?Vgc`Ha^xqMw?~wK3^I6#YQjs8eMO4Syfd@|K!Ym zmV8%bZ%cjJ7f%Uq?JKj!_0}&g_L3*neC5~BX}U{ai}bI^bLk(f52y_{8a6N6bdkQM zu8;gfobkT2PWL93R9sD8FMISAyW!U?LjN-Fm|k%Kw|85Z1Dw9Dzo0fAXat+u?1g@c zJ-}Zp`}d3teRX2szxcGhKK;KDBV9-QqgC6}wUok zPl?rnu9&2ESw9($=8IO#EPEd^uc-4`>q%|?a|arKMT+V73c$xjJzPk$*B#&!9@~rj zxT(EvSKCWoG(rpV>Ii+_B`=v=hW>GYMgPlluT_j%dR3%;(c4?}vcB@LYpm|Pz(-Ew z+xfL^dOS5_2r;B*ZcYEozIOukUP{A@demL~ml*xp`ba;IKgKd&-Ms9h-kY9y^CUP( zTmI0$lgoUUF!QAiLOZ6}>5JJrKk{;sm#ZvV^kz?48ahpCzpH7@$vMKW^w%Jr=a^+Mo+^5yrHq-X2&Bj0_bR4q6| zU+mGZIKyWQUrDT>WpPD6ImkiLRI-#psVXE{<&24?Q1zppg zhNrzhI-zOv+d3*CU`q~6w-c-==I zwh)cuO1^S#(oFqeFN;*kg$~_?Q2iR*AgBL92XpmOeFU*$Jof!!zgfSBU9aQk{k#t9 z+sPXRd0ty%PwPWAal;+QY-IgiUBK#2&PnfIg6Lnb1R@#Xj`Ldsmr}`bhIOquhixt8OXS!zF>ETw8(OSzB#k8>X< zI|G&;YFyt-!WN9o;?JG8=hF6ta&LYFe{SiZttyGOR|s>PJ3(5%M3cOr|M@j8Q7gb+ z?*((?2k-A_t0$mQb_ETf0(o@pJ38IO&woZ$(to>n%C0HQjxt*7J&4Jz+n{H9qQ4$V zT`{yI8V65Z^r(ekcd=*W)-e4RdREadsp*$2)7OQTe;>1A->zkKBF@+5t8 zRj|GF>1C46>Stdw&!qP$s_yC$)CSA8`m)P=syA)RZNv)l>7QqMdG-Sr?0N2q>3TXp z&%!NeWSPsly({>vy2OS4$Mws9f~)%CN3paHz!VYo~cisR!_jO%Bs- zzcZ_J2B*`nnO+3W5c`Q>M*WUx6Ee`!eLG!lyey*?=ML`I^+{ku5>nELfwy=4JNKC` z!3*(YL>4{|+2wuVd44)vYZb%n&Viox9yVDI;;XkVs^>^2-=D#V_VdC*|0RkJ~uwH)6AUBV&f z*w^8hkppXMWO9LBZwA~-wUQQ2)UZX~z*n?TQfuqutjBl-o$Lf1;{N%}&k8u$(F*#z zFpE9!7ff4Lqo>MBVe1xS&xQH#?g(FY2D6>Tvja#k%#@u4zu8d>Ddwd6#6HIYh;#9w zHp`lcf3kw9$%z%TJs?#*J_+&sjQc;fHNJ&eoqof(;qUrXFaw@{9qimap}FWV7@Vu2 zsNc>H5u3^a!L5P(Zs{eKqn5dW9xS9HMQn;XFb=U|+NC3+>Lj=_=3>sQE*C8@>kH8Z zUr_E3v3L6*dQl8K?&a2OU`7zV!8^O}k_GeZj+oOAyhRU&vE-Z3_(tC8q(6mS*r}i? zh2R_V^4)p83$AS|le=~DU4Wq*`D%yB{CksQ} zw*bAt#2;C#>uzXiK0^K4F`a3fDe3Cp5bE|Zl|8Nn&yrCHee0FLvau8Vh}au_G?uYn zK{Oh5fA@QG=8Sll3{2rj+p+A4dk~pnf998?%}#_ugSb>mRm;|kzcZmxV(SYXh-X4k zGVbWhR?=|yQ1#VVCAq!$w`PvLt)Q+}iyHWIT-P!o`4O}^VCS!mp9({|1X3^9dEPSv z(GNTc7qOqpZ(}EFNib{uh#CINrJ@@lo@e4V%x10VhG!A&jM;^0wy2#HNEwK|NqaTo zTiE|P=EAqi9*UobLKAj5ZkKk|iNS|pbKHwXZPsVgW&~5w0~PH$XU5FiD<}%L3D;i_ zVpHLFvx4z`JttNO-)^@Aw*h13umQy?8nswOM{jvC_fM!v@O7uzA80OC^@Ct^p zL_6rHpI4H~J&-v9d$YGD1RBjNn8C(i;#-GMzTpC#*dyl zvP9s${cC|C*wK~Av5R-a-tqdLyW#}gW=`^g7T4kB;vMk#z0&ogtSN=Uw}@am{N9r` znNC&rQbPN<)iUs}`PXmbv2gb9M(69l7to z!qDSn9aKWAU?_``!N#bu&K$8~{V}txYaBu^FLr1BBtgWxg7;@z7xq08nAjKKFm-Fo znzRq5!2^QH(4t2Cu?X>Sdmy!ckuA1@5BF^>r+$&vVn7Tuh;R5&OnIVU;f;6mhZk+z zW3DdqLmf3_IaNcC-lIZ6@1h#^DT6*875ZER|0nExIyFTI!%lVv>^yz{Zebv7TQU?{ zghS2>$u9#)`&}4$8oU!u;JNhQhCN`guBiMRK&pw*)>K)D555PG>33+YF5<*?dV$mz zGnf8Gb3{MP12xm32f8y*Of1K)yh$i^X|h%vuo!bH_^8`~ZQ^^qVB(Z2a#*lm4E%=Q zd#sB7m}|s@jv?gSM@4J(ZiyxyxHB@t9lqqX_&W!9&aU84v-l=%GQl?IJMK5^ev8Yd z0{5GyB!f*~#nY&JFWf|5L~q0~1wm9&rNEr%vFLOcdbx8Hc-L-=*X?j)^*xwYzq=q- zzs1gI5k80MUQs#&yE)7t78))WkL3r@n^oBRia!Ob5NHs``_rhBaYE>{v~6gmmNu>DVwbT%i#*9foF8btsAB9td~T z0hG2CI(KV+3I;}j^mr^Z2iNI|h1e;mzNu*CFH>>lXXwUawl#0dAn^x!qQlFf8z^-W z9er?fgqkm5(_C>)jDlO3e3T`4Gk6<=D;Jgfw?@p zLNo_fXHR@E<^3Ebu5rMu4DX&ixP`d9036qi0*EQngpM-sHiIuI_Ty)@^=R-X-}9m1 zDXWX`x#FfTWF`4Rk3Rkhv~`{~oNs*B$rkjEgSQ-ZPMu{h@W4@Qhn;=4v=?G=C#wTH z*DPu!OorCd$yZ_2{+7PbMH)c2)37%=Xe3x5N92uyKCIYXxZoQ=CYVPo_%v9Mf`?6+ z0*;uYV}x2f$0BSHzcE)K9+-s6cPeWBK_+~SK`crK_rk_F;ZP^&F3kddYj~>g5`HzZ z3-q#oWeI7>UrFD; zUauW=P#0O+hC;ugr(`aC-sGu@+FY3{Ni_|mm?RZxTdk68$OG184CV>JnUcfa;0c7k zZc9>20uciffK5Mj^sZzMa5f2;BLtnUm24=7hV~gHr8aKP=`K}L=bi9j3w>@deBNLr zVr8BlmvJDNyb_>IEN{-O?-)pJ_9*D7cT=uvIr#1SgU`aO2^Ta7*eclh=E*wA7hC8H zoC&545AR8iy+z(Z?a@3kU1GN@fSLeXb6IX9IpYJY%S0Jvc%(a64?^CY=SS^_#@jES zguXl4>mNP(F0U|SH(cJJ-l&+CB}lRZs2S|sYqDTCw3n>J>;h9X3%TVdC47ohZ>+P zm{jY|akCC0*CS7>DT%v_dgCr~zr)M!+%mk&V+v(t^CCfVy+5?DtNbuG9`CSjEc%{F z-t-iD^z+^+DED_mJ8MVo5em`+=$8m=jOicsxNYDF4FPtmS6B5_V2VCkLknz1s>6#R z;GlbkIos)2iOv`B>#oN=JUx<}cp;|`==%=Vb>u3c)w||#D5bv~#hu(Gry-HJgDv*s z3~vL6)+>}|>aOR?b?`H50kY?jZr;P(UX)YSv{n-ONbe2APLe#LEeh#8-YUS!`-?Asc5;sa6wq3sn+ z50aYkYuph}@Qk@e=Qw}Fg)0qw21>FF0LmxMJ`aZ6u3fh{8$+107arq{|=G_7A+50|Mk2@{e z4bIR7wcKRPz4u_R{Hk#azDF-`rlFUO22by zsBar1Po$R?a;1|HGbdwj8nl4(Tn*k-TRD07otKo1z~9^KPkR!Q9QKV-l2tDs%7z|& z;CE@0=9*nV;l?BAD5us7=+&N;0W~@aQNpx1>f1# z=;9pk*chxsOkUC1VM~&nD$yrQ6PrqmFqaL-O{U%>S4rGJIUNcLrByy#Bo5$6+}tUY zG(l%27iDs4C*sa+`X|YmA~}6=$1d}VK4)wJKX0R=l$DlT5b`oZ99}@gO;Nwq%XvA-4FvF4p7qTmkC@aw_uui0WsMzfqPzdYNVk3XJWWFIe;eMHdV{ioU$HtE(2X{c<1UKHFu1}HNam8+Qoj*-J-qqm};&W9~pMUh|FKVHm zz1h&84;z;XG4a6V!p`O&XA8^a$gQyR(ADNbtLf0wgq5N6~BVdD~rh+g?tyI)Jm+e6S#c z{pX)h(fA!s!WmyV<+!3Yn>I(di+7{|w=^o=S5VZ+8;W!_zdQ$wAlL}J$e&^5W3O2p`F{E zdn$~Lh2AUdym)z{aAE~&57@ahHcF@*0j@UKIpzEsVPBb?dcw|aO1B6HfxC`f0}PPO zL1EB1_@_1IJ9{n&p4xKKy$Ma{gcrhytH7c8VZL!&ODuaVqYG_-YY8_Lo8U8U!n}9+ z<(^_vAMnCCtLVlJiI^HCr`>;0Cmf$4&TWkM6g%(1yS&6@r_rkhArHQe7Ek8}(#eU? z;7;ElegTJGmbDTb_Zeae;%GMRhwJjQMZPMKnnH^=;AxgP+XdVXnTX@6ZQ_C}{;*iSgBN{<9{t3wn6;j3Sl5*-E*A`= zWW)r-jj=lght=SZ1wOg*cCO%jRz?e8=a$_s2+PrTzIu&W=<+JT32|WT&M^A)LtlIq zD5v|=f%#n8Tl7BwpT~To-@Vadk5h7LTL5it*JYyaUGQ}Rr#g8}tmu!Lf4$8G3CE{uLq4-fr19KmX-;g_wZABi8{UKUy4xq-^i+B91 z&5lo$)AZyJdZpH3ZNiX?(9i5U+l1W<@uuk}(D2^Wn4Rn3NePJWT~=zd_!H9MIXe=wVs&M_|xC*cg2%(AMD+H z@fi+?3|ynp&YtvP9w%Nzd~2)aLAHXa(9SD_d~Z0tL`Hs5z=ful35)S>HgSZ0bjfewL7t3sfo*R0-bB0$ZiJiIaZ?`$ag+|; zsZeOs4{{TY5fgek;3gy_T5N=z-U>S*IrP(YY~(cT0Cdca3dHWikRLHq8rJ@@sOk;; zvsoye_j)DvvBK9CD!S9J37gmpJZ78GkGC~sCkZ;>3o+MNZ^`y~$*D8uMeg^9v3HYD z=hXYZ_Gp&VRz@$@<5?^m&%$>5(eE1}q*0G#?FM?IH^Pk4c{m%1y~pL6VER!qimf@b zlD4ISckl2N)^e{W4aF{5L(^G^yBFnu#hv7gaV)j1H+4Y2y5bTsQ}9`C42O>0R0n3F zC!^jW;P_f#&vxGjreca89n3LjHLWm982T?~-Sb*t18W=3H~y@6DtL8}f$tM@(fg%> zk)w>#*M*bszFMJMgpB4)N8jDHqd2QbMl+1VX_W;hK1N+*gcxG}aH%*0@BZ`bFbeZq zBQ~E8e7Fy4X`?Lhq(5vj82RywS{$sB)9;_SG46F=T%Uw_%vspE@`q@%0lM?(WhVF0 zXV*~&CeH&_qp~YoQXr@1{X;2?hOl9%2`>S&Smrl@6}Al^>#r($cVG#7k2>~cH84O$ zO12C2=ejEN=~v@ekXlYtt)8_ymi-yNN)BEK7PO!3+m*b?0KcZy*t20rA{7Tl(~ zact#lZ|L)aoBK=xOPTLWH(FtqdMcS+e(Oi~pMbyYbpl(sLrSyThS04=@oZdK00p7; zYwM7}9QCl@`~@Amc~PtsShf{T|8mI4E1@THt07O|@b52$cyP=-1@3F#h)SUs{%poZ zU_^^riFK=FG<7j}Nk&-Dg=cyB3HQ zS3=3xR>J1=Ku?O8({AewHr*wFUhfR0MZdk6A`ASf>7isdIfi+nf1j3*o!7z?wgx+h zq1Qu+ZOUS!ng@}$Rv7)29bh$x=ku_4Xs||epHdj*hx#=HTXbh=%&DyV1IP~B<8bb1x$sS zbXzwig|1n}YLTPz(bv>tal?Q)a;k2KuS;nDUbxj!MhRuW*M)x-7LSsV3^!9LnO(%O z@iN>;!=Jy76I&y%oxg1F6X6^p@fnt}QM`23TiM~0ldFM&&W=RL9d zlAMZnhtU!1-=fYNy!%mz;b+^h*GACpT!LrhZOPtRqgEe-dDI~ZyXp$gUeqmTkIZCU z;-Hh&9h^Bkeb^#R01fE|ER%CAyN9~^l~ouGTb;_Bk}z|_-q62QHrvx3cpmJt#_FG7 z^KmzNyB?R7cai1qM-L6miTS;|?C&wmNr1^*t$xZX+Jf^C7?sFnPnZ~qxra2IW=ig} zz0LvDMS|Ek{XYA7C4k)V`|h0koL!v{UOUtV25mpFk(ga=^TW-5#S@l~95n)OT_151 z+a41JT;IPK{+Ic{FSTsQCo{qIlOXLRBkOX^Ki4%C8^O-jz(w4!>L>O{kda{|FuHke zqRlNCeVYUAxzX#yrKr>UVqV(CD^EPM9Pzdtb_6}Hh>eaxx8e)1Mq!`DzOb$F9ej>4 zt=L38%vuF-^N~3_I~ttx*m<=(Ys*H0M|mr7V&kwMI3iyo{I+{7)lgz~3 zsQ;@bn(Bq9wH4rPnA=1%ZhZ)y4~U@5o;n)iBE+x|XocL?(p2K-t!obq!|^@L488K< zw*TIwj0Fy~6wmm7aps=IH9}9=`RYA9gVI*wz>)a+NH}fRau64f&o&5Gl#9;#c>;yeQ{U%HYea%~K%%-%A*-Y?Y z-L1j>kyn5A3NxG^m`7!MjAm)*1#%t&qprV@^}LSTs|R@BUNqbM^1en!Sh< zMZhjh-)yAWE)6B!Hj&^VGSmd({iw$MSB*+nlO7JOm?Ye%mmXy2fn7?Q_3w?<7VNQS zxi!3-SoyYAc#inI!eVnw$RcwTY3>;~2{a9{Wog-Zjq)%zhyFKyKlg7GMwF2HLXia96v#nr$}?p`y{irH|0ojKkcr zDhAv*liF$&<*3<#OKh2ArdhQbyCB%spi3W(KYs5LZ(zup4bVu3;qRqI(&UkSG#z>Y zHv%lk(mFFu;dJ2Gv0p#6Sx=L-6BsDmz1+>oXO8f%mp}it^ANuNFmhK%y?d(E-V6HlTxvxCh?y(kms_{r%t z;#HyP5ApRy#1MDHvD!9_5G#Hm&PWdRVi^+jJ2P>MadSAku_l1#;<-Evp3BCfw@Sl1 zZd??=(lHMkvIrRd`D@scDS=dlyr5mSnR#SFyAbuyuL=8Dnt2e_9RlX zFf`Y$ur&0)lMKMY(xsBU8i`pEY~d;m5nq7s^<*hkxD0lRzMQ1jX-l+>@l zmsQsvRWYsbzR^q#N=O{#YHyA zch|xx^M#A}MJc1>MVN00>%=yfW#qCqoOVgcQPD0q{I5L1@_Qb3BwI?x)YlZJCDXQ(vrHdG|Y5A0sHj+N(lRk z`oVQGG{N7jWq)TwCkW4X;k0dR663h&-I3O_Gw=ulo-nB3-D1bFPVy$tz>lfE_Ns> zbHxk(;BW(8SKDbl`a2n|g3S$o9ucd$Va5o*3TROw4oAIV4EtO6(_-#N<GK`V?Vba}qb37nRHl^RXVV=fpni znDI=^>mG+wqSH3Eb6+4G`V9=p_&jzCb}nxNE|)24)(u#ph~Cfy_rJ=vU{>LR_`t3` zWo9cdV_pIN!PKuz5e43f4ZznanrYUZQ&Pbx_;zYr&CA)L6#4^pE-}+gn1}fd{Q1&L zD@`9@s4Z2IlrJBmc@>YFxxJBOG|NV_9e#Z?Gm=_FbkXG1Ag+U(?3Q^Qd+rX6-(vi4 zMI`HMf&SR@UpsHLMW5l+@J@4z(?`M7Kt>Bc!QcE%#Vg%qREGEQLe*SR<1V9I)FG{7 z*Nb9-jJlNKGj%vB4s44VV+rb$>-R+k>gOw`P*-1V%x3SDQy{)RFx-gE!rZA0Sh8p5 z`!N?2%&uX><}xSN5qa?XO~h5_1*|Rh3tsrQEMkM%;u_SxtXgi6@!I(I9%y;U0YZMRwf>`Zcq`W3TsswO;^@gJ5t% zo~>dz3g9)iBZdZRX%bH<>E}7zHNVi)+=iY1(VU)QqG`Mcnt|X+8QRuTqjMN>12Lh? zIV(+wS0wd{1IL|NPfg%_aQgt0>b%uJqlenWuQTp3%Ad2nhQLbUPQ#(6D|5;QrVR13 zK5lT`&<`GLXlLhMuLO@4GCGUj(M#wgdZYHpeTzHp{jWGzlgri0+xlj}L)8 z)-Mos>SVP0J~#^4Z7~J?@(6t0dE6hdFb4jNKNE7d9s7(}9g4pj9o?I41;=bBye|AyT@Pv&Evh?rcN z`JEl#tE8sqaf9}%nZ|5XD4qR;*gCDP<}>hvm&|YS#0o|CQ?U!a!$`XQW*@^Zx< z&t!D&BkqDXT@_PX%PI47{Tjj8U)=_@dtM_g=K z5q4O2z~eM7c@jH3Cx8s#6WOKi&`b{?D{%f8n&LjE3Bz@7#W|cAZ0UD+}!jd2`KBU?Gp-Mq+Gpea#Nk6`N3d?CPekspl|!(kGJM z`ZU(;pNkn!GjKOeeZsmN3M0ieaNgcH$R?vtNe`{pHqvLEqg2#4=U+P?`Gs3C{D1Yn z{eO1e+~>Mr`A13#h=IZW`r_BWz&HH@_g5b$@x3*)Z|d-O&qs*;0}wa z$Z>aFx3HgxA*&D{br0`h{VRj$TOhP(&mU!HvEK_@3w@>IXP71SM+4x`eKKycL>`zs z#M0wCpR+?xROE^}A+2o<`|Aem$!Emb+dtSC)Mh<#`?-2hHIp0%HuER2ych4YtE+JP z^9cGB;~BGz3ZQ+jlh-kE{9HN(;IB~^iXVitN%Jqj1c>kNNEuKynW&(@zOgf zdBOivMjsTbbY#@+Ct~%-^Ws=z87)RUd7J!HjOP)fkPD(m)QOf0F@r_^)#$WhJvYc` z^m}m5B$%+b=P{>6omr&r%`&iynTj|+Wv?Ae#U5wJ1Jv;D_qmI&h0qq_WpH}5gwMCI=^>`xmy$ld&a`$Ey_#Syh_7p93q@TE8J)qO z_pA#SmkgHCGJM_6J4w`cmC0^#gXClb428%oBquFAJB5xGD<1-$&+p;bu^|`KLZkC*IJMc@kp;g5FD0I1 zUAQHy(8C=Ka*b--VD<&|-X7!;AIlN!+9lv~k#{P0k7Y%vN|GbD>Gd1KWbn!T&yW|l z+Ow?9A=C-=ZMD4>`*03gFsPT-EHGgKRk&q4hWn8zxG%#lV)eFgGRf&AvgJxzq5Rjj zTW*Ar*6fCM&JAoM6y!+h2Y%nuCkDch^-?N_O(y3K62@(pQZDS)RM%CQqlSJTY6G48 zSYg~tDNR8<>DDSkXjTQAYom^RR47=PV7`a1f3>(RgrcvELY$c%Un4Y|BBKG#Bj}1v z3-MKujGp6bw>cff!0j^V%i(8^=p*`+Vb9e9vFL|`c(pm^B=}lLoh(MXU`~PmpFch) zQw&**`mh?$x;k0hT8QU@cV|iSDdNR_;Fd&>T=pLLr6tg}8vU~`{V&KIt=^78o#tpn~okwH-i5Bv~jq;Oh!7e$?`igho8yVVIrP?xwXaN z%?a!c@q3wfDspJ|9y6=9sG0RD90qlV-Xdz|ub=81+z{J48RHpg8A$fNlhde9;OTYh zCMf{^ss{B*$&w+G%l)C@Yk_T4-peI3U}v=rbi`9F z^0|^9zzL6jfw=MBSQ0W2JQb@^YsJlXNW%B;w)$6(-id|Lj;x0D#*E1&MHdfBDH(SD z!6GGp)1}lMww?H)Ml!rWN)O?;#=iz~m+wf4!L~B@<=m}i*b~9FhKWhs3-prhVb7Q= z`?<7{*s;Q%a+6Z7(Q+A?!iMKIzT+N;$>=3)$PH@7ch8m4U)V5diVXuox zC-{g_3bMfW7j{3$NB)BT%y85s?f3HSng^3Re*W?EnY@jgg0A8DrdcQRyN^Q;3o)lj zs1q-&3!wrp#1O|+Zq^7TMV}4(M~{9uX16t%``5?n|I35tTf0lPAAvn#=RW0~xevRg zR0=yQd{o@vV#E{paMQ;JxOLB=VF=rL8a(A5VxMRW+xARs$$#k~BMbOv-u52+V`mvD z@y`Az9l>X-U{BP>qio&y52-SG1fTS)4drVzm~X>R0@|+U_q>sj+8no$)fs#nQ|$XJ z@s8&g@M91wwpf8j%lRyCy+=;H;fLwkcligMp^J)|WcJr>!UYc2frO0H=18R1oZ=K+o;Bi4?ukIhp(Pai02E|%fQcq z__jWSAH5I$k9Ryb=@|d6Tt?FF&=6U;$R|3y#_5rs!RXo2G`^E|Hpg#>g z`Ulg)sJ3xKJ7@ps!(AckzpD=Bc5bmmpZ|DUN;B&7e(&M@1H|Oz@L{9w!~3%&lY6A2kb+&-3D-gE^(Bh2GphVo-^xlD za;PIUS^*sT8T9b8V)@O$33~!tRj)^HwI`G&^l3Qf_fCxCmYzaPXo4L?>_aY8kV5MX zb<~}1yylUV4kSQxdpwfkkN3&gr|2qQ==Ag+JhK7u-_mW2W;U%_-*j6(e&8^m><~o zxAT1RPY3SK6}2LMrz7yaMA-I-bQRs6kJ~*J-u-52H19t2))SGZDl)0I7j9uP5N8T< zX~IVAPqU%VvUoq{{&-(7uY2<@hqxSn+^8Y;4%xOG~G+@X_AJM+Qu2-`|457Gkc%`Nw$PJ3~bGL8X%l8Jn`tbqCs z@}~(g$cd-(=y6M5%3Oq5)3jVV$NA9yv50%Y2dLX8A9_C&b&*j4Dckx{N;~9S#UA?M z>qp;1asQi_K>K(3(L&@nJKrTVasm2L_kpfLIJwW*K{dcKpIseBZXR(|w9AJU z_Xf^KYc|<@^P^8Yl$3FyHQf^AxC2tqh0q7!Xa3ip7doBh zx}gX83OgTLXuv1p9x*@%Iw|}VzEh2qD)1TBxX1HGePq-VvBK=gLEgp#J#{B=Brdqa z=R{y$ha4Akq!D!fWF)|c2iA0;E0r?hP&3R9?@!LCE3^T2 zF$0HfkGdQu?Mgq|8IKyq@en=B_ol`35UYLm)1j-LlsE)&VCq5aggmJge8XOTjLu!~ zBp3Aco;JsbZ|Oz5qJc@^5nG}?$u|j@pKcp~r|_h)z|1@f3L>`>;K8t*^%vQ!#Ty?>q-uFq6G#o-44^%aLb4#Zb-~ zaDggOKkrYaU8v=__0Taf+D%cpn5iNTlzcxx3e*EhS>PclJ4`?H{OJf{h3UH)?SG}7nh5cEHJsNJ}E}K)`18;iOC74o1X7dNY zJ2ia?I72tJ<2D*9C?0#GXV9a!oPpet+>lqzQTHj=WrU29VdwUny6^`Af!~0g<2Ehe zD=^Qm@98F7O5vxhltW_~T2%dtdF?-P+KO0_)&B+G8aD+VeNa19>d<=3iklzBI0m)tR1kfL39*3?zz@X0--o*7Q$ABel#v2m`tRwGq{yk&cgg54n99;Bdux; zjqk0{la^*ti;bB7?1WD)+e`PMV`%~Vmu%0b@%U`3ktjuE`@ep0pv^Vz%LHHvVCM;0&G_1NGI|X=$DFa_PiV_&HtalY zyqwqGBBwvFbKR>g{22QH8iu-}-|b?4vH-1Q_|NxykNM*(!R2U+ocLRd+O)xa@krE8 zmPT~yAaE?xkv9Xa$kaa=wE&*WUq@;>2tBVHv9x?H1-A*Iv52cf-^sv{1Z~-L#Np%^ z%Ex_n|9$vuH{(gMS3!ozeRIpf>$d~9pF!xUPAXhJI4U` z+bgNqT0u4=F7bC-cv3m$Q}0}3_>{&z^!t^Zj?d8Ni|Xs!-%>JPF@XD3iQmQZznHo~ zRtiaBYEeh}auK_{KxnoOw*t-`GvT$+3A#q;CBS8YSdr*Hjcx*mTXhKa_G4F)%u>>) zeE4v-8;!07?jCiWqx~E@hnbQFKi}}AGtC(T+^hxaQtO%2VWgCp*Lg7VRHZ+;FMBKz-U82l;=fv@+_i@Mb)B{z;>=M4XTZ)^ z&DER>a#=^%xw_eBE_W36+OYHSppLvp6?zKTd3$f3zmM80vKxGcE#*s{aBG9y=Ty6j z=UWF+q8)z6@jLjO8$tAUbp5RL82@B_FttZrA<fGJ&o&)cp6j&YL-fA1ZKq2*E(cf z>PIazfx+JNl>Z$9{^y&x4fo0Bj}7#q3aNswKAyu*JmX23_rNa@)|emE&W9%TmP0>4 z#r;BGya?Roi?os?$3G}Y@8o~=yYtsH)Rlf|zncqQA){Te^VhsBoa`dz?XdHW>4n_S zMRID^27bHf1!n@BXZ;R(dYvvm`XTPh;WOiR^yDW2m(`*_dZ=Me{1R|hJVFoBGuNH} zg1hy?v8ZEfqWBf?y-~AK2P#te)YqtkR-o6Y+QT<`7(yq}cZAF<;+K9=f@1@@we%`~ zwnr#kL##Nry^`|UpM;9HwA9}`dQ4VQ@-(%2o>}@VCTXb{@FSO9gIcY68WBQ z1$(TXg#P{D3qHCLb^)k|znp!|@7E$-!;dfYr$aY@^>xnR z-F$q>)U8KGw4-uiP0#5()gLpD|yi0uFXOW(c1B_}m%b zvO^ED?ZHU?!A#83z0iL}&*MiT4$O_f3~;HOmxih+bt7`(m{q(h3nhbtn3?oXU?s1Ymx)uI5JrTh*v7Zk+}M^7-J3H~Je&i2)P%k~&}9*Q@Afvv&N4 z!H5rk(bENr+`xHW^m=j-*;u%8g)@C9JOK0Yic(1g;`7B7{&Y0vp2I-+^TEmgwR6dp zhIYO)egl_{JAgdc*{aZqTZQND20Odu5_ftNZX#gk?AFt`47UL4V1jz!r5Cr!4m>CL z{G(;7xW$+s8V-d2WNqc%J_QaLwVY?#LCyp`&#@Cx#~PmF9P$*@e?DS`_9M=)Fogd4 zMv&J0Z(P=SB~6V%ji=j!5BUZD0odwF7bCuI0_L~yRgZ2x`0!+4cCI3yst54)*MV2M zk3HHL=;;7k`t~|@sa*#1tH38Q0MF&dT`S&aiGoBKW`mP@@Js3f>CNDJ>}(g_*$EsA zm{I7O8uD(yZ?7E)9gU{i{PTTMa_bH5rXTmY1Ec(CM+*23%F?+!A8(4DhT9^q30y&# z7k$l!*5J3-61Rmu&<{YaQaVc}!k_I*{OS3-ISz#V%gL<&+Bx(8)1&XxDS-=(lF1mMO5u=()ZeH{kBI2KU!w%+Nk{;Re-#_Y(bxNwyVt3HN6z*nx5-+>QP!%0rED z>)9l3IdHI7P`_z8E#&T84x`{=^dL;iwX1*cZ)0BP7{Rq0ftkc}JtGYaol$$ZWfScMC~s4ROonVSd9cK4~+ z3ug}FK4aHuHv>GV=R0u4bNonIsv-}~9f^s;n}l7MSu~E96s__ieI4AeMR$@kb@idK zJaCyu);Rp=i@TCBm`zOgv#)*%z0sk*)HN;mAN}t6`x?gQ0|oJ1IeLu(*twQzaZ+78 zYuH(@SGwfaIpA+$XXZaf(l!HoBG`Fq{~Cun^gW+o=ljEg9FEQcPlYw+HWp-`hq?O2 z;phP;HY)a>irdqvn7LZztX`kZ`N++_vgFzT_mckR?`*Qsbm0^-lCVQQN@ zp_H`;^RW%CYBvJ@`ZRDdx5Cv=Q4g+zJzK6!R6DK0&h{hz_lV8vG5GgKzQatWY@7P@ zV9eFw^Rx6ftK+d_ZJ7d}dAC7bZ3wQ&8Fc-@4mn={HsU5FS=p9A@XavgQ%&G!OmZYzm&}Bh?`>A+0kIM zq~`-X_qNcbI{DMyw-|fRPOy1YNpUqWoChr7d%tF=^`e7lsSSEJ?;Yyy;I8m<#Ju!g znOX7}CJBCZBH=0KX9`N_Iukm@ltr2)N>c=1OhkNUVTXWF!eFa|5AxZcGtmYNOlc$dH zLihIIox*#O9~CVeoES_k@O;Pa3=)!oC3EhKzcbE5xU~v)#{Sf{<0PTc1t}fe2cFmp zOQCmXKU%;86SKWaU5Hz)JGdqOb9kG&v$Gc+t%Tmdn8E5dJ$@pun^(Ez$dR1V)}ubY7^e^zOh0W?j(|rAU}Gi2~!$l zM|1;!-YQ!-gYP~4j9H3xfe`ZqwRV$8%KmdgsKT6Se&a~oES(Tizy~?)1#mL64+=@< zN;;f}d@*K^P(B?xiO2=pnr;_zIwPl80WTh#ByW!^RXg@KvXy!%lX5t28qpMm|=M9}B4(inVahC0U5r>e!y6OgY1~Wf_lsa>hrM4VZLQ^WvEI&0rbzbTE;SW)&aORU zANwJIoZt`d?|mrl^C6IIdI1O3Nv^KFirWy(YTg(hRU1DCXPOgmu&>{#Wtd~VnuU3? zdmCZgA8-bEp(ZJ@5+ZHEwH}RlJ9n(m$3K*&qVKyo&0UDQiTO;8DuR!em zmLN>Jg}v@C%!s;g7TSFQey|nrZ->(b=MdD7y3pw^-7Y9GS2I97xsaJA^aod^-SG&z z{4hZf`$4lQ6wgd2R*3r*KoaEWN&N$b$*UkHu#MgGN2 zmfm;u&2%q{06xR_%ucoG15e7nte|!k_UhdiyeTUth<0>5UOYb^`w`4!ZRR&F-i2KM zyjBXXVY{Mw{|&JCZ*N%tzm@BEa-+}#3b6BnEJN-EFmexIXS;j3k|u4z?EyOv>*FLD zjlS;$?EG_)=%COEqMxvH*~a@NQZZsoiv?^k5in5Pqhqx8WXhdUYse z8_ia49Dz9(F!?(1t<`H1JjrZS2(Z5gi#H{BQ+8i)xEoUOX<)Z(+M)-xDJ*)n1ss@& zxlaGlqwkzpkJ+mK@83E9&btS=?m3v@!_GdfIqt}4IrPdgAJ*6B&UFnSt#*iq?%yQ$ zJ3u3>3-Ei5-b$*w;+`Eo7m)c{^0F1Uh|zzM-$zNX6>fjW0pFx`V`a<}p;ljb( z@EYh{10$<_#g6;*3Ue1=Xf4X@xPuaWzf&X)A7;%xiVdZ`Ke3|^w&c>f!5$Y;qdYO; zVxZkHc{8-gOZ2(MLEuzGT|MexWA67u8EKm#Z=QcB@!022X21s6*XBy*WcyIJL1B~_ z>LD?@=Sf#_liTJ<3yBq z_tHK7qepM6({Nt*Qs)#Gn}=Ho*g1Jt0H>M)Y?UtZ(TxS%mww>kft?3xJUA!phSFhY zz0FE)8~Er_`#^j8>{@QWCFVkQ@Mqoa+~DyFN}qsTNs|NIGY{~(xZ&@*oZ>o$E6EQv zhST+OZZ>9P^?lzjmv>x`mbf)Q-5dY95g!+fxf)_})cRJu3F5cnJ7%QL9r*iInDOIQ z;q1`Py!(0hMz2V6>ClBASc|!4H(>7v8S!J#kMI18eq_HsPw~(+yong~UK_f=$Q`I* z47&W_j+tR5BL{Xm^%E&u%`X>km$|>Pg%ocg&P< zV_P}lk7V|}l~jaYh`n1a*`?!6-J%sV@$mx(M>8pDzYe06{6u?O%oD888(aTJkN#d_ z!})V*)ordR{Jl^c`|g)Jxa2H3MYO`~vHxx^1~~BD?SW~@F63IHmRn+u8N1VM?hRMre9zVVexz7bYGpj5A;yXAfe2^)0n2M&6WUdJ1mF1YdJU~sj%ZsnV zy-e8w@aTS<#jnJkqN^0x81rHL^Jji!iT5{ammcp?;7u(m!55dN;f%kpq)W>}so7&6 zu1C~L`c|qW<9=G)pmSchPsJ_b%DIw5A8}Lv05gR~Mh`6(2+Fvv%ioL-qBV%m ziXRqylTgfE;m=+b9KR7942g(=!>s4 z&0l2kH!y=Q%*VVMsOW`hxZTEQK2f%We<1kM98X|hJDBn52fb*(b?_>5KhN#U!5pb2 z<^lopxImdVEdWQ&r_XAM%1KI}!h^}qdb`8ZAaM0qK>OrBdi1xaHQZZ8PO9W)07s!f zEmb__68CvCI1&&;N(Z!2V}H@kLg^%Hd{Y`t~NoJwqP!i6o!YR^*EBJ=_V6^DAwr{aZX| z+(UVHZ%a{l7cUp1#`~j7H$@fQg8t^AnkLlo0B%(lM3T+Pue{%M+>g>Y-miE)MRokMD_{_#))}k1le4N|X;>3xFTkcH*ag@uJgFDw;n%pSwTE zhccHyzu`g$j?0o#Q{2>@S=U@5S+AfshXU#KfAr`-0LSycd2r^9SKP7I;0*wVd1K{c z&IvP(`W&ent;5HA1^lC#ejuVZ?>!f~-iRl8Zzl8SUBR7TjJnD{h)>4u(GtF$Jt~4LbQ~1B<8)KT4h8wO)k<@XDE;f z#;!Rsm=?{RBk7WZ`Wo;2x&P?VZv>|2f9?GB?R!pQASXBAicb`N;SAH{H0?Wh)oe`o z?n`m&hkYeG=*UaJSNs`%ex%NqA2%k5ezk@_`z7)HI|kE3>q<{bQA;Ck?A<$v z^bjMRY$M50K9btu*~Uf#XSC6o4ju*O^nN7G>E}+(P*a;h!+7{r^u&em&FN8ePwq_{ zfH9vi4_y2yOK6QoMQ;6~NciYXVNVpap*9jZdJIj#ji&*Nq-V>9LZcUYui=p-yU>*? zfJeQHy74r0-gVKxEW_t_sou-G>-mwVBQT2niC^{8mv)~7_hRcjPV|#e_eKh;v&oUj znSzEVz@Pu4N1udU;s4rswEAs?pkyU z8V&L2f8)&!>5CWc3*r%%PFT|15h{v?jl6r>)9t>Y7<3MN7bTMh^MD!+^r(&{(yUg{ zj5rd78>=|_*i=c|6;ZU@4f^rdfg_z5MGlTDsK63fJ7|B5_n%Jo1Htiy_a*#BKgv_d z$qes|^49<3>bt{ge*ga^s|cxVviIKUoYylWJ0dE*t%`Q%oc2CxM@VL=gffc~LY>!r z7m*c0Nk*BOStUe%4{zVkb-n%kb*`?;>3Qzg^L~!U_$Xw*aHDP+!DKfuMmXIab>J=d zySPsl@&|a+uUPmPb^amQSdQ6m6CWCH^~aBXBlHvh8|T|kYo#X;XA$u{)lEy-j5u!u z9`b$SWMSS4FY1E6$!md|uzkEY4Fm2yy>f?8*wcr;Gz3$q%V|Mz--oi0!^1jO2*v2T zJK}5`7dHy+L(m@~E>{XW(6Vv<)Y1aqGhiS!G=&BXa>1%N3DxIehmwU}ucaAzL;O@%=Z>=V#SRlXX1F{T;ZIZ*_(Bh;!p3@Y*6U{j-8* zT{$=fH$#P{L!mQ-`K`)7O?ajS?ai0)tSP)CY!ZLhFStYf-wPKu_>vCpk?*tHP#SV| z=OLKqwCF=!Ff**3jU4i265ZShK7t2k#eEi1)%XC)NW;7?)`>KpVvdJ9uYX!7y^n>) z#R%xaAK6SD!P7~LfnSVu3h7K#(({H8a8ZuYo3YSQ4hTXvYr~HI$-n-5N%kZBG(UfF?O!ryNVC+(_tH z?hB)&p?j%lvLB_y!#`+yG_~sMM|pQb>4tPNImY@BA)k+*c3vRt=9Xh85vP11{eB;Q zlxfh;`+Do&zI*4>zw3>UbG}ML5NGXI;86e5O{hbDwkSi5Wwlsn4u0R;tC$09ixCQX zd&B<~7&FT(;Q;36pYH_I9AJ`N_rdQ1G5iOiub z5D`LC^fPIVUJwoY3BR!5e5x)FBHvA+v~bWZc^n3hJ4T@MA>{G*CK9;L!A*u>x9rSN{0XH-7jV#~3`M zPRfBTG^zsExM^R(cDE;XozN(5w_13Nyis}_oa-|?h2whIPaVPxVp4&i#C!8N0<86r z8X-c49{d#ejRx)LP&;4hbraenT7#(>FfdlQTO;GA!k)3RTvCnlewajyPU2A}kbFPCW7RcLO%!9Dou zA(;&Xeh{9pKL^*+^ZfzTV_6uTec#MzW_19qof1wh)wGP(SO<`_Wduo0+8gymy>U1q zf->whjrv~3IawJ&-w%GH0Pqpq&jKf6agW;0RFJB9I91hWf;S_h>B#5He8aK7ccq+W z@K&Bbn)H)pG_Dj_xaMbs_;7b>+K3u^+-K=Nr60Y>45U*=fBfisLc{RC`FU3K2dQQ^ z@GFsfbu;@49_YKP@}NJUWiRwt1|5<#%)>o*3467@snrf>WvsX$hk-Nlqk+iP9ZFTy8hzF{)VdcRlu*rnKQb-__Ic(@8i^j? z9r-!7dlRG1z%SiEoG-h!F*+$h{p%rcojA7m48!@L{c`kT!C5w z+SbjL7Nh>0ki1*4*Ks3_Q_#KXB$ayKfChV5;J<$Kg-?Cx&gj2!=6%CoN!5A)|8^HV z$EUr8(FgH7XJZ~a+D>RdU6+Q~wvXH;xIrJo5_rE^?Jf%6a2~z|1k+$yoe)12{uhDZ zhR@NZ_(C7j+Yn3@*G7`08=fibMK+t5P(1GRwI%TOt#YA$;m~E*Kpng&idt^Lym~C= zt4kATcQUlw6_{rxWl*2ZsL2^>h!F*J8ht<+W=FBZ?_yWvOX3OCw_*()^YbOSLnyUw z(acB(yY*z`4apj9qZ0wX^ckLa!>hU*y}jo{ZQ>$m;evifap-6B10%_DWM88VcY()- z-}KMc9gQAOQqX*gB+X~dj8-jnrS?$~q}#cI!p1t&2)l5ayDf!`O`OP~G?Wr74Cq0S zGo8GLdt|?Z@S#Rd76sV1!H<60YF}vb1=39T(a*gp2R`%fIDdLjDOKuw(xY4Oa5V2B zEY9?#Lx(XZY;G-FMxU}P8g>7UokCN@xs@WAzTQ43l%4Y?ec%8O{Q4+d8|gzGmIqTo zbO$=W7xU6J(1OqzLDiW3KKH>n&z?*9O)y8?h2AI7nK}alcn&c?b|sR$!J}N)7B#U} z0-gQ>zijmExAtVv$qPO-I1aik$py3)-pX$=yBj*Foc1sG!PyI;g{~i{73$tm1g?Ww zbEEE`yy2;eI$^nvk$yJ%R(UvWysvNM^vsJ+XGhS!9fOPxm_e`gS|nZSG}x%)88>oU z97W9@%(azJ4o{b9O!a~Fp3lU(frGf zbPF}Qs_=qTXS|#mjzFjWY|FesQ{+^;6gy`4(f4k!qi@hp{%_vsvhcPvybtzM*Mlh~ zUr*?i18ryYy|=Y2gp=sIrT&QRoH$`7@~M+Kiel}HTgpW-zEw?JLEo7%%e0eK$oWH zc3QF!GkG2KU(tu?EU?4hP;WQ5isYLJ9lkuwy1(BBHyv0JW7N{NZz-`1I&A7V&wlDg z9bLgYRu7{@u5Ba({@-G8IOQhvH1YrjJLhBs-L4yG)K1$S9v_i3l?EHVUM#2juI#Az?pW8kHT)Tt&u~m0~KwJgg)aty4}H^zL-SN=$!o&7-UB~E{4+U!}Wr;9WbQ} zgGdTL`uj;Tn(zUd)bOJZY-LAnQCCfeAAObH3R;dm)_>#tVE%cj8!)k@m!TyUp(!kz z??tV5;u#+_Q@A=E`dXM@)n!Hs*Ucrrw`9UyvKT4 zfV*t((O}ASPQqLbexTaG8?a28h&(sU6?^s_g;X9F2y7Q(KJY#@#oTW|7Uo5{pD8Q_ zUKY9V&a7-<)C>FEv@YQB$U7M2qOV*M6G4X0x*Fx7Cd_;sNe?Q!8NI>X>bxzA&Zc!R z8il!|9!|Vp*u7-OWVWC=6?MP<8Z~W*1>_x~h+PVgP3V!FAmeVO*6+pBe zy}$8tdeStIR(--9vD}yL03UR34)$5+)>A3w6@3c8)m^)bN~b^{-6@1VY)z**sFNp~ zhthQeM#rI#(F6G9gR@F#iY1<{K@pVy?J@1O2&Vd?NSgQa9km9Q{QQz=`ZW7Jr8>g% zYV!f5J$p@^0wc~Mqe6rK0lPshPO9iWV$SJuEK0rULC6h6OSZG>$n z-B7oq2fkLHJFSf;-3GRs{MzSfXE>8BaEkvu&pw`3(z&7NwJ$-xs4`M2odR9rZHTku zS*g}oZ}PQ+C&KVA(yQ22odvGKdTbBD8g=85KEPh4PZff0`_e%T^kb`?g;u~SoBn_Y z_sJL`0&yNttE7JRsY3igXzAB0>Cruv(6?6r#cM+Qseic;?E~MmA*dT|>VzF-0f2cU z&sb?vRlh*`jN0-@ziy-%8Avn~IHjS(=|mm;f3^clx!s6vKnLRy=A6y8EupBv&=f@f zGSI<=obX;Q=);eGBW4-sQ*XzI)9Trq$kPP)KHPVoCdHG}e9T`PqUeO%Zn{_toio36 z^dWH!1U;(&KG}-k$^L5^}!mf>Jm= zJCLNfH#cT%687i7CjocmsrD&C8F&mOF2L9v%@QImL-X}Bu)FE!h1bDKT9gTmBPtiB z;rS~*j(Odo8o>d3o}Z|PhuJozcbV9Gqt{4k+lF+XW2QJMiZW1(M&H67BQKh+Y||#? zOVs`Y*3q2}&1eZcS%!a)qMhzlLg-QKIX;Km0`f>y(a*||-@eSX;q`bZ;m^CqJ2Q#8Pbc$7SEWSk#*5~$ohO3k}F z1Rh7gz^V1UnWuN!pY$uBcQfK=-c0n@vw%$uzNDwxu{VHfpsnXrFD_;lFH_Wo2pR3vh975hq;7b>5RC(zEUx%5h&9@{~!F?s&a=;8( zbyT$B#@HHyqf-BQhZ1&>;3Bu++I`hRM4d9N(p?2y=b>$n{4n$TEwOg9A5~UCw?Dr@ z>^Q=oLQ0g-sn%f!@}a{3%-sHqL)c)G0J69Z&sVQ$EEgIJ|2%`AY2I?S8+h`?T6l)f z`Z0rKoTYi_O+IP0FFEkW~hLhXK=DZqxPg7w3^WL=LR&7FPn|36z zxTZYS2{W5r5j4&F8JmPN@aAP0Z9H|FsW}1vgI(mLKK^Xf9Lz$YSDd=1UNrj%FWqi# z^fIogsF4ng%18&g0YCb*aY6Kg|Lr5zH8oP@=mWiX#98;naPj*fFERwTYomOFSc_g; zhI-7b#|5zryn)P7I9C--SRr`*eu&AZ*}d7ZeBf`v53O&Q#vb52f4HlJM!X}_9}6DD zMI{Y0i)Jb4m+y**zjHF{0zCP(0?f=`oM795=~i4<((RI~td|A+mp&>8(6~e zgPO>yJ(JGq*_n@J{SBF%tIG>j^NkOvkv_Ld}&7`uDcTZ z?TipwtG0+|y~0i#y}5M0HTN18LUD>PYGdrery=IIFkiYnM#d|4gRc-7PKAn9JShyg z-+S;-PoBfS_6G+rBa|Wr4Cji?&^ft?U3~EmHc%a&Hj(hn8Whbky2H8OrHb02wm3NvURL4@^h~n@L<}P$_gd{?||8v zd=O`5<#?Z{1GEAjuvH!bB;xhP6Af$In$Ep=_)l<5o8vuH zjNvf}(A!3>aI$y?zYPuJap-aUG?#I0UDWT$zeA3@b9pOZQE_%pTSf2#iNHVFhS0H@ zoB7Z>;QHHPF0ntJ&-sD5AZD&PTFE?RKW4Y6x2pyx@VgUn=U^}JzGfr;1`Ln?lMq_= zJeZ%~>rclnATKTWhquh}BO48PdRq44mH2y?hhx5=m%%0tg~!4bSIXaQnLK7IN#ElD3-c=(hc12G3^eEDLuW&IwqL1E;eE9pkcfje`8kb(d=-& zH?1BVOoRHZVP8JMOHLhi^~O!?iHN-$a>bj_4Cb`mkK{PR(<832F-HF6ig+dJxx|Kd$u$o)Ny@ z>Am>;lmOZstEA9Q6Z!R_fn{i z?SoLQw^3Xw1LyZV?)n|CL{~j%*hV8)%Z9UOzu?!o2y^MCF6?}bH%&*)Z1i|1TLjJU zG2g(+ovC6S5$76kYC4a9%IcEAIl}yE(8?BE0W5s~MBpm?yYp4ek-LC3bo@G&yPk$m zAnLGVujcWpd6?k`D#_Byo@af7*Fg+4-m^luCHlJy2azKpH}g~0@T{(c&bed{w?jPE zOh8ZiIEz>6V>fUH{Ocw8yrVPv7+^~pGq3W?h+jKHXkInmLBgQPdSdyg0Mddw^V zR0S5XkY82vCm+<@10Uw{8qBz^qb^U@$>h7BBe88=0F`*|<{i;5!~rKU=8ix2tAz&p z5HFHDcHwV<{m=&ndbw^i6L-KTVVfPTs#qYNO@i03WF?)vY?6CwLIB+yxAd>`Z2V%M zxXT%OiRZBIys5^fX#@Wl1^n@Sfw=)=>1~R0zA%LKdjq|=p1`td9$+nAgAa%rY!<*T4S*J<2fQj0Ht=ZVilX)S9AlGs!yzSgL!Q@lJIaS|#hwTE!g@c3 zyox;}>VtXTuX5!u@Hn^O87#idYo-KKBF=oL&9}MM(?BvoUXr9;<=S`rXg==LoUVm@ z-d*5NpgmW!JC7f|2oGG`VRybB=X+zlN%;hR($AB4C&bnqyry0gT)8H+6m~$P=pG`B$9P?&OGXz$36i zoHHM^VY$$4E{%YW#|RVVP!C+*eB6CL>)Fd{Z!+x$FG%a-Y&GW0iucfjA9|k!;$G;4 zoUC50&PN^gqj&hbUS)LSq4xf?EmBD~@5k|dgVAfl6XE6A1w8Fd04-ew4gVf4{LU84 z4lR^4KqrFFS%O+>Vewa-AHTmOuEOWVfLHsh z){&)Y!dEC9y5~`rEci39e{-Qj9s^%#V5_Uqo0zEQGKXp(Is|RUwcgKJX#t))4&Q+{ z8oYfLYMvz27zurNF!ne~BN7UGkFI5&|mK2$Dw<(&kQ?El*O zp5gky9=}3Q8@1;U&xU@&yj#G!c(3Ov&~3?`Q{_ zxoIpL^Lr1n*@g}-ex>@XfClo8Wn}gE-r1(j;FE6rcbt>v+!GsYJ*h9^Jl?DaD{Beg z#xUq?H?wA{_vpcAV@8y^gPA??ruC?$25INBK*YHL^}wceZ`r#-=mnuRv;CpPea@gC z+=h6L8^~SO`ctes&Rgvi-gXf%8|J{i7_Z<>QJ30IRg!9AAiwYsJfJbq5_-LnpUDZL zOQV#uY}am{9*3UN0AA4=S$qKA%SXg~m5T9ukl@QV8BOP({2^9*%( zKb^uXduB2>$_Lj3S}KhSU%sUh9Eu`0s=hFQ7kJC*Irb~VRJrU0xa95U+LL)gH|CAn zZ2B>48v2c^;&Fz}8~&l$@S}f>d+Na*^S{pX{n~0V4}8pZ`RMPS_F)T}d(rg}?EWs; zu~l!OlQR=InX&}d`LQ=iw2`Y1pJ#)RHW(%lUoSULD>+fSe$8QY#u#~Eq15q;Y3 z!TiA{cr-ZR+-{oAciLmuJO@44nd+or*6*op>0z`^>p~zAqq<+QMtzK~u%E_W07RpYQ`} za*D?zwiduD_m*Vylx@(`yz$$EGn?Oo2F@_-$#xbW=OcW8vexX^V(_i-Og`^9m92m#xyEGl zWzlPy?LpkPs4?#MPG#ThyvZGRlXU$hb`O2xZ9Koehd!{Z9N=+CNq5d^@dfxh#x=o= zGQJF=D`0&!<{e5^QX_45ywVFaSzP#qMrql zwf+wN0GQrQC!i;wv6s7VLQRPKD_rXUx6g!@z(#z2#ryaW=+{-Q@h6E!5?}BJI){Dz z$W1?i8!UIDchF=UU6{ZR0q0y{53GqQf$L(QvNRbyVu#I~&4M=#W;$Q|eEIV)a!U9J zt)fQaX2CLQ3yz6a^e@)ot1G?S?o2JZ#IkW!a(a8oj;3YTh~XvBY00xDUA{q8WQG5K z<+6Xz@G*%WnNR&YZzN|Fiq|W^fkm9X>)wbuM$lZSs^Er9DB;Lz9!mo=!TuJp{5ECmC+)9I%@i-2Q;1n z9m39k*Bh-}Pl+8%;BSRE-+Oyr>^{sBnhEeeIQmm;DZb;TgbnR^ro(;Z}t|<3R8Xtc;O|^B=BC5lXdmjiUo9luzD_|6iST%K=*wqams0^Wm#4IA!i&9RWcyM< z$yLYL%+4~}G{u#UXwG2W%j9(DfCHV_aY!6~3>szGwiM+sN3~@(_UtAr=mq@fmB!#~ zHvS#wuA>f#;uNSOkrnu{`Rl`?0dm9^)=R@iHfFFuJ!t@P% z>DLP2o}U)5@Kj%_?F?@9jS8kW7W=e&fwXH)9gBuu#Pq~KdVQ`H-xmzeM0?;}_UZD} zmHsqNE09L}cjMaV(L{#;diK66uY|rzsf|DOM>>4TQg`Z%&#z^9J1$+WfbI}#iN)>t z_0|ds2A+7}?hZWcfr1p!Mwd=#!=pJgrY?XR`Kp$&qjK8z0cXylfL*tT2PyQwJar?P z&kz}HRR^b{vNM}|8}s`FN8D#&;x%Ahwwzi`L#lhK-9dkJVxW@jQ-`sMn1{qvq4#i`$pl*;nv@Vk>T_4KAEnS9hn}?t zylX=B$L zyz?Ua8m6Gy3U8X-nzM$rh<`Qip8W^$bvYG}@r2%01eYVpdDHJdCW(;OM_ zJ>}wj#CiWZC-QkL5q;1b?m4}NOkJMlZJG!#0LxXR2S0jy6JR(${M~mi*tku+fnAo` z@BC~#Py7aLF6M_F$HCd+e)NgE#{+A0d!=~(Ir8>L&#g4%FH=^&eRNEo$yNCGO zE9tcEG4Z&$H|^?!J!s`6@yJncVyF$&C%+JD+xn2vW_WqGQD@8tp6@f^XKJhqk4qoA z-w;S+uMc1=W&p2!Dv-QRPiCd473~$M`P!SZ8P2E|CIpg}yDf7G@q=CucC;~amIU0( z%-I3(0#L9M$Gj*Leg3h;HSF|rH~N6tWuVy#_UVwER@Z_TZM1?V4FV?^Sd*ZZtC@RW z1^gPkNtL*anHeakb5r;nyG>=@rqKL>K9QoL8(StpPM+*ey?RxOy=TZM)KX5C??S}Q z$Qym#G0#tbu38)ky!0tMk~NFYYrwocd8IY9|GpSZUFb*IpZ=aBS;TG<)ia?>DPn)R ztdIBrwTBnttg%{MoDIywt8u|(xb~~+S|NM@(F0z;(5M#9C3Cf50o z&ZGbuc{*EM1^k08cy!x_9ua5kb%Xx4Fa6X?6Afm|sq`7}3i4Djc{9C% zqrj|ZL#JH^_p6|>-v#p-JsZP`{k_QneuC{k+%_zA2Y+^L5J?Vpl{6Fq-#ZqXTD#^- zdTIKQ;gdjk#s^8}1E*KJJ&+nU#!KAGpkX@)KFHQ5Byv08#54kFuR*coPLePAVFwej zpi1%#n*2Zd!yh)_rQ`$pg|8F*=~M9&NwJw5jl|x1-?2xMxzB)sx$Q&0=0BE%lZ^Ue zHZ*ko8;R*0IlYDsk7>nANzN8%RY6xOacGIe;);yE!YgsCcZMYS8+h>L?zGl3L=uG@ zGI_OvJi7LhO#LXQslQxEcYlK68tkDe*Ex{ig7uRN^!;htEZcwm=&vvJqgBuTo3O4q-DzClqCEsg6dtsCM^-+hCq|50PTnBo6CHKHJ12zWdsh#AObaaD)=H3H;e)2WxMPC`cV$cZtdQF-L zzHn@7A6hRjl~Rd}49|JvuDT^XH%d;8`rhP6qO=4x#^_?;Wp^e?hhKwMl9mTuNO6^R zT_PjPOA4C4L05WMQ$gnvpc!#GMl!=6oT+(^ba=vC!{uH5>7m|gdICTCFDtN*&Ry|W zKbX3BlNhlJdhdwy&olQ`%kw+47m$*P~R#ksiUjp<~``v z98i+kr;CzWoTZ2VC@E2|we%f0r}wm#l)7xJwBPR;3wo0~I?JV-anIPh2Vr*}E`5!d z2V&<}=$$A%W(9w3?5Ko~C#2@-@EP<+Ez$hC)T0sFJA>g_U-?S9)ercw$KbPHXexXF zmPr|heN15+VLIye=fC`E;Ij5YF8Wy)9e?_2*IIDcuAt!;p!;mqQm||;qn3y8dAx2Z zbX(v`&b9ElKd&X!ArF|~{y10CMsPSMqh}p~2RidpIz(4S>9_C<54a=!w%wIxL!W(h z|1@bYXvkP-yHW7~GijR<3QBD&qh5iRB-y}Ygg$m89vf?z+zA-haB>gq5DKtlO~>YcntPgPyU%aAGzA^4Q4)_M@crE z^`unH<+79aNj&PIv$_<0;y-UB+h%zIFQ=qZm#$JvFL-~mAZokBNE&{~i`;=rzEo>3 zUG&t8%DMpKQWY(|`g>n<4u15lQ>4omdDB-JdcTYu=~!UBI-?If`{9O^+CY=`W&j@u5I`ozcg`mc0BW)stUqB4EV3)7aM0kjvx;^f}X%*Gdc4@ApQv`3tMTJryb63n* zp#N)~C^cRvBQ*mz3aFVcja{aofrxv}m?Ft~VDgn?oak}xX2av1{i)*D>VN&{uK>$o zbL{Upmo-fhXUBR_5#s#tTYK?css}kE>*=s4Cz=Lx{7|)pSkZJ)(_X2ftjrIhoAuv`4^TCU& znlHVGIGKS*RD94{8dd?1(YxqdDjcP;ZXWdDIk<}{w$d^2a(V*1Y2eirQjaFCbX4I( z3!hm_*DrJ-ZxOx80#|ADL{}Q>=1pzq$)pF)xRSII&zt2^>D#{e{sYKC9So(5wOok- z8(lS_v(y9UKXkkseWlwHgB=PwZvhRv9;Onj)6iGz;RH-}FT)(<=PzZe|MjCc@I&74 z`a8}en;jL`KqvD&;%sj)SOw0mT(JGJ}SK5fTklP0|4Wt(D{6!~V{FY`15UH&f z<7D1cYZX8@E^iU%uJ9ty0)Lv*X1nO{*qsIfW07!lli2NtjJC^BBlcV`8acbr`}scf zZb*#id(D}AlF&y{oOoy-?lJUN&%bRJA9r+xu9X+Xwh9-u;#}wmYFWjGHDc9S7h3n) zo!mx{cn)#ijlOY^pdl(Np%aTc@_U~s)lSTjxXh7c*CymOjP$1tpKYlZduPxZJfj?s zzw`694qR-EfS)7c?BwYw%AqYY5^+|0VfktB|X$5od98w7AV4ao&r0 zrbeo69H8yI2zg`4ES9kyx_|Z9Yp%3rzOTKAKs(Vv;C!xMH6 z{OuwmS(p3B$w&ODy~8?oTjEYFjzAZ0MmXDvos#P;V7@1Wu*XHt^lP9Gm866*k7>U> z(7}OhyPnNehb}92A?LcRXZ}`rjag_yOC`&F=}Z%Wle^K>hAmv?LKfc88LXVfOf6+p zXQ`m2i*;G)6gTSC=t3Kw?Gz^(d(oywd%E$;R<##>_n9R&(3iVnus_L<8ZZ4_*WD|N z7w2U=Qtp1-gSs-YO{Nny0Hb0X6DkUM&XoQIwVZ2`D0$&RX2{8jHB98tRB4acDvV!> zx;mI2wp5b#!0j%o>1!*gSC^3CH(<_EX9QIPH)$Q1ZZJ4KF?%X9P zf?b{q?Y?b+)cbt`i~sIHdDs^okI7=LJHW|p7Dy8n7g^;7d|uey<|dW0uWBBYRP9eY zzm&5Ijvkr$(QLyz>~gI$Jj!r}OG;Trkt4ky3(WM(DmDNZ=0Vo*5OtVV5TFT+AE`A)g3mnCA4LR zJ7brS!M0S&=jj_`9_ks zd8H%Orw7yVQ&D21ofD~+f;TZDMRZ^3Ov5#U>DS>4;s#G>1Tpl3=jz1aZmx933;m#a zC-&7%MkScfPklLo?OY13XbtM*T~;izw}Rr12GPY{A*?5KgQp?pC$x96*PGnv3Gg~4 zb28c0q0s3?KRBZCG8>!Y4u4wogRa$V>Szzr2L|`uOLcw#d2E^uFkvlqu$zX?o=zYc z`uE`S95)i6ac%xgpT9pXqxl=a9Xi>af3b3=aV~yz_CgOn89WW!SYJ}J>d$+8cc5@} zUrGrY#uG{$$kqd#z=uP)Iyum-Q1piCefj$P_B2C+zH3r%KIE+fsoCWWe1AEW?@5E-fM~;;%shafI{pqfBdP(A2VLxPQ%P${xraI{HJsPl*J3;%aE4bTA zxf3s$=|)FAJ;^XHf*XK`a^2632J{K$qXO|amHg3C>sf_Zwq5hrdETj?CLW%T&;3j= zdWM5y!*nP5Cb&D)P6JcqYQdUmK#P1W z_NqLTt#~gZz4^eFj7nnb&x2Fb6TIJkXPEH@1wF3?F8pE{I|H4_fzVR)pYxR!)Va|O zoOy5WwtOn`3EzS_e^4JjU^w=2c;9<%Ch^oh!aLT z(duA$XbyWXj%n>ovT48hgWcFm+#PFMPgo>1W{u` z9M3>KBW;Jdx6K|Nvc!w#4Mts5oX&5Zg#Yp&B|Y;v&P}kl%5214?3T&X2f9()lpxyt z{utM9lv5XL?0{cp^K@+mja&?E)6OE7g}c!fyCAy1;5=^xmcX{%@4Ux(E%v$X-T|L6 zCTsq_!mxY+^lEI<8?fA0ADu;_^UA{Th1w8@2Ha8D;Hhyhl! zgE~vAaiUJ<@P}01_4Cl{#yVEEG zV316V`JrOeY2%f&fUn?<*3g`vj9SswpGQI~(r+g4iv}C`p%~0tfKRxTki=z}x0FX> zmgRknFE8?LcNr;eLf27HXy&Y6 z$X%eLWd-b}|3_#3q!V=MHzBrD!}+eW9^{02a+DEL5`$V5=^do72=^Ujx;w7pZjS&w&J)G&%f-ZcsO;!@y;&*bs(;4vBD zJqrmp_!i)|3ogMoaNu*!(7)?}ldC@Y8~=jY()iiXvKZDZzugZXI_M5g=(3jir!Wh7 z2+b7J%4YeUoBL3K8$3bqJ-x1iGhzuHkO|H5U;Xlmtf~|>qr4R6zYmOG5DS_&)6u`A;;T+ zKdaW9hklSzygE3Zy}I!DWI1iZvwV<`;2ReysQ5c-m3m{|6>~P_FTAc?!PjND!Cwz} z-~>OuVU|1a1~`)gWB7>o?zCqd?u&$7yfZXWI{?f2UP$K~MtedF1w4+4BG<0=r1rRL zYSVA>>3Lo>rWtguZanABPk93?0&UVC4gBOqVCEg6e}~vE3IQ$xSl;L%TKTd9U)q}o z9l4}7`B%MtsUZhCe$g8F&e%H~*#X}`wdVPUfO{-h2%K5wTYkk7-lmA@OCL|j&6?6%^$haFTdDK}9 zcs{9H&)+$@ldT*4k7^URNptKYw!(|K?Gb+P7(Cn&+q>3zym1Y7qo`jO>0IYO1?aRO zC*+zw;TI&{6bFo>-I%ZZurqYm{eSD1w#at^RzE8P`eQfRpyMZ#YTNO_-&OK|c}Dk+8gnz$+fVS>MfP0Ivyv1Pf@fdV)tm2!r%y-RD{iZ!x!G+u zI(86V)rWWRB3F2y;eG!6w4ZP52(QVHz`I)HaI0$`^aI?(g%Pn!8eco!^AnZW9V0)qT&$LV3VW^Bh~ew2D1U%`$JK4Xhuj9=!9z|9QZP&TZq8e`hi<@8>>Ye%{6w;X2=C$A=`gN030RkV zI1g%ZJRQBf?^pP0k4WJ)Zs>8q$(n6(j9={y-z9KZB6cy}9ra1SDd36sxXCSkLjMrj zLE~zl@M!S$&P9VeT=1FaNPWN$g?{6jMjlk|LwkVXzkB;95BTUqKhHxi(cm-B>gG#E zY0&pGdCaLFxO=M+XP(2ofEh7Ht=wv!F8>Ps@avf8oIhiJHdG6@RChB?vz^fMm)da;rgPSpA~>b*oWHaN|RrsDkU6CzmdFlXAy!FLZ%`wtN}(7xp--4L$w2DPq0?`BpZ09bY^G z+O!?u6*6!K*S+pW!~230^g5NF^MfucFuQdr*}QI^2en=R-kRMxF3j~LHQ=PfUf<%` zZeCQe9{zFGRs7dNZ?ZoCT|`+muRZHcw@x8fTztyAV;(yIc=Z7(6?|%EA94V1QJ!&` zw*_8$`ATTH*eCMOBmAh{E%1D&SF@$ffu%<;{5w}%L(RJmyZisZ8Y zykCX5&dHIg-oQ`Uq$`{J#F2(PgD%1LxlGR!oPGT5or;3l%MVW231bFgoCwJ)XNoEZ z@2>hZoBYO^&f<0AjZ)U=?E-)1U}&+`F})8i=r4k4Q@JL;?dVDmUIdfon{NEuTUUzt z0N(4>;e3jdjQafqmM_MLyVYZV)B>Kf(#8C|kDT1wfvfY)fwx9ay%KoxS9g{C*k%O{ z9tceN&-L7Rm>a22fR^u+oxJlM_-r5#hb>IwZGfkZ0M7sO%xpdon!x8#S3Jz;d>MAF z?P8z>XLp%Do&+3nGHQY~*Lc=4@Gik!iA^oyTHveM>;})Ue?AYz9v~Rs-`OFP_r|WF z5OH=s7QhRz-?@zUKla@*ws;vddk+1Hv(FPH?Z^lI>fe8V>WyT+L0n$$K#mQ_!}p3s z$s$MERF9frxi(A4bEKY#zn49+&r^`AYlER9DQ8VjI$<}0TroC|Sq^cg+ApY`0@B&j zo#1MG52lruFS3=LfA{+E3?2BCnL&3wUmZ27SrhL26>~rEb`E5; zu6Cuhy5KS_AH|)Z7dH^x6PMdl`1Tjjt41EM)?dt{T;$Y!B)o(y?74NFoMOQx>9sR} zx7?_pFvQkU8O>KApN~Wy&bqsmuV{o9gdOUHV=3^PMjzw{&8u~X`NSQ_=Qz*rO*47^ zYY#esvl%ClwW8%E2g*WBI^0!>=@T7kyBhRf z`ZZ@Qb~w^c)ao%0MljR%PV^ej?DQ}z7VqsuHZ7q;`#g;4RpFd#;*Ky)WXmz*RYRU^ z7k+{noppw0?^-I4zQ)vhx{wy$&u6C>%mOhFLkzzsHQ^PA`N2MT&*5!(E6f=p2San_ zOLw01)RlVT{?b+(#us9D5oCa$%{JuI?#k%QRA|)qoX7Vp1EysjYT%{I`KJ$Zs;~g} zRVn9YTNL!#7MevCA^a(@%H7bR!b=RQv;-wk~DsO~7Nm_yUYOEvO z!?S$->`yUnyCWU?5e$7qppTzA(s-QzYFIn$p5TQ20`j?N&E|w-Mu=x&`+-oV_QHu4 z;aTX_Z96+Y3BBYe>}zHmVl{Ej)C{c-$``*v{=vO}?w{){voADnx5G#8m^O>I zg_aBM_up}TdR9r>LjSz}U!133Y$@6%IM64=wsZ6Zu@H0GgNW_R*ZyL;u_Kuyw#lZc z;+hOcYK7QN@x3bE`{hWfi0$;KI*}}#Xv|meRkPYNv%~0XkV9IB4`lxBoJk*Xwls#k znH}bSpK-^jS+c$7oarO(wV2Cp%y_U1Nf7f)%SaZo(S^cmP**r?V>L~2Z@vW%s&6W5 zf?43YAx)XgzZ12RTh-YzzJLC0TwH&cvt1|^5pMUTu7B_x| z4aJCWf^Bk}!fhYn$xz!P4? z>%bcZtZAlG0FQbL9Q(A9nmVZV2zQ!w4DMm7$=X_*?27g4l|Fz$D`Q ztB@7Mo3&y{))@;U)$ zx)bl=Y8hXcJ zzKY*jP`b^qe}fAt@qY!|Wf->ccBOc{hw`_DhL6x!TH*}o#y&E<-~bI<-XZ-!>5 z18?K*`0+whvI{dsJm0kjP4_?p?C0P0#u|Rq&?LhFnxNqR ztnrkb?%_y%aE8AZUX)DpbEKz;L+40Msm*&wGDCdYH;j?GEp(zuh})*`%cSp5JJAK4 zv8fi}(%qflv541~dL~LgtVhp??%vN~jpn$g_w2bd~3j6LMZk@r)Uba>^jB{&&ns96PP+|2n`0#dw zro^1J!Xe-g$`OBWkF|pQsT^^I=2%vU@KMu^l91m#es~BMv5&ZY5}$P&K^RcwMqLOq zhw~q#b^mx!Jof&%ofk_lpY$aGv-JM6_ZVd0EFW?FJI+sHqa;q*4kY03-4dcET|L;5 zz9J`F?`$j`whlXU#8zWWq;!6BCn`q_b2p|-16`cxIiBm!X}6?L@1jq{>yVfR=}|*x z+Jo;29HAq)oN$ItIr?Q7yq)jrLWTI9g?*+7?IN(3!T;6$?o#0g>J4keHmk%#nCIY1 z<52rm?2HoZU%8SO>Swc7JA~t_(6ghSS#JUlHS~|~QO}GBIweeU1+E_P3_gBQ*o67E zKVtY6+9`7EZhG~Go_3EH!pC%A%TW{hY19ZijTB_k4}D+VTOn-*_ze=OreOq^B{9F8=*27j2T> z0-jnOXHx4&zVvrac0@d1)z?WUM>$a{a$29#j>6V@C;Elg6LiK2Pq4T3`W@#>i-g-PHt=ptxGvQ#f)f3L_0E@3Vs9P*&(MZEkb;z zfVWv3)`xbCRFK*T_yRZSPiKwgG;`2eTG^s6Jsd8hF^IE&Twij<-mL-ikdMO$&>&!( zXX8EO4C_xisdDnYkDUBno7D5cr@*Y{{k%uQ!Uj2s=tmx9BnV~LVcA>`qOvu*LPucD zMm>VA8vN)N4p!1f=%4@2vH#1@?{Ydy1?E82h(qQpAL&kVq%_25s$Y)O=7=MuAhsjU z)=9gMa-wF4=WWOC!sxwD1yoeq`?ihUt=NfyfdS0f4<;%qh^SZ?^pG<&%+R*j zg^HM<*a0fcoP*tgVk>rwfr0J!c<=99|I1zLt~HB=3h&wH-ETYr19QTWou@?D6hEBg zdphXneWB$0;V93oL*_Tpe-bgYjO}1uWw_q-$8gr(tG+bEYR;W%arWysr32c$2|#1U zttg@o{nP`Y?#8;e-2jBv352NydC0?u;tcOcgy$ot`k(fpa+*A2!6?(rXQK1$kt>OU^eI8Lg#J$Go6ooLw6%m#Pi(Ml8>8 zpM$rg1KHlNVGK?B)fSBgsgc3=XhTygQ6)!>(fr)e!A(r)<%7+P`EBiN5trtJrHpgl z&s4FCd)x2K6}@gA635s5dxkGIy(%hjFL06hq13atB4i2cG`^?kSONPg^IS0}m>jPM z^>TmI;JF}!6pr1w9c=Y)bfY3hlXtr?0 z6D#sZdeH}GDKUj7ne*BETp#9&9+8~AFjrRzc1NqazIe#ketn_FOU?(r@(iq5s>YP( zz8HU;cl04=@>qPadKmM@8w;$@;%+pCeE-h1VL!zmi(`ltob^ns;r&=9j2ad@$BJWV z;TTP=%P;h!pGp2r1I|zXd!Apum@ExqKe&W<)7P=vrR`4Mn8sKQUG-Jca2EZX@qBl% zooG9OcmvLwp0#ii`T1%L=I7St@#5QP*2#?XRO1?9JmZ7={IiYDXNkv-^m*a48=|=? zs-EQ>k7xMenGfPie?QdbyQ%+C5fzCiY*m$h5H%X(8TSJ7>ab4e-5ISf`lAfr>j86t zf%XCT!<>*?$qAM>0??OzVxX@F>>dT+U|&9q$RPCRE^-7vFD5>{+BtI2m^WS!=YF`p zFI*X0KWAzW+xTD!pJ}%=JzP8aU<7~8}8HnOQV##52~}4h$%k_$pvb( z&x}UcEi0^c^+ESzdc?0N@sD&-} zvv&MErR*YMLk__qK8v-Q9is6YAMVBYjMkqOX%W8v)JT@wUWxage38aHY&)(3X0q>? z$KN;Kry=SV`w=t3ys@g%bX{8dNMzh4MPddFPUKm zi8Gl_2dTjqSO$BpY0w}t5;wOE74a>@@qj$9uJogCdWHT+9sb?P{{Q@3_s@K3(`7GM zGR^_Pm!v7)-sr?!(du$tQT)Oiwv1<~TDGE3f*N<(qZNW5mXJfydpRq>B3yD2o zoUN8+i#pYPQOr0$kGdm#*ZbleYw}ewzeQAYdd#slbAMb5H&gv!#dkJQX^Tc3`3~|7 zuPn48KFl9md9QU#8ig++02X}T8}0JKW%76adNrE)Qy+!r){E!%-pB+LeD}jEb9x7_ zPC%ssAEYqPjQ&J@TT8zGywi<+sTI#NW1YwS!os;|%ALNnEe7ps&V$)YFHD%ocQYk{ zdd^;$%h(=d9Xi0p6Q_w)_;_j*ZtwBLt_R$gi~)Kja`$13LQs#cSjGFL9XaIfyxxi9 zzuC)Mk^{W5g|I#n276-S|N7A%V$N{uTXH|xzv5~sFW>8*8Qp}?dr~m5QgxUIy8JK| zL%w?B4`Z8OZL}!2QjOi5mlh76DNI}VU?IPLq0<&oZl@3WGtNECPKs=EU!3M0dScp3 zF_nHUf1jmkqzSGM<-5jQ(Q8%{WL{vdU>>en)D6iK{E@}8xA=xFY#;c;hWFIyCR1U> zxm+3EUp{u^WJts~_2wDQi9cEf3uB@tGdQNt4lPtvjyV z(D6(k2eXc<@W+x^Nq@9u9^T{Ph^4&mY*Y`Lvn4H(;^4wl{ z$C`k8h#styANo_rgniRMKI=PepJ!AD* z=+({x_jg6Z{33Pu*0^Cxz8>9XOu-D<6>VgC&|Db-)OI6|I0}i+2cg1VcdQJeKIX~Z z`1ZpS$H=TOeOwU-R;y8-yOw79`J&=uf0VlsieKG-s+?XExBe*vkLX7~hjYAPVI^?| z>+0^2X0vAQ%Q!FT|3RAi%NwtlD>^;zD7wgM#51-d8cY|Vsl-cip0+c4p|ICbUzl;e zdvT9=IMNTp7-xUGd~vlMYX;_@+rz$#-i-s`&72$@UJL!o1Y$O8whn#TqkT~zwaR0O zCls(}pY^N->)V*IxN}~MODV$KBr?Yq=ftDGr4LTF;`V0jGTOVQLhK8}+FJkwPwQ>1`tL ztQv2~xi}DHDq1xRK*+g&<7so2n4Aja>d=qgIfHk4Qb`}N?x`E3FqJpJIR9vNQHrmo zMpd5Y*Ll^11ADzZ#<}uiE76v7wo?2Y;p!`FSf>>+&i&pj676RB!JY4Ha`H~`fjbc| z))=*io)=$z*cb2)s#&K{RB#Q%LgwT-)hZ&$RfB?h^pro*7=yWEvgUo)z`rXbeGs}Z zCm72E?Y0IXkU4qRq@j41poLclYR*%yTTfh80PF4UadrrR;)$KQSYE$PwYSCi5}NO&me z^0IJ0?~c>&B5-T?UGbPTjind)(&5|0p?jYAoJY)!zq{zMRZXmK2zA@PN_E-G9BfRS zy;l?I@%=Car2L;3UTIZH|G~@CmPr+fuN%ZTYZmX63Yx0Xm2v*D#$RwQhq?V#!A>UNa}F6DuK=`-^PmiYo0Jpv_!j16WI}nAieO z72*-mkRLqJnHYwzozXST z4}XZ?cAMRnb&M|rIE$!T2Zz`fY%|rvy!LmoAd{Hq%~8k-yeQP$JTS2oIsElDiiCL{ zcw`lh@4J1)OL7G3xsj`HWhzF^R%66!`bw+Pq~B`;@T?R$SxU>BKHS<%O zlK46)ZnmVdBd&mPe(-pq6xvA*d&c=^$T!Y4D)dNNWk4kEV$xoB z=N*b#8pgUPfN{2tOpp9?tl4}AZ5DNSpIje6udBq}V$*hdIQQp{?9c&`EfJT?96tE>eo_6c1}FLV z|BB2MJ-7#VJi{7(;USS(IuIeVI8Q#GEhg}t+TA?{k@Yi$$!5+}mq%mOr_I7D!xxds zdaUg}Pnfq-<2X5VjcU7y&|Y3>HYpMXcUlSaCY~^oBk<(>T`6G$@76x#WX+u;<&RY3 zTy>s_S5+lHKHrm{xOX4eTD6>d?C)Ox-x;2f{dfNO_rHJlu!FCtrFqWWn=sBbQdH8U z!D=jIoY${)kfMk|s=@rQd~%pn-P#v}_<7&)rBYQZKg{CysB7((S`Q^Bmw(o~^aZKx zm;fB&-y1x!P)dvs#68Y1`&6hX4sFw5GHZ;aq{bq-K#S_U*S3%7Dja#wmFvXw>@+|; zoIzbvYwqL5j}w{Hn#dc%U9-K1@T8`S>rl=!^ZbOC+NW*#Eb9OC6)A7E=*8N5S|@+u zn8dl|Bj&Nafx`SkAoizn7iOvzmE1YU8^-znSG7pzKFjV9b&~Im6?=K71abbe=4CID z{D*nci#`#aHN>lskv}6GyUZRF~7`N+NTer#aCzpruuT|CR-rWFHVvTX`@tN$HmKu1m#<1V$n$vbVYctju z)i&(PiP{r{E1b7a9PujWePiBttlt{FsBKU$3dLJn&U}WO8xCcMQHO!|X2D=X5%oI4 zCsQ-jW}Kn#W8#HI@wv=%F|;@zOwK50#kbrHSH}{g%R0m%-rEpLkINTNIU|bjF>H+1 zAbAOQXJtGM3DJT0T8B8ayJHM%QyGJP#0-_|YnZ}W(;M>aoFZx(jxm46J4eB#?WLR% zv7YE=AAx2K=jY64?~~G-{taq#{>+R|75?0}bF*8sp9;B8O@p(Yvo~I%HrFHe2LJP; zZ({L(XZvrC?vZIHEhg7c%{ZqW->Rw|M64Hcg37F>s(vtWp^S6TiFH=5R&s94I4}RQ zHYa|MAGYzXPZ-$NF!c^~gg961em2zbnEl8=));QBHyJjL(4ZM>45xEv4RPe2WHzGa zYH^XFBlq%GIon)Zxw^5zgb?gvz8!4U+BoPsvERdaXE^jR7W|@DwF_s+KL;C4>W5>m zEB&uWIvAf(7w9(Q|K{N+W0T7C-eMh6;5*uAvN8x=nM3X=qmARjweaT8lT^#msNbML zl^x96RqTux7X{)P@5JpRERBg9{SoO-E@V|xho?Tp5MtL$?{` zP4k5Hx(EzTaxn~BF0NuxZQvCTjrG!h43)5Dnh2##o{=F-9HHq8^H{2E6#*{?Cv8 zII+e5tvAX#j*~pXhSxI=C7u@I2RL9pblp zym9$da_jv04z3+&G>|)=wUhn$mNrI*IlKoKbFXLn-SB!h=T77&Cfn>X%zp2ItRazj zY36QFgeSfQhay<@*|KKIw z=gzXM(1|ll))<}M_0L&O9kP);OBGuj%kig1+;!F%neA#C?o|mwKuc-@?~n|4{HTe? zygK)(+K~5(e)ofzx0}y5Jn&_%U>?4GaJ`}BMDm#Yi3>fm#~|};=LT~x5Rh${{U#I| z#{X-E(XjAhFdEwvL*DU-VSfxULhK)}`W-biaUln}1dhVq-$1R2I#+U9 zRQBXtjvgZyXXX?V3pW7NWXWollX{+~fu$FPYb2n3EeVe-p))?z6?^5}c^T#CCat9yp zQk7~|hvsP7hn_W$#v56>$(NBS{iw)88` z8#=~0si2$Go^!v|jI;Ti)>7^+&RQ8~n+u(!Bjk72WsPwqRFaz3_2(RxnEyy839N0* z%d(Gd8z4>QPT!U_#-~v;rKzuo!*57De7_Y^lm0>6XK-H8FI`%kPLEWcJ@h*)y>1su zFKgCshI5krvM{XliX~_MwzQ)Ubu1a%HLD&=dk#=*Cps48Ry~oP)TCZVAoEiHhtl(! z)KZ?nGymznwB?l+kL`$o$+##On_ovt9LOi3fhaj==I7 zDpfh|srS(T>}cuL))QxwFFB1GVrB-*&zwJ>kE1r||NQ7%@pt=g-tc;|Qc_*;#%a!t z<2^m3Pgm90zuHeqsPL{GK@TjnY_Gf8;YKx1VdE4om>vRb;Q> za7)q<+hEDuSiZ?u>HQcjQd+UD7*|z1$_)BvCsIG$RNN!i&xA2q>0vHn(n8VQo$+_- zC*GD0$LToE?uOWl=ESN^S|c|hM&k9VqAsp$rHY^T18m19e3-UJVvjEO|8?FUrt8+c>=aC-O^ zHC4^?@JAEwBm*j)wwlj7I&Whb9{Ax$ zpB>jx$TPJ6cstst`iXiksLNu;J#60zBHD=>41C9zX@kWL&dB$&eh7ayOPEgLtT#Ru zg)f(irGq1IK9%)e{k6iyBm&;MV-Z&^RcJSd;ao;6?%!T3Z0)IYvXpt_%No(+K@c9z z;NLlZwRk9NF)^IA%CePW!Ao*0Jm_UmyimBW4#W!9Hm8rpib}rzIDM6K-A7JBwZaGY zh>QEPsJR%UaNogQwl4CfRQSpR_ui9(oIYDx+tw4#W4Uwq)kum;@`V;RG@xAot&fp+=I#Fi~jdKzewFAO?gU8-806@d$VL&!H2wiYRH>hkmmJZP9|nJ zqeE#ih_jd8M&iC=n~Q#ziLc;{{n}w0aiDV`JkIj`&vp|*@fzgbCvH|fgYWF$x`uv^ zr;|m<*kF99M_l)a-D1Bn1Y=ll)c$ZnM0E>;74Nb-d+&*PLk5| z+Q*4)ZK+va%zk`pYvI^}cp>V3q+L5K>9f?>Du<))^$yY^dJeA3=bcfmwW`Mg_ORX| zsQC26KXDE_Rq`Gj&^}$N$z7Z30ee0B1Jc`ie2>T>Iy&ctG-|jnEcWwrm3qRD&pny@ z;y)%00a%Q!R)wZPI-VQ5QC!Gr7F&?1U;)=SO|Uw6gEUcor< zi2JX+PPj9a=ll+R+x^?&>uTcm`CNKeZHVeEG;oOG`_=i67;(iPr*ergsALrOO?Xmj}sf0Qp0mKbGTuRm_c2H@4J|P79JFTrUzjK^Gw6u*F;yDH3rYN)xJ+6 zmo>w6=8!IBt03HyI>AF3=j5h%vWMI;{=TXf=9o?HQf?M=tV@4<0X-CcavqZBh_!|& zXy{YlB6~6<&U;on(=YzcR4lipj@jrq^f^2c?dFAIqFEe@Vx19mn|S-CacH_{47T2& z?o;zP1RorQYWCz|(YJcv)d|?lJYS1`${&|?Mt|n;!;$>A8dSim7XCQjB?c~!_lR@F zKIF;j$o(EBb`SK0Z4LSxIhc#ipSAR@2!~dkt6D>D@&o3to&WQrcStW;KQ~#lL%LLk z7{z?2fVE~d-ucVIO4%(`U=nS0T>*`n4elK7M>48 zCci#+&u($42Q`6L#K7X_C9z>u5b7Rc|JA2R%zhn=!`v-esH?jQO%i(iewg`h034{Lha*Bf4aq-_+S9Iag;cx=0T%i+j?xQ9gLV zGh8*Vp(wkV^-ltKou%x=Z|ZHn_hUb}HBN*k5hv_M4FB%+VmP&|+j#Tb`X3dg{Ixi! zSQTUvm^^ezZz8`|8nQ<5}I2lLT?|RTpz_xhov7u*Yg-|Rw8wZaG-QYhw7`M2)S<&#Y_)Na- zL%vs8iMOQ%#2uK74n@YdfBop6PzUF~d1Fx0E-9vg8gZw|sl;=s3c0SDRWay0xs|Zw z?)a*f7{A5i#R2X*uZ(Bzy*y8}C;qDch!~*ZF7aWY20a{z4fDAwPNfs4I-NVLQ$NJC zUqL9~Gpd(d2g9wYN6NEZufPo3xzF6r9I_&30QXYVv@~bmVd;YUbHnK~#@Vu4B>FCh zz(eL|7sj@ENF?H`^W1(~gI?33a4jMZdyizmggIo~lQ>{$CS?Au4b9`JSDeiqIW>ug z#beHgEDT-{iZd@H~shne|68xmPI6 zb|$dyI)bU}KTiBfK=r&`Sj{=@-5Ckwd&i@)fx4uJ=?B-N5)PcCUfC?_Zdo@MdTIj( z5_|A;!oPm>XPiss=O^cOO1E2(Gj;SY59O`oNZ;f?^XY?7(Mym!+H#IK2 z(Y54w4(>~h`B0o^ZBuIfX!ys6;dg8H(YHBEBMxxcbnd~+&ql^*>f5tU(5+pCOZ6k+ z&p3yQ40O3opLF6f+O;si+c63rW#aKgca}b8k#JVWV|d{eSOii3KP?{9c3r`F>Rg(v zjfd^#bI9jTZ@6bXcHTRUhs!xTokc(H`{xj{L<`3%3E0-}GJ1~*!nQ*R7;xtViU(5@ z`%(fLhoqxdycShTC14J*CHh6wW@#UXj=HDfDRGRaJ5iH1?Wr_?y6O4UN?v~cUqAZO z_{Cl;K z`*QEujM%D#qhcUyj5WRJr2c$U_>vXb1=@zlzG3EvRCzcuNLFMqub%oOUFA&Udk8%~hW8L@7Ji89$GZA=kU00iAD)b7mQ||QL#_J(6^H|z zaaz3QzV{k`hGq9Zi>4!ku&yfW!##D7FoT}69a*a^?h4;^+&@hEs~cvAtK75Yq!BY# z#s}?K+t(}4p2B4&%-XOX9?V=FwF)0j(F=7IaRraI!^$QCeM-e4eOoT(?WBfiEHRV@{kSWL}|$FEV`!!oBeR}Dc0?ybuBvv&2V ziH7t7LMS~e$0Ugs6Ill~)?pFaOEU9G#=HoaH7u1AU=xPt#Mt~d&K9bT(jo4+SMOn6 zH?l|?f0|z5YR0Nf57F4g50ARhcgG?`oU9*!4JPE~?^-X~>S0D$L6Kl!-rCR+Im@!r(XK)sw-wWkTIF`QStkw4v%>HU(1hWSCS%9joc<(fcC#LN) z_LB3Pe?A@^-<7rT=iJYEN&+>yE829S7M;bG1k`F$*2c|8gEZ>|ymdc-W!7%m5AqLuhFy- zXZSJe(6nthhVxEb9lIYxMucPbb=D`H&%%5v`(4&)Zd)E<33cXmRpXKN{5wop%Q>-5 zcy4K8W9Q8Mmwy7{W>&RHqb|g)GYN3tUeP8=MUI<>c;1Zf7)v}@<&E*sKP|w|OI{d# zpK)%fpe`{;rMtx;um4)SBJO{|eBK?LXY9{*N0YhaHhw9G@drKe{)~=%rvp+~)_+|Y z&+qi3w<8X@A2n$7^rOG1b3;()lIQu@$l?qpMItHCkh#TsMqHtMAH{vc+5pl<~~UoBG`N6Us_ z|6%%+-|T|IcOj_Gm{+zQjt$#F5z?GHg%N(Jt_nk&aMsnUXX60pqHl`WAJtw9-35C7 zvVR$BwwHKR-H^pp3ua0iG6~KLEs1M2qy5Xlb8Yc2ZF`E9m_Uoy2LO=TaM!w{)hd@t1db{ne zd`{G6q91+#{E3)C&C>tojjYf_X(sii7O>X!Hoqigaj!khme`&NO~ipX>P!FT{(YCT zXs|gDWlqzVZNNg2$2;1MT*QMDvc&c2>}|Pg^T>QCW>C-hGj+N=3>6Wm<6Lk7HMpL% z!q)5I#Eesy+ZSk7Arc*!XI5%m(4l4&w)Et#oIUy2;waqbvz7)fK~MHxtvNSd`eO?| zP1U1G0`ZMwaxkNq9#*^)Pffdm!mwzxmgDfW?+er(!p|Y`FfaOsm2LExUpoQAmzTCF zlS41y2?@xm`xBPbaIIDlkAa_GA-Pb4&%8rFZoG!qo&4d>cf{;ZHWsLSP;+H0s`prj zYxBJ^d?E1_vNJ|k_Cmghf@@kA;r7V`Rdcl%Nk95=_1*AI8;HV79dp*ao`~uBfhcO< zFXy+76Y5Vaxwk4@HCTE>Y;#-YAFrk>r0F5P_`x_AUnr1D`}iZ4asIibu^7TV<`d3X zMt-mpanx@~Oraj&{5Zi$0s<4M0oZiCNO~56`BCJ29XTTIj;BUe9JLvjJQKxPZt~kBmvg zOFv1#%Chu4yvBWEm1P)A3|B!|94b`XLVh{*=laFtxb^_*Y^IN1)dZZ%$i*>w0vtO+ z&-C{vP`fqz_a=#G^i;vUVPR;Qn}9WI48VLj~|mBl4pAV1n=3!rNlu8 zEiSB%M%>F*Vnowmj3F0k(dQw;?pO$dg7`U4E4q_6@FFA{m4+`8b5{{RHJ=*(mfOT4 z&OF;^QSWZ(aq*OO?<4Myt}cBjTHcSsO4g9K*Oh|ZJ{^Xh=bf8bi|@G}zqlV6*uD)c z>hONp!dYwGzUaG$e&F=sE?hGL`v!1!`za17Yp287mpSiDJno;Qm(inWTqmz$(mn2D zmQfdTcp_{+$Kh(_C|pTMM6J{GZsKfyVCzJjt>Q&&O)yS{CE)J-5wKOLr#B)VN3+fF z&4j#K-iZ@JN}*x}`Wru?@14(LAy4AYx1|m6!J6@C{tk|=vx5Qyy)+N#E7VDQl<^qDVvGp5dS0T5w3FDl%;!1XipAI<6DLJbh^hMa<5=M3CHJx|So?%v8!{XFMF6^WhRXk{3^m%K0^VsG|28TN6%vFQVUo`gVyB(a`y zAcmpYEJN_R=d774hf-)}g6k$$fo;t`pUYN){Z-uraUt`8&{ zHl5JGhQ4OhvNq(kMv)^Rg#eNQjB zrP1)+wb*EWFbJ_4`e3>pFji-O-DYw$&W*fnTz``~PGiV@K3-a0PYi~}h5pe^8_MtI z(!+&!SaSbvGWJKpaT7fX?S{$sk5e1&t@Hgp%}4=Bo#L^RAEN zdb#{}=Fz{q`(t@`5WS=W;xWGTO}RnE2)v}nv~B(4^0lN8T#99HI)1DCa3N>Z+w~aN zZ-!iN9<`3&grod%O_6rUh=Wf@c^%pN#3_oM&?ihhHXQ$!-{pgo{*TJRh zq!Mvn?!U@#WR4omHu7isQp-4_yDv`K#bD5DS7YoSKXhlWcQtUm(Xp5u-lNgD8JBO| zl1H4+;%Ia-F_E3AHDu4T+B3DC94Ljrek?z?9x7MMCgza+sna%pIlg^3#yU_Fb=y4I zK7`&+Jo8DZ8)VDPtUcz^18&G+`Jfzy^34A|Xp=(O>!C7J)nLyL&WJDS!Qi8*#V(%C?8{l^Cc2`mnIEjLtij`}VL8<&R30qG&=Jcb<07SYDsLV7(fn1TlMqn|ZLN3D(9hSKqHe z^g?Qfu9jqNXb?3d=_3~BEvK1=;Ho{(_QCmbGxmK!{fO(%O_NQlh2wbtXuNoTRMt+7 zK&m6}373a_M$FHwOUKkKt)$TB=lB+Sp>D6ORAgQE^fmbo3)(8H_vrDNvq9qpOXWP@ zp~MTU{i5xaN42vVspb4K*{U{~wDr<5l>c-fGD0jYxViNC{KGXdbQ*+j(jr3Sw!CCp% zGYnmmBk*)lbLDw6?j;QxbltRFp3T|gg9Dy8Gj@;ByA^$S`?|o6e)Rqgb*MMlxkQ{F ztZHd=jb@L}9GAOrmhpB2`d{$(8d>*(allP-&`QUkWpH&l{zw4s9HFkVqqV$YnFhO) zcvfHf$~TF1+U3styk)UG@^>&c4vj{2``z;OXkr=q@^joJdEZCwDtj?+j46^Qb0=Su z@&8a%Mfo{964fU%cI{dyhcl^dIE(ec&0fmVBRb^sY&UH*LU~BOua7Br@qgTvY1G3h zyC??DD#t2~W^unn49v0Ed5U);@$VA%uuqpN_g7Gpcp!N$yH_fHsXFeUxD)hQu6*S@ zYSRb$DgR!gJY!E(|Er!FL5md~F&CcZdc@sXq@3i8t3o()){G=2lIJ;!b*Eoeq~b@M z>O}tE-Lr?XbP;`FUQnB9Shjqy8fOSe?l@d^zwr!rKpT%ufM^cFoO86c z#>e5*-eH`3ZP{R~P?bIlBZ+CWC^9;dfBlSc_R_bPlhXsRl5rlfb)uXZs(}gXw2aMj z?3oB&;Igx=pOLzK@Rz|b0UA`e2x%K=Nhnv(df5%yh>kK97I?w)C zYLm8Dstn~j_jM=rSRSV+uXnSS%;cP^+GeGooE}r{c|PZFQleW#!imo`^<}Cu%q|Se zf9tTcPpT47M4ypvIy~OAUTMHuG%+;_1wA$?3m0?OS3U|3y;79lKj|S-Is)Ck%u;F* zbM$5^{gBF8D;0mSjtwJ+-)UnP%SK<+2wTy!f`4j-?hZM<0125}x5>O2m1` z??hvsA9>|lsM}NSywQtVXB{2LWpl1CpIGk)`?BOT^&cr`k&EHMID0OcDIXv=&XT=$ z+Td;SkMCMM<-1?b>XJN+IQOT_6{}*u%92?qsx)UjSJYNKh*@o3o4CPUX37=To)>FI z<9zZ!CD)xE1;o|2@SLhN*cAoa-qBFHMk_IQbQsNNC;wcaWR_u1!=A|haEemfD;g;W z*%L0=sx&9Y(}K^U-JG3D`s64qCf}s$)(j>5ei&!x)UMU1E2HX%Ag&iV?aApxMhBte z2-Y{qP{z#(!opN~6t3K+qGM8Pp(i()pAy4<}Y5juRUGL4v- zjIanys=Gs(enSff>g>!YPE*>q;|#$v41e0JP%2Z`@kR`FNDaZtIbzZOjHmuxp1E>P z&G-5xHFUBs$oXIW;BwIo;c{=eZbdE59CAU+73GW}st6>0cE-~;)v`^WM<6<|WSpnO zt~XjwS0jY8_fM@}89&|gK_<jn8zHOGk6Z%{bfF_LRpB4nP{?eChjgc|bW0s`Aci z^&>}~&38vTmghG3sa)tqt{?Nj2kS~oXL8d9^V~YkYpImyOsVLn9_0>MD>?7!XF?8+ z=aq3vumkrapY{0uGDLYrZ}ZFLnHS2>Q!ER0>>c=TZAn%xyXet}@&Ei_lhWH+hswMc zvm(+J^-20lzt`dN=1oe<>k#}}5rug!8?l2XE$41jlF3!M70q3v}=fkX28F@8um?}~>L+sN8W^l+)>0*8x_3~@aouxz0-hSHC|brk31olC}fLEjz5 zlu2qdOlMv9?2~c+74nNY7maJsP5$aj{m=3-2;1T>FQq>AJH~l<_-a}AA`so^J7A6@ z^0JNG39^2QocUUA#a-|tGy0+Ls;b1?;=NpnS{CZIN*B&Bn|;(HsGN=Bai6}f)CV}8 zG)YMvOfNaswHEcFl*5d3_jh_c=#-?y8^~*CJcsHYDH-Q?X<0_o zahxMD&dWakG=8He)Gx-_qQ8Z_W|AMSR^X1QSCAasC;+36(rc-Bt$c!*4c!dZ06&k( zpNLm{JBl?}^jrC(c`&YX22pQdb;UsmL1oU@0_wI`qDB&b_>!|Txu2rDNX+dm))0;^ z$`Ms0W?iMe%Uzvf#yIQw_3+5~%DBEdIPu)-YOPQ%Td+UiY_#m#Rf;)xL9>#0M|NGV z7z2Z$vuD4tYpL?|n1;UIk@%3jT)CXcIm{T=$2-?3R?7nMllYr}(kY7Q6bNNEpG~>t zO3S_UwJQ$6DceNlA$d3Dh!2ZOo~CrFO+J3VK%{3|C@I{1Y#+cgt^O%zjip{+vM098 zTq!5cB5!E!bY#9OCr^vipx?;JxZ7u)K}F5;9oGNW%;6h2<8NIu&e56a#x&xQ+A(jG zDSONKexMJ6Sa0~wY#<*de&Z*#^!JsullOKYMsyE%C5PhWKkLYw2Y`J_ZuMVaKzbVWo6SC)Tn# z_r(QHO2>!cIKh7PWHWzdmW~>~xjJOmj#V0Ggd?3^KhPv7y}9=v=^X`sr&uMFSP_#B z#5lIoD_e5uXYrdleM@4Lw&BzdGzlmEHBq@Vhn^SI5e|7dQ#s}CkEeE_7?c*PbR0mB zwnM?_e%MX95lQ`!U}`0dAE2aA6S(VN&UUD&GV`W4IunQVz`j6Mx8|NY%@cMtXUdng zPod|oO@0FYBZ(hXMe`|WKeXU?DAP%4 zq7FyW3mq=jwo%5lj=&$zlDrSuE8hBWoK^Abv&Jgm4sHmw1)@qhDob_T>2n4&)_S-og*60&3k( zQz=iWeJT;#+GKT0C4(Hy2lT`Et|_ZzJ@ZBv>P2R3HpoYY@;s0Cg7qYKxx#GfQLJ#q z=)AMW=|0p~k9I-bwLykSbtCX|MpWf@g6XW!h{lF7}AT6Mm0H zLI4WChvRU|R?50}^u+v5&%rhwl-^hUFvB_wldL-{9@J6yoTJU@?>zf~Yla1D7MzB)P3Dj1&B2bi^NiR{gpUNtlNTcvN6Zn6_VX@q=6?^nJkhabk0YyHBbSgsuAM{gE-f%W|@x1H-ptQ2*1c7Ks$SquMYKwrss z_vA{%Z5EL~GpBE^yr&^GC(j1LO-hxQl26g>#8&z-CmP0aqaj&U6 z=1od47V^#vEi)Cn|1>i!t`vb>?#92EZntc4G#p+VOUBuxr^eW#npCQ}n6?HJ(D3=L9@2T`E%{^!IWQ}>dQ8eZ`d@|lj z(ct5CJuYvmDc?9r{fFgxjCJfNFL@t?tnqsM88A>TU77gI7J3X^I8FXpHxzYV>ToSB zRu17j;UnjCLt+=p3FQ7Pil;YyaH{;6d+-8N9ommfmw%RHFYFqHI(N3nBbO47VHt_n z2^-`cQUD%&3`f_N8{`Gv)E;~phW&wQa=XTUXwZRt+Ns;+#ohdHjs8Fq(&aDlzR2O7 z(W~)F+4U!J_2Ytog$eQlVhl=|(nqAhB>6Yve0mu5Ot-g}$DdTATC5uN2IU#8FZ#mf zu{*X6QyDLN@H}6biiz_c=Y-RnefzYDFr^>8C9x12dYA0GZL3Z~*U>9%-~EX2zHOniw5yRMG#pCi{`c1q+Qr ztw9;q4=+|u_*T;KfFipD)xS5%0hmzK#Q){k%;uL zl&iBRj(f|yC#bJn)Q0?y2VqETAmn=nUsyH`L$!|suo9dI`c;5lf=QKo;H4aqXxSBP{TrRJjWeimvj#d zD0pJX;(1=YavGF6vvXqp-Vd!OA&`Fb4K9b{#?6v(Zhe2OaVGgGcNyoNqrV!$$eSqQ zylz>=^9GA{zUa$1cl~k9;2K4Jo^8=MY<-^Hl0S}4;_S<`z>r#=UMF?At3CR~FvL;= zyGwd}iKuLxY_EmiJbJ5DYHF;hz#uUEyj`V}6F@2#iWhZqZ#zvuqyuf%ST8lbX#5fw} z7{jQqa`ibqyT{Hp)+_LZCpqE2U(7S=rud?K4d&`bi;VTC=`^2sPSxrpW8y1n?jZyb zXJd`ooV`CLhS)J?y75GoH+pW+;G9`M;|OZXmFmG+!E%;SdaW6WFapH9NB;U-r1x!*q)Uvgfj`)+R>bio_>jPu5#Q-*0T zh;3k;*Zm4I+^@^?%w6)bZA}dGT>YTi8jTAzvvY>6_eU?zG!}1cpEK-!0NQeP(e<## zvP>1;zvt*>+)`z|s3CDmGxb>7W52aU`yh-N#Cg!Fa;n+XT3=LNkHm}JR3mE<`*2E! z&G{~>q@TpXvo=1sc$TV3KK;8#)4#jwI@OCu)G_!Pg+EcdRQbUnC_jR{;5!FY=2Nw( z$Nb!5$$pjBeqt=y{|vgGsrt0k7dR6JgNdw~TAG@WrMRc8drDIiGRfy{@X^XgOc{>O`aNwk3xi3O}fe(5m1 zlbzK5STN2Rb+~cFUrOK1-#d<8-tluKU*3SQX7j9r1X!1 z7`Q|7?n(aw^GIBC*eaEw27|>l^5QyfmCOfGdn$(*nzuWp;*HdYe9!&a#{*K-R%#Gg zg`)MP{nB~XR2F^sjC-U>W!`#Y07-=*m8J)`Q=L<3m4}fBfjnJSA@QM9DZ;vUMBO}sz z-`5_AjF3(CD%sorgWvD^{e7?NdtL8!uH$sh{XXyg+|PY~hE+IeUGH&A`g+saGsuZG zcexF3;7Pgz`1RB$+*?;ZI+O++nfJ$!-VE1O?BBUnt=UXIQ`FKi#QF8!-8%ns?&N|vAI-0?yZRKq zKZtYdg>m*(*k6Vq&V@>2$tGv;nr9%NXctH#!{F~}1P{cn$0d8x(D%T3**RN}lY`S# z9F8@d*qM8YGesZFn1|$!<}S?-prz>lg!*`Mx1i^AxFC`qwOzvL)dfb{1O20dt=uyq z2pWHwGesWa+Cyh%^`!_}+4>AumKjLaJtF9Sr}JET0sMShhtreQXSnJ+(C97>rNHI`jYd(U1QaN+A*d#yQ?o$sZ}fK8rZt^sLYgJ?>5e5NFLVZ(aRc&_qR? zjU9iMd^7Q)E!mhi54SFn5BB~uZ@ruQ&3^10A82Vr(=oGB2TM=*W*$L)es3*#J{$E> z2y`vR`AUY2L;tWZYLDaVCAD3lY5yXU+PfW>JbfELvTXF>171m-QHR81?`u57h+FQ7 z{jMYO^R7-@{gpxV0kd$E?0%fZNN7r!N098xVD6oZAKh*gPAliwa`U3#3k+T0o~s9O zLr@naF9@ONb&PXGEtXbPR6v3l#89Iu4myI*^3vhN)?YY_ z?j>-!_iIs`8g=68F4R(qIr3m~bI!NWgQmkbv~BrCN!4{P8t((0BkPHh(4&5|U8|tr z*A@;x5!<+X^ZxkJr(zCc>+)}$lUIlGbO@h`IJbGxh(7~uXLH1PsP`3}OSuObBF>9% z3%WJ>Ueq3O-kPA(Rds?FIWPlR5hrvp;L!C!U(U__ip~pInrlK7x!!-OTR9ND9bjC# zt*paaw)dy|@Wx#i+KfL?>raK~FPpBm;I|h+n{Hzy?fy7`PX~Wt=q%t@_Ko2yItI}_ z(@2{0bRPd0*xJBDn1wg+;)~$#5M>lW4O{r|r=Z=^-~-O*w^aN-BQNq@7D{_QD)=2( zCmp>pM>*oj`$GFAdn0O$nm~TY11+t+7DU^&`0_gqwWK~ANE5b7dDafvsuKc8VmO7b zi|Z2LkiOj-&6|5_N&kfp6{Zj2Z=CZW=kf5t-Pw>|(axLJHP+Jel!dxZz*hv`kdxEh zK_#gTfNiv#hg#^h-EiYDdK2<*e*W+-iEn-2uTOfntbx4I0e3P$oQwQ>@rO=$(AAHa zU#Cgi@Fnp zmzZ5I#@WMcsgpp!3(O1kp;_OU@b(GLZYw;gN2!TW1fBE!%{64@wwf0m{HardjGDJs z=r({y@HTA@)xwW{BCy#hKmM(sr#BtT|J);`(<`8*A7I5Bua%KmSKuUF9QdcAoLqJA z+YM3hV!47!rbLr_)e^q2R*7>#6a}3u;4Pr@HfTu{^hhu9MvlM|W8Hq*`kh}Dtff;I zBPsZlnP31u?|=x*NDlTF4*&F^{m8u)YbOiwQ{bKV0D8Yaf`wxEq0HMHK|MyN3X@jA z!*>#9ne8?RW5HGI4$f76>Na5)&UfyQ!e|elEyTcM>%jF;dKJDyD0S4*$*K?<(Wyvi zb4o+E(VK31|FDoMswwA95PV7Z36oz!7gq~?F~trcexHIipYSKEkvoO!Pmo``qCRWS z3-wp2$YrVzey1l5*l|u+3|-3FW?EX1o-1fgz2I4=AiMhTaG4AroXztn z!lpfMh`zx)UsrO2AHD0&P%66n@45Ss#YDbUq?D!r&sJT{@y(SoO0?Plny%&@;AbpQ($H2ovt-=oP4V64AXl`0)JQPjrlu$G*FJf-i%?Oh zq0Tt>eaaXq488zwvQn(uIE^skh?y!t74c_^v(u|QgE z{!{2ED(UAWcy&xR6xW~+x)^)ywvp|{e!1?%<7_{_PcKmm9l6a{J*ea4zT#EXDVw3; zSfOVw_PG;ImN>Kg#yt0Y4=<*w+5gN3yVaS>_YRWMr7bZux88LA_6!-7kAx>w_9A|+ z7Mi`lt9WhN#e2+CkkiU&a;Uz|kDsd~2h8v4)HM)>DOE(6gM2dXCMdOPx`Q5Foo7x$ z6|{mK(9^Ja=`Hw0;#`lI8=hYxOasPj^vy^bc05a1vJJgo?1No)i9!g@$c@9W4}Q8M zY^y-64!`E6<-dfLkG;vl9?ylnu^2fYejLpr$-}6azzS%Ta4vc^(8YvV=XT_fmW zvXy8(0ld6W^!$JI5Q}V~jq^B+zTFroUPhl&3=E?db`sG8wcML$h<~-6*!~38gFz@Q zoZnZ>G}TZ8;MG1&wh>c`HFPIBh;+{ei=BSB(^lx^Wd%(aqg{OHM_)fWek4Mi6%s_l zpTRR@T7Y=nC6d%rafZZyyY9fpvg5xv#{3mC`4_%Ya>|1~_AoF0#aJ2X1D}(;I+LF= zMULJu=7V+4@t=n($a8NrwKLKadJa;euMkb6Y%K&?KNTJC031=r5kf|9HI0O)d1gy@ zA-b!E`m96mPFO57vDT6+W+EjowhHq8?lcp*qIA2`BoIBd> zhhPT&$Vm}>Bu#U1mzy_5?uw-CUAl^+HPGMAjihgl?8UWrp+}J(N%t+rifKtcRN{vC zZ=5U|_4lSp-y+EJ#Wb-E^7g1O%)-;>h-n)=sK69?{;gVU=j}m`<>53qAV7Sx1lmLi z;nc(JcnWCHF>VXElc23}g|yXqya z5)VKx?tBAa5Ff1(d%$C*S#ku8+rC0P0#09n7d#FumWmH@eJLY7lLw zgdT3MPCh%Ho6nIrJe&zA`+ z)cYpu8KpZl#mr^+wYuW?86LC|n2gv( zW}+0iSA#SAdh?!Q_Gt7uBcsUl;xN%^1bk%TqM%PQOI+iCT3|&KZBhh_B?EkE$S&L? z#Bj|K@Hfy zcwC;S0#2hE^N0~^_KKO%gS|XHid>!?5S#acu48c|O&hjT>%TgI-ET?xxOq}qDne&tR63v5Sw^2?fgSa_z%RpG zx7-o;#?C+({17~sCg81@^%0B&1({X?(~>`}mP>ax@J~DHJ)(k>k^W+u`?%Wi5T_X&f-#SBu4g zIF}^g`}6Xn;^9}m#B0DcFg+)pLJ!uzOEh)pa8_&#K7I)LjT>I(h;4cTM;adv-S=?Yr^J({YXD230nm9+jc=7Twl1^vM)x`bK4!tq%`CwL9G z;&)wXd_;H-9j!0G&RuD7S2%o7LqVtytJnM#T$gL<(ooD9UmAv&ZRfM&0+RW$uvu}54e06Pj^O@iAX zacmN5c`o!%Y{QXvy`gLN|KnVIQp$U|NXhX6xS1AP_;C$n@Ew9jQk}>A+IuoOgnKi# zvbA8hRZgnW(An5IT!`>cP^<;8=9KN_u)5XG3Yea7cho^%3Ct zLrw|liE8xxqA4o>k&uHk!p96?X;$is+1<5dofM6}s;L#necg2(L0cR_C#E4ysFe64zYpcIh)B^YNqCfPG zd^5$);XX7&7DMcDzW7NAPWlFLT3w4pl{wBOH=(g+cvAef+>d_L2PZV*oalN2@oxq_ zAERGwU>(HoZ#_+zctuCR21PS@p2lpk)x8tNZ{W-grKgv znIT%D#@@OW`e{S5#G|Fa2VMsc`eC8CBo#WS;04_8#EUI451h~e+PwU6aXs+Hle)v# zY3^z9BKme^&{8=6qEzgQ{>L?N98bJHD#ij6dkVk(ssXUUs5SOrZ$04mNEr7Jd|vwN z9d-b}Z{o1OYx}?JdC#CJ{0KWK)*Ir}J)6(Ffinx9ooV-~`8Me?x>FcKJ(4;K-x$t@ znV5<9A1f%T<>a0O9SN5Z!D^|37U6d}1+5fXj#QGK7P&61K42- zQPkv~->ZbPW7On``%*Qmj+j*HQuA-|2HdF={Zl zGxOjxvU#L9?vp$8ae;e|o+%m}_n;))_pF0n;>1;+G;(bWr4ES~6)G?4j@oIDSE^X; z1RcM-_@4fmV&i`Bkj1)n-kvMAtcIR{dvHI~3dPTHzVxLJ{EK@W6m1{*Qp(_1n(JR8 zmgZnKG!Qz~y?F7=U4PnV4$Z5q-C|;+K=NOPby683dPPF>syTQ}vVB7C*pNTkq$l7< zZ;07-(~N(8#2k{w@ZSbVNeewX*Z3{`tWqhpssw*9_yunqA)|}f9|L2|h34($H1r_$ z!OxDu))R8NjC0MWWIv(*Yz3`BJ`diICS)~I!nYl9Se7e%-41?qD)7C#j|gdFkwcK* zii~avQ6Irc$31!~eiSz1oc=mFhKg$qM6anDa>DzUj%y>1XsV^v_#9odwRrUew0t)M z!@t>HECui2`7V6s>G7g7a8qlK0+ZGpnBL}|GzZ^Ve@md4g8AUrci?+EFAxXwz!ez6 z2ju87(R8ghT}5p7cgz&ejqo9-zR+DCvQ2z{9-1u-9EyTm@#{ceavcHRx6A^uOK<2` z4~Gut_Z_1C7~~M}k49On6=wi1u?}%aDR2}gSfa0m{Wn%j7J`okQ%~rF{Z18D_knkN z`mZmZodL&(_mI-Yx6ms2xsH!0mJ;^_+KhW2@O|B6;1fWjW}%r-_7xn+%g~lFV1l?# zPPxnPltEmW|nQ)|;cp5$71y}G}d^?CGGqlv?9`rpP+lcW- z?xcK;_1T|^yUL(<{WFH{`Aihe(mm)ja_PInQn3qWufH`t-VO{Bci2Oh0J^3jgA&D( zpTNuvh^6^!mWbb0dXw9*Sjs;F4uydaIgg8_Z*NzLcb5533-IQAWtn2TtKj=pW&tfRX)=az%T;Kht=v%g#A`F-eEDF4_e#iN9X*4asobLDa zfAdE7C>#EWg_O>Nv$R;boaeSnY3zIC;n5X*`%$t#9!$}GO$2GBjIO>y&12hN*x)Ot zH!r~Hn>|wq{w$~IxaOY52xh4FzT!G5AYD*(RsQkD`fxB$cy>@piErQodqEWH%uoT_ zg4z1XYr?O$Dzg3#zoFgL!f@aON9jZ7`C?sh@<w|vV&g{W)yVbn-eUzWnOGZ}s?T=dO2?r0zXklIGA5OFsEJn+L zQ-&sd`bZ(}w4A~aliknMLf<(GYJum}w%0&N?K(cOQbCjLK>?m z4Y69h;E3>UlZt+|hR^%lt3v1DYWj@lTCeU);Q@FF;n;&hPSg=|Q_+XFhGt-bk@(6% zOT!Vv>T|8do$oM@MlKE9WhJgakF=1Wm0>qPTm)QVgcJNMe20qf;A^%C@q9RZyjX(s zPRcBB-^6KRJIt*2%AjLhI#-;y-HYbCV;?M0inoA&=KR6oYM~Tk2IK4#1bxDN<3ypk z4+VH2|L8XrO}lynw~p`jd7YpJ&Ts|tN!ANJ!RS;FS)2ThX`MR7n^7PA`Wy5AuIHr| zw{+@nZgd3CU|?^?`zxi??newQTAjjAd@Lo;Z}1Aga2lhav96?d^RB z=cXU`g`y@}oD-qr5%6C4TBfD`*H8n8)f3;Za3?~3Ywp!ltQidt@eA1d?OKW5Dm*Ct zEb7%39mEXaWD=3D#Fw4LtdpL!3OQ|Avb8uS%Zm(=d#xH-gRAIG`8!c7?rkYLptm2m z4V>F$6X{_rGy2`>;Tl_tT9m z5L+Yd8=bS4luW;39|`Tpd)7*+58@f#&5Jknl#vti$%Oa}e(q}-^t6BzOFqC4oG+() zh++E!*Z8a_a_EENIcoWZcT_6q7-INiep4a#k%C;GLX+yTg|Iz9Nd}LxU-uX&AiazW}3k9cK!M9fB_pA1lQC$k&5{Tmw(l3hdqb$Azj#(1%C-H}*UyY_|2J ztn-M^j>|&yVf5loLo>nZhR|!F7d1!BpO#-2c8>O@zPoVVkn@6G5BQg@z`ndNUbvY6 zypR$#WYdnSSD3Hq|BbElT5z&)Ui<%f&R&i>J!_{p8UKZIW@(;P-Qlb zU;Il>KOaHwOYq>`;uJIxG0d!3$oth*QU&(1mSJo7>U1R?z?yu0GoRnuSw-Km&$<~3 z`~Xo!I}tmI7&9TH zt2>qB8VGd3>@oZ(@i~tS`v`ZVJ!l?2Kl8~DA^D*P{pKMz=1ItJ4S&z8sBNB&67tu> zPpTaIi^+Il*kttajzj;@WsFb*U5KO|F_e~TBYZ|*rCt=CBcp2Gy&LMr-q>H_mh#3k z;0J^=S6O-k{$yQnHW&Sk?JM-@M~?nC&IeGc=Xt94h~w~La}cRc%d3q0-p z4P>+dvF$F8u)hZk`&O(^vRGwbX(FdySd&Yd9lA}7g%7dm0TdaM*hj>ly#HOGnW`ede>Q1w<=9_PQ z>TtFmyc=*&W1_!0tVr|#&KhgmtiD7Fp2B`SFNQzHHe)0<10KnLS7YMak- zEhRhadC^0}xhUO4@)TIpsat=4w@(fkz{q&c#hkk14u>9v@KAdV&Yf<$gAcTf<^=&C ze!kp(TWj=`8vXU7KZicSv4Vf=jb3GgBv%ZiH0?8b&cQws%S7~)P#c(B&XHuIr!*h+ z!*uSpM7mB!W3W~?UNGcrt>p9>&vmhdH8*XGoV*avao?S|9sLv(h&Z@O-MMGQ3L1*< zuiUkeJ3UNE&o09EL4Pf`wo*ycv3~sR3b>wLD%yP^hDIuna79LH(!=YY*Iwnq_Nu8J z-oLH-C1*EFLlg15r;2)PM?-i$Am(MZO_}3SXes0G)`RYiG!7^j#5Sj@8@pucL0#}Y z7i9NmXMKP%M$WhPvuECjd1JhuTs4$sXL&%!4xgDgn)Pi7z6rkPvx#Hb#|-3cK89v3 zAIi$GZ%$hpLmd;^v5((8DBLE7vc(%*zh0iiZ33P%U?tZVvz610qbaz!B^PBKOwVKg z`qA4f!Q(OfH_p#*u9qBXfV(S&hxP3l=gm#rI69apqj|WK@IL zp2&*l-Vc`31w6lrQ#NrmMRMAV@0lOUbFaoK$QH4B*!B+B?wW$GoWr?n>`zWDRsQME zd`~lG6O(Th#B;i(^I>j3{IEA- zjh(iC$W?;lb*&8fjT*Ai3I*vQZnJ;3XDi++$m0ZNj?Zja!#E`kI|j{vU=8E_YeJT@fekgZ6?@Zeqb=Sm+YH?4! z-yCD9?cC`oa>a7jD@?t~olc`ZVWS_gdRN^^f;f-t_>yhW!J`DPe{y}t;xJ3ShuE66 z`p$Y?!Q2q{u0w7e(lQD?(;8$jXIbfXy=#8AX#m-E2C+AM!pw;9v>+8UPC4ooQ zH6Cg%;IU#(v0>sA)+^A5zBUHW+3X58fP;_qsK0*n6ZOGw*!J&v(ENKNPOqhuqTgYk z9p=b|WlHH3zGq$MC0yko8AajwvPn41wK^@M;aE!zKfUCB%|S03zx_f_W45bGPR6Iu z+quw_ZH!XT)g!>^)i|+Rm~A!3GuU*Cn%&*3B%>1CyPpZHj8v3#82g$@1}nXzqEftG zYM#q{(L4Qtz5f1y!>nC@4P8f`jPbd^y4}~%%~HJo)kD@9Ir$~xe17;B)~AO%eM6iZ zH)=o`f$mffYgIF{35`~OOM*PyqpJyhZ4W03hY)KSV-ut(|F}d23>xOg6L)2;S8@qFfTcxB! z9&4)3;X;SYNP;!28h?i?yegyT$fZNu7_kmMavF`;ewf>nHNbh$NyHlPAJ1N`!ai7x zXHDtDyn8CC>;OKe`(jppL`gOKpqZAxfi0D(s1nx}&U@MIx@x+C_o%GTFo&IL>WTQz znt6|%nTuS3`!)H?C)OFgj)BN0xd$6T=Mg^9h;s{PQ~2DV*MaZmSkxZ6RPJPmwaOlL zriwf*gcb`dWnAaym!* zpaJNSh4piPII-OtGG7QBY~C<>J5)n74tj2#1^_n?@7H_4uvxdJ`9>=AC7=n=QIGta zsAwDTuJ?C8VL2Prm?KBhNZ0%9KJeim$|ERJcZi)H1CO2u(6+eLftldk{qzYm0^mpA zW-)M@(7*Wq_4CUB7j9igDdnJkOP;rqlLDKx4*Q+e&5PVQU^%k!TbeyGWINx=h#`OK zx9Q7%tU$eib?b3?2774#Eb>_G1*bTtcAC@C-(b?lhk>^S;J^>UEs zSD#@=x2vcY*U8ZjS+$FrHe=s0HLgQDf2nC6K4<;pX5?I?fzB54yhjI8BF^)$CPy#q zNhQE1JDnV`&X$3K_vTlRg_y zlUATs9Ex6+{s_v=K)%8`!r8b79c>4n6zpqxLrrK5bQFV7Gc0JUPcvo-ef;>02iy(0jO56}F_&7h3pkrRMgH8=jIqO6a;m_y zf3=&I4H=@K4v6iY)D*U&3US8z$!M6xnqu#hZbmLO71%us71?frms7{Rw!4%9UgBPd z=W$;JDaBW!wmezQ_3{SR4)sIPjt3?gIT#4XwcE`~T=ir~Nf#f#*W*X%ByRHGNA%T~sujdUjD$eh})tJ7cMa zR}q_vJ=$av-JY(ZLzdV(COXq@wUXYSLajTTqk5%sI${HU^!hF|4ExS-Srm=FZbD5i zNl6t0d{mhs?5{c zxbRRJmEoCnin3x}=<_@7$39{)naw%_t^j_!SNk}YB~wrZVtfC^I+kFH+4m~+MVAz@ zo5f06xB_!Biwagxsv;9y^JVW?r3r9u>F9ObHKe+y)Krc&>3pjlZAUNk>lUor={;zo z1F%^5%mBZEWW7{P&lX{>*GEFlbt;;s#(lpulE$EJY3PV&s_l3>bVfrRYZ6!z0LN3zR4Z z%IH;YI33^LoOJXea+YX~v%QZB(A!>5Nkz@?q!f%bo`7<2Q7f_KuVym2HMYlG~ zN$wm)(R?#nQGuEMM0nmEuR~M&OG!OGf|Mp-*o9Y8dh8ZX2Y-EF36tgY9o+KH_aCs{ zrxfJ4E|e0N9AJ%StH|J52+bW4!|puQkQ=yi=daXoUF&*L{@lOuym%y#Ztwl;M{jh% zlj;r)`ez^P(k+6U7bqor#5o~-Jr~s|++0=n9|i!_CR^s*+{^voyT+8*8{) zPDhu5lW2I04V1~q8$5CL`~=%JT}Bh3Gm}*BFpJj6DFXUUgTH1oj>kExWhfapj$}>rE&c)`wtmO?2`FszeOL@mQSEUzCc@jvAjJ`;!v*Cxh_x6bMGXlSBSH=T@@El2bf{R+3ZXcHu$9i{A<*l?|QL`=ajS( z@u?1WX4a)Dn!g-*c#b~{KZ;snDPlWs3A+sZz-3%pJlM>vZfGe7@8J#>G4%&`ibW3J zJnJ00x(9mo>(N8&a+@UqYZrs}9J=v@se9pE?2jB(`-bW5!CB84TB3u$v2h{b9dv=N zov}U@I=fS!=fETN)2G@r_%Nc6Gko1Uw)mKu+%85@d5uxg33IlEvx&syuyjfX}g51x9P~q@FY`c|;T6#h6Y1IerBlhUm z@O8NBnaK53c+oF#Kc3y$CUM*!M9$z${G<+wbApw^Gm##98^|CO4vyk_@*&gOsnwbTvwvi&zc4-kv#O#;RF? z9*!`CxqZNlH5D`N*lDbZo|aU|6*C6~vOIV$B(KEzD||8QGuDG1AU{8_U&p+mn|Bv` zVw!U{p)ZR(CMTDu zaB^-rmSrE3(`&?8HmEBT7U7xQ3XbT5uUr&nK-C?CDQ0LccMfy;GrBRmUoi0&=+dFmb|GY|{$N!73do_e{}P4~Ob=Yf?klVQgcC#6@A{E$AOOu%7EqpPC#?btGOIa82@4h#~>#Aj}VmI)Rz$U%Q zTg+wvZxhuM_`0fKb^`fi4Q8XyQe4=WlS)c9illu3Htd+Mf|lfklh3v$%&4J)_&#Cu za_$|jufGDi#UZGNvN-XLk}~vyDL2=Z)7!40oCve@K)P?>}AgWg5XV=FlP|^YU@G1&d{lD+lARS z(vpuac(^?c*#`6p8xMy@p6f$S`3t;>o8i#QIKVw0ub`1r!)Sytr zbw-@&+HHvlEWtCx`B%G2$&I;k`i+?`Nq8-pK1D(O3bF48H00c;L0=tlR#mj)(w$Y% zV1fU|r~X_MEzSt2>yG)4=bA;KHbcxE%{1KSjo|3v_0=!pIpuYC`iT4Dd1D2a)eil0 zoDH4VZ{?Qv_M$Ghk1xLL<}!=H?L}>q6jsb-t?{B}sPUeKi`@H`UgR8!eY4^eHy1tm z52!;1=bq;(+5wk75SXQ2m$)6Zo>cS(8iS2Xxu}aC^wTq%G`os8t70v+1n#|H&06j! z&if2nt~*`Bxy7ildo~51iyz75N25Oz2M&*5%+(;y(@e{=QkGoh)X758$PlqMn0cV-kw z+G}O>6LAi+OOfnzmy`Zc^fnC>B$v?h+=4h?a9tp|15QT~p79jvQppF@a-$H3EgjcN zE~3VGiTYv7x?G9ZHVutIY)88sk}L&>_Z!ymuxW;>e=L+=4(aYMg|7_qZ81TkS=`o~YYD zx8U|C;`tqgx;m*P_X2ucLmFUzx!H`{Hw0{F^fPPD>v2Bl@A-pAGoRg%IHmzNvKcxF zA9qRic%!r8CB#6Md}e$b-X7_;4BhE_x4 z@&hS)Xcvbu;A=GO9zZ`XH?!Z3dZQC`F$Vv~kKP8j)&C#oj9JFqsdUU!5a(fglO)x? z=NP zRulHb-E|8Ot50dLc4DAgHLzqWFaTY!=6g3=RMLBh2c1W5|N3QbNoPF!GOS_U{5vIv zxxm}&P@iwr(@h%cO-*pd*XT9Z>Gkub_IQuUCUafrVK2%?4tYJSyUuMd)_DZ#_D%hD z+b=;cYbJ73T{~Sl*8j7%m`Ai4q?;V<2|t=>I^Dgyj#SY0yo>y7W2{R@EySHguXy(B zlJujPR|ZBXPOEBL@RN+~(+s-OgD*>q4kl?+N%lJ9!t=XwSuttJB#_$82n zn{GS&7&zgrQ315VyTjqzYl3J%OMlw&A3u6qXwd)vI3L+$#LZtLrJ0CxvoNJ(0M39t z5a$tRpa6lsTqxo^BsJE~DiIzzi1VJ$3rhHvN^(N}T;Ew=w`v`HuCYE7FLJtb$JG>y zoM1XKR2TY0LmaMk>b1JI&}qrUd-S>=)LBS@A>WSubk9{?73z5htlN){?{qhyvEy?b zuPYny5%2|QehR&j@6C8EdI+w?n6YM<@g~p?>WRT5zU z&NnoQcP!35thX3>W2Zm0`L7@S*b`hPcywtl?>uwYsGXJZLI<7xUjV=A-X;(rT>X-u*i89Olc1N@HmF zaU1^0LTFxHz;lT=HY6y*m!$f9iQtG4{&gHDh=`vH0z|H2N#2=&EA9(n@^tf zJRG>jfU?6w!h-05GyodMrhj}M!`T07>EChQRo#p$+bE@Zi1T@0m88=G8BN1_zWuYn zAt(c9ZN#~CioxNx8x@p_IG5bcFEKm-o*m*W8P!(z`WUzps2SF;ovmy5P7Uo@^mcA8 z)fu!$PTma7%uhRY-qYO47wdn(iVM0>c!KZ6b8+%@jqb)zPtsxy$DD4+8-imy2K&Mc zo0fbPFw7p;kT;%n;9p>Eo1eoo^~Q?d+7SL1SpR*u+VG*q;5Okq?7T66?+T32CDiJM zuC}~@+``Sk9+79mPnzpVHy9gYz5j^+oeh7-*$4aJ<}Ff^BF>Aaq)1AEAMik&A8az0)ZHkj zzF13zQ}Z1>^TD^;kC}2F~3G{EhoPDVUr5X_^?)&AG9wq#&*|jkXbQP#KY@MR12f68Peo@iaDd;nAwAFP+kFj!KBt<+m z(ml8?rv(qg(dWNdGC_xPVglmqwz{NK8(@s#@6)a4)RN)VYWn&JJ~68rmXw#{JcYiq z^XpBA-KK!+)&N>9|M8=5H0xj9#H~7=xdB;Hk|WLs{Ps&;rpYK4ziWVRisW#%oP6=S zobQH7_U~8FTEy9DhrguBMJ3(B^V{ZSu*B~nJg-rEbZi$V31|)OKVrMFcd}&YXe~u! z4JWr+DY=jU&LH-(anTzkC$Hlihdu7Xw|vQ~US8B2YuNMi0ZFa7H}$AO{7ZQWg9qQ2 zC(w55d{mMJEYP)En62a;m$ZK5MPB8Y|BgH@>GBqP;%Q*X`kj^de}#4vzT4gdCnWrI zFU%0|w{i|h#vbyZ!ltML8?Bc}?6t(^Mboc(p^~1lDiYCib_$b7My*C3RzRn;YXixe zBsqNr-_sy}m&0vb54j&k$qOetocavhT6QSqJD<1jRH>#?Xf~C+l-dn0@uULyM~}5} zIQ)*GZvx2IX@B8f)LSx_ zJD=fBL-22*b;PB-K#%AoKIdT)7YXf@Z#NL1W$9dE3vZh90`uh=8@L^=-q64Ye#vGl zw+``CJ%S$f@f@z3h`Qo7_Q9wf+&k#J4Xi{S)9m8bl%bYJ%)4FB=T7K*5s$OylRF!@ zILxN2I-&Mkv4}grUPFREFtmGIxzzXI9juI^X=A%{uet%_3cly?P9G&r2g+%%R|Njw zE@?4U4jx-LS-hPiS$so5@~&YNxVDa@9JR_@%TQ`P&c(q!$CKn!|Mv6mSVPC`c`!T< zxBSV^-wOWii`Jh#nwxt~N(0e z?W8C7sfCJ`qm~{KxtPoAtEM@-p?^MnGk47!vn0Hp8+4Gnm5qMRVLZR@%DH#IKXf|_ z4BpP?TrxB}XCWtSsnTQppedLB88w@E6ZY5{8fFb*$-%898w~BrTZXYT;AvAdjF z?hmI<<0~W%M{x!}fO%h^NJ*z%YT62(?2(vT4qc#Opx+~u<_C|kcQ*w`8G3G?|Kmrm z1drnX*L7dK#&an*q*NczZ26o)oc~D~)y3MVXg-a5_Y^p1Jntdlaa@CX;Lc-@uVJV7J$;+`zJ!Hr+3p?vf|9Y=iQx|IX-fcJO=He;n`z*!-Gej8%R zJ_dS{5_$FPZCf_rnithx#cZXX6AJ~`b;vv5H$0}Zb|Zag1n|H=CeLTX-@uayIN`BB z70lcn+81B(`TCyBaGE#KFMPM#ek{T5H{Umw4psWGa`oXTOwY!?ke?dFCVO@55Ci;!Q;n$u%&S|i==R;HF^TtJ7(^@%o_7A6w zqye1RUrE}*VYKULrQ|m7@UzU}*A+Ng5`NT^svSbe=dg)`PyZltyd6x-|KmshqWa(U z+eU{HqB)l@auU~LO%C3~O~kxXx!`x)j&s4|ROB6q z9Q*49=jW%UsqWw(l^C+>63pyWs0~~@u~|Q~6pZ~SXsR9C?BqfH!?6DMOlHjsJgLtz zSiL+#;h<)Tv27BDzlY$0= z3u7C@?!`doa|Y(x567|PZPc`ai=wOF+p%~18r6I=^@ONLgO=9>F_-Y^M?hRk&FmW<;n6E?g`agd37T^BO&sK5Mxr!&4 zcV9t`bX3Lt#x}n}ULD&zozn+qK%ImhZx5cEK2S*`5w~5|FS!7B6-}Q8p54Z#tQm0l zT}PwmlWNVJpJ`|#dT4`Yjbh$?-Dx`NSX~1pYZ&W6`7WrXFUGSc&!Fd^!R)V1I&+`m zO)5MK4{UQ-H^GNOus?3vR>a=z_oa@=)#s-jXK!nL$pUM8flny|VB*iZo$hdfZCLI@ zS+zKuXIx>gC;3o0@=xlON~Rd?Lw3j^`)=M~rFuT}9Ir++60z3E5YkhfXGAX zAId{+dHky(P1)^3dyw0&HE2woi+rdQ9EU?k8&O?jA8LU28zg^cURq#o{ejm_yT)?r zdi>F(&CShYR+TtY*MpYGi7@tSnHu`&5oFw_3%jjSlksHu*_fQ*tWdAoA@|J8cb{0H0UxFdsr zVV;lp%=p9^c`0f9AoNH#nX^@URPYxC-h0DPW{rHc>=!&`wyD{j30m6y795y|NvvVE zJ8iFpk5&36R-%V~&QI_wzZ_(JgHQwGUhL?4ne~3^O-mec#<8hpljr-ARU-7g&()_5 zm;A^T_1@r@CbS3MMpwbzi#uUXDaHOY#{y^AWu2(^HRz6mXQ7+ZnR@K?rE2gpvh%vq z*{U z)&}f+3iuA~kl*U`VX8_MJ^v6*6%jMpm#!LWdkZtr%6N7j8d<-&M(vcD?CleGvN!{c zyPpSG@OWU1E1<)6@-iED(u;l~{=2W$vVPDU=xd4Ia;^c5hW6b@H8A`+?WoAkpN`?2 zm|EE4(QXIx8W zvr|cqbr6$ALzyLTaUQ^-ZMo&mRssuWi&=A`*>c96)Y8SR;ILclWFvY5hrAKKGW*W4 z{0-prp{A<;;}tuKbKg+hi{~pF(VHco@&qwtbq^tNiT5Fpe=HvegHYEVkxs2eGWfpUQGs%3EHs@ z&iPUdUN;$v{_i9|ay*3Ba~6|xg+Co15l2xUmctJf{MMp4deCbno!uLVxoRAJoS8y7 zm|t($5=Z@C!o$2a03HRgl-$me9@@godlGaK3i8?H2Y7SgNfLG&4ZRg>E;p|=i!WSkpI9lxhgHh9@>7R3S!x`eE1pw+(s zxdQQYKkZA+PlGenaRW7c0e@R*99hiFr#fq(anvQA^xE#DRp@v63Gvk9K_Qi54%O;$ zJOw`ANQcn7u&{}zqk~m+@hr3(!J*4(@QjVR3hl;z;S@dZ2j^lLLeK96lK0%de)KJd z{u^h%>u%harqJryjz06AJZ?cBIn_fg!FBn}4O_3EkA|4jO|@oeAC)u&-1e32=CCc` zkGOz?amINu%ew}AAT%G0u#aeg8E!BM9xJY8%n~!}O7s%~cfVyh(DfQI9bPukP3hTP zZ@P_pQTMbJnS$His|4K9Sw!ET`_Vk)B{#)v(y8!Vqu2NN3p4<#0{`%=CF7SsR~`Nv zvG8lVyM}Hy2_~a6u{8DMW;)b9h~!Vf89cHDUIGDhq%@We586Ve7JjsNZ!BFf&!Uu3 zzH}0vVk6A+Dck{^daUQHEsFNis$2eaqbip6=I7A9&)(!WB9^{aWzcwV+z55i ztgW%M>ts6`xnrMQDsX>#>S0aYLQc z0ocn=#caxZcN+Wy-iVe}%oekfyjq-Xmo=m?^exBM0nSZlLH&>Upoa~uk_rhl2B1?N z1`QL_IkfqKKV5<@&=_c)*g@a&`C_c?wB^t@4jVX$r%$FmeFAp-+`ik4PW-nHoz!7w4nr?LqBOuUaOi)3-4i zYHEz%vN4oohk>U$6iK}WXYxr>kO~@BdZ9M-=&*ubK-bh}PCFWvjK0$(_zg+lvyR{` z9(V$swYZa`bJ%RAbZ0*DLVMZSWOknTOHLPxdmQ3LH+_RWx zIpaOZ`*IW+TzblOR(n!gXy>laX-r0$&~L1OKeW0lu*dLWt{Y8D!bXzWT|YVk>`)x~ z*`~lj^tv8R($9%hXHy{63&%dVWer_{C)!Tr!@gxZX?+H~>2k3rrXQu?ox$|cGLEEQ zF4Binn9YU60bhEJOx4hM)WUB%sEn$jeCYepSn}>sLIYM~CX3#}or_uY4mv_tIB2I# zO(DOB%@j39eT>&JP9e6ini=vxffSb85Y?rn4sv!hP4(VVGE%iydL~ zsvEBQizzq{XSBeJIJQpg0gWRYXqYeMlGqzNGIw{XsL9V7anJk!daw>!{jGH9RR?&z zL2qh8T|aU|tu^i*yrM;G3h)d?FC0hjcFJk*nJ|hw5=Se0rqTG<;ndO7sssDC28vbjZlp^KiIlt|}IAJT!EQ2G>|NI6zFDCHxb zBjj)%c#6#aUELO!LTwhAXCfxu1XtV~yfs5lQL)Si z{3-Y)rDclS!8yE)*m^jXihWx7(~(#e%`bl@$}YoSL$0FJgS6>W7WNqxD%z0HmsZS$ zHcpX>hPASy0N%sT)bUhKY3O+AV5}dQ2Xa2+rX{8uKQE3}z-$%-b7O0emlIaRN>0eulnP zL-$||cB`WgQpyT&d!Xx8Qo0fTXV}}l3(vvxi)dY)8+qx&oBIcJ%Mh!3S7Pbs5=(HT zJ!o_~^zNpWiU)zA#pOoQIQY?bc_gQWqu@gZKYFc&Ze*4kLX+V~-?z|#Jo+`f2e+Gc z6KugH*s8#+?ZqnL;s8?QMje*khM3)j{Xk za{Cg|hT#mWptX3rP_(;;9>i8fu1ju-z0r&9HHS{1c{6$rpX(g(Hog41lf~L_+K{56 z7^Oh6Es^x(5oV){ohT|ensQv>%jT3w?=)j+S}S1w-PX_?xq{}t0Ux+=K6OzdN5&^m z-UBshE>zO?ci7pVT}k7nD5yKmc0|P`ipGpO19ioh;4{$13Zt)8;9j;WqtEa`3&3+U zIcGOCpZsY4F9mk&*U*DCK9mIBS7nzZibi~Yq{hJ09=o=eyhtA&5}{MfsHQ7;dho;2 zX5B?`7WQj$pn(NH`thjEQo)g`h9CWXt@-q50`PSB(T@+CMdr$e^KQrM_hfkn3f|*40!%h@JzZr6}Eu$U~LTV3C)h;`(*euorSjBxC!E~bU*kF zs%U?QC~@OX;P8lZ-}3chyDLF-5PM1cP0PfUdZFZHp(6e9k3`v&aIy=9f6WjLYCA8I z2LJuOW*SoNuxK(J1E0qoBgq!L<0;ortBjjLL&qs-A8Mf|)4x#4>(dY8}eTWO>E$Gt-}V8KQygrf#ylLwUB`x@bgOKjgcz^i%4&J*(Z)VO=rRq?C~u=ucC84p9K$Z zKiZmvm`~^|8iWRr3C?Yr7j`Q$g5ZIGTyfZ2v_1!&#6)EF&Q*3h+r4*IG@su?<+ocG4kr;J20#D2<#&d}`FOax|aNzWIC z(U4j2CirIzl_Ua#wFl3{sxR#YcHN;6-VFovXwq#$MDFe)Otg(Cxzv=KuDCkFKfBnS? z&N7#4?v$*7xu-*kOtuNUveoeZ`_NeE;p9!(sK@G6gM}p)zSJD^2kU=gE$~wMaPjt zq`~>33fh4~exo-mI3hkr-i<@<(fWE!jK*Hn1XUvGygeqSos6c?&WUvVc$qlH3Ob7D zD~Ej8FFMW&r5C^%T#L4f`wj-tm-Q+N(O)i>oG=(~M^DQ|}#efdE=uf1Ix#JQheOgRJBdhkN@fMVBj zHFQfdTcAf6(zaXzc4WRjj;NPm`G86AM8#bG%9!Eh{d!^-uS!MoQM1Yywg+!{iHb(` zSCsc}9YD6zp+%Xzru;Z~d_@CQba2yw@|)v;zd;N1(a@{qaeiSW09Usf_qE(7ErKe; zp))^TSDhXkMeELCNAFi3byv(T?xOBGcb(L4fdMZ>z1QN7gZkwtC5_C6=I_}k^XzILex1DwQ<@|ML!f$8%hz$#38( zumakizRM(UXh5}@iM;WkK>GP4kRA+x_hs%SN%kk0G`gwi_T+EU*B)UsU@&s^Cq35H z61}RUiZp+kuyk1z+2^Zh#!M@A68DdbUL1wA_GF`TVrg+UbnSL6WUtVZod*U!F(;G7 z+p8#2AGqky?dM$0)v+FkL(sSI=4^`AD|DsfP276u^ z@M=tL#Ps&V`)M|IZF+TO9|{7A^;gmEH3Dk`ZPl9wh@qVu3%dhPH^jpF<|3y09ZrST zDq6K<6U(ZPq(RG6WHhscje|~hSuOgVahKVEm{^MNj-x5TuUY%1O1jq)cVe&x9|hgq z6l zLg{M|un*Cel>sYAd+I?UdnZWk-eZ>4*O7eFwv}~-UiJOC4h_!pijpTT`Dy6o3BIbB(+ zqLtHzvz|%tGP6^W-F*jE6&XlV5a+3tN$mJScvR}CXt-`R+p-3JcJ1K7w5XI_Ivh?l zc*c6(yv3Z4Mv@Nr$)_6sWc#z=(SbT7y|pg?Gb5Jj(TlhE)|0#3Q&8NAI6Ag@6yLcG zyJ)}%KAxV)1E6u;YXP{CvT0lfo=Y9_p5cM%e8{Y5($IlcQU4kIe(y*c+aBLdA3NS! z7D2bOFymhB%+JarXbtL^@aMk#26nVN&ry@DJ@5=|N}v6-XiA;<2#{$Pj+?y6AP*zHI1&u(_+Av>dw<>NLzy zEbS#5>?k$Dy^|1_Ep7P6lltdDAKvtqR8!|g9e@`-FVSH&d%!!wd1F<>*{FCq$+O_! z@yUs;wD+gS^Hktwr?U3Y(NZDKN~`V6)+!kMO626R$64{rP;$~zQFWVYb`2Q7T4U%c zoYLUgiIH@64t%eUcIG#{qG|UQ74=$V${h#5<68rm-c4)1KUo26JdPUwSimo!w-~(> zGX;M?PVhz;5Q)CBWeC3qPTU9N5n);|7tA7QUot$VQ^R=I1L5@ifPzeB#_{ybaGHU- z{O;;h{t@_zWsHLAPA}sYmhhd&&fw`8OZZSX#5^*Zjt`0CUy35gKQfHits(q!C3MXb z{b=b_D5zcwqqL1~G$Q|i6dDyxni})T4}SD>CMwA3tbK#??67*EluB;oh`!svP9@#O zUXpP~%)9R$k$Q>X_yMCk;tc&~%uoi~#F6jm-t5*YA8Pp)_sy>vEN+3E#2nPJuM^qK zLH=Zod^@(uW;U~JAlV{6cU&*A$2yonKtI9G@G(n5E$!AA-i`^)_;K`rye(?%+|JzH zB9iQJKOQ|ZjO&@gTPIFMz9;|TeZR)g(;MI%w)EsXpTmb2_)k!eXs+51@9#g*1#nB` z;ay_LBLu$5szg4^Gm_L(mGn+n$W7hhDPe{A^@5E-7y=mh>Iq;)5fmV8x=XMR^Y*#)(+BnvY{w#%_lKDzWvBI4! zfdk*Oy)0cB0$tVv@YnWj&FZj6GY2~eL%x}@T@gMM^$B_@hJMU%EaIH2qTir;ISMsfp?hRH8%T35Ix2Yj#jT9to~XE?fY{Lv$PYf6&r;8j+aZI ztJT4Vxx<%fChoqd9{r`vb?|IyIgbqCM_)A;zT}n-<2-w(gOoekjduQ>@5{5Ls1)e% zbOR^z^;4;^hbMKzOzNvw7j_f;+l9c5*C{5mfcfxP{(&om2gj!r>_ek%a2OBGq4-KnHxr_pOtiQ@EBfs z47eQ5_L`vCymx679VY09>)8IV+_6d~wK+j~_O6X8c&y)5mp+VOJ zIPKGql65;ziYvn$)CGcFId-o4)(fcjUu%&v&wMhoIH$ z3tyEB73>mr8Ac4nSv~QN75fLlpG!qoj9T+J#}MlHMoF98`fzt(#riMtI$%6EK%Sgi zucT&c9rE(VUUwRG^)DqAOjyX%9z@b(+*x`&i5DTaH_lQ}PF^xJv_om} zrdYZgm&)tmzkG(p(8lcLe97}*YTO<(nckT^`*JXywvMLquykH_9e$waBPp?W3Qu?w zKr`pSqk6PIpJ3)si#6aC{bC~DINXm0V%McIza6hTB`4huKGbh~DYL;o*MUuLH0IzC z)_5JT1=JW#t(r>OUiNzx@aI6> z>Fchr%X0&0I53E(ncvy`u|f0p$v{pOxBaL|PD^g1DW^lw>2N66%RbIU|J&J(JlgkQ z(a=ZIt6e~?7CutTy`pGB;9Tq*-Y%U9PR+=r4dcunr%IW?pEqOx?_FOeb@6wnhv2l_ zDs9HJzk84k>Zql|hO_TcUKHgXN8gWnv)8)N;L?txhvU-O6}2z?{#3N&+W|H>z>ih{ zcerAIgLz-FloI|(znBddEV<#dU_L{VuB4ne*!ys z*Oa7d<-&KwN6_2dN-`cC#H&#I{Q*Duiz<}=@eQTydBBM(B6vjxJkT+lU7D!mUsHpi z84*Jr7bJ6iUud0a#L&x;X*}akAocDNO?l%}_`wU{-Ju3fdKk@DT=1ixi=nf>+Liw^ zUQWiqQdikp^MfJ2q&yZ#`@0U{a`1}3K|3tnwGn>;zC_IdFM3j*!w$EAhFGO5B^I`2 z*M@+Tb_=thYijkpneYJJFqcNbkAA5Vxo&&II2#;WA>Dx9l;vvhy89iKYCNF(X97N9 zVRLr04qi)VP&3DjVsTzxRP6(eAUi+S@4GjR2j;V{UnbLr#!DQurhnHJvF6xseFyIb z3(H$frV)U85<9;ZjkpFpeVkhYyI9qMcPfJiRyEGB#Sp%y2wwJ=;nx;!#Vfj??kZNo zr_6zSVSYWyM@g58-1&==P$~n5Gyab!*Mrx5)7P;y(aMjv7!1z{_zy0)5zgD}MNbqG zL!H0I@n!IQY`H%g_&@?T$bc{OvM6fVC!DVazdhszJm?#_@}wWW)TSVel=E%5??WGw z8z7Hoj^QJcvG0#MY4y);{2KG2cNuc(@ai>d*%=;%(3^PvA%itl%Yi?;Qt+@Q%<@+t zU4OrTZqD7L-idzp^xOYx<|fUe>C5AWaaIgoDCIwMCH+k77pLuz9Gbb)S)6B!s;AOg zZ|K8gw{)p-N7m#BcG4H1FFRt%YP)&UN9@!r-yY5`1HUcX1}rXT4NKOA_Z%=Hrd7b1>t9 z*ptpdt@~n!1y61c?7W4792_R_q-*erGmM4rq%{u&HkdIE+5#=6^F#NrzZn)y)^p}@ zO9n0IZBcaDY(C%c$B)8Pk+f~k3_d49PTwDflfmTieDG83rripq?i+{l5x>02C_I=J zE4uSucfCn_bpTDN)Z#sG*FUjcfDe7or3AN2p`_C=6n`-boaHC*pctRN5W%A zw-C5>I}E3TE7CkraK{g#SXFfBsiE&0pJ%cev<7r(1-P=cKm01@<5!kN@RLHsc!* z=ilGp^S!l(xklk^!y|Ctv4boUxY>|XUQ{~XiH*Df&zCW7G&HJ~;i0B+mf&VYgH3RLXv3FeQ5AyTL4xZB8H*VyHIM=LREqPD!pwk?6UB_e6 z%f--#afluc(A&TM9kY_j9hu!fKJ+RZoV2}WY|s&3GMEIsNY9ylGW8?rlae|G zC9@MJ{OM+alGdHhVn-GPLK|L5{i{lthHfy$Blo5kTwx^}Luh?tCB^TmWd}NiQgEJv z4lMk}T(HZ#zKwz=>;Gh5pModQGnTS6|FD)80aPT$P>+nJe6~L{hkc`|`R$gxIXrF( zwnkCrIc=`7#gCjy86;?*(GKZT>mZu+%8|C~SYr<^ zit^^qqdV}U&+8pcWBy;9-@dYx+^byaGveImotbp+nH!BnoY$y4q+6q~2K2COLL7fB1)LltWbCOxji6Dv{09_Z04QwvvhE2aIh*AsKNpRtwLuao( z=rA)IfO(>>g80c&Htba(E$I_W!$+xEyZ!;xUcgMh_!v7p3Y<9)=;!EEvhBM5#5V)e z@xRFa@%5wIn32yodxm-I$*H_Ad^+t**`k#`ba-wUIo-%-rr3jsvVrfoMK(Kk34Au( zgKdVbVD`JPcYgqT7gla;bE+@xec(;Y2DfH*t^8;_bQ0xB3DSg4K~&@EM2+hW)se{0 zv-9TBEBMjh8;X1I|HZk_@Zr*h%g}K}oCh>&Cpq7B!(0bCIdy%d*8M!F8g<>eiT_9* zE}nD@_4BONu~Jqc^i{s9XyKaml4eVMo(H|8(fvcaR+ z7{z>gguwexK|7-q?DpG0YTZAU#&?QiO7v*g$D&sZS;+Q)k814%ETTM(okXtaw=s&w zOk2uohhWyT9vFvyD$9O=J)n^hbYYr;4fOP(l~G}|QVE|v>=LRIL+DhTJzIf2Q+MbL zSSlv6wPojs^NjY_IMSt$L;4xn4JmGt}1IqBz!AZphUo`X>@CE+4GkDe*$$D^jKQ&tGEwaCxi zTC=@vLa16tLD2_wnIm>6B;ZQzSX(v`J;Yhe1BzwsneTZ&x@aFwU1u1w$Ee{OuZ|-9 zl*l5LSU6-UAQ zZDEa+0v#lqt?2#oxzruAa_=9w7axa9defmh5#T|w#ShhCsCnGOoGI5drToRnD6$A~ zpb+@ccgHMoTE~Wccl^Z8lE+zB?1RQrd|Z+GWrZ7Y#Mv`Crao84Tgwlas# z8~7W`s@AG2z;9m*e8atcuDa8CZ@RDsc>b*;>ZgXjG#|B`VbB%zsTj=MpDC$w_Z#)l zIzRMz&~lm4LTZG$j}venldD}MqYvQEv_Y+)%g%rY*c)-4W4%_kALsUMJ}}K~D`Yc_;B)acg!a8klhvj`cd>CW zb*V{`^?d@bB5>kYWVy?1N6IN0`!)x6b(EEF@S}5!Jn7WcHRi{#qj74X3#~I)JhtWF zC~%m-Er1_=<-BOJU)M0sy=ASXM#o&~I^tYp>8nmC!=5JM9Jk|8dC@0#Xl2Dw_UWT$ zAF&gvhd57}dC=T>rWYlDP*HtZKiR>*+@1{ZzOKc{PT%pNts^nFI=V}C7CH=d_m$M~ zPnGP}O5`+XK>f6BCan7APurm}@)ksMO79{Ki-(G=!NZ?AqKs7eK8%W(t~f%-Vd6 zNfh}Uolj5x=#33`k0zgo4dZOJRYy7?xzc6Cc~!o>I;RMn9K`wjwZQThweDnwI8UE2 z)4W2^1Tdn-YT+UDsV4bD zQ||b2VJ>zYm;(E%HcaRl1}qo6tkjW3f>OtuIs+>#8B-vrc0%i0A8{VPOTdyPO_~`@ znbx_2X&t)ub6x3i@p5yU0a26# zK4udiy|GGg5Y&bZasGYpb*1fP@J~UU3qN?Nt@eUDia1{xkyBp#5ceu(YE}a;jx7cc ztu^9YSo6v}aG)1eyu*HU+%(x2Pj7m#Qbix1tda2?^oFLuMO&YdIpgk--%?Uw;xCy$ zxCe!c;Jv%2i_mQY^6D5Rjh!VE(y;~ z?-OpTz?<>|=gF%;=-U>WnT8QGZtYfKZ@w43$^-}FM3zwH=tW_z!Sf5-C|n-kO~x+p zFYKQs?17)}pdo?u%VU{vClmSkog6-7&~3)f_^*x7cF8#=o0=3vhnKt3&>JhvwFX7e zp>YfT^`qB`Mn5QP80UvR9i^LxUFjU+d?90*I&>Gbh!N+KdtKCrZlDK8oR2NtTz&}q zu-j%MR~v6FTi?Zt+9J*;Uo|q%Mg6YEy!%i@uKBYRA8_N~mDxp8*7LM48QxIRl;JX& zyrUl}!P5#4kCdGYKzz`fDB5PpWL409K`l2!#$@5(W$B{Vwp;Q%~a4q=0!!KTc7PJV^gH=>@7HsbN(uAo|Cl0Z!n+FYsNb44iJ(sd+6x!(JnBY=!TzJIaJ>~YGrz;XO8z|{vPLyz@cH}eCiH_8Sq z_}7pAQBpK5>fJETWfr}pe@a~GEaGh1?}*xXn;Q*8oGS*WtEXOcr!2&|71DQYu(ws6d?9Ku(qbp&wEm#e62L6-U__Kr7$GtkXpuX-$Wn61g_?WU(r-sHbxrRSWdgNqN(?V@lp`5wLm#J7$6l0zH$PZs zF6{xnl=U50$JC+HZg|`uKMc+8PEDn9+zYP2lwLX~sYT%Yp@y#1d+>;I1FI-{yLbM- ze)Q4l@b4{cn4e9{M@Y?z{_{y6F#fCBF58Wa5a*1AAJs+JeU3z&Pc&&EnS;ml9rKj7 zwcVs~xCh?6QBmWmGHHYf^gqD|*tgYL`ZU)ET9)7y#3V}`z2StbO4OyBq?{Yj&sQnw zQ1M|Y%E+G-gOp^iaZ}P$fcJ-*dFa_6(tUW?_09!X^GzFe^l}h%c;FwL(Tx==umf9# zyrJ2fJzX9^)tDFV3hu+kc1K_TDw-C|Fk$P!s~r9f`@f?{vReb73*9@4;wO(~J0|*2 zC&NhSkqu{7(D+KlOv+^Z0Om6h-17Ee)OlckHgtw3B`pu3`4@&UW9Y%Ic?>_}kpeq> z&4-R929VjNQLO5woYHWouKc6JY=KiHXF&)5ccv8BG?>EsxzOfeuIlEVsOvU6{Od=* zGAEj1bsENbtYd3wVx=P;#2hwk(kJzBdnY=tkJ(D|)>7k6&eR7SmF2yMNQbMOX>)J* z9Uq=6wJ&xdm;IQlK2DZS7of*62M0j5RjSU#E^UR92A(@6{Va8-P76@i8N84VKK3B~ z9{J&A3l`eZ3;W>EuJ`M~n!0dM%$hGG%wbinF*{g*I@#EVb=(TA z2`Pro#7DBw>*$diL-%ZW5_>Sio6cIGe%iQ{-T&rA95qHcUk=|B)LfXwnkFt{K3zS? z{8c!)w^Oq3@7zekK8zM@jc3{I-D%2M_{FYIXKwqT_d7h8cCOpa))#rvY2!eutSM#b zTYTtu6nJ%BYUYlaem^ZA8W)w#@=g6|5PrA8{fDyE72q-caw6@C22wKgk=k3#|JRS+ z9y+gkMl|FVq>6fy{ys;#hP+W!uOnH?oTvcvlow-%O6|Tl(agip^6l&*y~}l`Y|Oj+ z>|G|kjc}oo2hdf>-7ERxzHJ%-F7$wF(kSq#ja!4KRPd5>cVJI}lYIS0 zNyDZNV@+*5$@G(g_BhR8yRpB#9bWUV%EH-7@KNvC0}Itz&hAA+qg7i$>-ukI1Wod$ zm`yK%Z?eX8A8G{5`B|3|mb1&7I{dSnM=ks#lh7wF z{}MzmEOodS?$**6>}1Aw<;H&CYFf#u=6z4@`#S_XPhK>pxjtWKfSJ4SpEvrbkMLMX zb8IjlR5b4({+?NO0JyXGr>=oT$eY_(cCsl_uvnlU4xs8npLF zVR9Gxj(N)2hu5VG6J3ezfgZg}V>ZLkjeMqK2HmL(%WCe9eOx7FeI3oJ8)GMZhmw3e z=dzoco}_QDq`Oa)EWfiCCFnvkyjdnoH^qH=SwZhi^O+&Eps#OGkfq*n)_9;VwRTm| zrOP*&E$WAk9f5mXd%++8N8Jv@lE(GVOh4O)GAWh}lufwiY~Yy}VrWRB7T-V8hlb6G zp<{zu^HxW^$!s^cwXIt6QJcMJH!wYW&p&K;z9)T$=B>8>cQ*T~C(UXFp212D?v6e& zD>aO6ckIRuhRbQxDsUHn2|ThDYSHFF)GN-N_fH6;$Q$5*9dYLG7sb+z%l~l zrM3O@el-JXG58-ifxpL|ylDvovd?Gd%)FH~(ve zB;=x|rke5xW@kpa8e2)>Z3R8%%^B%Acujk;Qbb35IRWkb_=1+eJ( zO%yB{+VU?-fIojtXEql-X-W(*>Z;wyfnMZi2`%xU;RiizEL(QaQ-v{X>~^S*pZnlI&) z$I|UzrhG~UJg~fC$=-AfKkVj9zO~Tg*))P5F9zNS{>QoPefeu(HBY`okut`JuN~_{ zdw1ac@9o3uTFB`-b~)ypw%`TZ1IQS=u9H`J@Uo|&)Vm0Ns4Hgiz&$ZE0Q0cFT--@& z;1-xa{a;@0(?Ub3`iLX_&IiwY=Oig$yc31mK^JaCnsnx!6P*DcyXWd+sd%+B86Jd( z_0wwU%WN0AfLWp8(AKO7-i1#MaOQ^$WJ7CQ;VA1<{?9phqZFavoIam_$NQhh;`<8l;O=ewD7q)+HK*M8yb3w_gWEsj?M!fN;49%C zL(gVU;yuBM^?wpYaXoB!Qd$7*-3=W3mII$<8cM^?g7=d@j+Z=$rqO->(*}ID9y@~5 z@bCTm-+w&w7Tvl_1`Oxoam@mJY6eTE14nA+YK>inRixdztWj1z_B-& z^hfG51?PDMxJmoFGQ&2m6fp(YC-aH9fD=&Z()!(1R?@1x_)g}VFEPc35J$N!z|7q5}!EVI1Z2=A9 zJgvY;N;-?-z}qoP7}7hZ54 z7{xRdeZM`J_q*y#!YuI1_giw!+wesK531tCT&{Bvd$?gLiYoHwNz=d`O2Pa$PsNLY zamvxRF8#HL_c-rQ9!pf%MP0!iMg-97Bz%UfHT)*_Nr!l&j_RDnwR{8VT{{)UN3Q1` zG=fMQ@gI3LmESxPM8kKhlV%|Ls_9^oGWRf5ZKh?nXVN z&=aUPj)NQXDMZ>b!HHg{VCVPcUP*>H+u6nw@fzu2iZjWb7eaq;=6tqehbtK+U=ALh$l5r&krI8n?TNLlppQFk8XQOS%J;Ih-`!~;&iux- z)2w%;2R%T)v%u*wdspB|0k>2X7GBSSmU&U|8N@`R4POFJiX)PWVn-SA@p2!kEQf~k z*I``k;Y*v2gO3+$#qFW>(fu0g`PGhmF!ngQyhcxYIE=To@TZRWw_Z<4=9zW=6b~-$ zyS~f$mDvIG2)ko>7Hjw~@X61NkE7})o4IU$AWf5jdmNw3HHTqu2!A*K@h;xlB$$Rp zs;GJU4SafaFr7q=`sSGj*BKm2X7KVbb^gRUmqya6YZ3pR;j43@|5VX%-^yZ=k>q>Y zkxI^iOAx4#?oV{0vum-V6m&>>{l;pKciL0^Kvw0I6qzQlIaA?QfC}Kl#CoaMKYf0I8 z77IuK@Fbc$Nt&KHLgO~j!#Lf7WBd@8KQwDIwMYF^C;4gk;6@wjH>qWd6yAP@@;Q3^( zNw12`u=-FYqM#r4+E1oOVe8chbjX@1ndao$OY)Afe?gVis(O6F%BY0*_^ z?mbM9DiG(mozSpVs3k(2Pb=d|tI==CIMJC-&j!Eowh;^Jk9%+k^!jWjvVK)AB-4S$ zd#xY4mjHc<*XSREm$1A+ZWM%?aH(ky%dK^zXyh5YS%+Cs9=x%($C3S)OHA#DId4WB z8I60%5-~@ZnS$BPz^1%A^uwRTA^v81d~-FtDv+1Dxft`t(5~r`h`)PmI6n(+aM@Dy zP>GZH&TL-_$d035l@5INM)VZ;u4S3Qd@Q&PBX7r1&&f%A1oohf8iCLMXgM#!c~0vI zEno9>+z@(Vbz`B?6<2Lb0vGAMT zh}@zxo7;k4V?PEt{N{d^3vDEa{n7u%+1&_O{_e;I`8o4aC&~4kBh9%3&30j-^c!*3 z2M2!pNiMyvbD|&M8+cxB#1i71X;&EP>McFlHe(lRjG9E8X3f@Bx=;UF1*ve9&ZMF70dK`lz>^}7OW};TS*!wd3hCSaqcoqiju4SFu zc;fRyQ^KVQufG8d7I*HGN?m>h*xJSGanPJG;$aKDN#`!K_j88w@g6>Oj(rI5Pd532>x)`qC^Tv!;`krTY7gL?JPTRO!}SBm0e8^-stoRb z8+tM;pg-Si6Q587JbVLc+K3%|(izN3QvZ6)?c_txfcw-39wqbB`Jwh9bgVUaS$qtS z!2EUy_E|b=tYq7Kph5LAhP0;4FCB#%ZKlJ2G5_DawvlJ`r9~GVsml}SIBiLk)=zSx zlvBtXjgLyXh;t3^ctkeNVauV3M`NJRqj88e4REKiI491g7udu;@P)+8w{CMads2(u z9A|8n-yi0=$CLKpb=w6xJSGNOd3cZ6jV}D>WN%8xb5t_cgtzJkY*2>1gB|9)Id+9#2~uA7G(&&_@kIZvS(dt-$;-AD>^d%>#BHcVZS^ueSNZOqYPC ziuWW`H|HZTyIB+gp9_cf{CYR|yT#!%tm(=7eS;SyINQ~Q!}!D7*lphg{i~xE{OCz| zK_0-*;j{SYQaM%O-s#)flON3Yqq=Hnta(N9#Vh@(tR9{?tCM(rcmSPikw9DKFXQE^ zK>DVWK<6CN`DULWS_<7Nd8Z}3qZCB{>_(i;X7l83LG+;<_o?y~b6X4_UOyFi?vOF< z%i(ljmh#`&MpeRx7jw7&8|T7KjivWj94YZV>N@K%$qI4)^c0_G)FCMualU#Jx&gyJ zOZCytREzI7le(~{`YyEd1hmmQ2u$O!3*9J(-^ySY)_SHZtt*MANZW<%+B;Y3h2MAE z*fnerFhKi4^g(sIS=K~%3g3&~GgM+NP5GxPJj<7^enWn2 zJ&`wEA}7b@2^70{Ht!kZM{BVwbho1i=dREZGEAT@-@41di5YOLSdm(Q|Oot4vwVK^Iz%&u}?Dy)}5vV-hI3n-fo&j-AKx2{i7k7r&|*NJAz-+vlkZ ze=rytykisS>jQJ{3SS9V=(A00_nyU1_owf9z>STQnN@pe;~)pd_xmMf1cp;<+#`SE z{1|t#`?7|9#~Z@Ws;5*rk~?;g2Oga&)!`nj#p{XHo1_@Tnc;Wro^(wzMV#+JuWx?2 z1`}JmkZrRBsth$|!TViEUo(NGe#2Ujl`9R#Gnl%-iEXWRrCcre(H~H;tQBs+W3hjV z`(nW;cPfDf+B3F=X+6iCi1`FXcWKPDu8az zhvv_)mi*6hKYB3apRza^GHPQ*8g4KiDP=x$8`TA|930~ZC+%G?WzGQ|mzV!7n^4rc| zEYuG;J@TGcc5^-lyYOF6qnEH~!%M8Ni^uWY4c6s4+y2u&JrLcDpPr2R1o>^rvQw<} zcR4)(&i3S81arDBCzDLvxg$HXU&R5?Yr_CH?aRk~Qpzb8@_T{zc%7HhX1h`}^2VJDwbB~o>fMh~pY&+PmM?`)EbjE`*ZOQ0 zFzV&^kT>S{VyiIowLsjoqDQh8tKbiK3p$NyyZ1KM#Y0YJi1S;`LUzFk zx%v!v$PW&&fF8g!5NE?fhghWxv~~}m?s}KYn!NU-2^(>D-wXrySWZWA7au>-iM84- zrympW^G(i6Bah<_)km$8XDb;xhSSwo|K*CA@xY8xm;OE5|9hS_u0AoF34Fs5=XQ5R z3w19;U`L4UhN}_kuX~(m0?y>gzJ+Ste$Hf!c(!T&SbeF`nf!6~iN>4&#v?Vch>#lXh}$SBTdBTm)lY)2RS4YF>%w( zl3bBP;x3{dn_VDHL!WpXG5O%6mL_7ZBvoQRckD%JZ+qwg;C21)M^XoHR-5AW)PtWS zk---LuY(pgW6E{#*2LdE`m{BBAA#BfuU~p~V!y$`(87D3di7!_ZTv_BaUNu8!dk&I zJwgrr9L@f$_9yz9UC_0*@4#%3&qpUh5BB9PsgIVNVlBWOy0}!D5Fn@ZAL7V4*Gk$4 zEti?OsNn}zs&)LJrw0u4Z)7vjgNB+ljB~N^FY`#8=h-;Jce(_cuj%SU>UXFaN_&_m z7CO;B+MEYHmRHul^BXL^r#27Lc9cJu@na>6sa@@g~lAs1a}2KvhG zGj+|oI=RxD3#dO|b~E?+=}N6oUuFIoVji;2jjHg>J{e_co+G%E-AUBX3+9>+c!NE! z9u&;3p{hDsFxu1h4y+4ZI*D2lHq`Mb+;LlHP-C};@wHF=0`wD5(IRI42so-EV))>|MRN=I5Vfv=o}}eNa}yhQFrCGGx$3RC3cMO^y#H>=H*-zo z-hrr*f*yS^AME4zujfm5cGY~#LOK0%MBQ$&&O8&Gv6dQm|F_BJ+Xu=iY6G+sa=Mt? zJP4q~;h33D*)UcHO^#aNGs}w-%m#SJ(fdse>y6Y~{xWaw_^%FdUR01Qs2g%c9XJLZ z*2x<0ccQk>;DuzuWmim`sq!vxq{>&aFU8K}iRX9HbsgcZl?!Dfo`ya93LmbzPzHWS zOKH52=kN8wsyH~J{W)1ObDMOHVL|4-Kpy# zuMiT-kSj z;lu&VupXdpxieTu8thD~5Zl$Q9fY5Uo&WWVZ}l!ohy@mX44+?HYm;#FrVAa!=MSG= zB53-eH$>dtoVz4swQ!^T$a}NXUJ13B)mH39UYgoWY%$fHx)sDzX}Z3sh1phS9?t5f zo?;Jp0nEkgYl$PoGpMCkihH ziw>#4JrIBEUuoie=!AU0=V7}t#97daT!}j0B7D900C!>leoofswPGdCdAFtTgsMvu zGo!GhXM>zJ(oQUaf5*dz(1QEkMKpNrP4V_|bm-eh;na0s$~c9c--K(z%#Y9;0ncsR zFFQdKdqw~31uq4D^!NJ4fxFc(&Kb71Wl6{z0&3=dZ(0i1x;xPqoZ-1EWI{xd6LH)} z##15%VW=~W!?|UnHVT^M&eQ_2t?y7SL{D>}%2Ief=HC~L?jz3l-KFo1#EwC(^Z@ax zY}8IX&<3-WT;$TPeMRF!H~N77_v~w#SZwc3rkmm4^lhf7)&^&C6VBTZxu|>8gIZ+A zgF~ArYQ%Yx&KBgE@hik7mhdUw2Ho$}EU{7p{;$x|Hh@1Rti5TqbLu2t7 zHpQP1^LzMG=|Md2hcAlL_xh3_zSHd)SH&01m)@pBBX>uIIAF9domhb9)Mbyj`>i)U zt_R24CRq%B0<9`l9KABL5wmQ;i+-#k^Hsyds@uL~jdQ!XQy0+J*DMo!f9F?v-Gf5E5NiJIWf8qy+5 z7&Z+3;3;@CuRktKWzJ-QGc!E8PDr2SLS_5#j9ax5dp>cYG(3ZYLwbr6B3$VSVinu&U8Qm|<42JQiVUz(939y0Kt`zsM=>oww>3pm@W5dY4( z;<{zwqivKP~R5hfWl}3;CiO;y*i}rGWVVD10u;2+#Nq?AL7m zB9`3)S79rjox^`bu`PD2@bky${T5rPp*`yk+~&!1(V)zm>f7SG;H6^e7-)HAVz;_* zm3SK7C1JmT%iRbR=b>(|!K`6Kk&kG1-o>)^QHTiU0P%py#&{;ud z@S~rNzVJM_m;X0!DB?Q^GUSbZZ=kcytc4jpoT%k}-22m(3eF`?Gzn*TQ~$%lqv6h^ zVyKHOp9`ChIg=00j8}(NVud|&GR~@&cOUV`3m3Ar2J;=A4F9|b7Isc0}^x54+ zTzS%&LU$vF_vtP+UEo495!+rCg1G0k3)SJwxM(^QOvpe9p0*sL?8KvcS)oZ`PI6;oy_cK`rsA zBc0;#)6oZJV$_0)X2H`I82H*&_ryMx(9c0^%W4jabKU=PIdF#8ZV|1VJcxkB6+7mN z`;U4NVHYgn!#42~yyxl=+fAPriATWOt-`*uQE{~pH!mDIVX-s_e)MgyuaKA35UDGWKY zQ|u6Nf{P3N!nx9~o-USsbRjv;Pb>3qF@A|Fbw+%W&o2}Am;&DjL0z4ZBOa=9qqlx| z7LrTE*c5lF^nnKr{CU5O^PqNkU0eM`{L7hK=!-f~=ZAPR4fi14|9wmg(rfBPXZ_&^ zH%y;2!%$1(&s$}8r9J2kU%BCXT+@?U9QUGjlQ4JaZ%k8q;d^O`Jg?Utb-D-X<^c15 z_(jxi;Z84wYqlWnN;5sX8s5p`a zY78%p6k!kItaAmvF!5zV&r&CPgge@y>a!4T=1f0u@0|P8SrjXs$#pHX*9-;mzK08~ zz`2z#a220?2X+^Ydhc11*gnIR)&`)C9lu^2Y>vHV54^s&SG)#ZhrJVW(WR53?rL{3 zn2(rf-xo`#K+n?wo&}3Pi_@w-Xck`2F4Cl?*gtBD*DrPT=wZ1hZMDOFoz|6XyLnO2 zG~ieLdQ)I0FESVjofe@FS*3c??_bzSk2NG$#Omcb_#oeDM#6kI>huFU(K>g;=AEHT zhP^PeeP!b1M&NtKDJeDikoX6C?#nM=7e+iGhL8U1-KL=Dwr9k~OS~vAJeD@_!(s~; zaQRNhkl?5iPeS{yU{DO%C+7oyObZ{;hc_ zs;xb!=M=>1U1K_Z(u0mzBj!aq6wuL=N-a_2?e9d#Lg4=^i>F-|jHzuD_+!0r=Nj~Z z2d4+!dq>IWQZ`Fxo>L!GJsvURMoN!zgK#V$4y}@1L~&mvrl0sHkA5q?adx@= zvn%}n{<&(7M$F{B@#G#+cV;^LKPZq<$Te$qBL1lV?TR_akJY= z7cZz$k@v&;l;Ki~5DkKOC$#$>C*7;yfpH$xZJB3FG0Q#Bb2Q)gitD687tVm}OU*M6 zNH!&&IOfP%X5>xj+iEWqNPPP$ev+o}ey(g!j-R0d&SZE)-Icj}+iPM2dyhqJc_(yk zgsG3bvDK13AyLf{PoFLIqa-98Zw!$cNySsSD=cq;$r=wddPnades(Gk_MdGNQMLI| zXKoVDW;->he+r5fMJ6{J3~R@y~r;~DxTCdcDK zuS3%QQ}laz6^F;QbEG2<{P+ufN$;UxO}(<|@+^XSv*`+qC@ z&;8)MaRFlE5AL|eUhYTye6d^*@#n*QyOS=8xsBE6%pTY;wTg7=pc*yi@LcWdC@t1= zHc8-IuxO0bxsL}7zRZ_tlPqnk!2EH(JL8mGsSWjU{sZ}Eyf;a@9bOp5b69`DQEA6~ z?q0hw^RfRuX%J^UAL6(DExt(&c=x`y<{QzZ5}s+vE2zhOx6oRMI_(QoWIs8!KFZGF zUBUg}vyJsop7-_-?rmdis$zeH7y5r@Z?LskIwWh5*d`H`sveQPx8x3JfF6-=H%WG9 zRru+v!OX<5ARhg*4XM8@2!PlxQ+Z z+Qc63ciA|;**&F&{pf8;4sP?TO=9&XLCoFyr=C$^k@WnFVg8qc{dej^V-EhqG5G)U zyw`iQSoFmmw^-+!_fo~gXca0P;hd7TMRe$(#u(Q5`}IfS-79JgVVxT+uO_9`=Lr^oHlBo*yx{yy21;cib0P=UuK*Qmay4P*~?EhnZ3b>Rd8d=e<*xNe{1)v%xyY zj^8a+rtk9s*134rNy(D6z1oWPbh<4qxI;hH`aI9|-%5Mc)byG0t{CxCTHryB=u`Fy z9;Ki!^u;CiW5G2)N*>nqC2LNuRJTjgYwm6=JjsDkGy8ivcf@)<)Ya!nS|fj#Njil5 z%#`ZZ(xC2w1Sr*~OY3|+aKRK0uk9JqFmlxj@5Z6eyHKeYwUf6h(f2^Km-?*pp$A4R zez*TEmZA1A&!1e4>oY`4br4#`(A)RjPC+oIr%m7ga0#xM{^V~AcnxvP4|irq(_3=y z1Ti&9g*vSByz;Ze*1VJTth2uBUh&{_HD<8R&g@|-Z_yx>b@uZ%lYS?8Ad7YGv&>qW zL%+cZe5bj%(r8n?KeUaz6QnK{6mJb5>X5G9xOPWKz`ua}9Cyy?X z-mym=-G&)kX`7`3&h)2klnl2avXph3*}m1dXSsA-8cvOg`@1Aqy*(qTi1T~yq}E{Y zami^CcZkFk=6>EGnR|L;DLH1&E9Oa0YI$M<_507;>!s<$#+z=^;n3EJl6#g0;_3uA zM+}z^#d@F@If#x&21t^L{OwI~C@Hd$N>!qMVQnlz^2$n$a(r-g4|Rw!+r)+J!;MNb z4lt*t$HXA&5Tmg5X{eBA83jxFj{g5_QatF-+|pCcI*0|ORCvfb@9f%DtT{!6HmtMt z0#DIxkQysl=UDA5aYcz57g*=WuG_?hM>Wh}<$ZpuNYpK4|K`u{yY)};aU?l)eD6L^ zswK&zywHGm^6}GcrEDk8(Y%LClKV)Loya@t&bP9XtCZP?y;&FXbIcU#x8q#d zE?ru?gRi(xTPYlV6gXO-rVoT&S2F4;5|p4W+j_niNnVF&6?|G(yc-5uL)8j4%Wsqln#PMKL<>@rIQd)7JMu7h}E zv>InvXJP#qak9Av4LD~V@02Dkzo~(fo}LEh7m5M9c|Wtx<%9N!6_{Okopp9EzAVOa z25IKRvpV{tIF4R=1Hn1&b`_~Xq7Pp5pkAO`Ln$_i*@b-X(z|z%-ZR6ZLkE6F7NXRQ zGhKi75{6MjBnRr*OY^RtSHo2@HrL`)S@z)rJ*C~mF7n7760Ukk@AUrArEvFIceGTs z#1|9!4sHv!lb%fRW=0vgVNI;0VbtAh<{Wn@?VH$fp9e-gOMut(BC#ubk{k3>(kxWO zMcX{Fa4vm3`YsX6alcbEf!a&w5OGcrH7qU3(N#ARFI3?DTs0bbuT}{S$ltTL5Q&l- z#~dEB&ZqkPr_L*xA@tvMb`q+JnU%N`WSv{|ek9zPr-C!<{Q2|`VTDGGudK6QL2WUx zp$1yk`BQsavEEw^jYd3roC;rN;2>_uKsvrqexy-c(r zo_xJGxj^4{i@(XEd)kX0L5^oc-7a5jDEf*#p9t3)5_4nEY-;qk9b@f>+3##`|SITfE^JpLITvSW4_*uEI;!x#F~~LjA=mxUz^p2CE`I7`h%z3hb>Lx}5^=_wvzKYWP2+~JqQ z#6DMjsAJ>2e9u>W|HK!Eda_RrN)oMa@vh+e7-Ba~)Z|lx!?Rr_W3KqU4?X#KwhPsZ zMF;w*q*!sj+ptnhszJYc-qr0Mt`Zv+YB6?W5(>^2i1lNMV~{ghVMC^-p@N=eqP1x6`ldhM>cweOBTqdiUj*PQa#)--HG$>3gQc;f~F5VcUA{(L!VK zeRhuUZUDKgjbl)!2Za5_e(3RuzNnKAIUE*)aP43uth-&auT?z?9ftj<&VI3f)_JV( zQpm5S!W-7PWPOJ4cqRKx*7>5wRj3!Erl&IRNylM=6Zfr_#Lb>-MhX_SJ#d$Gp6RF- zgdZNL8OZ+mV7O59)Dza6?}l_p7v|jbLgp~yz0KwbZcn}Ovmfi6u|(L#x33HDkZJce z3-Pu5;K!P`tD*=KEc{V}=e%C~(}K$-X3z0Hv30#JTuo;FX?x;zjh_gY+XcXh_x7l7 zuY`9#56TKKTk6RJmX^i3-xe9xiQEGHH=zOutG<{;GS z6N9j#5Qi3b{IH-_G!9!lwx2{V?uT!glM%eN*PzPuW}|oNgn#qs-#+`Z&Lwki3Fm97 z@Sb(Pvv!!!o4eOk*7^GHj}FI^)jT_YW%lJc3>=_A80)o8jKrP?P>_ne6e77I+#mn)^b>v#pzxZ8&dF zZ8-0f6KUHG`ddntzH&jaVhPaU&^@lqR zr`U7G&(`6mcdp@rzbCX~6Ofu2ZTQWd+Sr=$c$3uMkdo+y*@t8C=yV;!issDIjETX+ zkwt~+=l#&vDH?k#rWXdcVLmK9v-*B8FMMAr3K>5mu1@BLK(lk(*NR+jx`rOk^ng>W}x06TkanIQL2ilM9WnXLzIIN&2oh=NY5Q zdg0R^9W^PD#)F=o_&O;8HC-Kzt6)m zVr$|^#cky*?)AP9-$}hO1!V6aPE3q_GGS(|ae*)&;Z4TLG z(C+dhCny@R&7BOv^a!%89Zk%1ec_Imk=WcU3d8=*qwiboKfUx{bw0M~oM1!F#y8ek zeX6mr!=Pd&4C|aT$l>68HR^8UzViHz!aaT(EN7kb%vKl-F2uM}xIda!!5Gn(Z$~J1 z1ebamW6A0A@Zc;{JHY58&|8T;p3|C{#y6wcWAF}Hp1s<*Cf*l!cyB+AHW}k`{P4wv z^N8lE(T|*>ulzH9{;!N1#*y>MpW8GpEtjuDZ4Q6lo>4{iQv$GuZ)>}C)#a>r0emyL z2Rv9qwwfA%!Q3}Rysj))ve44QlfDWCZ;dw!eBpeD-t{w&7zg(BhU%9dA2XI1Khpc6 zQW<)S9ZEKywD!c~hY3hI>tt*&lK%SCglaZ5GP>}0Ii3@T+)*zKgNf7b;hQ)+w!lzv zEqQ(Ph}?3<&ak6w5Hgl9%dOvr!r{y@Ja#b(9skXvFJPYEfA@6@A6*qP$tC!~I+tzi zC=B0EK0oVx;_Z2dJxkOW#yW3VH`Ku*T!WgqS~vJaog{xg+*^~wCg(VPKigmEYS zTQcN0djVd=j_n~QuQBY~ z^KFb0b+0|x6GCz{DxTWE`@_;##~Ot;0a(trb@vB+G%KC@$xal;{hdX3Wmt)q)EnR}?aFR3SeXk)Z{=!LFU)O@*E7^CC3)3Mg0 zaQt(_AaYB5t#qhrt{B>N@q|?=-qn}p8(vy_A@^AvV&4TBR^1^d?HcvlhuRxTE%d{r zXUxdSeNtHC8+BN{Vvs&}ZlP^aB(5>f%=X_r`c}-l`tLe#eD_4y%H8WP*7?GQ6d~oX z3O88iAEO2fRH3?K@mdwa$l5Ztt!N)3FhPxMexrw=sjI9uIK&C zJEvbswy@2Yy|D-PgD3KZW6bkS<6Q5tV5zWZAMXwR`*#N{7rIh|mc(;Dc6x!3-!K5( z>JmTcnpjNdcnvRH?@N!zRiz!`&U&M}Qyf|x9&O({i~c#0|6rc; z-q8E&UJQDC9aFgbcq9f;@7&?vJbJtDf8t2%JNy)uHdCS01J>%Gj3; zLEiYpy3KLzAjXr=e1`Sx+_{f9i9Vf+`BpA`I$FHWJ#`7!k}m*)c=>GCu(M?!>PSO%)#<;9k20=frNY zVt$byK5nDt&U}ctzljfQDkLHDNi*@pFHczZOGK*{KLxY19yk#~9b&H|f@K=BBvW*# zY%^c5eNBEE^OaU#^ArZ~&tp|QUSFsuyjQ%@;cy(%=!9@2)eoC0#^KqlpY{T|Op}>0 zectWlzEZ|W^di!eh?hNBK6*EGLGaRztU$ zZ(03DqSG1;9?t)ZlWZ^M6Vr&E!uw>ttJrO!Cl17O2VE^ue7M*PzPv+f@0l&`T~ACS zh;P}k6=J{{AI#*>PqO!j8$Z+YhqWqQ>Xdl1H2Y-YB+pyl7CR6>zmU%RR{u&YF3{rc zOzIc%eu_2Ovn^go%+S7^)QI=9Qox?)ad~OT>;QC~#_w8#(o*TkT4eFg@3i%aIF9&U zhilYOJU5D-3%s$aeG-mZ&lCHS8yp?RERv={;>%PIv|X)7Qf+&&?kIB7j_KglsHWKT zh6ffDCt&NVo5J{ad=o7b@cGC*!G4D~IyuKPU#+u{7VC%Lb#Z9lcaFn?+kx0L{GYwa zZ~CQIvyMZJsm8zaVYj#VbDuKeT6NJ?P~rRyVvi1$#n*RLSha_Bu(cM~9#NwLYujX? zv-oa_2Dz-sJzb30C6{vw&*6c^+2S{18hU>CSQLGdV~&bWM?5htTaUx$i^Rd*xr?WdbW5j5u~P^=F|reI zN#8?^R zt5|GWWcs_#ex3e2&ynLSMSTwy%rB8sm(oydep3ak3wci5i5p*RaYJmm& zt`v9N16xYT<@`8{^Pe5wQyN4pw`^7NI_5e{dIv2=)T1Br8#n39cY0{FB&Y63pj4fn z3`;u@cb%Rf`8NoJ3ul>-*=f@10RGI{Mm|fI?z_`hjTm617O7Ilbk_V6wQMc5k_Ywm z?tb)z>)%Hbt$fj8Rw7);Z}DX>RDKybEhj&U_4sy=rS3H^TM=J&^unu<1k^3a5@mY4 zH0~CU=tL*6XgE0}<>Fu?e-m)e56zo)~q>-4p%7=z${^XOaB zU**5w!OiRHi1FRX(>TRBYicJkf;*i9Ji~Ve`-xt%8Y-TdMMvg}EA!abv9_yQ>=W-& zCwPQ2!bID9ViV3#>JsKLJt-$yao;!N0e`Qb^(9a0AW|!Rr4Nn9v)#&oHa6K862GI#58rK`sSFq(VS9_trN zr=&o1s>09i(P}AaV<7f5ARpUtqco460nSZ$NA24vwIeTaYiaUEzAl%vg931EeiFT< zW=h>T*H5{Sh^WcFQrI0I45Zi1wUs@j{aN1RLvlYDSxss|oV?vMW+g1YD()o4*opf3 zDZl57iG@D&+>OPMF1^K$t%%2tp=W*CK4B|yq)N`wDBEM5!{hgnC?xKY^lu)0vmt-J zgEo2fMe8oq&L1Lg=RqH_`V|$LWb)kZm?WMnRHGStu-M`a;&1Ly$~5B}bnB`(g!jfE zo|)yd%1Tw2cw)*qWShP%N!V|%bl)KmWB7T!wmc+t zN)E)8>*TalJuBrr4a6|cChN&Z>f1U9@A-YXm2y++M$Dlezb`JTtCExxh(jlm&?Nn^ zRPmh_t{s>Gw{oRaiu|SP>^(s|+-W$0bga&Z&s4RP`o!+D+~ z?u$th@hI*An^l}GPA3L?_**o(OtTQjCkDZk7lp$4RfR|k@gQ(e~CZn@+_t>qr#!vhcOlWJYz z{n?25hMg}-v*~$Qt`~V14PQxfLjqA>L!YtGGMG#K!sy9K7+u*M-RbkJDyR)r6Y)=Ov_Xx9V&8=~4MliPWo*!=86_sCxVAdMWwjqxA92Lgh0W~-yh9P%# zI5uji!YZ&Yerd%SkT}NY0b!yQ z>zq1)y~MFiVi(@e*EnZgEq*SRTdg4voagFZZ7E{A2W}EW*lFw~)u7h()&O$Sj%cJ2 z+Ra4jh;~Z_d;Ku)QX*^;E=YT8YcYd!v7PFT z^fZCl-{cKW%dLoKMS=KD47ulaD>S@Lk8ZCd>Wy1q=ICJfPvia5%LcRP|KD{kF}n9% zVQUr)?P~5*x=4ueAt$*w3Hy5u#pj3+#3WOzyNCR#7opIz&R+W?FeQv0$g@+B+9(CK zSrMpuJB9qkRMc%0iFr>`kk=yy^DHA#BP|6b9Y*5KNM>H2rv^5?I#LdYp@ ze)O2NmSUhOwL@&aHyR_)M8KltpFH}6i+|#E;=4xTKx@u`E68ba(usbTRqz?io%Qs+ zqH=(o=MPEn@%%3Kq^_z0?}sWAo00qH0n>P9n|>c8wWM}Crw%jh{G+5k#OO-yC1OH_ zY^fUkb?5A1-bcrc5*Ct&zbFx(A0L-8zc7z1ClODy&!jXpGnyAO`$JzI^G*j~!+!Py zW9!0M2tvV+MC`5E9vl6Fk>tpGc!>kHP4Ra$x8Q)w z1Plxc#;`Lga*lqEM=F!xtfL%&QuGL-OtIkBAY8@PG4D`p&oSt2?teSJlMIwt@IbAB=V5+n^`! z2l+TNu)gslBKLJq^Cad!jzZsEA?VIKs>TB^v_2YwXx?2Xss*E;RS2wjo&$+BEX)r^ zDBsW}-BXc759Hl^yHER1K?1cT4xDY<_-10`>|kcKkiQx;3I2_pt z`ji#?%+CFjM}O1i&pNM*sw4U|RiP+{e3jdi#IsjbILUj->)KKA$^|vL9;DCqrAm_O zvoG_g?iZst!N$&_aLkRun7h~Gn3OU3Mk%%nu5RD zGBpIt%5pz)E&wxCp|}~EgzNn8QEs7_zlr`5<5OV1Ihg!0zI~600e=s`PVTB=r%!~% zZ*o8Al{fHecg(%#jp1vFU0kezTe+V2JT4x(gU=-g@}`1j$3a+pT2i&+%$OO6h276d z27Wi6*u~>q+hbDK!M^B|P7kGlt0eieKRs*X@coUWwA~Oy|Lqv;aL|d<+C*V@k4UHo z{F6t&c;cURwo})jKcwn!esX@Tba58v6qmZ3VY5z%Wp1g_lyCi+C1z6PJKT3meAixg zmj+hy#PnOtI~eCDJ*4(wWIFx6&SpuU$TcDf9^ITaNyR_tr}0}4 zOdOn^!OMd9cd(m*KtWDm#bv(B2 zdMOo=cWSnsy+`MLQa(NBhg;Cw^?Xm0#j z=Z&>1i&cr&?VCiru56kpbMD?+k+ZGgxLELvo=CIE^C>Zt)bBNT+8_xzK0T#F{JRxy zBle{YkVcX};K_U7RLmUd+C}DEv$nzU+oWpbgda39=lyh%)bb4R{9JO0%l(!#?$qXF z&};Ob73{tS;9;H~tHyOf%`AF{pXJZ?F0g1Cf+e=hS>QYWc@;gw$;UYHb}AAJ!r&Q@ zgh?)WXv>TU?K5&_ZWiDo&-uw?Jo9xHU{G=pq@(m#UpEsIR9e`0>k+;y78|JrFr)X^ zWWJBX_R>d)esdGQx4{GMQv#X8(eFu3jE^C&=0hyr)vbXBAL%9dg8r3zD`6NvBfC6i zIrTm&9WLvStbNR`_OBv&@jE!?eKgiFk6t%A5|`UV(pRvCVL5*De{6G;Yz?Xh?58hV`qD z6N%JZlat*vraMZSF^`p)L;KldkxkvYZ8>`Q(4Wq~e;Ags*R7a1i}?iMF#0B8!N?`J zW*?3W&Pulqu149_q3Cp)zD%u`!)G>kqsy6p@oFBjT!{PC(-R||j4Q;V+m2#ZMS=&e zaGo-dr{Ua9MCnnUIGDgp)1p@J8tsW{%pWyBX^mQ2sn3mIrfky&I6)rZ>{{`d(^HXN zIQqfKHWqvR? z|LtHb`s{&g`WQUl(H-4>dmx$IxzodXVx>fHOFeg03tFLYqc;l3P5PF$NSYr=|Af>? z3}qhuQC$FTwGYKi=F#gKQR}ob1f!Wp|9FTi-VFP5-(9Ku0bxK_6^0V;9e!u57~4jT zMn%*o585b7{^X>wr#d#`llWK9oUlC+enVPH&G>hy&bhU)(`acmIRnl+_}x4#5Yx}d2p z9Ag^lp{_6rQ@ERGx0&8(?c!knIT}t0^j@1a6As+bNo|r~vRa6S+>16MMzpQk5^Nb5 zg+TU-kMA!)(+v9gUuTY6rP&yAl=%w}<#`U~{VZCFQ(LH!PYj{Ur*N@Q zrNN~^>^B;267A{b)yt5Gan{eoBdz)N^`IZuwc65(6W$o3=;2f-NF!&`>yNrQ+tpfW zF88W^xq};6lqI?90}w$^_=+DkN}rYl!EUP#dyk)!>f8*$;seYgE&o+YX6{cVYL_$FC=qeJW{ZwB`Cj+o?;cYqCh|L#NRQl>MK8p8^m=sF@UC#EA%&5D zxYbOLh9kO2W0{E-N59JP#oIA{ffHoKt6d>y2$A&YtbfJagh*KSzr-$^Tp#$gIYn zlf;Pn^xUqkN1($p(XkSJ{EBqMA`glQR?MH`y`c$xE}jrWP;SiDxgIgY zTS||%N1$7G_9yB-l21t#CY;lws@_9tSD*aNCCp@Ro+9OW#UW6|d9d$H=_NUFg*+RD z^X5vI#>QeXF~i@5IZ~&h(Dp*8um$7)G;j)z)<)0=oYdga* zlpLg|d+kP5$~r38wxpV`;Fy{>>gvNK%BPcJ?`k|q#GJF@`X(-J#wA1 z4c}h+p?p(4F7{k$ICz2iHRMYq#T6Qs5xX$%WPZn}B7-+|yBczmGi^T^PBq|n{1mke zgQ^1X>ODjMIn9>@9iK5<9$;MUX11}vu%_yylEW#N+)5Enbv4aKm4_v zUs8WY8;|sj#fWai0XD=K&&`NJCo^jK?t~dfEeXe<3?0(ke2oiUg`f(txb#lrjPAtu zf*-{q>v~^f%8>xoHoKk9t(X1eiSC;9=#kee|w(^#>V8cD=q z?seE=+$(9YkQmO}4iAiZvhcOSe- z(_`h+$#T{KKiq7m$E1$SPK9U=43`X919m1YhP(Ggu zMJRKx%VsuK&X$fq&!5buN$#bD_Kw2zP<~%Z#ww>>Vz9I_wWi*Y%64Y5J($bPiy@Ph z>>}o5UZ$sd@-*ckG5FAt%;vM7s_fQBV#XKdSU{#4-wEt0~VzwdnpR2p!*Dk-rrY8-M4A zru(Di71kjb=!HB_&IOAz2FcgxKTwu9#;Gc)vd>|9hXy9%V%_EPlfK^Y_`;0WH^<~$ za=hPV@lCY8m_7fb`0i(>F8d$Pnm?7+K~WfJ$&Aj@R)AirxI(Pk9_sLfymZ6R1Oj?T?k)$&qN!`$uh2)|6Q<8o|8()r)JG>OLfXGl$s< zZyT8IPl`r2SL!Q2H#PNW9fcLVi<%X+GO49V%&f0N^6bv0fA4OStRdT8iNT7+)&VZZsF2!{;qdj|ETk-F;!$0&+`#IcWu5s zA25GOcd+$f(P>VYX=$)W0WSFTEKye5S?kM`z@*2)_nI2Y{P zZliQv#93es=aK0nlmUbNuzx81`L#Ob6?fT3+2gHC%~c%9i;Lqud};PpWf#4F!P?ds zcTVZ^Is_Bf=*a7Oubd^Wdx-sZ^RH&689yUX{}Z{&w;Gu~lAGD8mL8VtZA>S!qR_L1 zT6IS|lNGalmPG4NFvr0(HlNt!i3GHN+t1V<5vV;P0gEe-F?D$wfj0C!pOGA7suLE4 zYMInc_@fKpp4FWm;;`Cy8}_d_tbr*8>Cj?(CjeMyZiaz05S;8w*<~_exPC z$?tDJo59L{>NuM1q(*O5q+-|750*S*!|%;elJ1f>UX@<`%{M9Ccd;+xSrsdvR-UX4 z!lf-bL|MI2daMsY^OZU@>SJb#Foa?`V04|u}OG>dza#wX(ODIv=A!YmT`_v3NY zZHnp3{3w`S$HVFV98(MO<5V8;XxcT;RIgeLy6%j{shk|s)6>zYu8+dAda0(S>|0I~ zLlMVyHSHj0--gp8GvInyqGW{NGRC;zj$rZnc%V3`ixX4shQ$s<0Lr6aFEFoj+SN7fJ>f&dt8 zMTF@R@sQ8gW3ZvNk7*^d(QEL0-yG*+I+q=UuKyI6VZ7TdS}(r-fXBICQMPE6OvE-uN~iL;U}&bJq3V@)@4z zzQpTRZA+7-QfkyA?_xmby>j(>8cd%~4R4h%^3u*8ILp0WZp|jjrzqk`OA~SX=Ky6g z^)mNu6Vc&#q>{rO@zFDSj5NzpeC`t8;JdqV{1&D641bIvZ?I*rb4v4(0e`=7)mwj1 za_OyltB|>w2dbLZvuhD;++?;Z6pooX^3}ST<|c>X{wN*RwdiB2DuvOznD#H_4l$8)h1~?xhKkHoy%oVf-``|O?E3t=Q1oA8W3o(TX3Ez<^g33>v}jrY zGM4+H&DT9jM|xOw;l1f`t(($mXb3Wj+?jnE}uR80I;8 zjZ)4Y^#ZrgIBK7&tm;A@-3?|q<}6gA>BI0QMGxO*`;=rKf86S#N6+Cml-4Z+AiZPm z&%)oz&r;OU93;1`v8CzpG44$k>tGwy+O+*g2qJ^|zgzY&l^+@k*V^QBuIz34wloC4 z^$Dmw%E`2*bqKE9qmK2(Xw$DR!PrR7;ez8HriGokTiFx3=JHhTLX5UAZ6(MGvSKgLD|ckDR*(>Omp8sCPwVlVUPJG~(nuV~yK z_lExjH@QFWjXd(@`~!33^dG#dEvO}#c~)L#p}|S=D}3KpRysB1j=NgBeeP3cnlD+Vn3gg>f<4}f7bayo_dXXTJ;q+TuQdLu zWnL2Rfk$OciOi@Pc~S?HR~=?a2jfAW4sTAjF>NOP{CpU_0_xeB2D}PJ@#O@R^pZ?g z^q(BgGaNBskZCXXRTmf2hhfzylSkcPxRs5^wC3(6J-zgeeRx+)QJJn%cXoTGRdI!mtmf|&sr z=kQxerWZszVmF_=tW>@%rN?7M>YYl}S8Cj+mm|Gd51hVcd>Rss!FpG8U>?1Zd2OxE z|5@jwOZ{XU-W!HYa$oHh$WuyG7*&ft58I36#3~wi5i3|Z!b0(^>w$_LxPxxrUGbtW zzV7}+q)hQtoK|^3HIDalai(Hjjy#`F#GEIrQch8$+MIJ-@ry&skVgLK#GIPEN>7yf zXSK+w#H?6Dc~kKeax<8j5`Vgm=@557dwCD<-QCKR+nkxv9XZ#iJDc7t3_{3~1Z?PJ zZ#qqm!3nbj47coOisde&I3yl-dJQx6Z^0cO`JA!$N0^R~kMxSToLlK3rg@G5&`yj& zeRXeB1!{{zGop}b(cN_97d_H_Bk=A+2a_H3Chxz5V%POnrmGUM3Vz<(2GuiVzF{U# zS8{*1y;cSi>pRfb7uiX9N}CY@cvFfT#}`$UyIY7&)lyMUxZC(;d^9?oaK+D*dHZsU zV-frQ&pMlp3zy&WJU^XI9-z8F&ibap-a32}hu)Ac5P$x%DhY0{t1J2%9ynx|gg4cD zDKF^>fAA!Gyk$PhhFt2!yqIw?X}a?IHN9@ikSFkTwIcfaqTYJup^rVH+$^E54sjvT z_Nn4b-CuX&9vA(}n>KVLUyHa$tHrfV=GB;4oUTLgl4ho_<+<;+Aih`B&eU&iAUY=} z;K8_VrnltLeWjQ6r|+Wap-Ujvk;A!ZRbSJ)hXGg_ABWW!dz)?=wU{|578?%Pncmg) zr?GuB<__R{N^MsFIrn3ZTANh+ebM7Ad-NsEP1ou(TV`4)roL!m3i#xQ#^fl39<6Q? zxyKA5cjs;YTT0wze=KkAi`u28DdWop;8Ighw9oh=$EGmjBc6Uzq0Dl1jK+T3iGSY} z2LD)G=<(x)ucwg*9-1M4+@M0!+Vsq+yhl!5q{hspNl5W~C-=(KprsA> z%W^&C82LzJh>=>akd)@9Jh5&_BChQ6Q`GcEYx95^ntP`y&SS|*OXO_WW2N%>Fg5ax znMc2MztV{~o)aED^uQVEfNlJCsN$fiPbu z^OvYtr2bEx&o$^ThrD&iW7fI#G7s5q1%1^l>GQB9S9X}CMqAc-q~?&^AXWoE@{9Uy z{vxNO)1#n}*h2Su%H++|z&dfCRl#1dp+{)SUFK%4Rw?!!nU9>nJjauhl#%o3QCXk3 z(B^z4sFpwb3-)r$cPM*jY4I*p2eToklmfo*QPp(pSMMlQ*99PpbzZmPh4Q5V-yrt7 z*S~*J%&%&(dr&;)uP9@>yjM%_u{d-(UeVMmQH#*yu{c{&!DKaue8n{}*gy4`l2zFc zt}UY>t$(ZJ*Yd?Na1q9N5R!cO4b-(Y#kGdt@)3XSz6|IKMz9x>6esP zax8z4lP8Q@rF^>Wk1hjzv0%$^Wgzu3-yNx8xN4LqX7gR}SD_@u&)9=GDpflEQ|HF1 zu^9S4b*?+1i#+zFJ8rYi7ccgbZ|Bp`oORYe36^K1sd19`bF-)O=t0|$17k=I1?zO1BvWuF*IWgR8k8@VMw0skJSNN|B zQP$t}LusRq+{bCkaPnmKXqkmaU+6TC0F+eWy-|LXvVw2Tbb1ike%-C~sU85ESMk^} z{D8vbE>sy9k1Khnl&f=@Upy}kWz?7HS5KVkOf1^{xTI91Phh>>F<8;$xFY@H=POWC zdEcn?JYpO#cPRrEAA~63*c!c4nbF@D?H7i^^VBY-ZxFSC4&1f3TCX?;`m=us zfM1^}%1_R-+t*OLyR^MBsCxkO%BZ{Oy-4<0&Mfjw72f*yHVQ+dag}whk{#Y_*vwee z|DQUC=$pt9&)ji^b>4lgw)`nug$=B8qe0!}=otEXvCfeF!+X)`@ zNgx(Ic(dF(o){^47v;k*%5|Bqw1j=#@kS-`Li&;oW&fNLV5vBgZ)w3j;OzPx6^qT( zh3(eS)6+>Q*HMcoFX9XjeU&UJ0BtMqPL51c?q^dUF_S&Up$x^5*l*XD^doZ4Qu^|4 zf7CA?_s--hdE6Iea+kVh*CJ)}Ao}y4XO?ui0>y#4DldNtP@@U!9Co&;e6qg=;cfrYt@o7&_h&vb zxiM)L!7?=Di}oi6rhb-epGw^Xc^Vap*2*Uo7@@=Z%$yffFs+UmKiO7f%c ziw?KeR8+S9V5Xltv)GF2E1~s>@s{Sj-KD(}ml6Q=^aOgb+9}1n4;vN7BWgJms~OCc zcZ|pLwS$#nXYTvRvA^LnN@?GQ{ILtMs5WJ^GS!1ToRcy1N*JsZ-1Nm74`v*{6qMV< zxTcsgv&%$SGmn15s#t9QpE|F# zDc384&rRokKCBUt>h)%C--;* zbqd`V%0svtYB7%9Wo@^~?(gXZT9SaPHizYF+5iMhO~CQE^RnM7Elxd;$MV3NvK`NG zb&wad{)s%Jl@=|t;t*Nwy}W^$ZtYm-Q6(Sbkprl6IUj@N?oZ{6gX}GdwT*MTCeN5d zZQY$nY<0RId%7`0#6AMs(=W+&SNgI#Ut9ba-$Zcd%uefsB)E3-|m z$bS37ee(E?KC=IU0KBEIlly_o#?qIAFv^XTtxi$(JP)Vay{ z*Tyn;+;RA?`}sho@mM1HNUZaZEndb|W7L?&I;%Rn880!Pa}4Wz=YX&Ac@yTO?4-xV zIK9!ymYT=D5B7k-Nu*-Pn7`db6**{-9XRL1RhnmFY zGIzc*=H~mO>j)it*$OgFYO(cm0`@$sC7Zbf5LY2~5#LbWeTRPg&*JfQW(&F1NG(P> zkPFnLy`1-(bs$IUT(hpS*G+%CIva}?G2P^P*7PB{90R|*?PU8E%#kGSx$#+Jxf`*U zVro|FEUqUNL>f>Pe%}`_8`mKet+@f)3BHzKG742&&v2gyMI$P%4 zHom>#j{U52{+;2*j93-ySm%l_zZ&j3t1*am4xGHeklcXYbgh$6`h9ytp@j!pv(6#M zVhXP`^u%HAWbZwzZGWK?HPILK^!_U6a8yN4MSuDO#P~RvlRIHfT=cm0Du*K_zRWWF ztFO4}(3WpanzIg#H&qr!EaO{7Jh8e(OW_SQgWpq#3+?YITtBTv^C$6GU)f2>?xMwa z`b5pJnkZZ*clu#^9G*4~5@NP+w|y!WSA-~`$@S?8HYgM>MH?w^Tc*woetA6Z+= z&yi@+$W1sx9dRtV&IWf+VbozCuhS8X8(&bxF_pe^F@Kf=3nHT??}YeEmeel z~2D7wbqYcI?uK6FA?+k}KP4<~VWWP+zo8iiZ7~!D0*Y-e*$_ z-2P5K@iVy)2Vx@dUT_vW@l9NNI}G(RCx~PE`oTbMdggvtv8j=I#_>VeHPlgb{7HY0 zU;Z%FDlhJ$)}R+PAxjcc1rO$^Z)>eVOdm&wWqb!BxBQbwA9jU42X=qHgMH%87=ws8 z?PZ;}IMp(WK`K;Xos(9-EbL^j#+3r@twy*xj4aE%gI4r4ep*^s|3(AD_C!1ooQ0pC zsP#r7-YlCg%%tDKNbaTwkKZY*Y(?#!mmbrv+!K0xk~>OF!`7^_7`nw5rhFY5X0{Zs z*W}F7hgq>z9L1%>v}p1)0p}y##r$F|EaMVT?pL^2pLr-1i5G?LND;?B@rR2Iark>v z#TkkI=*Ru*o8&oS-y#0+=67|hd9JvTy5RArVvzhKOSIzqYaP$~Icc((ZSY1O&-2Kr zH1XmLZ+wl9K(!iE#jc6;rGFQO1p{)#LR&v%S%#wX(_FEViMraEL1>gbMVwzh01N1Y zU~4amuAP|WL~hN^oPEMb;xJz9cm3Z^b-3XjjpkP-{+&mEfSHin{-@5%AD=aTzvzzL zth2+42F7lFDtslrvFp8!VUVpFt6AqM&ea@de`O9Y>+IG2g2S@=8Z=>@{72N2 z60e)oEKCS1_QWURqGygR5}d1g!{EUliu zCn+)lR+jPN%`rZx`<3}g5mUwPP3Vi>hP?m1Gek$$xz~mujL%OM&vpxdS)dknzP&^} zefy6x^X&5Iy+UA*5cHg;!KmMv4)e9qxLiE(?>zcPugMYnpE{Rs&B5lpJ9e_pZvA^3 z=XugAiFID!ebP{-y_y_Na?2Ok8P>j5V+iZ~7bjuiWesx37wuQ7x`Xzz2abw~Sp92` z!`7>w*mqiwN_n>(R(zrthlc!(OIAWs8|IRK(QzN_D3lKJMVGnc71W6kG7kGe>8V5N z{cNG&r#~j&PC&((8-(>d!{w>tJKfSG)Fv14ZV^2Ms+<+tOk*xyV`{GF-xgNaCSTnz z4)YGb66#&^L(ckGoSFDZ=upoOn|H*Ze9f1_eZ3EgCPt&xgWJL~Yj3zw+p-7O#nM$CnX*SE81-MJUGPRuWtC-War=_j6n+@vL(IEZOUHN|1$% z8G-28m-qX*-a^KR5Y(EYfpo5(!=pRh{JCEMHBo-_5D2xH6tc zGIgdaPO*PppK5%`89YtJx9@DW@w|l(%5%q;(_@WsGw;msIm}~iWipOk#+*Al?g!Uj zH-0bjN7d`RD}KB)9_1c?zCZPn*`?)AjkKtGjygWKiZVv?&9{n&nXQE!a>Ea1?s2%t z+3H%ZA4U{#PARD)zc|J@nmbX)snz6*#A(qd8fU%B%WHR~kinZ7e#qK0DU)ss;aCcPUt!%2HBk}D2rBmBeP*NcFZr4o6*be2{k9?txMz(e=jVp9>HC^nc{lW z8w+y7kXN^fl6}b+7rCeGBez$CjsE|~)pf_!+`fM*36YVJq9ikWrOvtU%br;Yp?Ow& zY40d0vWhaZl_;{Sb3Pw4+1c5dMKZES{NBEv@9X>cJ%627uk)mHo%?g$*LV*KHw7>5 zKzHGF06Y|~B9BaLAiRBxS#E}cDsH7}_O9}yDh;0VG6!}0B_SlAHupb%^s8Eh)1&|A zlkTFeqgnD?No%)5pC_wA-Qk>^V!*{-W?o;T3x65!qF7RFH_>P}0A~=qvujhhCNK|v zn&?w@*eW$Uzz^EqAKGPClQmDF|LhN(=f3w_G_}Ft+V{d-G*-}jX^Z^}cKxFpKGb+a z%Y_X@PS({DY_7l~PaR2RB*9h) zg1*F)<>6$~$w6oV9o=7N!bq$?OLzvJmkN4`2R{rKw%^0PcoaVKyBi@sj)fl^RfM}Ha>pDGBL!-Tbj7X0N+LZ$~W+bhwd z4%sQx$4nz@p*uaPSt=x)1y&R~o*}b332XKI$k+vW9#BV1ZL)}?M=;uQP{U90IM1JUDN6UupcdfA>Z0k zXd90i`OYZnX4_M6L0|KcN0G;gQ9>It;HQwE>(;vpC+;YyDDwAQG)joV&hflKBpDrF zEDTttBzx=uFR#cD^w%lrbGr!YDrO1KCM&5p2)@ovS;DE=3i3z|qc!7K2oBjYsu~+g zce=z2J$zB~KMAIJmchasA2(VI46~(2l5p&}4EoCR;Ni4YxB>0cD*phouPzbFdbpE$ zlpjrud@Yz2V}5JlLvGvk#D^mG5%##Vomz;6;BB?E0oHB4j_3zJUKyU5-}jeoEp!ki zf8)MJpKGFdUkMMX0&t4=w9#y>l+#LkaJSox&`7(27Xu8~=ceJBQp9ZrID>sgtkaCB zbfqvu@ZB~SYrO72|9Mvoy>zV5=<2|85H()cKpmk5`l!OKXv%-oUU>ZkKFF9UeY!JH zFkXVs4vdiBxhcZqF><W3E56^}q2L+q5JG0iY5ZMqT2u0bx_AY6JwcSd^s-Q{fkyiA zKnfaFCrH7cU3%P~PM4a9$F+Qc^#a#!?r?F^^FXS>tlY^*31HhpQxA9X6B)GZGTbyfCj;N5jUL=AO>+%-VBc2EpGyvF zEKT6kJt7wTum_rorf$^baSX}c>IfGw_vi<#WNMm;aAYa!5a+AscnYi-uA3Is1dqcqMW*zKdOMI^v8XC z{1fy4#yMb1ON~VXaAX8{h}79=Mwlw788EtwSI23zz>7KC9`n*J*_tlf+{oq>JTD$! z(Kt+VqnUo-oaX(~+#lgaNk-rr&u=Fvly39_9Gv~V1_~F8+~{p6@TncA3d6dAN7fUZ ztUQ0=;t?5@J^?P;G({LOS5Ed@uunAKAdG>2_!0DvHs%FFFgR#s*pC}2N`)=Q(XZ(O zC%NE}V2*i(+v6y@lKovch8gC4V3taX8jJPN?+n1qq;g|hal;Pualj-T?`I(fVU8Dy zx$BVQy~PwaPjI_|!#Unx%pHSXz5smr5KA%cpa*RN-eN*}J2C1y_9^GW>DXXBQFFna zb_3U*psOu*Z;V=FT?i$tXenO*?oBJe=iGI#hqxy+fFd6N=UTs=*zrLqMHl|@MmI}~ zqutO-_#N~A#(Cm^)|$sHp^J42o-%e5H8C~{Y7DM!;i09P8^84-`$OMpdy!^rnH&9l z8cS2ZztrqVbOV+Q`r&;H1Z9*P4W1H9DNB0_HP~m(YzWPVr(=buuiS`E09zR5E{Jx} zWS)fXi*J@&>U=SpyWPRut1@9IX;QKYc8%?9<9~WjL&L#VR?>%x`$b?38 zJoe^Bb3O=zz%9BG3@!aQJ+XDPJ3U3e*&wv7sKV~!9rll>Lb{3>Ej(%O^l19Ec(Aza z1ZGncft}7DCE8&IctjdaKc-F^!v=QN z;&@=TtIwgHoNX?)AL&KeUBju%j4UE0p9HG`6`JplVYP&}Z?-FG2 z5XZc_*9t*bOHOw;$Izl}+k|uJ(8inxoNe||AqHGp3HD!C{4NU_*ypZ7&e=M+N*H%k zNh5&Y^Vm{fv_bB@_8nMI&*tI9`p*YA64`dPY#104c_zO0&VEKfn1wHEs&ACA2&2n}FBs6)27x>_gY_d?h{%6-R~wKOP6|wPIg! z3}zbxftAwooFcAj>_gcjBI)AEKH|i?KD4TNIKBGWTx`C=pK|O%fYHAx)Fc5no$!Za z_09>t4Y&ONI?ugVw$=3Q3+zxCH1~$6;J*nT#5(Ai=1sD--u);mz*CrkBuhJrqkj)#HRZ1L$_n2iJarmr&;@BmJr1Syv|s8=)5$ zXdX*$*VYQH2g>OK@Q_>TZrl;3HHOalTAcHW_rhG{ zXOE;9vW;mdj>=S#X=Dt28PrC66yQ!F$V*N8brlolKr=rohQ!fU;&$v-1}_HJfQ=Uw zL%nDszSBMX=ZbwgdeaWnq9x7zMWd!ZWO6!&j-87a=T!U9oMU*;yCktK_SXaP|9+UZ zNX$9qOH?n0ifbdpVa2{Q?NJo9%NQrVDfNZ#UIe8NZXpK1OMNBqA(syw5X_)CdN$~f z=Ef9gHPsvZH?OVThc=p@OhtEYB0s$L*9=Nl(2s0rkDt%ejMtaL&jNaYM=CX+aVKg< zpsx08Dd-u3H_;OB2_GN~HyS9E558l(PqUGWz z^dMQ_!fc367QKu8Xwnb#xd{$p4`?7vFp8q@XPb%T*ef>0uHjgDrZDIzaMZp2X!V2+ z1U}K>Z=I9cdxn}Aa7EwWi-WgKsAl0N1x+{vF5%FFnnwN5(_!wht>Ud_N*Fv)T;Ve~ zrk${Bn2fB!wYOewEu5Yvqk)+3-L-QR@=+U~eFy%6UA*82%)j2%STdQKE|glqy8&lj zIUrlumj@lW4VVG8RSPKt737nIJ#Wve!sinT(hh+hTIvg7vI^S89wr0lcNK%Cdz1N5?1tQe#R1OHHNxNa;BKP0EW#Icbu7hxoT4?fSs{Z5QxaU@crt=Z_vz)-L@YfN|VLLg^+60{tpHG@kSu#2w z1D)sV#==8y=|x2-6I zKxe4|H2312#XI2k?d=4O?#F>*P$KkKB{&<(1hG#xxL1?#cOFj_{df71(dggUl@+4d z5PzBuEuij|Nuu^Ze=?p3ypYj&@u|#@8kR(pi*c3k5;N3f9RZ@Hi@Ku&-*-8g5Num${}vCv5AyCy-<8z-l(xI@>88N!?bIpyK} zUpL>v<5kYy3C$ z2F}I1zx}Q9c4=##1Ok)uCXQ_Ef;AhSV`hjP($@X3h6B?TUy7V=^id0&D8Kfc$I>#7xE&@W(dajseggo$(W9C;Vv(`p&==7B*@y4q zmV=nl%n$u9^a(?oigzFSP>l`D-7Q8%KR>`@;-r`6X`O=JRzaiEf1l>oLG1ewbIZUQ&Hkoxntlbi=mBkn zYTy?(oPl1)-XX&KCUR1U$SvGKs6&5OdKB@0A1O53FQ;<{fIAIbE|hjc&x^mgTdS?Y z;2p^Sd*LhLb4YkJL`h|M9g%ugFuVxt%6`=CNe_fCK`I)Do~m`g2O+34Ja*AT?cLWv z?DPP4AO78%;ud0$?H<$%akKL7C{_h|lGPJ@*VimXec-Dne}txVGaJ#2yy>(KyvR{| ze6)d%fk8ZJ7R?q*#^X#H#naDX4{_p1KiUADnYv59;+h?Pv=u)OTkb0Qf*aWW2Yh4# z`--D)`A|l199_PASNMfKCAlz`mTyiFUTFJKWs6ukY0*enQx-(aR{rsXT?Z^i7-q%) zjNN&CqAf#MxRkLVIk^} zE%+`hj`tG!43X2K=g$=~sNY@P|3a(A-PiYGn4Z$h1^ z2PHR*rw!Be#7C7LRN6G2;(oLe_h28b-5Od)6U@X*(1IS(A)ef)^%f%*f^*b0p1k@< z#GLs)w68Dx)~}2gyQcb*k##)v9zR`d3A}VYj@Uk!DxNp@qc=n2>Ek17F%Nyl5_7!g zl#XcU1CMolk7kc{2*a(s=~Fa(lN-4U*M1-_|aGBkJA|R#QwcrJU!gEMl<@IoQ~CprVzWNv6v>Or}(^s7ibAz2Y_RQ za}u?-qcG1|jyZQcZ4Z?Q>$Bk z;-#*MRFT;)+y%RvXwG9MKd%lwV6}tB4R{b2oU0PobWMYI=u^JN(e>8FnpJ{~T78Zq zy6{B9Z^{1SrQZ9xt`N`+v%Xqj^Ask6fLS_!i<)HT0O95(Xh$IL-3E?mCw6l|crNN< z+=Oq}{^Y1@Ln8%JC`pCqV%z5w;kgbpQgD7oIb{lWu(xgU2>P*ecL08nMXs}NB@BP+OIE;*KeJ5Nbc2rT!TGo&@ZT!bm@QE!{5#Gqr(7s*42|)t zi0$bQJJsvnVZVSJa%`QhMw2C{Tc4mC+}K)k7rkNU_wWd7S$V)(jKn)Btf?*`=N^(i+}^6_^{!41~p~ znNQ!xoNAD%uxFZ*yb-tZ+`huRckn&A{aYJqn6P}kiX3m@E-1AVxE=Ha5X0qbm4a&< z;BS$i6^aPK6FZl4SK%pOu}J87(vu<(+e)i6!C*hMi!Y4(l9Ycd8GaC;Ok~Gfy;BomoK7p$>OF4EW zh)G4g9hyb=QR7{Le~|Q$W&!5RHHgogAtjngQefQhx}rh3W*s!9ew>Gn=&6^Q2jDxn z;O8&WerjIkdQvrBTb*wt7yzSn0k11>8w!@dtLx+alRBFS%`KtjcoKbXV`HH;v{+l> zzV5L_U+9aT(PlNCBk3*8;WeH#T#1|P);?3vL)=HF+xL^K zUn-~dc-~JfHIVeXj@{pLJa_lCCB~TJ+2Tz0dZQ(2xgWk5cc9-mPfs%bnT(8a-jc?( zl&GX~np1{acbuu@8=ea*eBNuNeI#qa>l8~-8z_cJL}2jlorcHpqv?`UxEBiX*%Lc@ zN{*H)$pO8RwO+jBWPpl}9Y?+Gm@3%{%vd#EpG#jWX;bA++IYW9akgXyW}6N0d%9O1 zmb_XCtRrd?KH!W*_FHQg|5m?^w&zPu;#ME`PoD?a<~ zlM)kfA}$2uULKV$8FkcyhW5d~t3O3D6+5iQx1slPx{GA%a4-6r3?A$7rjq@rz4L}b z_xNp!jZR?@efadpkAB7^)Y>=xt~c&A50Fq=I`MK|#J*Wxp5Jg~9%@t(<-Z?kgrgFW#7MjF?!p!FVM2%YAxzlduPM`!oZd56;?{B%Gy^*G#SNNr5A9 zZU^jTb;rP!e;!MlLSxv)H}3Q{I+kkoyRx5F(CcU)3timdti0TpDuI79^*<%GIT}R4 zZh!pfJuIR3FzD|%pE`6t^ZTZjwbYE{^(7r zkuxR9(^+1kjAC$BQ!L`x&P@Cq=j66;277u2{-pSf<0t1cj-Dk2aZp;FVWXqLF~qa! zH|P=Djv8k6UgWx&KbS|Tf-djI8FSF*ed;SIa~JeBp}E~q;`<#joaZbDmh}ss`5DdlffDq{IJbF? z@3Z$y!M`woM$nDx%*E1+PHe)=>gf??blH~nXJHNXsbUPIm9V>Me4 zE+ZwL$NjSovePNxdgGjEf4|N~9FQ9_iD#VUb_LfBRucs$Flet6+D~py*TdK!!vB(!aWO^7U~Tx?Dv2B(a!~UC#LG}eo%6; zK6|ai&haDq*|Xi4>O8nS=t(=YQn6ChW|_#n<9lbYW4mN@4LP<(EM{LYN9u`lyW92& zTNnj@sDp8I#zB|&#Qo@r^H%Z6n78?c9RcE*mpp){&yv&kwa}9{p1>`DThLpD+T*y4 zud-FpQrzhSS48uQ>%c^$Lf@-w319A~q?UMX(RdwSiqFoLqG#9L#gk4#rxfSV{O(ac zc7Z!>TMeA{*0Wp(7_fKvUY=Ln=Du3MQR925&UnlNd%$aZ3G(*Hhukt3{){p_BYn^D zdEWSc+n`RP&Afb#l1^`i&QjYT9t>@8E98X7=SJ~vOi86nVyM;QQ9KX$kj2;wbXqu) zuW9T>d*?^fw+~(UGVt1#1OM}O$QGv93V*yMQDg%@`bpUTw`PCGxm$zQ?3x>}*0}p> zM~-41z(Nkhedj!F5!>M+C-n{V%LWB3F-t~WOE3%CcAx3Hz>gcx=IU{}e7_Gg0}5lBb|?0@$Oxot%CkM@~ZXX zH@rJA&$f%Y=n2%f*5Ml$(2ui4`1L<(Ukhqn>QVbJJ&y&#=P|4Y0%zidOwOD znU3PiGJWaUbnwLr53!lR;IycUq%ZKJ|E)1O7yO!k*Bc$eyRw~5Dw4j(v)0>*`QY>R zN1f*Ld<}D)A*V9r;g^$3*^4w8{hnhCc=wI{o;goKjx928$M-tnJa5LcU^s}sNrGoh zI%cF(r}1+5p|?s#+@AUK1oZ3yh*iq_MSQ|$Ih_hcJ#cgluf*fnFJd?GdoMG4 zVKCo`UQD9`6HzquOak9@-IJ30Mv>p`nY@1h@CEQ} zsx>;oYUe>~SNg|~KGHOrI^O?#UN>>z5avExMNd#;T-!X4-9D_KeigXu?`E?&)WEk< za}L+J2R~E95WSN1<3_wQc$&F8k<&(Z<6W_5nUxVo7u${D`$DjDS%h3IQ}Ht=;H?>n zbJZ@9YvWFAjClUIw3@3HgLB{xO=)=!U!tcVjVtQd7sb2=SlPokdy_)T_+a>s$>*Z} z>HM4*oP^g5em<;C9nV1h8R&x9+K@(M2OYu_c+cjw&FD)R_z}Z#&O7MSf^W+I^a~fY z>i8rlXzXLAQ}+?MVyuiB;(khhl*I!q+-MqRo1M)P`EuY=x@v$e`M!|X;T{)}V|#pE z&R+u~ybw!WXXT(9~1^t8D$Q3`wykbWqWwfRM zy+a2>-gStKp5p%cE)L|4Ie0+Gfn{Iq`7XH(at^p_%EI{cy)v4NbLeEbj6cwY=MnCm z`u1CRc@XZ_S*V?Y4)K_`z`Wt?oz6PPLxZ5TI}tU{n+jf_huUL2{1=vd;TLk0G<5>} z@4D-eEqGhK#-XlQXh5Y_z#R4m?#IV~x(6!B`Wy79&+1SCa6Z#Bq0>0$4quh+M(Uq2 zv^je>S9NwJ*XhtKHB9C2uei{S&8P=fB=KkWfvp19Kq{tjqr*5$z=~8QuIKf4!2<}| z2w@X8^7_9z@Wtfup(MHOv4VBdB?UME2S&h~lpP@uS~g7f#VW zf6w`Q9GS|FOovz98|1f>DXav(C#`Y!wdfM=v;Vdf?exaL; zz9ILv-_CeCyreCVGvAzb<#Uiv#`)vBC||&5t;d~+vsXDdgHOWq_;MQh+@-nvxFa}* zW6+P(iu}VZIYn{YQ!zLB5#Y5?u#M1jY<|-pdj2<{s`se&8qx$t$^HnKLy^ zj;0&23;FBrE>wOO_mpZSUvR~hqQ^(k1NjF2Zmo=_ArGAK+R7V6D9FBZB)#60#Uqh_ za`!|~*!?74fmur80K{4B#3ytW`+wULZ!e&6F- zqj}Q~(C0_KEnDx&r{ipI#+|;qaWXGLuI`T5J{Ylq^SgM@2+Wig6>!VZa?(c(t!vKk zazRe>dSOqr;UOP040DgJab%zWh09QTcp;uaa~hJJ3A|Sf(T~(Lp%W|M%Zc8>gBsG9 z-l!Fq!7pHKH9v(j`S2TdvbIHBk_tZ~;8$JFuHxGRo#-04qP_AHxaTe>a?wDOa9k=6 zHE^LsU}j1tWb#|PT~QN7Qm@yWc&1E7{Xa!OD|##U9;6_7Tm;1%Wbgu0;2EIlVf@3D zKgK;P2aljEt&)}0_n{5KO{kUioUtLc@<^vG7p@%qSqQ=0kYKF-LzIFuol16bv zQ=alys4Et?#NROe2Tup?sH-0C-_JT^fgbAoBkWjxwW&2U|L5S`Hb{KMwfD)W3HBQ8 zbv67{Ch+jXVra$r)%=y=Z*l5fKLiSz9UoMmmMun;^Kv50eZQWP6kg)@UV zXWqj{0(In zxB+S~u@P#pws-jKcJB1+CA5R)-{li}qb@?t;GBMeFUNTsivIS&vt9f!ccWDSF=Ugq zh%ayELff*UN$lprM|E+gr>GN-o|(jL);iPLuaUsa&ERK$xlotk&`WWc#j}AUy^;W4 zbI@d7c@J|)uGlr40} z3g<198X-R~DEl9lpb)xX|E}vg-LYZSi&ZoqaXz)zjt#k!D0;Q3Gf#XAj~JaOnzo=5k2Zj}(cnnZEj8nVfX{p{i=du++VaJ>WaP3UoRl$I ze5(Y1GdPJCo1SJWcr;Jd4x_@#1eQL+gL=TryYb$p?2|e2a~Ei*ob4<9XdXmi_x=}K z+n;~ynQxMGXFZpzXd&XfkoRW0aldpzoHv}C%@*g#Nei`{=ciucm`^QQMcHW%QD*Q6;96v9by80XIgR?B@bQ1 z(odnD*&9kHzYJjhgV7Tm51|)X8tDaN9}3Y_ z*vBExn#E06CgwQ<5$8_RyRz-r!}dm;YicI4igwslA2LJ8*r1 zG4LMWOn8TnD$+58=IzAZ{BQ*{*$i<1hDi8%@Y(h1VZNj@g8SRzECJuL&V%zxD|h-D z2~DA0y}8d&C566mP(^1=*nbeg| zf;$j&bR)ZgIGfIlp!GLbut6m<+Bg^5yYBu>uLXG1u3mbH=7X~a4D>S*@C4%*;|^B6rP)7ppgKN~Zj zMhR@THU3W2Z^6n{Y!hZv{ZL~JU%8XrS*S$6g_&elAuFGP{-^_fPx?g`4g7pc8}yZ` z$Lv;n51Nd#eYf*RR&@cj|_Eqf2%bJJS@n2w=U2 zemlWz{ZOlqhHjzT2DaT1ybqUX>XsM9Rynv*BbO+OI&05J&~%p)Hu~r<|7Ag;DXj8`6b45EFSQd@B}9GqDS{2UqTOtbx=F8aPvC z22<{su9CON&yBzS4^yXa^mm*cGe1kW0`IyEajxgTOWGZK(piY}xx+i8cQEr=h&WGn zIwbv!TKWs(JjC;&^dVwCVIgWT$xCT#Pt2Oo^G0@Sz*^(|`g3reL)x&Fvw#&J3p~cn z?o9F#9!ys7*&HNg`}Zj6eNW7bGN!VjQ7YPE7Ds_Um8{+zcY1(a-NYf9`Azkp`H1;# zuVnVz$dg=}!e>ykl-Zej(yc1sj^a|8E$*X6==J8mSilnUu($0DjGUPhOTZrCr6Ptp z{OreE9=p+H%zW0FH)SCQ(T^;MB1`EDskqveT)@kSvoDjrgFfxMFyQ|yilkybc5r^- z)U9=fbWROCq~<_>yI_vAC1y>gvQT-47FP@Ssl%^(ZEY+ znBo7<^9lRE_?8}x~Y^OLlx(r+>7@6ekJaB`K#!av3uz3{}9LDJjk@1~=t3(QND&TS1$mkstB zn^#DWmnmseZ@f<3C{08C_N_B&6{p?O%Sq5N?uhyPmqKYi=E+-;PjcMPNGrev*@b*E z?%74@BoFAGy@yBMi1X4-dpyV_ANr8y8fo7S?&OBO#*wH^QmrKls*D5QymO3n7GbA` zzHf;2SZUNpR}ywa(L3`_(tC$pDP}$NT0NRbdxEPnVRZx*nSPQq*eavei^J*Rm*bKx z@Ex!TLTwzmSh9Wz_<|wO^l-M6?9m7IX(_Z*c4XN|wSB<5{8MA>GQzyhE{InB<42#Q z{yWa@m##{!wqRa|IFHylQrf5k@EeHp0jp;cJIsn7BF>(}mPpzISCET1pWb6EX*2=- zMH2Rj2|+fJmB8R(c9H)rt#HCu%=R5I-z(TxRIyY+?I&Vyp4zV15c9E6Dc)}~qj-8P z_EY`PcMFS(3rbO!c0-*!YkTpVz1T^aBZp@nEB=}9L5DlxJR9CE)=PpOkqK(cH8sV{ zvJmq+_>eyTP<-wMG^UDyM-8nhHg$tO32Kkxbytc#Q8zkf#L)bN{Nk3uGIA`Arj2)& z7e}>+-_IH7t1JmDUUAlyb_>uToo`=!+XFnZ!U*imd2xOC*R0$dPMb1Jil1D9#>ToZ z+A{uKQ61{fuj@l8>cZ}#RyrQ!AcWAB9LJ*AI$&ll1Vf*;UeQgQWCQV8qJ0W{i7r5q6*x(IWeSLvr2t)0eYEh(X{-i zpL!u?NAAy~sPM-Kb(4#(GysqR-F)JH$Kb)3*e^K1!IDBDH z*R>g*S8Nxeq<+vqcogGa+~5bEJFQUa{z1F=&1Y|tScK4+6+T7520=6tTD`UVpBMg) z>y&qY$N5$7lhThnQM)3}KZi7tO1mp53voU?_=8PPU^^M&9QmYIaizPQybMD2SH}otYz7?or z&}&!@#V%~aIkh|RpYi>%SIT;#*8YNdW*>aNjqB70z(GEQGw)p4NYe?r5O0xZ=1gg> zY503Tf*O1Bz~-8ttvtycoIA~yh8n#PVEdK8T?bXF?J;MIg{IJ>k|K4mKjs6_E&L)` zt&V7eJgf~YoN18y;t5x}st2v<+f&r5ph46MygB`{LFyLRS-7@@rizz=+5mI%q58VABWzq?T3{`yHRUM4+O(!(eOY1ur>w% z%hkW*KB?;|X~HgGfe`1_cUww_^j6Yd#Cf)NFUcmt$BhH>uGjLsvP?M~!y`x@=`)-vrFnd<7)qxer$#_q0-WPS* zZOkN*w=<4@RyWs%-XLm^LpLhbb(lpnV1VwNJf&WW`Re48@Lkf{q+XAC%kFQ{^rkje z{p-Ce%{7arr{|`sM}lXXgc#gMu-Ku-n|d}5CA(g0iW0TqM*)qbF8}z^2PFQl zH~byv>AvTs_jbb*1aUU$IY@fCKR9lP^UNt4Nno9vHX+VVSNloEU?wKnj9PkYt#w5# zyns{iU8wdKZ7q}2?qKBhcf*UfjRY4!h90N>%HrH7n3LNB@8KmBw_TsGlcHkTwF2?tm@cV=`OXC>Y+F zsH-c-dP=X)a;JNUXYGbaDTI7!CVpO_N|J7!34JZ(_R$fk(leEw=p&J%)Tz>~z`zVZ zZn>zFBt4S>y@J=!YufK4ZM+hk@mS394%tXM7Ghs>9W&<=eQDoyZnV<`Iw93pB^CM~ejTw?B4%k^h8=)Yeg~TxvyQDASl$XBQ z=FxQ2qC>)I?!A&?mrI3~&w*7y%(vOQ7m1(dQ5T%^zW?~qAG7~^j#NJE zwe%G*Y+DfL3-Q~fIo3*gj5s&$yhYl(k%DxJaIan5EA6ucGome+Y3P?o6Vi~M7o(SP zuaGXQ0yZNoj^@ehq-$Li^hO2TROe=FlQ#AsvoWKa)sg)?qNGz(F_-Swm%YWz>LlV; zo;{4&g9BJM;Ww_^j>%;n6pVZ>ucu_S?w*w3fIi(kkliWwq(+zljx-Enqr)&`M{Y4% zhJg64>_RG&sV*7x{%LD(&>yQO&*#}(LyU@CM|4Z7izZCVkA4Vdr2n2H&FI;H zy}{n6XAO4K;SZ(G*n!@QWNXV-J~=?kJ*gkQyXlke zvK_cLml@(dwG&yl1k4}S!$&o94f_Cm)GgqG4ovZ5Q*J=BVR8(eSR-Lx4P8lrTH2|X zF^d}NN=GnXdiYC^?H}YuvxY=bwaXJ}&}12XM*ngsWS8_CW|ca}p<|<~l%7Gow9*2+ z{!A_DB*Z!R82nmt$4lZ6X9IZL%q|Zrobz%Xt%ZI+t&Dah`0Y$L2wQtY;-Y zmr$RnaGqb5;@tK$VS|6k$t)ZDYae1oF>*SD8pE?l#c~!vTf-ak4N7KN=w+(xus>~_ z#WKbz$d|{F>*|B7G3Kk*c*Yx)ooCI_Pc=Y4GWE(677q+VMhE1FH9wf;1n6twwVzHC zepL#sB;?*vTJ3n`NO(YF?lf_|Ik)}*ZwK6)@4t5CyYJ#`_kxa7N@t$>4*D3M;VEX{ zhI?7MlO5*Lu2;XZTz@=+@WtqJ<21WDKt@e_#!#%?dY1ng9DjG{_jZkB+Q(d}@mhEU zT%5rU2D(xBu}I2LS}_szb6O?*uq^c1$WmZ3b)fap?u7JNu##eJ!pV5CN;>|#I~hPz z#j42}$(c9a6ptCm^to+pdLeH_^DsKL;g27Er`dm>=UWq+Fn{2>+dYaSn|rO;9_%k} z;S4V|maqqiVXrjcC7yXPUF>A>8f0#@#Ug>2!uY_%0{k zCcqv$XA$R6BSd5Or9!RM{>i6VpjS*+D< z=vs$H(jM~^))H8Vg2)K6CkK{msGxX%_%Us3#|G`jc}BfqKe75bDImOH=gx?&e%VG^t;ig|NA_f^=-!Dx2mYY-8kx*(}f+yyl!hguq)eV zGb7CE??+?D@o_P8Faibxchl`*yV(!};G8>Qm)Gnf>pK}7L(DCkcX`X^BeyssZi?BB zc_C_#bw}Z8>Dz%9)+k851>7jt{=D~5CFQ1pYtU;9pM<$e;*wZuk~NnPSp;p*rLoB4 zf!r?=IV2Nvp-l-~3t9nsx!~9?O66DJ!}AUE=h&PTJPO!v(_OKYv1A$FiruIRb=|Yc ziG1x7==NZT)%mtFuYz7jS>G7axjTSgTPUaK3GnQ*YQ_WS!$Z>vIyPsYv)iFET8f#{ zon0r{0O%+D-lteC+{^|=DrgMq=lm2EJBA*1;j)l%xNeIn9m@I8+;zOsq zqLyo_lB{VJggICUW&h(xZx0=xf5+J*zd4(^3jHtcKJnlX)(AYHF}Uxpb_io>(6Jos zj{4#9Cg%DAyzIWfuGp0@UChH91K+zX={4&H4n_Vs=oNE)ZsUzw8nc}y+?-!TO&E!} z<#q>aK061y4<|g=xzqSrJcIYg#ggF&Z~oH(xN8P({__RAd>nALQeanRui!teJ!sHq z%$av@4=j+=O>g+N4CulO$I8i45lQdHHR9uu zE9zTCkaed@=3J|wE%0MnJ~)>(#QxMcD3msBb6_6cc9u#6 zcwzWz2UAnyv;XN+dM^08eqOw?CCfw&P;v?T<@7P^1NtdVIQHYczvQ5`#82CPsD!EY8~*AYE#|=d)rbK@P0|wTpu&l?l#C3m+bi{ zU(7|@;5-X~+zB}6@jqfHbXYQf(oID}YQXJvTEn+v7G&`K}(4nLuzkLRMU`(1wPg(sDMhIg1r z6AHWNN0t(B(j5)ybPITe;Mq(mH6n`_@F)xi?2cp zcRw?IPhgPnEQgJ2!{1@9?&<+PZ_fezCvfI=y)fG;nZnO5#%>Xx_s}eVZZCz-IeLdq z%aVCVLnVFK1Dx>gb=(T|*kV(?fsH zH_~^vVkdzYopS;l`G#)HX_bOT;Jfx4y@kDNj5CQDj_Sb;_TCZLxht{sb)zo-JV-{D z<71&0)S1TuYu9-&IKrJrasyzHTE2yLZi<56cft$`y!e*ZiF{9M1?`H5#@)J1KI{|b z!*gO#BkkeKu(uisZPKG-PV%GQfrDl6&#Jt`b9Fta3ug7>XV&tfS`Yd@6FAsk+B6$j zpn=}-&CF{?BKT{wmH|KD)t>G^yDy;(etEn*t()URPYE-AC%r*QbnO`Z?m-nYrzV@3ekrUg@W)MjS2E10ay11a_&Kl)vF|DKDk3~tE| z1Iul!MxRyW#d-lBG8}cq&n3C+=~K*On*t-Z;0YViS4OlimO5TB;8{8{`huKUbFVK? z?JuKbJl9D!cD&vio-{VkA;m&cQZ5KaBu0*SpvF5NhZ3|{-wi*_+| zzd(z^to^7{4Ezcg+4G8VepLSgbbhAyW_vaS(Q55La*+M;qhHzL?>L_>F<^%$;XXQq zUOPIFb#PTsN5|h>n*ugU#Gd^lFjSVWS*VtbwqsA!!KN*DD928%XDpc=vgRIoGFo^J z_|>n@d7H~S@1Oat3$;gG=Y1&}eAt0>EC9Ii zXVEkwcNnd{??vz0KtT9_3hM-4hSmJ*BM zZT%B}LuF^`n}zx$13JmEuQAoY?($j$O$*-4kKx`-8yrr%A{_XHH_)^>i~XRqH`h<` zpbQ>DJC@&Lp(-ERft;*8wjO&iCJ34e(9bOU<3}$p_}d@0+^Y$z9Hyf9y~q`}gV`F~ z3)fM<^)x)pz5)kTbRRlM-XGcETW(~ByMA%937@ssjYid>E^R)XpMDA*t#s&{X5RqJsPmagH&X(3)n@cVD=b1cRxan zxA_R`g7X=OJ^t6yFRUOR{pon?gUKc4Lt7| zZ{oj#Df6J~_b`8W+mGyiKzms)8qfb|Dkuamen2!0`!t0z!C%Px3je!4wv?sxpk_AE zcpM-hH`Ka2n?#alTzd-tC?f~>n?9TIf(J&qQXOLTa?KuI?cf40g%EnaIhE%fb^-1K zweHH*JQ?1szcqPQU&`WhfL%GgG89^oYj|^DRuv~h>C}<{{tftzqtzi4Xi~*`Kk}wx zXeHh25F&j6d|ln=0O|)n`cQ)qaSL?~11TBjK5j zx_T^&re{Ta_;}3y{2v1|Tyvgp1g}ci5CvcMH~bau-?jnp!qe7=CXPF;R7BCJrk$y< zwFQdfEfY}M%ED58cgvsvITBCA_Ociui{D+#|ph|Ib%?kmXb90VC*8ZNRQmN5$$e)97dpTwKgP*0vY;^69a( z;qp7ipyj2iA4>+oCft6a8yx`7s`}VSes}}41d%6?T=3_2t{rk| zbIjx67SL)-h9{}fCBDl=NfE$NC@#I{mIqYSNI!}eZ8o6E=Flex{_W%9?o_t{^XE=c z(Dxfj>Gz;99u_GPL^rj1|qbRRCGz02;(?j3{d_ugT+3iUaqM!^Z~WRwS2{B|m~P2#@?J7m$~YcGSIi&r7s!E= z;VJvB`#T<63_TX?TNejB;(FlAe1T7AXT21j5bsWj(A~9o-G|i-1Sd`iz)Z7Y@hp8W zQZDnSMew6v{MC)NP5b*im+w3)Eoq{n>#Kq3vYEw3yuiMu6*Q4rWwU3v<65An`=xr$ zWTV{3?;bb>6|H%F%o6WW4CX3QzGHGm zYYZjM@+Jl1Z&!rbTeUacz#gP>yFYotSKjejB)OoTwSVP7=Yd6>i1T;~9FS}lPJ!cb z-(e@R)Gm~sMRujr^W12IS1>i!ZbCntT&bpQ5M8$Z!VfKUrMo-lQOCzR^!SY%ZHf<~ z@!kg1Vl8qVFfd6u_35gSk`BT@b;rR#9#NqpkM04afFJ$06<(AGea3b0qrcw|Smi4| zSHC&bH}P*BD(^+Rq*{h5vd5hBW5x*frao{)I>5ZOTg#U80k+vSmZH~OXAw)F z`*%2o#Kukd$F0y^Y=+l2`tsa?GFspjO`Y$}=8eqdR8)qYvduz1V>Wm$qoXKs=@uSx zMM-ZjMN((=32u=H9lzj6%;#V5jxL^5#GvVSunB5OZ(0V-n`vbiVv)XN>>Np3dk?2R z9pG7?5lP1Gv#IiuKc#Gqq!HjN%Xa$F{91T0eUee_a32a>1CNglGeHygq<|Zt^m!Mj z1E{0MV`q25(}Jc{VJ22Ok2X6SP%yBj4Z{QJk$yu8zYmUB^FX>VxE1XSSCE|;2wsL6 zZNPqQs0s8imo%ho_|ZSP;t$W@$Lw+mcByMU$p?P)U%=lEU?h?R7Q(v0d0W)0q(WikMdklH-1N`W< zHsG#z`&%b)+NOn)ukBUjg866F`AlhFU;~8Tz3Pbi?By^S-3L!O>z5U~u?G8M)XDh< zL2MHE2#MXXgR@!3e)N=)*J5~OnuzQn_z{I4aDPpF!A4p_`v|j|x;lM6CKWuj50TJl z=)tdI_gb+kl5Px{z-Lx@&})%1GWLw>a@yvd;N*HCqtpLhvgLb35Q-n5waI}l1{TVpBg{5Jl> zvJm>!9^8@!YxtI!slF|XqHYdL`MNjYk_?Q5fAk`LGv27eUM2pwX7^ zz^B90W`JcV2}P5*yC(Se8iU6RKl*W)*>nmE`D2WG0MQ}dtP=0bRUoR-t-s9RiK zegyVz;gn}Rhnv4jK@&08s~x#TIvjJm+yeL#!jIm=3pFox)&F-cD&%$5j%^b{p|}U# zKAb9j4V>p7+=KfAH06s(J{0c>B4fy696j4}$;T?>VJ)9igkX z6MhFa3rin?hw|J8dXkrxm(DdnKe7TC@2?w5tHuYDxt)eqA1y59Z-hYOB8ldEu~JnU zuv^L`${Bd0R5LAtRPIR>`@Xg`b&8za@a(z2k=AQEwBztS*L%0n)-;Nw;DRK2=j^Dx zY86GESAk(Ja?uu^jHI^k0a?hqY3m$S)EGPKmo55heR?P;Z%`tAc5>1-)Ps+FZamE} zYNw6EF2?3SELCJ!X*Yrs_o^bA^0bY$-JE~}IU7mqdh2K}XM|ET`s&kTYfFdj0G`BM zMjiFaOV?yaP?JT#aJVfm{fzT`r!#m9-&>Trzz00{j33p)k6t{VOlKVZ|BCZ1)k5w0 z_Ta;2BUkiYpxxg(i0Z9?GrUuvEy9eb+f2-mWmmP64*1iB7tlX^Sg&K<)V=^6>^nk##4RW3(Yr~i_EydnE@F+YH zMmew-zy{pf6+^oxn==D^?gqP~=>Byb7Cb+Mb|t82;_X`DGUfng;8VE-KNhB@02_?i zilK9fph$?I@w%uv;6s|74Bejn(2{;MPg~*=OPbN}1A`y^8$Ovfjqv?D&Y7j!rd>iv zxdzzRZMU`NouEJ2B8}3YnhNm|*lEsBrM{o~3dN=VwC+O+nel&H&%pc#*IM z+^cKnl4(kDfpF<5xIgGkLdKjG+|g_AE!I%zqPN21R^ajshDUoB6DBSJR^(w465k0pHKOdFXr>^SsR6_jdJ7IS=TRd~7?(_WeT-Sn-9TD%Nkg7b+cOtns=J`}$lwRD-709AqIXOF7|0g> zfDb}0JX5C6VeyB+GYw4wc6L29v1MdE8oI$&2U#snDVZR%x=)f{H71}ir_rgoi!(C0k^-RQ6NARBds_Dlsdr^8aimJgwiFxiM z#;%MZr%LQiiUx~Z<2W)xJ|AH-LG-AIqYoS5$#P_(I1V$6GR!?>>v*v_W}p3CqiFnE zBeBdbngR^)?iFXUU&c|?B|CuR%V!Epb+OC3=S_O>qd(Z?AAkE9f5o|^g^}>7X9$I_ z#|->hPvJ@*=t7_$H1tvlZPKA9oDHA!m+OUf&?UAogieBKnXu&?uu}0U?>(B;1OIHL(9m~DBpVK{;so4@XLB-{7xb3P z4%a1}Fr2Q{r;GexY~ z5ko(uYHCz37Yj_{$m2vJI5(cT6CYH%X$?R`^4Xg`ez#0P)qjSYTjPbmTxg zF@8ui#XiA&ywz^z92rHTDR?{Q3WVmE;k};ZO-}HmFUpuq*Cddkvi{%4gkh2l<^& zqOLvy)Axk8;G87t-Rds8S_Q9X)O!Q>e_=aX%jr%F)P$Ar%{(Kg#?bS89MV*L^FvNM zfMa3fTZukV3iAJ$NNHcXi{oRIB+({PXpg~STgymV!xBj)n=ZC}5(RGsU@bn!iF=R6 zkgyJV{v+p#6EWxL1YOVxPcucYwb-LRjH5TN7mB(*akTA1GZkcM}{ax?aEXD$k-pZmj8K9w#MH(;F*^Yu&Nx0~ORHFAN5Pb2L0 zR&Z=M;;fwmf7lNG>=X8byN!~me(r2`|3(nag$K|w)Ag)p+YqXPm&fk)hgeJKy&t}d z+IV0&d($eMuAm0qYWa@sz)ni*kwh*<24b9AMhOiuBTBRoAKaBuCUR_Kqn6^zUhtlR zH&C~2&==K#-}F^@UHLeR8G@W97$s5{Ggt9?ft=DhCqQGXzvyR-@4pyFx%-{OW8a~1 zcRq$@ICc`N37(Qeqo`Hqmg3jn;dDMkNeX=nv7~1NHNu|8W!(>EAVknUHSmi$yVJeiiVqHG!>pT+1*^kNe!UsCy%EXRS!|T7EYH?%e6A^AddZn zIxRbz5`VN5QxAsG`u363Ue`u+2dCH)`ngBSnut~h!|B`{%!Y=3XTN+RD6=+%A`fk6 zVHPr)gZ+ow{Z7m!M?uY+`;zUaM#8V2v6NymgHFPa{=5!w>z}9ol{Xsp8!1$RBk2z; z!E1hwpo^K$ddx+=J{}Qtb_ZZ~o=Ukwjc~gGxWnC2$@Q2e6W)VEx*dDf2QI7`v z)7PQ@E7oOQ7zON0qGDe?Q2{L}oykey$e4?d%uuhQr{?b2iNn()=&C|ZPh2~S9{VGx z@%=<-@%IoFha+fLr$oGKPU5Au@R)9uKz`0$#Z8zmwa>*FZtEaA>*Y+>X^&! z<8xn{6F~DW+c9SaJnkKRY0S_X?H2o38rNzDErTEZ(1b(^y7G6N$#b&M5E?``F@G)} zmnno`{^QgKdo-70f@?9j#=xccr2G&%m|=&7eXC!kJuCk0Po~fY4{=8eJUW0TyMQBE z5yXZ*4xj??6uMc=V6ZRaFiW=9ZdeQ8al7M#>DQSG}T5! zK4!JdV@w#G63|nRH4yhe59%lCw;^f^@!zlWG)W94UKf27%F_&SgfeR z&+r-k1%)P}J9vw)Z!0NGVIlr%9!4ACEA6wuSPTJMcPyT3T9!j|7#i0;cKR&7EARur5v{Fm58ycBe+jb^&*7{WbPQHbN};x= zl&tmJ0BBZVZ{?lIo)!m^wKAFH^381Nt{^%O&ceaNTBf}S{j^*SO|iR$`UL+kA?B-U zS;y_6^agY3aZdW;5#W((BEWM$ZYDli5=P76K_7O(QmhCIqfUd=cqgsIUeJ#^0Z!$` zax*a$??^M~`YV8;Y<7aJI00T#0DO_ZCa^HPN7wrY zlEd7mLK*;`U$KvQ+dor#r3(6WjsNr}{-@)Kr@!yPq~#vMXqjd7gBK+?+F($JL&~o#Nii>m`4hFLotPB^y$dFcfsRhKnfjq7|Kea5#e$Y zoL}2;mVE`gnBmFrGM>kl7X*^tH4Pne*vJ;`fi_?O{H<0WWIMM9Q_qixXVy8^Hxit$ zROIAq57^!J(1)pqhCog&yEiVB!lKpGY4vaBiM$$*+AJ`mfw%zqat$;Y;@f^^CGDYm zur;0}l6!3PAjAMOBJGK@%ocm$cd0QHCq2n}E&-nEd=xcrc9HeR9eww=igKJDvglOw zP?+yo4J6$cELFux|W5E^1~>rSqMEEI-T_ZX4MLKpn?Zyg_3IM zI)3w|dbL{n6MKML27lr_0rT&7{NHiz7QqYV*r!}ToZF9?EcC>@E)Q{@6}(8e=Y#x= zIDdG#Uudw-pVE*w<|f~V-}x{@wgh+Or(^K6YAj&|xI;6M zpG|e9v6^&fJzYW1GAWtq&IuwN9}Q(kEo1H(m@n0!PF|4D&W?jefI5jX%nmZ|Dvp+JP4q z*bjH#tS#(3@cD~#u_qm#!`h?-(93U8BuU!F9&ZVx=T7h(oN|OcjtZvD9!d&Y#aJ^v zc#DIxZF%4@OTZrO0{r>BqD>I z#k^698pAPE%^ZPMt8N=jcc#r`H!`7V69}x#_N8oSAUstUD=8;tHG7IU&j+6AywwVp z<`M=S9BIOkt56@sBl>4iAgj_o3N0Vl8=asE&@PS}y;PaNVrvMyQJ zIMAPxv?+A6bhR)$2>p-*yA|P}uonIJNo_LCzfvJ|RKhQel4(W2XQ2!7S^gQ+8#-nz z0DZkU2|iYz+AJObFcR-*1 zYzp?gZ;pc})~{A@>=8kh67W~=_zD@#6m;3pkB<49Xz#y|A=^gY@DeC={i%~c)BY3Z zGpmh+rS-vd1aUsk9%`+Dr|pM0uiW`Xy8u1NV8nS@g@xb>e(o+Qu+0~`3n4w>y<3_> zNmgTpTi}KHyQNU0q-fzd=F-^mBl#9V-wJ%>G7bGOWJ0AW=2YV~ z^seb$p}#3GEsv5&y7P;W_bQm)%g}?zG-3~ttJQDRG~U6Iy}cho$-$Tl!G|&SLkQKJ zOr-G}+p`0}5-Z^k>a5d-{fbA;_A;KD2V1bmz`eIhj-$eny6gtd$<+_gqYVBggkT5v zJuI4FaLry$fmR{3b$Yv4FtY)`h1Myl@QfX6TZcR1uACZNvSof#fC-UAkZC9QB*J5; zreP?RHAC+<3f?zifs_%^T4>rHb5RpNTBbf*dh2rxeMg*~A6$2>Xp%sk{}boY?%%X+ ze+2`h4vm*RJGDK*8MH;55C1CAjt1}GC%Cn3n+iTK7qN z7knivSNOHPFcsRZ_9vs_WYV#1FTB8h_L&42Z+9Rg^^q@F}x=r)a zT6OfNXZ?V){ie{qNb{!|N0aIFuGw0x4YVwP-I~y1m6pE=d?VA)+o{{NZBBs~FkAzl zTBh|n2~7JLs8U4Tz6+hrseMF&&Pk9e{(`mWVMoUP%lw!rJY))Td8sC6urjJ={A_XB5R zeKhrrzoYHe0`FIgDEjV+cNQFf%TVkIq6~#q@1PSkNkPe_4TVG{@^e`P+3b9)Rm=^i zq_yDS8Rux@7GfrF3%tHTmfEjF6*RxIAGr5^QIcoE(3m}3UNOD`+n&H2lOC_^W29SrT*^z)Dv;umS9*KTIWY?5a;1rElPr$ zVb6ko@aB;LZr8*8>HJ~n?2Y{G)}r2@X1c(uXz?gXdQkvLfF1g1u~-tY8JNZ)8al`w zk-W-*hFe7vHJJ5SQavjexY#80X!_Dj?B8wS+5Pg9we$@3&b_BVzsS9dGzPi~%`uA$ zZtNnppB_TPjGtHp$&@PsAT&<+zfW36v z9Zi#4J4pL}3!snvqv-XczEY>UAlja#0#WiA}OZaTbpsCnf4e=x8?ld<&VEG%Fc>n81zf=l8$^XRJdd?}W zicrGK(lix~94bhJbMw}&%TiyQ24`smT&re$|X;cdj_M#Lj{`^yN z2m6Fm*vU3_?I~^TiSv9YnfhP%msVrew7gF;O+C3tnztcH1-#KvfUjyNAS+->f_1P5IS<2K=R)nN4M%sxTRnG$-HYU9qwbmSs(O= z_ChqB{%pccxem<6xF|Xu)|QK|2L7Q)MKRTVxP{0|zDE@lu}#7))r8SD?6uup9J#m0 z(T74m=$v`2bP9L`mScnH6Dg$=13^REOY}#9Kmko@e^tD;6R$r<4(*q z;7+5)3p}4h0seN}3EW3bF+1uQ<;1z%MGm>8rnsuX+#>9Hj*V8+=#!otp-1*S2yDjG z0IrEW?*DHI6dD=GUF;c59dMqDt0!=;fp4FSIB!1V#ub+PQ?O$!`Sf+-dIEd-M2M!{ zT_haagZps?W}$ggxltFOHw6rgS6M9A{(K1KKs&p3b~-mXHH?m725PiN$z`H9v7CTi z=K8K&T5SX^NeiOB+jdGL;qN8^&-PS&y2R8pmX?}%|LaHpVKQbd|A}+Olw;cFz}0U= zoE<(GX}8`1zZh|DwV}RbYr_DlECDX}M{9|02h5HT=S}LflIP$*jzFBJf3uUiBjybe zXKR&*bO1h!`}>n=+S0kw2PMGkVqTXSzg0R5wQC#f%xv7xNUsbBS4*Oy&1>FBy*T(T zVa{K!+n6(kHeCnI_NyctA~ zv7@%*jX+w5IN!duqx1&)J1ye8v6o(HnVml!cLi6%jJXaz??)Gb0UP+ch2+;YKN{W} zJhG65l3>&!SK))%EdR8`4p^F_J(GzNbfsHRyY@Yxp~RAQ($F4(WbUdV`?tfSw;a&p zpG=~Wos`nLdT?;CZ{7NGfwW>Z^a0?F9u~V^I`~O2^kdXC;9a3~3;Nb4;Qx+tERwE7 zeRBIXbV#a8qzi8bkwa}ftM)Fdm2Om3>^#K=2RyX_&+VO5aXqE}LFGW0DG=aGw_O4AJ^=q&Q} zrTU#xPAa4Pok5h5+DmG^8{Sy!{K(}%6G^5`EcExh|MjD{j!K{l|A}+x+#A~Jm%+3S zalX7VT-&4^`b&uO;QYSYT-?#?5$B*g9kdg0-=!nYju$#;cZkqLMVv3a?4i{IW+5M( z2xA4WeP@Q+1K9h%{XDeSR|2ow0~mu3a_wX;0JtjP4puEvw^>yyGV^hYJ(aU|~EEy!;A(Lv02JT=>d>qq_Qa(pzUUn>@* z?a?P%N7087kA=|5h;y=v%7^K*?&z&oXDFy_S~GSPc_OcgjE-(=&Rjc1kVoS%3K?80 zG*~60=C}ucIA>taprHLee$=jLg!UKm(@RV5fBonuEyBI=pExhI&=>CAhtBj{=(^v1 zti9e!L;v`0=uXfPmPaR2?s9mGRN4!7O5-Tc9XcDWd7%heK!dANX~e8RVSh{{t&+h* zWawOB1KzoT_ux~%VuMh6Oh!q-?jAgRNbnl~9DaT>qW(&aC055E^nck)BU;Vv)Uq zY3rH<>hh@ttB(e5$`Y9H+b zcOTXhc3NwQy9CXapKS!+*hKoY4!Rt#Mhf4`;^?U-^tfKDh5O)sUiu9V=Jjl0=;BCf zv>e!jM+bz14VC1Bop=x1a-r{28O@vxZq)ksLMy)rivEsS$B4#k2fTH9V=jHVZA%uD z8Ag6p8qzUzW?xV@S@?kaARWQheFEm~A@r6b0$2k)8~6k7VVT6{oX7m(wweqN&SFXR z(7tPJ!R_xB!QLGoC#65&PK<*le#jGQQr4eOLR@3*f_T-MceO zH_RKefWy!o&&JmV&^@~-O1hlPQl11+aFB|`_UqXQWBAX;qGu6H*@8fDVTQ?Qxz{}w z*%hC>)FpNXa*hzj@q@5b;onY zC}^?vJH+hjfw?VKQ+At!%%VJmPQ6K_CY$ovsM;X9b18wIubaopP2t556;JIKhO?6C z(7?xx`gY48b_KKK9>DXrNuI-!jt0?I%$fpQ=CSG5LTKuWNRpbLV(tThmD;4F%SS%3 zmXqbs7z3uHfsOcULnKZ0h@hIjcH(2q3%9z5{To}Go6zCQ{1fwkG<*K}YqZE*u(<{O z6?_KI7IqP=&_h(;0KfZ-zfg5JkuL2*Z2eaVRjuQxA~ub3td9!On_|Effwso_hr;|0 zQRI3H+ISw8P+fM-~WUM#odiENCAMs1O$4ilMzjuz%5Mz{V(| z$nsk%_3^Y}+ig^IYhx-6@8rxJn<(fD_5x1J#$cZ!qmxflC}Lj(Yq%TUF$>T?-k#0g z>O@d?)ZSUZ&h=Rjd~zl9+l>oYcVP03)<74uu9zvNL)Qy_1YLGtX8FnRO|yc&;*4r` z4ev!e^=W|x7}-q0|fTIn*D46VEeqhl#6 zx{?io*WOUf{j#j|#9IX_+GQU}FNeHjW(je0XwM&S^ka*_jTrJL=KqVcYMP}Wyh@?q zPtbwiI!Z_m(@@Wc;J|)bELZ{KQy@TZ=X;3|7Z1J>?nK|<*TO)vSW2G;4;`gB`@KJk z(ygHrSlE>r%fTBx3mv(nVJsLs_h<2`H0DzZYp^kGdvl;NYlVIoA`%o3re8IjB_4)g4zgQu> zery)OUtVb}PRfZOlc;1GQe-P`Z3iDK-(=cl)mfaIE2G8G+~B)7iwjC+Bx{jOYsU5! z7b|7d4eyBC(eC0zeC}sW@jD-}67Qym(+%tw67PIx!LNaH0Crl~cZ;0|Chg{lcO`osNsq5!VBGkD}oem7w4fW1jpK`(-D$;v-Q z(W1W4U^JGnHl-?h4zB&cm}yLc+VW;0uuLm7Y-9vxy5XtxX~|im zk9F)jU~Ie&voV-KPQh&IWry?Z0Jz&5apq5qe9VF;M9@NC;DO(LWsZ^XFUIcXU2Y@M z=3vCXeB1k+m3XeHjEb72V2<2gT)A9E2TW6FP}{!ZOz2>L1&_v2<1QX3lT)2Z3jKIB zUR;4aNT1j6hVD2?RAS!j4(_d&YNR-1D12k_jyOek7tam{fA(M!c?X(^zdm9{XQ-x( ziWh7g@`fB*&>PO)VOuR#RBM7)%s<@u&YtkxxcWEWD)G3ru=OW?kFUTW ztql>@s)pfUY3#DQmOr-wanx(uv^io^s@DCW;$3# zqXwsvY58%+y@t1%4dzrwZ?Q@dn5$1IWd6B^xt)lBHVAmlxAjE($_TQ+zO0|Ih4{Rq zjP!S>(3qYM;?H@gX}4kT5Zps-Xeg&+!0@ErG8NASm7!Quwycx_$?J6=Pltr%FE!lrEDwpjX@jrgB&W+5tYlJK7V z2%p5hjE$rp9I#B=5?H)UNx`P@K^V1!9cc;Q$;ZIv?agCFQaQAFpeNAu2)nacMtP_S z-z~bpUW}8`OWdLTU7oTQon&+cJblw%KbQpGYR|A|-+R?atQ{+(gHFgxQ?13VSu*Hk z!XxQo2eIcD85Q99z{tMhh*&vA_kt$XcXx4w5jCN^!inyBru`Yf<#KRPhyrmVrlQOKUzIbz$cDa{aRn@QrJN$ZK)2ab%UU$R^Id484XR-6 z_d?qNSP|v0rQN#1UT=+atAcV9NbXU zc<()mgy9-BEv!Tye(*)ebxxod)YSzo?3pDn)k8{AleFjA>BrIZ8v23CY=4$<1DY)} z(`eM7S!|+?inatH|IE&2nq%-o908r}+@0(c@N2cbpl`fgWZl6-X#`CBl>Il@`$lqT z;X}ji+8Z{YT1IVk@p-M(6>Z+3_x*u96JajyYc8h@)HaRl?M3(L(17|0&4(~Yu@ShE zZ4KZZdBRQH22Px@Wg1yKjS_9If}i3Dt=)Sw#Nad~4IT!)te+~e!w3~w1Y@?qXNbcM zBB@u>KYDs|MD^%MN(@82im&hg4i1n7^fzj}M9CfO53#e$G_(*E@Mv3(-2Us_UN+7| zMNL;?Zj&>N`RQW*s!5{8qox-xc?JyEarIyK;K?noP54=vWcnlVbs_7qrqdfYZ}n znZ?Y9sc3H|{Ahk>v(?5*+NDmT>aRPougAL_4j-{AB2(>vAMOn7e^=jNhj1o24|t@8 zykX(UEgQ#x2kodUUK|GPg;CJYJYgozSE42#i}%9VUhH!O*a_S>>K0wakJ#yr!+T`d z*j4m`x7QQsnaI8m7puD{seS=;w9Kc8{=m>}*a{u3G`aW!XLZ3zoRg_3;tj;s?ha~z zybLiaI+CX0_quR9PVDnaMdxv5+Bgmon}SE6K99Sm`Zt>!rl3;f_9x;d_UV_BoNuAd znd8hBegn?e@{i}B4Qj6IxaahCR{H0OabGrALJQg=%Vp zv+cLwv)~X5P0i=1L&nP|Ij7BTnuDP=w3Uy*VJS_cn&kz=E%;8+?x(w)h+E>Mx? zKpNGbTFI_VR8q+{=-0V#XLXp3D>vf%muZ>fS2?{yp683oS=eqlb<4uLQ~sPqE|Jq_ z@EJFLs$)%Ym$h95FRe|+;@uN+l7M$053&)njInD*+$tV-5Tz;w{lNdVy=xzF;u{6g zsWjT+Gg$1Isw6%9oXc}P#Ao1P?fZiF%PLsB_(4UNjM8a7MT+yYp@`Re!pbjy4 z_*Ssb0`}(v@(KEAbxIr!djpNodKacnjG>OzIAa^U*rxfw`#iuI^VYDNXI0eZCiJv- zEoIVdCH=e#k4}$#Hua2xE?$DyGcZ3s0~Az&^OJk)9An>bk3$PfxcQJ}BgY;>j#^Rn ziABG}nZE@*$$bMcxT%72AEVBBX(8^Nt{`9h44c=r64ONm4a3jeOuw7xBURE#L-=%) zn|K~NR0S6BOjnK&Hz%p6d8>5tKI|n9>J~|2*L2be@DuaBB1z$tPG@gV6@Ok=(a6r} zv^`ED_Ejh;6kg<~t98X@@I+p@7X8Kd?QFbUPF*^qzIs2C^{H3VYUKPE3ys)H%mvxJ zKi<0waJPTO{NeweXFK&>?Ihgc|HQrhq8Y-C-_T${%zM>r6Z&Fia|`D@MgNIVyDx#( z|AHp-R5NxG`wDmbUIR?KvnB;GbOU#2)}GO90=UsiybJxuDOfV{-d%h~ks0&YiknK> zjjxxzTf@Q{E9oolg8I6htZoisj{l1j1eT1L+v}!Np<6l211{o#K|1|hP|fy$2h^c) zI{iBKgYEHF&BErqj%X)}nSEYORjx#HDo?SEE05 zM+|$-kcd0Wpcw@nq*IPV#aLjz9uG;Ux`D&QYqcu!8J14j1^va07fO1nxO5rK#qTow;{w*r0kxtC?bD1<_84*QunE0i&1>Po!x-8igU12>NgRjQS_q+%|TPPy{oLbP!*>BED5{I@ki#v3)&;(5e|%R*bsV|wbP(|xTj zD?1ZM=k(Lb^-(J}5_n7z=cm^h32TR*#R~7^t2tBI3qF#{@eU5^p2%{+NBan`_9-tG zu_q(IZ^e81e9#8=0B3u)RXSxl?`8vME2zFjI=P$z4=7wgU!ez8*SMUifUi&JfZyG! zijCZ&pjnPM4|QMJ1n_{mIK$&!VJJ31UW#)~ryZddV$@|NMGZ`+V%(LteN@zaBz~Tr zoyB*^w~ij^blbGMc%w>1?WU&FZ?2Pgu9b?0;kh3${6TT3-^QhblW>iNO_k9Jd@cbS zmb1Fe&~U@~ANN+yE?EPI-Y%UM)DLAPz}H;EJCfJ;lu&mQvk07lf8t!=|L5HP^ZdU! z_qZLQEo+%ds}N_eT4Q1EE$E2gnVUFOxR;}*xp=;_B}-@+{!g8P|2Lvk7zQnn4LFCN zovMV*gJWnO&bi#IA+tq(euT3v+h)(2&qrN^e3C+^x{kv=Rgp#xiJ#epdrC4xUJ5b( z#jNmr`y4#ErhZ^!!PT-o4PBSrS{8vva00WPN#ohKVG-nqGrU6C zgFT0~c3Ls!p83sKo99ZhK8TuOO_ngOA_iV>f6nk#ALtq$`TIPN`gO7N0_u(Th~bV= z1={Kx8X}zGvU`R?)&@1T!1DlqSK(J+0wv>nwq(eKp+n>70pi@wXPFS~7DJDaL+rX0 z3cJB=*F%0dTXtF~Mn3%b5nrcD;Q?}{8De|Ss{u<2P(XVFx|-|E*;eRPJb!^&BGQ4G zX2>ZYd4Bh+o@@YWww$M^0c;1d&;F?Q9%0UC?!hwW$f+M<+rKiHsm{x(`Y!7EeQNfl zD{73}&_o?IkA-bRPmO#Y>brt9?T`Bxeb$W88<^igC1qX%hA=FLZN`0Z0x@s0b~UqQ z3UIeEtK6N!h8f7IH)8m}s2|fE8$njvai>`8u!)xFNwd+%89fzpUt+#77q!-kV}ipo zC0&R^9O?!N;drm_Mf{2F=PAJBqo)18=Q&{KPPZ0_^BBZ)Qthu&*>w$Fz;i`6nYQ;@ za3Ap;)M&f*fKLKdAwm4LBTky<@@IfDp5{q)aMmDRta|$ax%nOy(Zl%bV4oH z9`T%|IV}7fEhho-tVujA=tRot1LEmA>bB79keo!sbGgZDp?h=eaq#SazfS0|R6%p_ zEUz_Up6E>`;``@xYRUo=lw^Rf-yGeHnc?SYk9&D+q!BY|qo6j&(R00jARL5##uC&; zp&xRDPYjwii079D;lhbK;q)vN9Eb8L0#(VVJ8H{_4z9wOD%=a`1@86JYGba)(Crp~ zV(TygS{jZ2jL^?*%b(~?B`AsEVkQ?2Q6S9{&NGk1>G#at3 zwdyH3ObRl^SzTT{K$5--S}cg?3h5-ty{XXm!@J)vJzV1HEGKKk<^!uNc{nVfZTt;B7koG#WBn5Q}T7Z8u z`ck<>7e7NQ{F~a1<&qD}6g2MwazdRb(V|wDqb8iwe6=J9SWuh!Y4p3$ThiJZ*qCXU zBd_WvQRjzK0OHwRr=z6$zKn9rFi%)$D*5xHzJZT|!tuFm2x!c&LcM2(^SpDY8NV2@U5W3} zOfuq2_Q`3Ifd1vzTh6i$oX}NiwC&^pF0c`}^3&l1^=%e6GaUNTZQ&P_8o(`|8BT5= z(UUgt=ZY$@zdDURbl4y+8oiGpYPd!^r=(Xe#}J46ufvF3R|(>|Tk?0DeeM)WC)$F8 zf_OTfJ|jJM5gJjbE7HUDxeuAp9K!R&?5Z7oOoFen58x=eB<76K-$|)Vertmy3UK`)12& z4dS_Ni3xwcr<_`%mL42o$8(suIpLm~Qs0$d0B@u0GdQb$5?Pd8TJS*0-^btZO&&xgL+X*;5mOi;BH(AC7%bt6Lz`Db&Z9G3ue68EpBigr)1Ou znj~ReinxWS&v!VZ_b_wg6lY_o_zV2e;YT0wErt4@`nykwEWIOLY7MSDVyL;>kQ;Gc zL$46q;t~D1==o~8iswg5R9wfQ(3!^fjFYe8_Oy&6YsC3V!6EL6K@9NTX=LVggEQ6x z_aAqhEb%M%xCi+DPyW#!H|2Z1fX*k*Z9vP`{2oIE-N!jJnbVtJqk{eeVx_%0jGtpG zr=T*-ZJT@ZuWDp83^~&#B!(aMUPfm`%toT1xnv=yiN}!lZY<}GJ>+D8+Tiv3P5eTf z&yi=L`+aUFzo1r5GmsP3oY>1JX3HrT|BgPllUHCaZLk&JGjJ7ebuyeH6nLk?g850? zLTLhGJI1IxpUpyO`;}CB#5d!^!$YYh^d~1&*z$w0hb_gdub-YRKj9Fx6fh4`7wYl8 zf|7ipu@g6GCU>(GS}7SR|N7DE??|DKga3~6ni?H=Z>5q2;(6JmGZzTleI#n*d5Iz1 zDe(I}@ccb88(X~u%KzuHXs+erz-4}edgI0ZO0NBnXj=6d?`f7HzxY!msgNtqxZ3lN zTB^tZXE^PeGr#Z#@FX~6eUu}4$p_qbh;6Q2AYY7pyB~2#eV@!LF+aD{BJb&E^4go2 z9Tj07J8&J}<~FpQj^fT8u!C2A#U2D-A81p|EBednSt;J@PUrZ0v*ge{gD-&bHU22# zKM-FZ)uV!c4bJj_&A>>kIL?Q@z`2b=t*F|-58e<;5s0nXO9jt?pZlvUm0oR^@(&)u zD?A1>HDfn^95n6I`(eJ-b;&tnOyXMd0(1AeN z`?>!8!5c%IpEP{PJ%*OTUc`C+Y(xIj+h}T!+PFt+2Y!7ude~>EF>d$gLov$=MsD1E z)Pw(w8CP%Qgv=`{zWD?6S^u2X^>cZ1aLDGMjvAqt&8NST5q}W+|4!TZJ%Wrhd-2@& zC~wbX^lCTi>dxo*eB42v_`0O|eLl@jPPg&>7OP(Imr;)m+K(PzRm0yNBcpvAu)93= zlve0sdU9Xlpn8!uIvoVLZxH*8NjUOH-S!3 zst+I1JCuB{L9;X@oS)MR`grqFXuzys-Y^CA2DCi~&m6#4&qiN=FPZM1-_JFM)4oD!%9 zzUNTDPp+mx9Qh*7=R<6Gd*~4^{eapdun+$UbJ2dN)4oEtJnV;(7U5nC9~sHt0S@if zDdbPb`Mkv$%-KqSxB0w=&&FQq&OY3yD|YgEXut9^Mc@hXJVCz!y=@^QRTkz^uHX4fC&23r!(C8+pWmGe9~{(L z51=o71i1YVyHMBeoy)(1@4zkhRLXY`;5*)fPs(fP9v_hLKZb%og0tFrVk&O{J((-m zm$mOZn?GtAPW>8TUpX^PpkI0^gx@yRqgbsx7kG6wr=4fWtH+~U5Y z*Teqr|JKjH0$sQS3+UkD+@|WqaD@!s%ZTm14%@lQv1+=6XPvP7oPC!B?8VZdbJm#8 z!S4OnZ`2jbI`IbAqv>fa<|>gx`Px&Fbng+oHco}`$I&ZAp*9#fem4JOjeB z$={nRqgHsn>#R?C*x8L*08gS0dStpIoO1o(%emnl|1}$aJ(l>th8*YnJPo32d8w3B zzluKrj?5Ol>;AKl399|}F!9@yu?kA4a;gAdLD zKmYHaKYLiS#39@|yekQav+1&#TqEq~Q!uaSvEmR%DmA&|+4;a5&aF)XZAF|%`Zecu z-o(-z#QAWOKD-*f)zG8+p_a` zowahjAMl;m9_9yNC(>XOa`M~reDX#aHA8*1bnp|tw?anRrD^nZ!8cwf2=QNxxoDg| zeSC!dcslfjjv7#09yCa&!Yg_758e*3RW(6>9dw1aM;_?7E|p@!^Y{a)0hEIttk^z- zH_h~?%0l>=ev9O7fj5rEZvCdyEWTk}AeA;up>^LE^Pa}=hXOuucaK$k(J^QsjZG$# z1*`bcIp74n1D1HnJihL11ofGR7|rOfZ&Hc`Ou=&T+DIJ_ud*0#+&hsyv zx9=RE28?|7x99=8`}5{oB54J3@-z77<{ZOp2lc?dxNKe@7=v@j596=z%uPoqghu^2k^Ev$bJ$^Je3tIFSmAr7sk8-=G z(8F2jeAie0)C5?C8hctgEs;4>bcfydF!+gD%S!VZ?cl_JR*$N z0@qUOtmciOOSTi7nx_@b_>lwA@AL4gkePG+pG8yH4)wo&^fUD1s0;V^KE?9dbnd4q za9hX^v&)xqAMhR|H^kXCI?ZVU)zlr&ZMN$0F5qez;InAGuq`iQKj@1%*G_Zi?_fXJ z57I)hvkp>l@`zn z&IR6S_FjH@B{Vr3r&4^=1<>XNjt*Kk#Uo_=fYrYAs7VTZ84~yh^ZcNl2A%SWbNMEx zfIkPuBWd7L{Y)!)MIEJ95Vlln=kwb8WlM&iGI^nIbTw?5);KcJf5L0s1GRGNu6 zKdQ~*HvQ7jPsFxU<#}#@nHrcJ%rMvK^S3h-s5|03p;bqI34CbxVx}>8!w6o-5B%{L zIK#h{d{Af&T~$l>3_E6F?$+OV?@^Op`QC>wbo+W#W|c94P& zr@&`{tKvIbC}=P0u8tc&@yiE5`(-k6h3Ye(7YdDE+-0&!kNNh#;2`f!rAu87@{y`Q zdXIZ0=J-NhcEFE}kz+Gkh4A%jd?}y~T3GMH`1Y=TB;?}mzm~}Bc)&}YOQxcY8T?G> zYng(dtGFsj_Ep4V{Rn(IR^2!8amE`kQG{Cf|3)O{RxaZD=BMx0}xYq&4a zQ#8aL;hMt^PX9W%Wr*_wi+fy`yabwoI3HNph<^xQ<-R!2(w-f78F=bjUc#Gc%3!`` zVHAaz;|%Kt@-r@}XdH5KV9S}jWSf%SAkMEBX7O8Iqc>cFoz$(Z{JJy+x#A4ZY+B40 zVL$Q_ajvyF%ST@ZrUm_P=+g`Qwb3$gmr-Nai+m}xU#?*H*5qmqKNk3Z-`a#}jY6pL88t0m|B0Ix9ZI4RbeW7ca}~fQX$C+i z;ZzSU7w6dm8W4L=dr1x7MAO7!|K9^BXU*UKDTVcJ+}VlXt|87zzb10!O`w^9I6Idu z;C4P$Q#s;1e#Abm>`($NLYzZ9?s9FQ(IO(w9&`2h8S7)n8*}4pmUjI0T~Ra!{Yd5I z-hALE6?qn8u61|}|E@wwjZmBYxE{tYZKb3H+;PKlX7UG%6f`;wweGCt{L%Fa;Md^u zIC>MmbFhMzp?(-^x0zpyJ-Eynn1@>%_*uZzJw`8_d1W5&9SdA8ylHGIC-W;>Lw{f| zd?-R3`7PkcsDK$OiE75DZ}Fr1$h~82oAVJ$fBK3uv@OVrADRrjbS$)^KQ-kCE{D$E z#UyelYsfnvgkF|CwB2&6xR;f|)Yex`yI64^Xkma#k_Pr;;gUk&h-Qa%^q>iYB!C`0>}C_ z;yl550XODM0+k@nGyJx5t&YO06ZOVvc8+^^B!*feKY#o2hPwrij3KC*Z~Sb;53z+7 z=s$I`mp$JP`^tbV=)qSz@v&opQ(A^O@CkQ53_FoZ)DI({P3Je>!psLb+1@;ozqS?p zbj)ujj8*dy`RMf|xDyA&@G09PNd68yXuYY>;0>i7z%?CG_TX(O2=g~^MXMU~gAD_y zL03FmKjZo|1-BIEx$^mK?ocAQGe0y$rgym^s6z^TQ8OqjxPA-ZQ@K5f7L&+z$O)p! zI9pQ(ZRC!W1(Sodn%4RRb2HJi%<2aou5)v4&7^R$8=OFqMr)|#RlB_{wt|XXpn`!YVq!3R?`5N+Vu3|>GxQ8Iq#z1*q9PV11_}nu-p^p5 zsHj+&pqN;o*kF9O?|HxL{5*f0>za#~qqx}ndDgnu9T)%m41do1J3mFO>c}_2Jd}bu z7w78oZO|KCr9%4i-Gf_&Znx@@cAX7^bU1y zu{Vpq@H&{L;vS6KSIFye*jr)#z4QDrf4^4{eZx$#$nhs1s0yUpYw-1DErc_`hZ`?K zPuSW}xDMYk`v|-jr}_&;->{SN!TB?GsL;Jf07Z|-*^)U(sAmt{;}>$e3wj6+yOAB1 zg1$exfnYB4pnflqiL>%LKkO1RVWA_)e!HJ{O9pQrywi4bH}ad%*UkB+q9=Ll`HpdT zp6#H?ty#hQCZOL~j~=XR93Q^|UJV6G>al)0ug>xS-l(AN^V{@Q6Ld$Uv{-3PUi>kltT(G_=Kh+uUBI-P}OH-%6;e8fk|1uRg&-hn-6U^q#b+POJS<2S~cXvWY4AJ6a{7_&N zvA@v2Em*-{lp|xy7Blj9H@@_v3r&PCmhskcd=-2^2mgjQg&)T^f}Zg?>YOle2;V*$ z9uKSG-JNU5e~xpfMmb6vV_VBThvv)XhJpf9a=88aUL=FID>>1P%aFl)tvZ5E);yEd z1OKG;&2Vb^_P3?SLwLc4{r7pEx#;gY*W2@zo9zyK8Z}(Jd_U(g6duEjP$WC;8Q_aOZ>=Ta|>_Mm@uc5cMKG=g7vDKN|v9r)ua zIh8T&p?a9|{R4vND*C#B#T?HAOWcCKPUqna{x_cOk|n6Wp(k$^9!LUu54ZbK{1G+y zZ#b(*3XAx)cY*JruWR6%z|WfNPa``(NAN0`{{-#G)x+=~tD3@J%J!rpU* z8zuQflO0!&zcbAh*-FS{*;C5BME+g6o|^8pyvR*Sbfx1sH_TNcXRd@MJ}rt8?`Cqk z5$+_MP*U69aom$79+Y|&TE$5txc!a1h+adhX8K&_Jj{m{LbHGGp0ljuZhuOIub{Hr z)w1?}2qmoiZ=Dkh{;u;(_Jr%^4UQXX=&~-3yJM-Q38-ywvJLmKM-Pin_y*Fpc)4IV6tCS0>*Btf=2fBl>Ph(zsjGH)JAG1D};_|5x9oNy@D;j;O>|MF8ZIluLJ6wekF`j z|IMRs-1qN$uwC&D?hyErt58Gr)^XgmF}R;m+kC_4GQK~&Uhw(8VX7>xGxIX`Yq%5FZ^_hrE)M)>zuD=vR`Z}7_a^#1Bg0#oH1H5+xMH{1 zyG--qA+XTC;N8u=qX}7u{FDp83yidyZ600}gB~y9%{EQ5#qRVg1=vMGqUP60S9<># znK-juHQF}N*5O^h)d@@qdO?=Ph5h~4- zJ`ogz=ehLkT}|*GKi>D?H)eGZ4WK7DbRRrAB5^{ooI=ilZ`06A%mFt^IEuaVxMa~4 zUKeB0OAlzfMU<)nsU6Ph`E8GgjXwp_Qasz6WoN|a4dF?i2wvsPtKvmp)Esx>@(v}U z=XdzY55gY*;5o78pf9a2!C5hKzbL|!vI#UALpv-LT{a@0JuRAU^g@RC1!P6lsHt`7 zaIxCZl}=7pQ*lsl(P)J$?b-o%2pVu@o*W5Q#P<>z>+wNY|xLQQe zY1G-&xSM!mTG&53K{yhNPtN;_ED|}D`j}HpdWkDtF{eQFSi9)ACRpx4%YZvn2Ipzy zsPl&mcx)aC(~QKqas56xa1He|DL9{R>P1pO@1*>0I5(pDMG*a)M?VdEuK(Xl|EY7& z?&r8$*mtc(oz0~-+@smZNkeUq9O*AR0Z;L4e3lC(`AgA14o027>+I6pKqhK?>||H% zt}m82gdxWP^+_2d7Oe;&u`Cu&(Dve?Z|LiaVyR9)QS4k7M58f--`>7Sd=a_rdee*cBk|&vd1(m|5m_vJzw4Bil#~ z4dZePv2_}JeP6<_siu!OKFW=@5cEVXTZx}hXRQ*x(VSuA zi)Z_@Sr2guJU*x6JgHI-6^~8~qE&d#`yC*$K}aACMjvAKa*W8ZOFc6NXNd0zvE=}G ztd_@+LryobhzhQV~?3i$jPQ@F6+a?(SOH&ivBvrfl;_84ZI3?J@=OAxKdiltwr zQQZ3wXqWJupVCR>`l9|HQS-RviChl6 z97TNpL}&g4I0;6m`6eSbejWI4kCO2{jpy@|jQsz}v-TfLe93Sh+WIhtUet8rLrXj; z5OuaX^N#BQpA!Xm;0tc%b30nXLvJd)BG+x@SS9>z?yIR)${Oxw7JQ%lf#b;*aZfRK zTf9=yvqg4X?;zwu*{Enmc~{N|K0>xfkrAM}Bs0LA(#;Gw^V2yp8*AiFoe1e|jA^ zH5z|5J{Rq1$CqJ8@MnIp-#U=bUmF3xkT{BXGL^5=gpn;UrDZ4m_}kw@=++x}p;sjF zDtM|7#+~@lX9M3B**(LrgWK%AmskD*4;kl4ROu;RxEw@VE@97@aEb2;t@NmCz*Iv@ z`GLMc$jHEc@aG-g6}VFb&KAr4#lUv_=n?Rxxa&vxv{T;X0<6RQ*>Zjm{06^+qmpIe z$k#SQo*i_j-8F-G4|oU74MJw$!Y+LII~TGA_d8}vYrazf{KK=r!yjLt|FXr6-l5;? zQ*oQqz(*)}zlydm-OBx593 z-%4^lb38BiDfa&G`S0>?9(`r;-#CBkX-)ZQ>*4>0IzN1+!-qlpyAaqB`5W-=3!^9t z&#-YJ@m;1V=m(x*!+u`;_PG(%>O1%YiBJJNO(eqHt_qp^Rmj^@Hicp$X7kG=o)=X{$to^*nbp@j*@`5i;u z$zdyW&0kjV>F6sSH%E{6&5w8Lf}R-}uMg+ViE*SC?HhP0f(A3&X7g{!FKLLc5Y z)g9cAD6(r;$DPC6eYHar4H}!p_3I2DU6qntrcC1IPlu)+x=Op$eX`Sdo`;`S(8j1e zqXM7c-@Z{nXaCKkFV6Yfgc9k9xyD|tJE2)bGcJhN>UABY^Bvv>|?CSTxBO$nhT*_fAKKjVMylhec1*hy{B z5&U+bXTy9K+`F})XpUaa6Mv48k#G!p@O=wV&(y(!^VvYkv%?;?(O6;E>p)tFukXD! zRp`GwkXiuWupT>I7~&Q{35MWmejX<*@$n-s@Y&{C^%uIq$5;Um@L$`T2?v)V3pEgT z-=e$xD$LaN^VO8w_7Ja1awQwwefu7*?M>x;wS1 z7e$6=EctZcNXOty|LC0#e+D>Gl!Joq*`;&&I5(!;ilnnPdfbaVf7%ltNzHohw%mz2 zbFPuJ@!vf98{7UqpQ~(I@>y}<>!QvLU-#z6j#kqr>;aRTF5s_r{pZDGaHOeq27-V+ zR3*;AJ7>T0M+Ugjg;Ofp->I1AE8*o^3*G(mQ~bMqZuDqG6fIl0hu6gpw{(G$wEGwH zBTGG~2Ws20T;PpHc+p*_NNU^d4R>p{53Sl7LHeESxj+rF0LDbnsW1IycF#h{+AM;k zfAi=MuK2s(7<@~gza0S{6KcCiX9Rx>c-=6Z4;|J<@>|f?biw(M(tSJs>0Bgn&rsWw z=lNfI!;upK9HV|U|9)dA8KVal-1USb>A}=C2s@EFBjI8NFghWYj!hgXOga-t)$PC~ zu(APIrsh-P(NbqWE@T>+m-XuKx9YE8- z8>~NkhoH&{pli7?(5dbeZsM+gi~D=UuFb;HT3@=Y8$)j|CJV;!+ZjI-d+oA?LjDyG z`soH9%SdyfNgH>16N??nBt4-IJjWby-uA1h;d6`KXeIVWCJi6+&aaUr`cy%)^Cf;g ze4%5}GpLPIcvsBziZv0`?AZYRw~r6?ONDQn={}A>>rb3cINj)yCL2~6LN(x9nE#tc zziiRp{qsh#4L=8S_kGmX|Mf&(-4S^{c!n1oTgrdGr=+hRz_YE);VaT2Y2;nhE$%U2 zi2a~(E_m;8O@wM2)Hw`l${m2zVU~TdJKtmPXvAt`V-8C&0RhV>pID)rZeu=JL`lv`0L(wR8v51 zkZ=}$Vr|`3B$|yD61uq4;YfJp$&7@0Chk-S{&Bk}Z3Sgt>~?o3=-0#g!Y@zw_Xb9i zIP3y{I@^m@0559UF^(U+_CI+F^z#>2aMPcvfWI3g{gBSv@<9!e+4vK8nfC_%ZN8FrU?o6UNzpG2!k4Gen;;(~ITLQy!0mSj z#88_3I$v||t$W8F4O?daG?L01QN%5z1cs?z>E(liOFP&~2L**Us3xVdS zGdOBp^4~Ei}UJpspvKO#b6L zg7zc73-ZMYjk-<7~-4F-_+nGniY8$&*a4arg$nd!h(Y1I#*#Wp#G zH;kfgUowRvOL#KejG(nAO@%n%HYLcla?2mh&w!7s)vplB`8SXLed6CZ(#S_``Bdyv zHe&AZm%H!>p=)!(Suu0N4n73BiS|#?4^J!QFJo8JR11vgZezjvR~SVt$K90QQ;0qd z%y}A~pEF~G&l}~?y5Ua!>MZm>fq(lE;DE>CgfsBJY2_J1((=_p7BB&uUNJPQ<1Qh$ zuRpbY2akw_$AzF8Ke}2FO+Swn33lK7X!364t&b@aS`YW9(OclrQCuV30AD%{Uw1p% zkXHAEzsGra8WihOztR9Y+Xyo)GX#GtkgU+-Em_>3bkM7t+>Rk53rotpCMSlw)i7i- z)o&U?u@&I|kC{Vbus^*3y;9mrJGuca?3C6bDcf?rhAN~k^`hFv0_li>q})ltaW z8i@UMk&SR^G`y1V{&G3N!k3xgL`C8GOiU3H8wJoz)OK}sy08(Px{jsDm+zY`3 z`kH9+-f~Wu8GQ-uB(!~uvazTSH&;*0B@B{%yIoY3J51^3)V((Vb58f;Q?pFoGO2 z>J<&0>^FGS_Zvpj1%L1su|ugDOwOaR=UR`x?uilA1^Q5P`i z4s$`s3I4+b_#om;HYoeduLKtL9kauo!3M&X`C+shXT^kHf^g|wFdcr6XVukB_`M3V zUTh3)*CYy!mIhF_Ch%%FlqTew_|r=8EAD0=64)p|lAFR?*5VBfKNOu10L z)tAbW)wE7kD{KLWEo}j?h&)|71zp1#OEvYs-IfMT@`XRSihP4wQ=f2T_q4<_v0I0{ z(ts69N?IeG5r!1Ikm_0_DIP=#JqsOa%(rlA-$Y*svv;5?`|*6lp5kX7cA&oSX{-(} z;XUGCq<4Aqh%{z@Iw!Ilj+Y8 zdKbThm!|nsr%uQ&RAq41g(37bEr{Hw{3nlo|E$03yuzaquOoxM0`9&U_rmxC`+yg| zf>)2uDc-7|lFHA3|Jms~e|tN!D1kF!oygymEjh^8^5zgD$>4N1cKk#6|%|3Wc@GbGB-pE+lz5B8-#Ko7qz0}n0;!B~a ztuHA$si{MH1F~D=OXFXtD0g8yaBzI-X%TYAwB2cLs4soN?56M816YMO*&sit>PA~C zLpE_^Pvl-5e=962K~9}AlJpnv6ngA&BDG&QDGpB+S~hm1o|V`c$2Jvyv~;B4{-MbG z(-&Hta-s)bp=8+1L`Xm9LIGu=wCS>iFz>k=oq?yutjR+JSr24EwhBWAPfJ1A|G%=X9j#FkVoI!DU2pI_`A+>y;{z27`(K9#8PfcIlmb^ z9hc{*;kXmLMJwQf`RF(9edSLpBWNmSx+U|v3EkoO|F9eOp^CA>3725X%!;8ezTU!= z$I#(+gI5oD&TmdbOR^Zg{q|dhweT>B#+lHqHdhdk7rZJ!O}n($gjbz>sT4f3D7z{l z$q4ztdsK8--jwd3p3AYn>)E<11(y5L^%*LXz3odo7W>j9WWsu!>rWRNz^e-Tp0O*8 z=+ipn>^z3w$m7OT&(V!0y^WyHAI}Jar8D)<4Wn-D69w&3NAxYB$cvQ;0RfJbX@WlE zEeVgSooI(^2(@x_6eRdhZmtjg!=zwgKofV`A0JA(30}h4o}LtfTyJB2Q$d7Z@k)Gu zv6&}-{jDE09g18@Ao^1ZW8_vcq-5dOt;x59FJZJ_R|KZIFg1$j8-Chj8;(qSJh9%IS zzK+KJG)ZuG^rseMqUl@879pj^mnZ|=>~6WjuD+;kb2UwJEfJbL^&wiRqAH^gLSRE* z8Z{WR@K9Yk8vxI)FHxkL+@0dV#m&AEMN>V^seK$UjqoUXAsa$FkX@CrLP;LeOlfa| zC-mJ4@=w;M#y)N&!sBegg?qwJe`gvA9?#OATZQ2_97(7`mhs6TA?$=B{jQT!ic6&M zyq7aoBg4@UJmt+LexMi7qL*8CcrITMp`xOP z;ARBuFK6@{xoNnYRt9bmB6cA2dLnRja65J1zz=OVewUYvh4ca+YTaE$4yM&YQ)JS8 z%L9LSpe{wKd}$Z<8v5V5Qv|XICryc>*T>B%92(Ue?4zx^4x!yk;1djw;*cq(l+nuOlKbC3aw9g(6g?{G!5z_GzQmtm~j9_ zA&=grK6u*jY|2C)z4adOph|$bAdmij{e?77@9%R%tlG~l#JMr&+n+gl96x(Aa=kG3 zb@kZ9X9Abf!%RIt>n8slUWR(WC_ec$6~@88?)-K57wzdQG`4`o3iHC9oGC)!X6&Y; z;KvmmBrI6%Pt%|;NG)F`w3fqb^o@#UuHTJw5?p-_buK<5^v0dI@F24A9G?rh+8s?}zjdt>m4qh|_UYyCuqmO{! zZ(*qy4MZNj)WV*w!Eg7)Mfa9#7M zqVW2tKfOZVRp@nJ@Yw-A5DCFk5)1EEhXZPACh`>VC3Gm64EPfmnC|4Z#eVF+fH3hZw_@9`G0 z@GdxGzhB)iSs1l0fHsyPcWLP+!4CM|kG;q*Zo6A(1I>cE9-i|bdj%cjP>;HUy|Zkm zkWmWX%aIWjvt^BN3;aV1%xhh3qJ(bO-RX8^FnzvlCtO(TMjJZHscz^Pp*1q0O2t50 zi!1s;tUGy~#7uH!rtr?*lQskQ^c`z2G@ap1I_7>fq{l>|g_AG279uCI_cy-dpaA$d zdD4~WF1-1uPI3w>Yn}OiEB&a@2)d7mMSK&SX-2pMCa_KX`{v*!Rz%U2J30JYXn#I(C1mfO=U$L!$&>|mt&;G#K z`gIm$1-?{x9KBI=3!!F#H)Vk%Wc1<_FGCJa#Y$j3qi^yfQO{n;19Dj@@^1&Z)5vP< zY;NW7>F~?#k2<$G$EUcUXU4rU&-5@~@#l^n?nS3kZTTJWqc{Mr zYR+vH7Xv(POn+qLth$`f4UeXFGynE+y}7HO*kKfOZJ4z`*A{BxGm)2j8)tHGy5?w4 z4fr z97;7=m~CenMN!kM?=;uOfq(uKxS?kQadIc{8;>aIN4cJ;kMnh$iINx&(?LgQ(q zpbe8+iDM2xD|7%jk3kbr$I6=qOYmhKQKPwW3mI6*A8cNESF_CDouXZ#!CP=aV~aCc zy&{l0^(xRzyzfp2up_Bkb58Ti*ON~E>2>OgG&`Mwbec*RszM%p`|Z$YfG_fY`;D-q6tRb840T7HC%7&ZH}6%^-doVA zb>Am`g+Abq9xBbJM0}kVL7OlG8o&D~UeXT(PZ*xh2RlmrlY-&Rf@iz?5NQB-L>-R8 zb8^CT>1Zv^vsyLH?j9f&W7a;4euEpdL<(vJZ6MC3rEAlr=f8bvbu-{I3v(qMSNH*@ z!dtucnlugg(w+fP6kJjzUC|GqSmc&oJldF5GWgGIh5uxLK066)fzWrF?PKl1#j)u6G!f2b4;l$WG0_5=>6*PD&?}+{iTt*hfO9bWGt! z3oe6iJ!7ZzScQxL>>%II%$D+yZ85yLFYVrWT$0T}{-DN-nr+-H9h~7y`wk*Ml8uxM z2L{j(jSIP#d5E*-htfP`*33p8{WM)Q?r-P6>Rg?x5no{*RDHsn^6jozaR7d7z%&jU zx0K}ApKG^5clpIaS`2>E=IPLnEOwE)8HOQm1l;46OQdcaf@z);{IAY!mu!KB`fHF= zUzsmy;EADV2Hs}xJJJm3eeCC}$-U24=^iwdv!OK#`rLwb!dYF~4SL3jJy~B{KT>Rq zqJncWb_X1Oe;J|2$jN4xRs_+=MGC6*64{2+_^hL#W;@TY&)Boy`4mCR9klE|_F^U< z!f2J#A=c;x_{?$eYU#0t?E|jji{Isp(H_ihJ3LOIA(SU~V#SZ)y=m`GhZLKnI+Fle z|J9jHk7tRxwxLwo-HFy9k3J+4`|~Qtzv{gDXQh}4{O>lnE|H`4rGda&`l8PEwPPg1 zVM>ZZol|u%Fskh@FvteKrTb z>-n9q18vZOEredUp1+#PnwYUvQ$KRW9IY{%!2aazoE)a2H72g?k+mPS%td~8d^~#y zp0gi%=HPj2S=n}AHC0L)aJZ96iU}Ckl$2quy!lFZwJd2^r({4 z+F(Xcs*IqoQ#q|QYTxx^C@r!w(e_#pO2^=dIo$X)%ef?{2<#&Rdb+YHB|-3VaHWea zM@zflbK)R5(&Rqt@_RpvBInBvf7N-6&`jzeKzoNeUojXY9X^V=_6GbkE(S?IM=5Ct z>YUy%U5d+zphYvVw|a3#`UPw|@(nZq-QP+a@V`I158KPSOlMLMrCy7s)GT8*ZVK{V zzy*5$(vqG3>_^*T)U^1KEt@RE=Q0)biw$G_b^WM=wTcFxPG!v|_|c?`&@ar`#!RlF zKUok(!%T8nh6g-1J|S-+vxxl$U-Wj05|%DyY#uxx1{ouxF!~eQ@EM%{Vg)U?ZK^%{ z6E#m)Aj_UJ<)h7Z2=i7{I15S*ogf=*T2Y6s%{HujCAt#Wtm zk&tk*K8K!A&r2)1z+(h+`VDE8wxM+xx#S^3Hn6ics?IyMNZA1fs0d_ zA$i(`K||_D-~E#E`_9B(^@aUkbq+8wkanTYNj1Qh2ThgijspX`4xZuTR7rodl3u1m z*B^dDdLV-9H52$ouV>OoU{_96G4x&5oOxajCO$ZZ798lwMqrmQ{T?t|H-RnofJcD^ zxNXS`*qYY@+aUu8-i!fA%E%eaw$G z_(f6QfU9gpKYzMd2jAYS&)6sU2i}5LMdO`6m=1Jss|=A#*j!KB_aWY$BJlr?8)$8C zM{HcBpv7AUYMmC!=_q!ox4KQx)|4Sf-atVK<@VZ}c%IvDkECz!gSEpl@H_(x6%NH} zgDk>H+7w2kn#O7q;q7_+NHEP!a?`#?R;0cyya2*`XzlESNtNJ5yJdS=4g6Gp4RfVQ zL(-&BU`}NX9N|UdpFfS^KC%3}&ZUzENV`UZC-dPCj^QpD^iEd;(GD z@+McL2xQAnnFY@!i+YR!M;!41n1)?fwgo@`H|%li?u}qM5kd6m3B07w+A@py021Iq zF{Mv9%Y%nW_AdCfWu&q=FW{n0)zp+_Fr8k=c2}sVp>ZypFVI(`_eh_9nQ1or(PwaU zc2z!M%|H23b)zUUeq76H;rTFg1!mM0O|+|>QS&e0?p$uEb;a-Ti@AbQ`nT3D9Rp0e zT_lys^|WS>edthZINcntqisC`e*Qk8w6j|cTj+;;Qj=in2Osh|axY>@38T!e5vmfPwFu(jUAflN42itK0YvHXIG%-83yg*dR-|I ze|Eh92Z}`={k;CjazFET-b8ISClvvYw?v(fM=7NuQAKS~=QmMV($%TZccacpj~_`k z$S3JB8`|xUx@;wIzn>ptXlkq}bAKO9>(nu{FK!Zhj(ca~TX=o^@Ma6Q22kCMXlS34 z*kc>aO()b;l(&(6iigjwA#zn3A7odC`4P7YyME;v7K{39)Kk$CkNa%-V&DeQjQC!t zVW;6^po?C**V~3#xeh#yQRiKTEwuaLH^NGxAGxHj-T4-|A;{zn_imxx15fhRQ4zG% zK}Y*z5j-@2C*QVv%ghIP(z5sv(ua5VTjbpwn&_`vX=0xkN6CYq)frC<^>?<4*R>FE7(D~ zKj{=pcYJR7McFkq@o*huo0b4z-r>_qgC?YASL`R#3eB?e?!^vgh z3pNLtr17|)Ub)<2KcMj$S{h6`53aER1@3h2dJxTC_<-dimp*4!VbeWyI;X_GkWM64gSc&9IN;fw;W!RjVjtHO!z@d6xy(3PY5K1Rw z9B3T!=x;#FV&L$1oo!dzNmf?a4_1SJmAXt?eojSk;BNg|T_D+lGqMhKzFb`^X^`QY zI|n@5od(QC9Y*uMW8W(0nOlbt3P^@$$VDfXs70NBMbn@=@$4~nqr3g0scii^_5gGA zrhBOE_9(!5*sM9<%cRW)7{HCg%g22G5o*chMVd($TsDk8!ZT z{e8WmHmTBwzS}9O)3kcp1$AEZ8JdyeB~O_d=Rw+p2r~0O%d}rz>CA~R3T&UvQX9BZ zZ8fq=Cmm*Eom|OoC^AUoT4wst4ca9;wKjDn?%8$%m{@D=*5`z~A5PHd{0f zdy{!Sw6x0+cC|Uqj|0e~LH5cg3t#wLA(y)9k@T+8pM|u9Sfm`@vz2tI5MX!p%b9;4J%Jf!J>1N<{_6^y^?>L|Bz@@*_ zi#6LEM!~4A_ldUt7!4S53KE6oE4RrSvLM)0ls*C%yCvv zuVqWKys3{lIB#2?vlqxm{)9as6`p2|TDc*21{o;l_pr(tF4WQw8n7)}SpVTiZ zE379H-ph^WKa_q2M9_HP8zm2#vLhct zscm%(rMK(N!lQyIO9k)!+_9_#TB@BN;Kg*ph0QcTujLR;!}Q~kGY%XH=d+{E8uk;o zeG<;+^{q15Y7bvB0d93SO>ait@-um`MM!P-|iQ|_QJdUS3Pi;i`s=fI9eD^i$C zxC;&cE+^CQbk-ht&p^i@YMPYAGfXPeRJ3)7f)Io>_=5?4>F5=UNp9g4<+tQ zWoK7;lgAol({>!iq_;kFzRHbm+&wI9MxC!gPrjqClUT0;S~Enb)L6I zkiIp99u{>zm0>4!#xwQpA~65VR4M3$`?jZ0`R(%9uKAP2iOn3!`-=~ zA)D?TOwW`t)W*tym3+b8sv2C2E*5M!@D0NSz(~8>u(X|iwEdi#!d-pY5A3+-nuE7_ zdJ%g#0y}Q(6~>3IWv%{X{54lmAM0K0>sKF21EzE`@DQ7XJgjT*WN2~XFuVK|JU7fE zvv%%cj)#zuw=|MkcS&XEZo87aDx7)_@n_XPoT&(NMPkHUrj2o?d}s{zo^yt;sSDX4 zd)IS#EHg6zrm+aTq6f>EBkdMqY)OXm|q#k@B zP-kc5AZe7B3U?ZER*pGHbIKKDhdR%8OO=*R!Fvh(*{?^IH1Is`R_v|fMqH5ut6&uy7mYpf_rrSBt0?n(> zp5k5G`wJQ8cN9|Na`-!qaG?WtyNg}nOId(AZ$ln^XYiJd{-@59Z97Y|e!xc%bzb$Y zg>=CY{VeKSu+~(%a~&AWT5#;`XGnc4Bd9y-JpZ9uDnE*TA9J_*&<3gXz+g(poboI! zTUx>3r;R;qWSe5CA24C#IniX<{*`op0kCE4RzBToz|#GE>3AT?s>i=oI2#krB#%o^EJ-o)Qi(A@Q7mf#lDrp z?$G|^SgA3%l=V0lIy<3OfFAzTs(_A ze=+JjqS05ewopO4Q0H^4+DNORjf_NjipmP|ES4zTa+1o!a;yix$3A>sCprQ+&xv z{|{cLD=quxPpe0}(AY`GG#Alt2oa9(q`oz36c<5f|EJDBY`=+Xz(MJ$q%SOz9Lo}= z$*FjcM@P^&0|#m8G#Ap{5k{*0W2NVEXPS>bKzVJvw78`UeM<|b$a`*52VnExk+s$` zEM79*?+%X$`1zVGmpb9xu$~0X$^Mm6;%9gi;C=Ia86))>gp92&Ui9^nxg@xQ=hM}l zHjmjaW;KR)^aQ*=17>R+`v5bEbfgsI(NCTVZ1aEWe8TvN*c3g2FY4TNM4YHQ3Hox> z`Qb4eu{ZF=W~lSP4dcZ_;6yl}&P~Qm7CWdy=@M|!8}W8x#XE2rLf~CC*+=vVg%9L2 z@DJO>i4N}Y3x(EcZolQC19;%?k3k!fw?*`==S#-m9oe@#D8BRap+a!KS1n;;pFg_k z*T6AiZire_A6kK3VX^k981>$pGO?=~seLVWL&oI@;GY>!o`|yXp70)oSA+3+vGX1` zs+tx-jYsbi=OIIUz>zSTX0Src^l~O;?@)T1wnBUZoOtokU|{UKMR&;+zQ1zx2}~Td z1sS#A^~&Jx73|?jyFIZ%@>f8W%^i%C4$o+rnT&jOvJOys7C+htD1&MRVsK^X;UiSQ< zX5bzL6|O;!m>93|sTV=zR`9>|Z=}ibg;wGv@Qvzb`Qi8FGz55Erwa>nzrXQzK53@o@Y%#2k!7h@W3xc(xSG_xdL$E ztmZ{f8g8d&1pd)%38=n1d9K=|hdmdiXg`%=^d_!?CB z$Zq!flR@o5A>M(O9n4V^^v@O6ttrolHgTP-jEp zG!KE}ER_d(y2H(e(Am zLT)s?vfE6GrpDn(T*YZ$nh!3=)4f|c74(&DTB|9k`$;aej}NuQ?&0;a8{B{=-pKRB z-M6BetA7ugHE3}shc)8Y9`~l9hm@EXTJQ;FUi2R4^Tp+Qe8bV$D-}mlE3=;*r*R{# zV+0NVdXrm%zQVmAjJ&GzxP6nHNiGW|uatZ)^`bMqy$MZY^*!#*a#wN#k9qRIpWMbM zcRH)VzPqvoA3YDfn}iIHOYQk?ExgIi*_V18(&JA>`_NeMW4NBh+^ZA5w8+_=Wbzr@ zr(xJ#;{DmJ?JXOR-)D;`)ERm7E!7d!g?RCfjGuOMZb$;i5hIr zH(#fqnW*!T<_qUJE3rFU0q;@uZ+q`2HJA<3)XM^2Hgkyyo#?Pb49(B$rX(m1%sG_&1 zvwP!T`MsAZ$Ov`r)xuczs4SdzO~hUKqezyHpZzoTgR2!?xkh{O^FrTJb$A9BX9WK= z@SOdt61a)*%2tktr<`sE_i80}m;2z!**c%|T?!v3>?zw_xx-mkdQ(mi_P!mzag^ar z$~#e{9NmH!R(g|mY!tD2-S~r{-jupaiG0w$eEwea0Kh^;v%Y*SbUM~Wk#xhf6YsqV z+(kUk!uOwCN)Kd?Yr|-A<8scetuqDl;Pjk*#LeC4Ov}r`DHj{?iUrVV#=^H^TUWlr zY@7k$L$s_L%wHJiNsdq9YrJPP-?oi6eaFvTv0BDE?D3(pD_%6*s3mU&U(-v_ap_sC z;||Zox#8wQO_F_NJMrG6s2yond<)BGTOugyf9iZG=z^FBY<>ai+%CGm_@N(s<5B1O zyY_3&B`WCaYUm>l*VnYeTssqW<~tURnhtC#0Chg)Zy=in-xx>eO{O(Yk%j38Qc+nn zvSZK6VxWU~KNfn)jde12r7!K-qo#fnx^U)lA3P)AHa{4_wJ%2IyT6L2Dd%#0EW9Oe zMp1aRf~)n1XFL2P74MdDx--2gBm=sy3mdsdz~!va(>F8Q#94mupyp>HY0a%vt`44o zE_M-Qv&@fcg!`@xI8x3&8;+`+sJ}%hg$|v~HO0&#-VLU=G9{Nf+LfLta6Y$M$8G1_ z>BEgc>f1DnM7#*$H)f+Uo^|eN!*TJ=t(9#630Y{XMllO!$1mNV(L_!A)~M#T%RZQM6S2lChV=0XT&!4UgUR4L5FLZIHSOW6sIETeA+&7!BFr7 zCPmN(lcnM-=1gJWhj)AEFa9cUqM7J7(i20)rLNADeKD9^=ByE2`?!)0G(yUQ*<$Zr z$UM)7rZMoEII9n~I?x^E&wVNG#QD4p&&NXR*W%AYAF4R(g`7f-xYfds`lh*4`nQSV zLiils2yvl0RSV7MiJ_De>-bL|{RRzw=l@gZ)wQq1^?29kq0R%|?iBruRdgP8wn*41 zeveep3Do&m;&HLn*>EbE0B`)g*Ts8=p~x|gp+-ACio0Xv)CP5~Yu`fhtqGt{53qan zFqZaS^P}L=$gey)O4@JHMKp7# z)yo1Yx4|{3uB|7X0atSUv)9rp{Jkldsgi0wO51<~{Mh70*9$I7Ef&Jp7n#w|Upq@B z8v-ao?Lz9;L&XNu!R?H9{3nlo&1GPl|5N9pV~OI^^U0KfEF|m71LC-pWctt({`{Ap ziPaAlQ=dWb-#FY(YE_&>6+`2wuZN{HG%Ar6n89;9!BuMUGl6b(j6-9t(F z063)GEybUBnRisvNDC$4m7aR_zsd?Up)bSEd>U@E-c zlFbS5pf>Y^Xi!;yCc^*Woeyf)!HTs-pYuQf?;+fl8PD^jiRk0ypLq5G9Ep$M(DeBA zR2qTj>MM3wqh8+>2SMMrb&B&pdGv{Da1XV zdVp_J8hBkAlLB2Vuy!JD676STUC%Pl|GaR_$>JJ2e>j?BL%_3s}Q$4nhXg66_8053r{x(7>i3gZyhg zn~B`vym<7W^N+C#cu@7#_xy)Ta2h+nJzjtFzRK!Wiq@#}Z2dU8cIk~+iaM*1;bppe zfYjvSVtD?*m$;q3lwXoW%gx~vsNN_!B_%@3gPgDMd}*8hBD#V)M_(rULsy6g|6dx0wGe0H$DiO9Qw z2i>H@YgvluLt~UmdT1NS#4Jzh&|X1Ba|M=r*`4m6i=d0MOqe$~hMke$I_K~RW;Du! z-eTW*XwY0{y$RXqz&9WNie*9Ar-%u`)coFNRt!wT|6~wNk{D}-zHi%2c+vX3VFf;N z>SF3otww%e>#v1V6mo9J4h`0cbBmLy9kRyu**20^qRvK! z(9ySBGEprA-k#+DA^&)@s^6{ua~w z2rtJH@NM?qW~;^o&^+`^^K~w;kM+O<84pfKK_+{JzNM@+b}$efe^}+G;BbTKe8p|^ewWS zC7NJ%&_%Yi%XM~TCUoB5OZ}}AZYs~v`Z`2e#tByH9 zLuP|H$YNI`txO3{lpVbEbDLuFPb{mH{zMO#ihV9H*;6m1qo3w^TL z3iRi#^_0}gc{NLY=S5d5BFTMZ3OjoQ*x*j|4PUpi{6*k1&VbkFty8QWaP?=<=ZxA~ z!or}b%6}3}6I@O(FYszaga2qHl5jW8EBQ~&|9_pk7HkqXTui1-dU14dfss_SB$?!$ zkjwTXS{m|fF?r*xF0(!=4SJbGt5Mrob6-f$4<(X4?#lm1)mH~ZwRT@CU?3_gh$5)y zRWUHIVb1ex5eyU+1H`1eVd!R<8AL@v5j(M431w!^7$|}r*xlWjsNeG5`}^MOU+=lT zh_L24``NMfTIceci;{6NdV;v&aGz8i!36j z<`Z@~M|RWp=o3ylo1w*EWT9%qzXGW&eyW z-&4qLAN+Tc7Kkmo!`pF)!ZOtg0~qkMcWg%ZrWYX5>apOKhC zs_cQ<%e^D%d>MF^hQqWUE=SP4BGjr92W@VL2y%+TPHtnSwfPDU!Nw_+8{0*D3%fA$ zh9}dsTpeu(%!~DVK})djS@9xf^!@H2=JzQV37m~F8PJW<6UC_wBj9-j-bnrVVkA7x zkIec<3*y@Z_)4ArbC3QZU#^~pysk6w$?rKt^IoAOjS;j9N*8I;o+!x9ES;)r&uaR9 zkdqDW$41$W#L$W?iU>a^<%O9YwHm~55i|SKi~4A9U|+ir-h~GZ zNSjz1Nv}picjDFr?P2ul0$o$-M(PZ0mLihoxTI3qm08+h_kdMj=oWcT)GDjO>EekL z%E{=XeL4twZnep@oi)^s9fvvX#U$F%=?95ihr5KhdRB95pzB7Q_JOizh|Po^iAvbL-) z*w#ZzFFqmP{;sd}jE|;B;2)=GqxHNTMcSkAcmLj1yEHJ0k`U)FCl1mkT1U~uV$9Kc zj?@-(kHTCM+G~QFcJo-|&NtwhelS4mik-@(_@3RZBDK}f7`XZcGYgv#?Sqk#l#N`d zbN7kbi||C2V;{T0+m6}=GI*_m!#2_6k@$RS7Y-p$f7apYL!8x~14y)aUI4VAXAJCppIr_-tf>0;ZXzjK*%dVFk=SfNd& z(NEDEDc&r8Xr4@|N8!`4Of80h`>8~ZyQX4)0#WtHKxIAY#Y`|V;B^=S=Xq0Khh6WFh^HU($fb&S>> zaVD`R{IFbSYC9B1k)?S_Ss!M zwMU+VI}L4KVYrocfdCKL*?3=UUWzlYQ}#AGh1TudD`xve(3+LW=!4G^Ex^iB&2k;yJ+HLl)S3hmRnSbUs}Y^A#?iaA*vt6qm1qsU$1K!2c3K_n!cH;d z1r3VyLPM?VFldV*wlD47Ui)Jm_&>-M=Pm7}^&ApS@&IVYezeuL!aQ(IB=oPm#%jNQ zjG`k@pEyTTaL=aY>{+if0xEYoy{`3fj@^9yBIn#ljh*-V}HoRI)1f z|1=Rhyvm~Gh%L7|NJQ6tGFpu1&|G&h+cT5CAU+%Q$rRliW`F~Z+UMtD(bo&-1!ucR zwneNtjr$z+(Tj^}@ik_xpFd#dsQv}NEU2s#)3|PEqvB7QW&2hH9ml zYqiI{KjqOcv0g|R>bVIh6-8%+^oB_ z5?{X0qM`WtTecY_E>X*<8L&05a}%Q@GN~S(f9yySPn%|tA-?9_{RLuN9_HuxyRi$_ zi)IZ{kViqQ?L&$9WlbV&#lNL!UoCDbiKhT)yAAJjM~t(LqcA*s8P$q8Cb9G!U*puU zq4tvyL)Y$C;SXc8;WO)}PktV=Gy#B#lb_K=g5jtztl*S6l;AcB6zFr3e?Hrg`- zq|{_wI<>vUwS&Pwx#p5i+kA&;kGMq9NmqOynYmWlAN;#9=@jJlK->UcaiKMQ3RbNa zi$7y_kAHW&R4F!sR=`T+SCudQ#gT{`ebE=XlJipImnfwfi1WYC@M&o(t$=RHf6w#F z*Vk0hrAl(cyJo)ARC7nFq?dS(iBxF5+*i;;;GgAkSTj{$@i+b-5`Ji`e`Jvf@E@w* zUMxQ&qlt(!3ujBjb2*vx23kXHk4_Uqgbex!oM-05i{_7^7l@xH#B84EAAtG*7*0uC zDGqOmoD>+g0guifyRG^7UDoJn#YW&|=mNuUrPh)L~X(S22`M~@qqDOETS&hKw^?0Lbvl?8Z0q8k6CW#B zzF?u^4dASc=b`SS#B9tMA0wU@mmbs9ivrgS_tbA}n;|#(=N$k3uYdYT%9^D9Ii%L@*e{#1DMW4g&^=lgzOfj(_j4{TT7Yd}uJEr#HBpmw2cf^#8wt z8~G|xEF21rqFQLhyXA=e5603(#M{0{3&o0sF%Ws)5aqa z6`l*98i`Kc*fYYj$Ja%gPU!jl!g>0QY@ZpaG!Q@Y@8|!+c~WViM1lO-4%jLJ1J%Rh zlr$c(QP<$P`V0Ecy%8&1=l0h0dV@X^&TWT>z8anLS%3F2^7IyH4Dw`j7BQsduWg!E zER%fk?A@eNbNenld-3%S1rIbw+d_9A=bvTQ6K#?2Ou=Vy@U)>gw?iUr0sbaiI*NyT z$5Yoj)GS^5iS|2UNrJup%Bgl@BlMS6;C-xho-7t@kkWAEDnBg!#0Cwd#Bp!#_?#ei zT8^3#_*+IO#WwIYOMisg^H-i&-yxb>;rXxKg<=aebSa@HnU=FyjLZj@_&(+kPi5k- zqHuZ$Jnc)tZ-lPKUfg%XcNvOymRM z$m{UAyh|CbSr#Ux0DNA*k@ZBMpyh=>aUMO)LU?pkNfP|-ZPQ{@mvIly2DW;d;p#P* zr;I=x=sbUg`oKFmZ9?o_V{}pd^FkI4L%fY#tEU-}FQe~xE_Lmw@c_<8@%;0%jppH< z-#tIvkM&(N)yDAXMhxHlFhbKV6J7+sf53f(W_xSob@)s_+$zuv?Ho^`IR6>ajhgh; zu`~>4URGM7S&yB*>Bz_GN{?&Q`BG~35&p&Vu4+EKM-7fMUq0c5W}*^a@W4Nz(=Uw* zoCl9L;Kn~~EJn18ra-CvKMX^z~(3>NsG+q_fL z2HFo@uR=3?Sc;}6bl&y=tBG5uYi#)+`&LmZPNTjzFG#gkAY}Hv3 z@KH`%aA$?sG?6r{$)YcaMLn- zL2Z8PJM^7Ko{&s?0L`9nm_bB{lEoB3qk(zmz%`P@|~Zs+M{5+!E2IeSspXmf0D;ygPo#r_oh z=%*u(UY7MI&MWL!2rJO98;tkbHYifyX-Z1P*>hf>D_lbVISKgq?<*FXp}(;c7+xyA zC)~Z9MSIZG%l_Gzxh$5^B-~{ie|BOsfO9mS-qh>;IG?@TnYb~C*be9)mU*#g3+RaM zLF{w%WK-%wsn<5d^R>fSo;x@oi|{qFW5UHCDXk4dEdW3Iy(ZurI{%4tdr!5nw^~Vq z5Gzc=%LUU+CFSD08K!;`E}{Rt6m{RXrhl=0U*)tPxUHTrfgQV=MS1XM#3A?s+;`%K%c98_ zcp7wd=hMeTgBuR-;A3GtwK9r+;OpnVjpmUDBgq(l9_tjy&!UIvhnTZ^<|w`;CzO8S z-LIc*!cCikCxE I~m{5d?rkONO`bCTIYGp5nvG@9*xnPr$jdjV(F(!GZ1e}Kj& zYQw0M18nfr2)ZAFT7Hf#D+9N^t$;cde)Q(x-ySmh6KCbx>%tz)tp?yM)hn+R+Mr*z z0r~CN+8)dr{f%<;F&zDTSTFRE)WCL`Sw53p&!Vmt$TueJXO+NtV`tP;LJgY;oQ?iU zr>IMx+0$$36xa!M_n~H7_?1c@fd89m7CZtv!RK-2+g1+X6J8|Ha(s>^ZAbHjm+-Ad zY!COC#h1FH9z;BuSQgFQtYT;&-Zit8a=v3EdUwF>S^a#z1-0`pJinE$=AuP3^~Kj% z7H{Np21e01ybDeAi}=tz5i|&AK5BFUZwaj<8{BKNUx#oX>@XUmXIPffpMLukf#?d~K5us!hNQXrL)~hweuoU&QJsx;)=8f_kzv zGTN5Omb*cB5WnZBL-%Y3Vul}n`pJh#B%xVedu$G7w@JtVpWYWy;@LQ3Z^GjFK zX-+r17p4Pv9Qux%@L4odjo}v4!QH?)&j|PC-)}>M2cM&rQwnd7d0h$4cHE$O{0ca> z>u|RF$1LY-+G1}QXWKJwD?e(D-Bw^&F!CU8G!Jz&uuXG4#y{zPr2exzxv<|hmPY?a8}3Kpnte$ zHaBp>J{_K&ivsz`huAUi^4qh|mv4eLc)z+-vb#BqtHD*jDPs4M?PHg42AV=2;~V_w z&+mgiUxz<&&I@hD&YlO(I6v-ocI?wUB|Sv^{Q7+^Tm4o6zaYH-pGDS1S3wVe)z5Ra zY}4&5n$ZXSCFeGO<80O+=hh`$T^6!fy{2e0EzRxIVc5cYt|{dp4Jk zNTwpZ3$}fh@lQt+=n6i^73a3`Z>l&Nf`50@G!0*78B5O)L#pqbp!o?u`t8q?$h_pweqBxv zbJqVNaK^nqvw9NymaC+1$R&EDEn{`>6*L;}`$o-q*13U#J^-sqlSW*N{<9fs(wRQp zxDU>=-4NVIJ|nr)kWA`46g|2Q{`|pN%nAnKv&+ij8R*CQ0`plTm++Cc@O46L34XkV zdxEFG74xq)acbTk9IgTQcSklq&pnM|DFiV@v+6M~zbqvQ&bD&GCvGzfJ0Lj2_lJDt zdq#tsk36}>{bziQ96DpjT_+nK;UkcbxdL0u&P#Y)2XGPFA+PQq#?LRuJ}cg<8>eRR z2`l~R<;zsMI4+Xc6@Z_J*-9%989#h9fR1A?^7M##{EKN2ExD9RLys-s9;<@s2YPVQ zux#GNBa~u%u#2i0&o^V&b8kcNlZ{uiZI7X;nTMTg_|f}fuGN$N#JTT=E-d+yl6vEJ zIg{eag7TDq^NTF@7csk91%-D-okI861@!CmfR*Q8E&05==syG7sWtui58Q)(LOQJ< z@4_<&Wzr0mPU$P-`SDZm$U=|t#+qC{3!2b32O_VoS;y_MJJ`|+eb;)W{QXAgOXIG5 zHRL1@D2$_D$Y&&r?s3asF%*T|`=>!I_d_nna0VVk)NxzKC~A)Ux#6t${6l0o?LLY* zNZnc98kz=X=>H$cSjQuv8MPYu`iLeee8)8SeO$->T^A1?2_32(C!v|#Fp^Kt^`pa= z;nOrx#?2M}H1r~LxZ3CPLE8don+kqpQw#XAH-Xe-K`Nz{7Vuf#!PItQDqTCGQ)6vBs{F>d!vE&cj}8Lk)1odpbTMlnq&= zq+Y*c^5&ha@Uw!J;q2|td&T0>uQLHwwPvQ=>RuMD0Jb;x3w$APUT6nBa7$0Vc0eW- z4o@c!2N|DTh4+APZ|+^fSK;opM^AFT$#y;;^ZehvAbIv7eyRYx6~z3A4p;a%%&k5m z_xtAdir1^eZYyH-<&j@`=Q+`I4Dq3|^do-(P0E|+q3vdTjeiAC*$nxBx!yM3{#5|= zH-vW6a~aQa^#d;y+Ij~)_=xfF_}BwY@~^?XPNqDXB}-kk9Ump zrv#i;Bg+C_1rFETcwjqj8Ry7DPTInAfiLC-EumrX0-m$W6S&=$5IQQuZityNU-%H3 zf#s7V*3B>(M4-{=l{O5Oj&d0(wHE559xKFH;&N@H2?0`x_ZgS`kXX7j%) z=qO@E{K-$OeiQUM5EG^~@5rA6XD?toyoCe5h&tuqNYvo1te3G*HnPccp zI-n)-v`5V8Ip+kg$VwplZm50q@A4s`*quTi5|s0n`@>W2 z5kB`1C*JY)t)u8U?zPbHTYSWbFxtEjGm%|;IKK#gXT;L5Z%Ur94jik)(5blW&WoG) z(x?@fEB)}|xkkR!X)WgFXX5z#t?->$4_;rKg3Gb*Q<94u$bSLf%lt{l3w3gJ0e@i| zK#`qOsnPW%{04S3U)QA2vDtI@MChYNN2Ji4^s#(j`w)8f3LMK#XIOoB$u*u0u1?kv zp%O98@n#Y|C?9V7DH+^q_(=XY-xxJ;5X(fq@dY>!sGr2fuD~;5<__mF=H5a{Q*hs1 zJoJs7AEco9l5~1~v=d+1RSvHQ^yqet;z!?tS1=Z5a&s8ZD9QwH1^vUxbNSS985HK2 z4zHuN`~muK&+)l*tS;dW=!>QdM!$X6DehSxyD4~IVl3|Qd~G~>gvf_SJ>^Xf#86Rv z+^0`(aQ)&)8iHPdmq!WTzAA(g`$1p*VGcKQ3!wW)!1vfUi*J18OLp^9i5t6e1F0`H zo0CfWZ36lAH@?&o@4jA#1b!>Yj~XYyE97VfH^x1fGa{A#dYj4hk7I}HEBGaAlezA^ z0CHZPLZ7O<_@tmf>O27a?G638XJimrl_Zl*_fKpBv{rJlpT2UUH+zizGLN1A;5lwI zc$n7E{(~QVd#hmT4bJ?3ah`n@I*P#gGjP^x;KEL={0HYtifjvJ`nn@nxz%L!^&0BhBK<5@U#l%d$5cT>~ z#FKHy7V!%F9*Ys%%i3(>5ezz`$Pb6iFXN8g6Q~2;qt$z~+%OcL*tqYUb{^#0PDYU{ zczPpgEthu=BkkBUnsqFmH-`R3=Gj#AuI+g+c7mmHXi&%W=6P#;>3ICP`aFn!_Ji+NhxM%frC{19OM*YF6)OPF?GGi=D8)qKOA_>CkU#w&wq@ue z{NMBM9J*V+Av+A5Yk~95P1dZ>>VI%f?GVpCw^33ca9-}biIv(b=qzw99CeA!vz3!B zVnx%xbaHo}cQ8cyEu|yni4!x{yK| z#2@iOChrCP%V+riik~m!i_)M!hxaIV&rh)1dQqu^G>44*utO|L^OdFMeBUs9Kb(K*oqjw)CzXETPJG^SBro5dL=%vE z?3g!$=T{|A8tRu76#+awC5{{spZnhN=bO==X?Pud^`DcuVJvnlW6={U>BVbK22)?; zX{f( zB$19fFB0s>hLK5W0_9q7k&N-jeu~HcaQ5l`C(cQWZV7jQ^LyZ2e&~s?Z0$cdkLc8z zE$X186yWUMbr`!kK|#%tW4zUiUEj7+7f&o}EQk{xpO&)qD! z>w`F&fZD(HSxY{@UJPBr%tG&u86Sn5SyusW%#(Wj;=vH=po96yzLRW<2|TCr;Db|J z#5B+R5L;4d^}$8Vy}uug>H__@geC02Qa|e77<|CHSmy z!_t|@&;WQ&!cVlvc&2wRfG$H<;rIt5cI$B<_4i4lgV)N1()qzOF$=L`uB{L`ER3QP z6EF*LmK1nJ(-rgo;e7k$pT0|REe{L#f%7}y+|!^~*tqT=oMmmV3d&AOQUd1=%^R{w zE()>&&P^Zv#XMZ(bPTv{675->brxj<=e#pM>{@Lm)dJ^49~rx_GlMGd=Mj$w!A4BJc(qGbElY5Ys*FZZXfe z80z~Hej<5iS?zQ1a`Q1WknLh?QZR#ViTpV>huy(GROjWm6Nk)ZS{HxH0@rSj{V*1c z{CR%6RPwmSSutu8^|utdTr4nS6Zi>gQmAoEfA(XkKkat~@AP(i_O=H!(kr3)w&$zR z@pJ%nhX>W%ZF_}eXja_D-uu*+vxS;W=rx7mj*Gi4skI5CA3h26X7+PiC(Lmyn*9%F z;q#w3uhMS*`#iq^&b^N-g~Ij!;QV21zF^-4b8z5%ym+e+KV3m%fKSgBl>*H|dY@n#PW37df9|s&}7iA@yP3Zd$8Myz}FKS&7+G zn~|){2zO$8Xjw$HX98;E(d)q}t@$QI?eeEsoM%mwOF~qJAN^>J8nE4IL9rG(Kj4?H z@Td~x&?hejkMvZfT9~xRpSDg)fv(d=!4CCfyNYC*zcpQO5YbaIN~Y$s1_@_Q1yag* z?7eTfBk2K6C!a|81w^?@UO=CFYB)5qzm2o~gdX@R%m3j#dB~q}W8LjM;WEziYv3&Z zI#P(*@DI+-!UhOc-N1_m&N`_B1qXKp`2**iZCuFkk&_*8zFRU*XfiU3Jb`E8X?J0t zp^S!2M4sGSDy%-0LCbNr>lw*~%DK4fkmH?bnI{-*Nu^V$UnE~w3FhdLPC+g`V#Rjh z>H0)kh#aqLb+OPL9*IflFTtNe=mSsoC8z=8*KHM+mO=As12}Ir3xsWnVbsYIGugXd z!cFY?8Ei#wUFa{UU;EQ0%#AMl83|$Q{m2+NH?}hn=3|dx!P^wd-q%Pt0i0bA;J&-` zT{3C`Jl1iZUtGK@>Dn6kb9FK`EZivBvp)bjpviRXnzy9Gad^?rf)1*0Ly0Lg-`dPc zq;my6wpGA+_2PeWjMkpf^w2w=cK_=~zXF`9|K=M#W~T{N!1*O`_K7kSY>NKD*|w)v;)^U;&Zv|xm=lrM^5+PVlsleIlm5=R+30ZUsI5*K*ebCWNMvsB>&vX0A zW3OjWHqLf}XsRk)fxZ-SydF`msvF>AMk1H47n!Y^GY7p6^gwz%FH)^Pl?a^)#A>Np zr4PPtGc(L_uT-fb!0EpJ6TUg!t5ka6ANEJzxE3nG?e@b1t~X|UHp^9wDv)>Wgg1#> zhU&R-0Qun_oa5=Ciag*)Z!p_vwa-QMev2PTK47=YbfW4V;>KAKJ9lFpR8Qt%C($#7 ze24T_tyO^e5ri@kwChUh#aH3p!`#OFiG~ozut9t`In(# z^y@6NzB{}=nC=aZnHpNA|N7B)8Stmide$E8iI5CCc;GBq??T9Pr@t!BY{CrGAI$4 zcT4wI_uPiLH||7_IZE}w7uZcfjwgDoQ1hM0_mNBgvfHh00e)o}?!*gCMRjEz_Vb zawk=LoKkuyh_s#^o+0&vd5!u8Z{O|Yx@ zE}5dPo>4W~8bEmylj-%l0#!fYTvP+bd z`&%(R6X?;ue)Plc{)w~Bsqw-N;QSmoTW#JgS+WuRI^=a;3u0}D^;Xh;;C!}th$ivuG`F_Pyw={?b>5zBsthi!;e4&WHEqZ^IOH6*x;T ztXE|x%gGw|+P7=<)kplYs0rdj-mre^#x^p#1Dy9Ynx%gHBZGqRJZx%~x>W_@#(4Cd z-Y!!wM!&oYxysyv-Rfm8lgS<5)AMbGx^eF$8jV=(v-zU>rf~x4Ajf+(>WVrVvz16a z^s*M7QV)g)-}{~Db$IPjyL&=I-U@wqarZZ7%55Qt*fV+G$xE*+)jk|;{5Xczxk*G63OCUKl&E_ z|Empu<9zOnolppzp8)4K8TTb8fb(~p=S$z`NG|kK(sAHiaa~_x5~ZMzzt8h6rOlKK zIfVe{CELo&Cx>QHG;sd4!(KJUPDa^N(1*XCrvkx+0`P1crB#KTMGlUyndkpPRe^ch ze*E1@HU{cA?1j8W?jif$QN46n5;aBNWkPVSK}Tux2Ug{j|w6;#0{rK*Hqt5`O{qRuBsMkRU5YY(U8G7&wUQ4 zIvw((%{}ln>b)veSAX!+QmLV)NL8Hg4}HNDdVY9;>Y083^>W9q`90S z((NWVL}$@0VA$(jKjF-18TCg^a&8ifEznGt?=-x!<#?LQMZ zHR&nzRfLjdC-C-?eo1_x-PZ#B&$%U9$?5{=8lewA^VbSV&@w;TqlI?~5Gz>jYzK0}E%>w8Id<>gz`(~Sg9e+R56uQ45&Gy5k zK-!4?^xwF>EkMt|Z!$d_P_KLl>hAu~y=`|Pto&y}G!1u4`u~3Pi|YQwd3NYbVKs1m z1f2Jc^bwu`=O4g1cc4OeFhEJyfb+PRwZfV>1@!{XKIb*UjyZC=51cJEH-%;KSu_$D zKFqEY=1-8(EnsUO)tv2Un@Pd0=u1EEz&_o_*+dNKd9^PK4+Mt@cjD}+cI??u=-4=5 zCTlj4H5&)tFw}`v{id?Ov*73=mp(JknJKZW@)Yrzjkjed=SI@rHEFanzcn)ehjXbZ zyf8|h35R5XRDU}wDm34i?^>U4{5jYRV z9h9`>l5pMz{f)k;FI*b4<1z)!#5=y%CLISlvgUbN?A70 zXLne8ibSGunf++g+OfcPt`57h8}k&@ zkD+dt1qXP9rT$Ezo)1?EODZr2UzMNO6t)9Gw3>v5W7W5rJaytJZ-=x z4ONmJe&3=`{aAVmc;@JBz8y20ZC)TJN8}j2#wnOf3i@?!$gwx9Vh1M5=pC??H7Q}+ z+GJA4S>UJ?oMO*!;cKTMug-bMetV%O;QS|>|A5~*G*OVZyjs_Uznla=KJ=S>b6fJM z773(9j<Jd={IbZ@)Bg1p5k&nwPi-t-D$> z=biyH&>8i3(RabII)Ex}CX=RcyI}DskY0e_b2NLjFmr7%z0}A3xNM7Lf>#&~FHfR= zew%EvQln|hT=aSW^`oD(^3U^p&oEO6tWuI+OYkC`ZwjSbm1Nrmz5Pp_*#5yvT8z8t zNQdcc2I9u$-#ra^4x1{I(-Opi)$_J6O<)$i!&xmmahwewEF%YZ>{FOMV&gxe{|uZR zYwGg_`_d^4XIKnr$!EU9y@WpAu82-N5c{c{5Q~x?So4oh66qs8)3|4xE4n2>p9Hhl zZ^L=m5$xJG#13hpgsj4cN;~ds!nLq7*gF9|&1bfsQwMh>A zJsaDy)8_+7r(QA*e^HOsK%*=zI*HoPTQ0Ohd{+O2$NJzV!nY~Vaoh;*TE<%2({b1> zN=&5X|N7Cl+5TsIjw+T5<|mc38S}Uu1HK8Tw<$@B*my9Jv5y0l)D^STwy7CxcBF!u z0iTUWHZlqF=L=JDKklh!gI%*I4%pV+e#5$=9(3|dr}oR6aP#vS^d4vXg0wwXC^3UV zE^T|HA2*wqO4X=S)~VkPO;gTZ5=5@{i!*`j1fa#2ct$xDPzs#(DCY-ObLyPSU;-(Dkx2&M#p6=^>zT_ zHZ)j9+OXZX(Wk;LjoZrmLhYPjx_&N!JR40G6wo)@9GXC9TsupaMnqHUm;_S)>qox{ zGv@!sjU7j_g%t3So*5x$i#1?X+m$p5Gmhc*ZtM{5!E&58!(z_?{mX?^w z;=Xf>^XF+AXvPEEsrA$Okh}QV@mc$AoX3+g;n~;#vjf{D{Pqv%c!5*o)NL8xdRI!? zyfiu+xQLr~h@$hDy$)4p@^P!sQ*y#wJAX3&?FaaFW(wU?cjraWC^)wi`+c7q^91NO z4}xCM!e8$h*ZNUw^u8_Yp0g{#{&dSdi3V0&VY|8o(BYfd^H&tJiCfH_TWe9JdX_OgNsN?aGmO27=@FGmZxS>qj4%`)8eE@GM6V z&SKu(8eGl0ZJFUtC7nZ`Ve#TfHUN3uWaM4*C0m%TpW^SjLs)%{#ktF|-;Xo;p#it; zmqogM*j1U(k*gnN(rh2_L~jn|bLVEz2Hc6c7bfvKBRwt%^p9y=bj|N7CJh5T7}d)3SpypY$0nV{DA z+Jyz~QqoN1a$N(n*uj3N#~sk$*m00~c_=6!u_Da$9lJbPPECPl`zm9uZl6W<0>O)R zvgUy&fwM1a5R>tISYQUN#Qo?J70iG0ZKDw@#y-vB(X&!09&ssT%VKVI0a~qk=p*TD zcK&B?Bln%&VMe7A-4qRc(7Oeb*~tDnTgtR zT|J7?jUk84(E2bn0FM><$rEtrnwwCo;23I%J6%4j6Inoi?;>)}5$Af)_ujGeM2ft< z#tJ);u~dUt_u8mCok)zKR^UB4y0@j?Go`dT5I#xuKJYb5;LZIliE?|b=F%$>G_zF# z?U8oo1qlRQpZmXY;Q5uYG|?xGrkCC1=eEY+@BZe#zT@2=NGTLGVCXhoio!mK20X4tZ4D`Ku#^f$ zfy-`cM&qz!)f1n~46P-#O_NeO_6_R|8blL6Nh#h6J0Mo}R9Fb@vM}&}E;*6=yBJdD zpr0^uJZ*<2%xs*EXEW_-c*huW0l)FMT{mif3|fn?pbftG0Y3#U-{7DGni&zo-^_}n zTZ3cijIo>*V-LMA_6_#^>ql=i?9V>G#r|yJ!X@-Vaqo;SAHoXuDk%~7{x8QucA<}w zEKpNe#$9HeT@`c!_g#cpQ(nR3bQsuf+uEB~e3g+Ke&%VLC-85DnKTeFB%^B-PwtBT zGw!}lr*e23f7ERQQNP%&;v*L&Q=I|gbJiZ7`7nVz4uXeYRKbTr^Uu#WjjW2VadYcf zI?(~S@v%4D6W*Aso`dfiuS*}G2Va4{>Yh!8w09@;mMc=}MY1_XV%PG*jZ_-mt0!$m z-)t~=9i=yi()6|1r$`3ZE_D>?e1sm?C+K;OcP0o7kOh9<^3M|}(>|JZVqUZS8>3r? zBFVHUl|GJbP2HhQ<^2x+s%fQs`l%3Vjs2OEE*4yK2R;JlptBTg&V*&5)U70n2B+#s zG8#qGr=%!4{jVRr!zk$==UMt)CRBqbGprqU!B#Q0Zod+|Q{)3rSFzE+S%tfA-NU=g zXCnGY-pKJL81ZQX;QiXRC{AXQEp1vs7OUKB@daaJRHJ>@Hw#n80#;AD2F zM^^4q62WP4KGT%)lcVX9XDW4ZH-$$;6nTS#k>z9oy=QRs(Oa%B=|HVFgp+hs3bk5q zNN(@ojb)mQy^A{>7Zq)U54GcvT)wB)mrUxxt0Jxyp9fvFz=7~?d+*9D4tUe|*Z3^o zeG@jf_oXc8&u1?*Ku5-(`pl1}y-#(R8a<`6c~NA0b+s_g8op+Q(EbRElGxObCezuG z)ZoHDe)N|ym;G-V7h^Q<1l!ynBEy&Y3)&ene`~)r?=|#(TV~5s6&7>>c z>Hc-ZP2Fb#e?FVmR!5T=yCqmP^dKXg^|e2ZnI_MZuI<1seTcxEoV+Ptja?V81Zjvb zsj#bW8|lZ&UH$2`Sv19dc4Yg{1yaNI*gt&uP^jz?3eBnr8qoHlAyJ7Yws%@zYfl`Icf*#FjiHjq#?+=2Ho1guA~3_7WIWy=nG~8Ucnv23a9Vw z_?(V%%83QP%hHZ-#Xjsx+$r0e2JltmGBFnhPveb}*B-`<8+T~b=9PSRC}#f1E2c&7 z;|)BMX!vgE5`)oC;*f%|hx?ZkG^xik#tcraiL9~iJi#;?8hqW7I*>ELsHKCqPs6*ZAk z*;;>QWau{Ii`vhgL;`@PFdSldg)%&^Ow?z0s zfhX^Fl8;5cx%GA`I6x11{E8S_ihf$%x1YTIad@rnPN7B426V43k_-(~=xMGYxq>4~ zP2dUQ*O<;2hL9;dDePK4;LDD{^R^#+1`C&Qg^f2AVn@rd#+s+PctDo}I<9+4n3KIb znJj*2^@*ewm$mHuUQasa9ZB=oKV`?0ys2#oF!a>nhCcAKzXFx-|ZPhU(ZMWah{E4 zcNdKBU}q4$qf5I6vQo8@{LyDfsaeG=5jQ%_Mz8Gw_&LKBbO5p9eRLa6&E#a3f_zWP z`1VaQij6}(GS!FwXrBqqWc1|*D>%!*`9+++#8&Vpm6#`g#D0f-FW1e-ywwH!{{5M2i0Pqt?AfWws*2SZMKgf zuc3dRqkb`>Q_>nCwsO z#z)YS`d8Sjut3`PD~v*Jh6(Dj5c*mIe{uNHS9}a2TRZ6d!;k)9Q*W|>kKKRcMt}1k z*u}%{58~%?$L?%~R!Q}c>!w8)FhAhD%QKy3yuHTuas@2_o@`wUK37jpebUk28#9Pc zER<1rJbD-Rr}OfLnY3{hIQI9`c?kZVA@cAf_X7Svik$fpbf~&-=TEvP(k}Fkhxs1i z=TKAIp^lSny}@6|q;xGMh2}T?%I_YJqQ$3@p{b%zK@TJ7;3w2;cbieffH3IqB~o2( zBl1!~g9~$U#j%IHMV246184eJauI(P;YB_Vpci8~gSXQ0pikI6yOz=n(kPcXysiCCIt|i}SM&d6E-X zlvL6Qy|}p6Y}R2V-9TKGURJW946_yF7`dA(*`!$tI)zxV-n;?V9Vn+YIInvmEcyM* zGSUOi9@;Tnn372s(U)877|xXkp*PS4e1h9K+ylHe|Gm)Gn6ZWru7#fxwEfqQF5#}2 zRqp?sLbC$S@cG+NYqUwBR|8(~x!s|iH6Fc3?|S6eBZ?A)Br0>Y2avaaL3;9j84^t{ zIkAZw186{X47Dv)m^ zY%%2Pfb*>>*biFNgFjJ$3xn^u{e%NQ5C7RYm{V^m@kG7{?>pc;#xb4G`v`7%9cG{f zdE8`w48@{P`qg9;e=uB1xigZfN!N0o_W>F&3zLXSj`7zQ;1fDEkyM{6_!D?&zFq(= z=n=*ID|G(~y2O%cP#!-8E^cg_Xz1t8|U^h=%+y}lRubT6#v!TTe zp1M_PS1t$6Wd$MB{fr~O0&UDoZtxDj@6U5FAHP%{49|rqJ~}6Wpj1N(@3`>R*+FzB zI*{D=++o)SLpRl@1%M8&=+qD_>T5VIVMGveqa2{)I!KXKgr&&6wlr~`yKcL0j zq;m=l9WkCqjF4iFFqzoKKz?;N@~M4El(8U%U)=`pp#zC@sbwbL1~1ytBN9lzAc4nO zLtAxZ97X0&n^Qj2=|M2|#|`;swI3DMfs@+7l-uD9NAC=zD1UukvnhytG3)(M zvyt_OwytWmA9cBWNC-fkk_u0^Mmbl@->GqSItBg_H^%<3SNEt<(q7~nla9Q!O;F)Z z>SMq9Q}*oJ!WNeJRe_DP|%kDPYn3}0~4#cqp?CIsNKXxWK*xS~$M zoFyxUSm|NJ4b)t&ZQNO3@F}jMUy(!U%(+Vvoq~tL&e}ZIyi+`tHG(dBtBuU?d<uaiPybJ*EE8j_L{;rJn*6z%n3@45yNc= zpL)z@oTsv!qdw4~38s>#scbvu0@oda=)C~$?&7MZjU)pw?B1U?VYmK9WE+qXM5~AEv~P&KBy#X^dhA9 z_NjKE|9lYn^IP>|RsSiNrvOi8kfZ9{TTW#-!;|u}Rc(NCJH+r-wR2Ugr)E-{k>KI? z&R6v~hW@cJ`b86#tA5VLjtF`e>iR{h68J2H0OwWayH&@axzVs0`q9f(Dz_&wv<&?D zmeZwC>Q=W()qPt4oxcFTE1Nu3<&Ge_P~;2GNEcOI zNGK(o@Fr7hMy`s%*ip z*tJ$|g}!J2>OsA~s?-NicTYeK5;*#+I=h#gjsWxFqKW3sMH#(7Z28`~zoy-^Od4Q^ z*~-@OnolRNyMtMnc72E@7jw}r%fOErqR=!&FZ9>rRJv|ns2Mjgo`$wcrT1;OYGQR_ zX(@vi`Yeqm!AlA)=VW?u>7u4JcDD~#Knr)^L(SYWyW1Rt^oRB4lU+-OEe?f`jT=SbQ_@@bQN(p`~o}&D+X##S$dJ57z!y`#l@6$e1 zt8AhP!j78(u)VOopZd8T=2i+%>I*;muJ>>U>HewzoG|~SItBgbji|fx1FF>q#mc{T z))q_kG}FKzZ4AF5@ShvtPTX;9rsgH;?z1?<%gmLUTfq5{8}tMYuhqPmo=Glv z7sx@S`FaZcf~Mf5f4{7$#4L39V)W!kebh9ckwh}!{CJbTcqk~I#dzi`b3Ck2T!!1>f&rkT?nyaLoO?R3-{L&S~cIP+?YyPEd1GU1hn zx^laY=zbo(kjCg8wJ;GY6{*lUL*G8Dr+5x^#>YqK5m^iqjpgw)+#LM=U#_CmE|!jf zA8WojTAk^*t;S!fiG`kk+A6!W5^s6?AcDYFlV99pA6 z&WSYgs=3-zIOU*-j{8C~(^?a+Zjw_GG-m5sWsP3(f2#N-80U9fJ^wp8j z5GxrMNweKsr~}Or^F)PE@bkT_^=h2I!G83vxgHzRD3lrv@TAr+e~9kZk+cQz`rbY( z%d?8HE5mcnA2@U2jisw+Q9J4eo1CU6h3r;RrX@5TF1bmEz!!}|E$E8RN-4nsn%gdz zHTGtbYhO9lBTim3`K1&Hoa0cJTX(cI%bk-!r532;)f+M68#o&^z(+EavAL*QgrP2% zI)6Hwgc+L2zGwX&G;c@Hbo9j^+nr;F6Ht$=N}$ktPuK}yu5e1Ak>%| zfvw@A9_m`-C`th*Jo(EYb+^9J^zLmOg_ql@JG_i0d(`gUj-0IaKrPvCMhtllbX1$& zi>74E#v}|SbHtrv>)W z-+_LMbL#9raP~EBD`}s>9t6Y&Cp9dk=DW~OL0@S>aH?d{7c-kU*P4zik!;5*NCvz0 zI`Tl8Z7ip*PB`z3TCoqn*$wxC3VJbrj|_SOK0t3KFq6B`iD`t`u4X1Xf|_m$YVW<0 z;#k@$^aQKnuP-iSuTM5vamj=}RAz`0pdwa-G#$)ZnsG*3(I2@RQ&I?RoCHBz_s!tO=v zs)+wMME!msG$jn68+&n_`V(sS&%)!Ny)sMvrXrf&kBTMNgTCq)sQK4>N0U{YkNR44 zG#y9%Q}%eGdP9pSYL*c~OPh97&)yJDmyG>sZya8x5LlN7s&)tiUT6G7vr1PfMgr;PXF0&T=>DxMVz9L5&d` zpEIwQW@3I&2EQHCzB}87_<0oaN9D2M%+EW6y7dDG!^D}zK0;rs9vT;$qS@gCDU^|h z`iA2|Hhp&@mHmbJvf{NY@Kzk@foI4)+s$roje*{0GUXW_XA4mmZH&3y9!GDm9?*^1 z+98SBJbupV5TnJzo}W$q$PB(iqi;q6wYK`mUP0rizBOjW4^^|dc0u$DwGQi+Rm^Rs zKW)>7zEZEfj52(w>%p{AoJScC-iwnvL?ZW}P2I7N z{%%Pe?BP$GKP@nnVoxb)jShH0!(60R;3IW}O-?UgBRLx>sgS_;?sH9gWskfYvGL`E zmQ2xGPM+gY^K56r@{o5A!DqV79m}@(WzaO_+OB^7tjja>t3RNRa#GI5oP?GzW`qMa z<+F!~9V$>~emZ*xD+Q0v-5hhNZ5SI0{pS@4;Qt)G!d_u7M>Kf#GUpm*eL0eRbd%_r z?q}A#C$yw6b9g-DD?1A^#|5uhUua)%KyG*-=MvKZr{zpGcK9XlW0%JH(sOo+rg~6fRBg$l=H3}VeP`v<313CIVFh=*x^qz zg9A{{+Rh~GXbZXqzN1$tdxE(MSM2U}EvuJ8cVmBd)jV*TD4|!-piT(_*)J z$tee~m-Cja40V1p#DPCoJF(6|8I*&(a?!3hR$q&J{Uv-w&=R)x2J{Lrk9NgzBh$Hu z{os$WUs?Ac%kLCVeiqoVe&;lsi@x?f%uP34|B&fVjwahXNi@&$JsY?dyR^C{k+S$J zi<}3o@@|Qgk@0~|%?qI)C*$eFm^6+>Uz+|pnp||(GOg9#^z2 z0%E*g8`=JG0W|KlFNJlV%Z7~zr0L(iC_?s3+PW~9cGS(oo`!O90O|vEz30%2+P3AD z<50J0`X|o!9-2#^p{rJioMPwwP$^*(cm*an`-bn9=J!xyE&Z`MEM3JdOpz7@EdD>v7$8_v=6;R)k~`B-Xt}6R)$d@ znW-c6X`dy~)#r~{{Z-^}-tn~2S7Ny*{U`)GraMnt%T8VKro-47vF1=VD|N%JOcgjx z+1V`7$BXWDkDzR?0v4k5rt*R?3X0m!geo6$MqO^qj{R(lh99kZ6hz;@?_m|a{OQ2v z06Kpsm&Jbdr(!)nntX5~+tMM5NW}2oP(W!i(#BJ3-g0}j4{93!Qq z*7;Qk&DxH=-u{(r6!NlyZ{Y8q-@qKfZ64b#mU>N|u#3!4OC z|HOH0nw2CTRnq#7=mTC#mIkd;(hB(45jAB}W;bZ{BTjqSq+WW%DX1U(L#GHs)(tq@ zS)u0Kc@(>IFO#gyz^C;KU~6MD$XyG4E3<6o{~Iy&73eE&Si>5%gN}|5^c?P$GXFl{ z0N%$8`=<(K6CO{tsO7cje1|2CiKWGBlgTUp85^=Eip;Jh(ZmncY|X52Qk_nuFAG~|ZZ%^@_p(R}v0v-@ zUTjxNCf$Kg?t?wo>oqdyJz}|oMjmWsBAyR$!ab*?GvzDPEzGgc*CB^>dy_z2^D#f7 zxrGhx9Y-skC6mLXLu?`Tdgu;IrVjItv!-&?HBm=0zj>T(3<;wLm?^W^vY)NRj<4;_ z6KLMg9QM!vJIGw(=*dQZ=7)Ob)RGu7J2R3+V>kCxJP$)F?3iP%2k=2}#(fr>aMzO( z=0;H1iD+i~#)|^Zhmo*Q&boH>A$8+W8u?}c3m)T3w;Ki19psqizSswJ8|Prm4EB5y zc8G^zc15!zOD@DN#WUWt;_6~)*3e)Ytl^3NC?}d-iJ)IL|G{|_^h5rI^Y5OWr20xF zEdb7y1BXdZ^HAIG1>WY~WNGA21ziTtM^m>;=`B#NgAW<8`KII!-Ag6jA79m!T?@~o zI(_ixrs%N`;D`#)+Nus4%Ch~zH`xSzZTV!jtOEO#!D&%m4`6$bV?WGt>_sTgWOq@2 zRy<6mE4y;oZs=+EGEXLMSs_z2@CQ7S=ESvPSQA+WwVn&24Ddb^^|QW7s5U z3;gtpLvCot4*&3?+;VU}#u~9wT~7)h5KZ?k!N1){?;9MKUpFmS?{l6sDj3i9_Oa}H zwHNh&7)Hf8Zfr94MV{{*N(W~9u+tOZH_#J#cxnzykHI|A;{Y2?u0_xS**`chae{W%zi^fU8cXHCc_DD#)U&hX zmaC*Mz`2MUC*?usqzrh@Sdk@ZLGNn|a9)?ZP5NAwMa}Sj!KbrQvUeuw183{d_tKN6 z=_G<9S6|7ZM@_`TP{SB{`l6=arGoqkoVU^&@x=OCTqdw8S2{KWx|gV_M(^As<=;%FdB{y( zg`bnQjKR#{TJYksUPzwt;BOj&^V3O#Z3{!pi+V@X;o2;DO)U9cNv7LYeOMg0a3@i> zU47A#dCZI?!raZi!&Yo+3F0p=%)EUY$Y$FG)Al~t7v|oX^>5=(eHWnKH>g%pyLe-- zVhqh{c2qiQ<4GUDxqA8OfVAc$YG$`EKe_ju)MTe8JyAqZT+VYT>7p0uXoSf2w zsZmcFj#}vYK`$}p!STEF<4RIv~Hi-2?e(YKPOFZ^MDXlb>%AT^onPcKpbd3$c7OtgR~z<(vunUrB|y^CteXjXSx+iJy6e&&&* z(#aDVWVxz5&tqjoZS+~ywA_pz~5a0)wsmnKT9w2+&Cr{QsJzI4?X zJ(S7Vr9OD6RI)dWUZSQkK6ZgrkseH62PM!f|1il@;ZGBb;%MbqPMW;Yo6gk4P+8Y5 zlG9XhU9j_O`EE_AdJp!KzQ8_F4LwPr@T6_)A}FxPQp!H)Ma@jYsin7rwCT4u%?}Nw zEw|jHelEUb90vW|?Q^6|%nx=q4Wx=kqa}UJ(T5=?f4ioY6jUETliqpLA$7L6$1j)? zx_Hv$_vWgchuGmF%%uYCqtDHarWOCf`PS3HWr71%Efj$E&92gH?o{OQ$hXc?bhDEf)swDWBYozij_ z>s`?|L7wyR{TT6Gkq4!{jifPW=89QSo-}oP1WoYE5YKG&qCr;SGy&C#4t3t7FGnAJ z`6e+L_G~gg7}_=4#EzJwkG2a$jGZr*gJ-@N`!$m{P8D_A2U3r3-jv{QQRN&JOx^T6 zDQJ^>x%33_25@eUee}6S(d7LvoHeJUi=R;6SPq<5?(HC&ELGBT;Osm_rE2n0LC&z} zPb-5|1y8XL2sjt+`dOa3A&cIk26Fmp)AGiHGN}-lu6sJp#&t_N*`lV=b;VDcm8kKX zfqOr)bhOOy3v?_xLN9TULiQJU`#YjABYdb>Rtv7a1$vgx6VJ+4sG+OhB$=+AdoA1i zJc8DbOrnfmO}KXJz&DBU$>(H)E+UWq977uI zcF0c7^aQ^>nr!$&*@XfR8V#PP(Td%&a~__wXkP@~K3OGOo##ac*s*lAZ?&vFG_2BA zh0^_9-(}ADG9vP|Jlu zTet;5=dSJtSF#9uOwfbjpf5CdbucXi&K}?p_Qp)#*&}iEZbli`73cq*uQ8NV2QfX^nZ?dwx`|xrwW{2_$!%og1x8IrGKAWM}M2 zy+Yf|)czVkJ2nzTQZ0*~tO zz7EjyIT1{q>J0hysF^g&3?wUAciy{40Oh>F9$1}coXONcx}oEPoi&l%Qr!0%#F5+k zkCDwmZTyApT>9CVb%zqsRRX^N$ZKTJz(xBFJ?} z61iFG@CRmv(GS#|M_F~@dqb>&m%l>rqa2z<}_qeQ+-lX^vLmut-a)*a| zQYPvfON=&fm;5{^2)k-}Ufj=_ntM_Niy*(=SGY`fFUoffr}I}nbNed1DH6M1-#u#0 z&$Gk)=GkD{J+2F1Qi=F^NgxGo@5DO}2%v}`e%P_~n4^F|YHs91;mP4#DfmZCEIjFj z`B>SU_Yu^^e(vA<=ubb5rjmc*tfd$uJ_ODUy5(1{RI5HM#M}h@#x8VQh_W8 zCvadA_N*zmL;+mFNtiYJnaw$&zkJy&fsAe@ah(xs4FkWiTUJqwFK-iD?ov za7)Gay3ia37h$ziiTKzm7(M>S}aJ+D%c*WG0 z5{?AZO#cI-9p;WZ0n>To%EZm1QKM_*k28IR7`rZzOl3awFx^n>gL~3*geO&Qd{Hj1 zkDxcB=Kj5peob@C*Zd3Tu@`;CYT&#UIO|1+id75#$y1JpFBU`YE1>@b9^I z_(t$=d!83Zq-0S7a8?C=5Hp%&k`{0l2e*|Xf}kOT+Wx++Mv^=q^EwK|a^J0`k6zF> z#SEIG%QUIQhoKCvNoZjDVQ1XEn__hoxVsC|XjsBvNwXF@|0U>WDH0@m3D3xJj%+J>H77zb*VeKN8@wfv zOov0e>SY^t3|z(B{YkWY;v>nW6Y4;B6X;jUcIjAFApJnkprp%UX&Rnybxka7I+`!- z_V%NK5AY{WyQE+T=01ktU?&TI>Ee|voHi0J`o;Li}+e#{3ucZzy1A| zM9&peQI7BIuEA_J$;o0X`UQ=3*(%J$rNv_g+-oo!J~o4v!vDW}H-=4%KwJqPuj#QF z?13is8$(A_RLy23_u@zn-G!*!axj`W94Fn&o z_?l#iv+Ka*IFjn`O9vPEQFcZw)tvbzd1D5ATuuyaKHH8xY41<(5O4c98?&mD{lG}%O$cdB2qDwgIV@sX82BgPn$BCqqR>M( zTl5ciaUNpZ_AkBv=y&UGoWbt{pLte0%rKr(b3e2(gNb@YPV>&3eW;wg;2#Y4Y*y83 zf%k=8Rm6qEV&Pc@S-L?_W}%g|F%tE?IB-Nyu9W8fg}zKa^o}}RmV7bi(sdW+Syne^ z?P1R$rQpw?UVZYQoF1=3jVWjZD=^EV8vL!oU=~{*l|j)wbPw*tGGo|#4tg}xO4gOo!FM=Nz0EM~=mPnYh89^yIO0GLL8X;D^s+r-*O= znd}z@VlOZ_%%*9~a3eU;VUaYg>uUBRJA_7H*Y9Tw6}vMIa~06&4+&r_0(_e@_5W~j zeXgd`ujD`Xq))u%#!nb3C%!FqI1W0&#RBIWh|_jYZO`q;9Ct&nu=RweswbKX`XEEU z+vK5Ge^f!6r@{96xJkx7&?XH5_v1&YlmUM4^o6M1#n(wQ_G8D;dd%AU8?ac^{hn@y z)+HEu!z$tD^ALN#^kfxdQD24McTbUa`I*;S2mf5mz76Ei_Jop}`otX`KQrE!=__#cbZ32Iw z*}+&cd6vyu;9PJE#0+h(^{ms`5IR{MMdVz@b|MDv?-WTjf!o;^)Q<8Z{+X5NRGLbA z@XR~cL ze%}chhO=^S_Z|@w23Kn`R*?^4SGsS=wt7^P{+PPF^h%osSZ)7Mx&i&ucU6a2n~ZS!;U7bdoz^hD7;u5h{xh42^M8obpK}vE zE$8whf%A7woLS;&ZoQVA{5ylMwX7M}#}oY9o;ds7^cNR?hYvxosxDVcTCzhyw_$q+ z4Hii=9h4LUAL4rBp%e!0v>$NO+}MLz7Nh4Vhkvjg&&qx&$a)cGX;rbTXSJM0;{D>$ z%h|j{XdQ%tclx4;)l_F-4i!A!;pNQPCY|Dt%PTc6vQo?+)5%mauzkuho+nY6dn(Q9 z`IFs+59!|&bDcr0)i0)FccD6k-ptcc_dg3C0L_yLHM;7QZ_%_2{l_Q0x~XHYVP^JG zGC8-?RHq@P`#J;tGL46emM<2+>Z*Dg8J(AM4Y*_ zj=foi`f32;kc|hJp++VN6VYo}c!oXkNGH?Y;O*Rb#ALuY9WnVY#aFfi8rW5+wJvzq zQvComkKFO#J1x^u4>}i5EjnQb2lY|6M67q@BlxJ-2dhW=#L`Uk*5{0~Qm=R$P4Wty zr#3^?=`+KRiFuV4gFh`o(R2={eYmO$9Q{V-bI5UJM;9j`4C}p!kL%{Dw ze`oR$cBVFzrY%n*pJZ^B8X-5SNF;530XqvWgI@MO+9t0j!RI~wQy1cAxEDWfpqvi3 zgl`;piHm6^r#i%VQe`9VE2=mxx?G-htAmDF+;&d0vPS&w|odj=t5`Qo>11md8>&EWG*G}NOGC)3o*hMiMd>Lkq7 zTA+S%QemJrlA&if8~X~?=IXA{WSc)GmF~ACwRN93lHp!lHJ_k9hdu14T(L*;n4>!S zFYrU=fWzZDULC+;x2z*(l)77}*Yp6N4)xm}6`Ja028b_?q|oc%*V(t(p>%N`?wyvz zCYpxPaB#L$qEyVfe*_I(l}xXWr?a`sqiMj#e>9PX5qMbW9sjRA`zn0+a8o(uwt(J? z;wm?(iJT<(M$7od+~RSV6NImhUF#tphhIGdAF}zNg`|^+y2n81V7u&)rfDnD8;5>l zNec$y7*b4uzUw<;ZID-H&%utKj&bbW4+Vw8&K(@{S@Lhhig-OSY%e=^0DF_&f%Dum zY=8~+pTcjPTKI&u*@4}%h$r`4tY_1#5Wgdbn%rAcZKj<>bp;| zZ-w(zpD2o^bBJ%(otdiM`vh9qzp*nYyPx{|)^KvF!0y7jAFK|0=g%df#(Vh$3yTP& z@xw5aezlB+IAFf^9cFz8Mli!X+&jyEb^zt{f*z_(@*g-4S?tH3GLlnxbNJP-H@LvB zS(MoZJ7o@PaC2mGDu55UVQ~!TEE6>-PwrE(SKaouAN!~dKjJI-;Szu)rJc6!{1{k<2X~b zyh$QWKpZ&bhP8V7&3MwmtYQa+gWB#B>L1mq^gLpgI^8Lb9AHZUI|I}!3!s;7guLK+ zh}t(1Gs-r2W*2#=6QEba;~Jd5*{C~gilE6{8qF+jsb29UjHVjG269iaTj)Ei!t-VF zaxd#S2fN{(VfV4qY-YC-yKATav!iWrW85G3rT?|(C2;}#-tKamg11-$B=V6oZTx6_cMa{8$9X4NGcZ7Aop4qAJ$wQi5V-Fho<~UoM zw|LDw(Kla&d)MPx6ZH-F^*iv@=EvHrdzN9|LI-o>GkU1=!N2PbdpL5^Ol=Qe?Stz- zW+YR4TO^P@Y-VcCc(uk9#C}@f2MX@$g1vFHr7z-tlOT0Xvp8~vJ&b-7rv46I-_Uu; zl@wlTjY-j%S;KtkO_|#MO9Z{e8T~M_xw@c5IDLVgbndTaox#O@<^aF&(tV_3)x z%-~z29yKeSeL=rKZVTSb&~+>dJdk#{wpDwMupYOuUk}(0EWOIOxJ)`H;5y~6SjXS# zGz&QECN@#4HozyD!nbs7um1T9+8emPSzdZ-FOy`tpqoZtV@%aUN)jm>F@Jx5Yjvd} zfm-71UNm!@x)rpb4B_X0h0IhtH;X3^J3MREzUq-;|$s}Ks}>00(vRnZx?)Il~rLB9|K+S&wE%4^xq%ge7V+i9qZ{ILHlrD_#jK> ziTK$Gc2$9W^b<~`P#o;@f9-izK`?)$g`B!Hg&n3n;+9>`qTkKn594(?R}DG&;W?ex zZoHVCDyLfHGWrwEr9GV$^bG#wt>1QO7-GD5{9bLdmh5X!B_#rLyHj@T%4j7W9)M@W zFPSZP0Go#&sMK4-w1IO!;NQOIA+{L%Zsx)MZP#98+1Z&C319s6Rt+1elR+CSVcSc7 zvsV)O?f4$=_pQ}UZNUNQ2Og@btNLANGWCb=x@lvqzWX(iYVrOMWwlg1T;soBH9C80w3FK!s=;bT}_1l&B+t}^;%sdf2cAQ5I z*k)`6PjmR6I4{i!;UE9bqDD;+Z$v!drku>8m%zNk*WTPO?42KsXVAOpFwrOgz6F@S zO6n~Q`3b)b%X&%`*PhD4sk0Gt0S!+#SzIPXFfW z{Nz;1#_M-nNA=~s$+R4wU-C|09WOw`5Al!7to~{%J@^n{`>Mc3-3@Vw$7I;{{W0pJ zA@OtxHJKkZ6V&&h4HF!Ne|N%2b;;xyY7O61(cD=5s3?*qBhTu;_#K<}F^mS_GXn{UXG@4X^)O zM^ZKm<@LX1QEemKud#n|Q7Y_kY>Yg@$ee5ZG>f!>x%pB(agM8;?rWg0J->^z*gI6ib1y=eS{g)HUGL3s14kFJwceqm zGab)Mp^_={!$<)<+fMRh6=R?|hVR$ac`f~(hrAoUu>slp=;t?wuWNYyU!2$N2;pN< zqifi;I_AU^ZaZRtd3as6Zx|wqHDH~(puVAr*Tz$ra|P-f?Qp-`Qkf0%cN1;I!%gzohL5Qq?_huJ&ZIX6h%J{hW;!_o&j-Fgg)gD`~NsA#?Rsh>dNT|Fbt?Y$L++~qz4RD zZvDAy$XWK|_4WB{REIO6Ap_rXC#h1jhJRiKY}0MVOA9wC=oIYSdvKAI+a5U}e0$~a zSJH0GT$BUzbwj%`Px$b=cs-@YhFwA(iSYXNj+yNH8r19Xx6?i2m;tn-AL9El{mVu} z%dz1)FTBZTIVqSus>lA0FGXzRIq1!RA9Ati0JClio#r>_p?9ia8OsyN{snRt=WEOW zyt1)~jRWUAVMnILqrQuL(&!mmdm@&m4Z{K_{>=k%vl0|pUU8?dBhjmpD2fyL;;G0;yO+osw+v{1ArDHm%Bf)Q9Ovsfcnkq>TXYR20-Za?bhrYcp!`Leyx^13m=*J_jUTV7{p4hfTxG+uU=})_9Vk+ zApSY9cp7U~iQSdBj|sj$%;@R*Fi-oIPyJ-1N6J&N+dq@j5`aIScq2M@hiVT;7b?=*Ch%{H>1v zC+Xv=DB1=aIJfSol!=*_hP|}k7A=x|!Gmt--PahqNmX13Y4=84aet;{g?-=AICINf zU8S+mn`xLO`B7ypt;GE1al{p9(}@y#?ALI1G$4D~F@;PSk^d4PRsD@Je^h`o8C`BJK%3+oo36J3VSwj-@g|O zl3l|5EC;M6S{TS42&k9ho<um4gdD(k{}zg6LnF%X1k`z zN*prj7Cw{x%3pT+8nhho8(s3#WDPrRT;R7)eq1E;Du+%s;+d<1SIfG;!0weUIE&{L z%St0q*GK*$D>@`w3?7Xq?orJvCTqPqj)vj$_h*T+=dm#~0B7-lx?-7pTO`Hf{n81U zvKY(*-37LX*+|)2-w?`!P5wO7Tb2Pm0~N3p;`_-a8-`M{J?dQn#xfQeM)N1&Y}ITh zbF+w`0pq{}@3PRw7d@HXIEx$h(eFi#&=&Wi0rUUbvy){Pexae9v>JS4rh?0^&Z4fc zVe8U?+(r295wPKFKl*U{*P`DIJ85%sDtBV2f|6hZlNRK0&ZjYlg=;=M^LRtlMLWO-I*!fc=k3Y*+a3;Uv!Smx7?}Ke`I_JB3*At> z-gEvZpZX!5B5;p>erhC4Lf&VG&-WPhiB~G1?}2NZ8F`NX3-jQo@Emm%S3&@5o`BE@B;NMbDcj0GfhR`A4_Vkqpe-1eJnhv{NG>^}Z3L|Ztr>5`icm|vsx!^qd zdXnpnS&buOkxyYCeQ#aNg$RG*JZ*h*eiY^|1Aue$6G2>YZ5BNO&Z)1=xutl&48HN= zJ7=zDI)Y%f1{52QMa3Q9x zbuHn~+{C_h{JZ8;ukaUZp)m;C=(P1S?|m?fR*gh1xwN%lG9{C&?Qp+xb%k@l`2YuP zw;(g&P7HiA@V|XkCXC#PxO50e;&@kIvf7B6LhpD zg8znn^asBt)98QUta1DmXN5XO1#rIjWFmJQxyerWin=EQxbdi$4$%bP;7&Ss{eYaB z!!rv!QE?)1%Zu;{(FtdXDTdJQYbOZnD9WY<+ zn2`jU1#$ zcj2ra&c_IxxgOnw$-!Y%i)(tNuOWQL8Jgyc^P?_nm3_`tbgAAKWmQYPB`Y0p}( z&v7rz<)q&fnh&D~anZy8B3de78oRTOko1RHK+z`)LE)sHq^G-accekt-4uzv$2Y;x!W4n;E27RhAu%EYO z(4GS4aTMauS|)t6O`u)2h~d|i3nihklm^UqwAm_r{}D+mO;Iykoi5~p*JKaBU1>i` z*Z>|;Qa8+lH0muJ-xma~0iM&nX2L*|V9LaOzvyZs%xfM(??Q0yWQ-KvV}8Xu1@>^x zPH>$UMo|g)OgCd;X4eS1>4$uC+y;IpK^qpnn#VqR<^&y)f1QK;p%Sj8C3pqE*{q@y z_YgUFL;WzjrzxkjMXcL4jV#V@<9yG`X*hhvg^LFK@E`?c!Z!9>DfvfDQ7;+{AAaKk ze8n(5k7G3kki7M`Ow9j25$DIYr?J8NfZqGcRh4X z=!N@Buo*-%hUl(h{ z3xP|5=m73fQ2s<=1#~QB-nd^6XA8bfLP!_b-hALM97YdaOM&m#@e$%Z_o-PpUQM9*vdL>2`RgI+Sre5s%%0J#1TG$=5@xe=B@N7g+)SvIF|vIM>|T)Izsk zN%zJhZ`$2U7&;%kCfI7|Pe-90`Y9uWafWtC6%tw^CX5Dd+POl-sVqv5LvEY5T{!B3 zxmvuxV~!*^0_U4S*x_P$S!j*F)4*@nQa=(xjZ)|>&Y@dar3$ABwRf@3U8)g;fLz_A&OQ`=8LSN+2wk=8%P7DsC!8kJ})lL!a z+zqGI_*<>Xd--PVqp1zf{ejp=@AfQ_-r?W;t{(bCdgKd19K9W~vDCiQNNA;Fs{-d6fnhCh(b&UmW%mNs|hAWm1 z5k{_5V(uUPtRi3GY76uS<5BMHB$*sT{G!JI{G!; zE(=Y8b8|eKcQdPnO!)GbVVE^=d@W40!`>JVX!9zcVSjo&l}<#ic>lEUsuA?J@$CQA zx=^TC8AfMd8y&ewp=v$m>*4pR2002&ToC#9Zs7d53va=D$-uLaE)N%iR|V0oaKsPE znL;brvtBmNUEf85PfajQUWA$J+NDD2wGeufiu`?Tws5^!7`X+Y7Hv3LNL?RJy+`3U z`mN(PzJvxOVz7pN^gZLzGe`aZe{o*B&X`-l$!W0$;=1(;nTXs()e8NQ7kXS4`h)lJ ztYs9R=N=&*GuB7^X*QMrx==yC@w;?m5Av`3D#-}X?EA9TLZ`J#ii7W+U1TQ|VXn3) z67ghNyr2i0?*u%DmE;T6+K9cEBIb18D-@hZ?wQk|V|-dLn~Awvyub9}BO&H2=Hry8 zyAFOMcq1o16$_11pI1WBl|*U|f6_Mhy3oovmfqtzz4@hBh%yBywljRJUWQPi@Z0U4oYhmgHXma*J{F5Hd&pQ@H zlOL!4y^sFJz&Hxo{3p&Eqi@Md1vxzj&gVw;m91_sr-hoZy*Hh?zB3T-;p`jz`WiPB z@z{CzG*c~iK6oYiDe!^M%hbFXw5l8&a1P$=B)Dx;(jzbMF1}6_7J^q`2>;f}FiRNH z75iD1gP$PZAgt)FpnYqxSDmSZ{g<++_Xfn($FB=F-7;xgA#(q{&jrt=>EwvdJK4Sx zWZ0)90Ox{}cZIb_;>jDnqITFmq3N(FI?@yNuq9jAbU&0Vf$h)%vxMegd!dPkXYljZ`N9(eCAk8_ z8MfPm2gunkZbz=YiY%WEGG=}L#Wl>8qS4;fFom?`u9Hi>ssNY z3vR>z`i+T?%*x02L+*gTz2vd7eCP}04!}9$%{AF213Bs7d31Pwocjp=p$~8#w7`ik z8ihVAaMsk3_)UnPy8`FB1)YTJ!N|3N^E+)vVbf+MWi7z+$o=JXp$zrUrMHBNUC?zb#km=NOIY7IosKNV_iSduv2EDX<%B+OEQE=t z;pf3OPM!0GPdJ5mPmVnTrJj771<;rUKdJ#wX(skxgR9f9kABv`Aj--36KD3rR~3dl zB_24pv}mC!0nUZE{?>!m$qobO2ETW3X(2avqnzA;^NFJa`15wCX*AfgSitwKM!$P9 z^3#O3{M`V=8?e1E`Tc~}TftKT&bF?zgnsDHegMuR`znP~xe6M)7w4?QdZ7(!fU3hd z2M6vI>|bP3@jk?ma}Ef7(y=2F_WUAvi@?_=(NEY_vO$J0V`j|X+=lSxV+H5La5BU- z_jWQCV!$a<38I1Zja?CSUf*iAeGlAiSp7z2-XdRq~AJb17D}-ra1_g0N z)~V6L0%*I&Acl!0neY)YNg4di-2O&FsAVv<)kF+a@`<-7#5~=4%-W3E#BbdYLR$^6 zGj39U{xIs*XI7-p*D^;=e_<32fF{6yZP;SRpZl#EU%IBcVJ4>}Tyy@tv8p96vuGo5 z-aXq7aBtp?enD9fXY?S|%L4 zl}=9zVDp2O!uF5Yd+7&!&dn00p|-iQANXbWut72+0~N*%$VMKFbh!beT*Bz&w5qDuJur`=i# zlcAga65oIJeKr3H^Ylf}QR@yU<_9D}SJOL{+Cs;tJ0_Pr`mh&##m1GN?om+@}3;6Aiz}f%jQ{E7q-n0ARABneQr%Aysp?U|Pigo~~j)D)k0JK0UBjlj%SG-6sO4M7K7qkC3}=Qm&E10F?^ zvS~xCzJ*Wh9EM$u*vV_TlwaC9gyc9Ak45J2E~%Km#^>!z^LQC%TPDD7A2QD4&EPkF zB7PV+V<{g4Y_mq8<{y;CS6+bbgbre-kV*VfynhZ{_g}rWdDAI~@r;0T7Zuk5I|nbr z_eNIPaE(2ot5%gv8^%qMO^J-6KG0_Quit3i?@yeo%F;!5)Qd8K^Rn;PRWE?^HsE~9 z;&AyBJvp@o&hs4?$@Z>7o(PJ_EYYxDl=IRg&%5Kq9oYc)FbXIKzwW?G z8?*2z$~*o4IBQz|iSx1@Yely~a*_k*Q=?YD`vW+Q{m*ck8Noyb zI4k|nbJoE5G4SL|PIEsIZzyrirtKx}JmSCt+`Bg;i@1)5f@n#5^b2mMaSADj(!kjp zxM3(4j=voRK5F|P4`s#ELTFz!_W4#g%Y>QGSOUNFvhyUHr(sdl^X~uST;lU5&X#_M z#c_k>q{KC^+S}!CoVNq#En(RzZ}7o>;T$gu4k!;;fmqrIwQh&cHjf5?XAYcy=jF)^ z!5P?wYxep2Q8vK|I&8rC(oIv&2smp3=O^b~x$q=#cY$+8Nji7+p@M7=A;(E+r631U<#2a?CXmZW;GplzeFb;u z46gZv=Mb)uZa8+>rjns;Cr*2Q2(A1J9L4sUTxe!6S?VBGjBCwZftJxu#K1YvTX4?b zgXrft)S9e*$mV0$PZE#1Zok{Iy}N>_xC8Q+TSc-%sN>0D&r61R$s7g+(;VGYy1TBq z>^pS*=YwC(H}|&LHY1GY-u%ZW>qSICuMs;k{HwTyMWmK%R4FJHSS;L- zQNGdAYCp5AnvY`FKXww^KQ$DM{D@f2$m;O2$l37o2x49iY7ozD@Em{9DI2 zsIo=m;J|#p<{{Ov8yPfrC$wZgi7E>Z)S*-1=iTY42e69SlSuh!`>74#O@Z2BTkWdv@918|O>cUjeT5_b3o zq*1eqj-n3Y=Q`j#qrJU&1a-Vsz=3IdD*U%MWP%Fe9#}W5dY!^G8#=c0r z-jZ=h^nH{;dAo2nbv-C9M@%<74bRcB&Ei1p_&#foyi8vqrbI;3ttPnsJu}3<&>kp1 z-k`-aOf1|KLQT$Nzupd0u|qceMuW}tGZV}3>>seeOjCUyG4N{;T^x{BV$a+GQk?Ac8M52o;8`8D|G zG5u5MRJLRJdc+%JvXbfSfA-NQulW<_mOd?|I^etrINQ4Wh@bz1^Ci7ss^dDC9|X>; z@9kD;EkaHKoKKwHqEh#QJ{53YJnEck1LB8Xz&SU+t#}zT6gPqM=M64D{y{gu~Cc!NB8n!^rto*6=P9TimgBoefB-E8MLjwoWQv@u2wwqB!ecFpm)Y< z#OL#H4#S>1oV+LowMqOxuHFJFs-=Y4+P|MhjPXRUc$2*W=2T=y0G+MCP~V`q5e zh!Qk5>duM7v=!o>5zy@yabG&Sh$k{UDYzJ3Z@=usxht2GsV@2zSM5Y6bLgcZC#-d~ z6)l1DJ)GywjmC(2XQ0hL4!zbxCSoaiN_8CX`}#U!%1#B1tw3MM?u2FnaGtjm+>bGS zniVrp6Fq_6@8o8h3iSNHJK|298C&Qb=1;EI;ZOaqAH8Mg|Ci&{z0c>Z45gRYPgw(; z=loQPJ#i22#Tl^GYa_k`Pw5G8E^2&IGdxj6xxm>VBU{t42lT0cbNVAmlPbkiec+t_ z<-6wBMCi-|=Qm3Z87cUXh(TiS^g?qgFO7YDv_}w6X+rKzl4DT9GI%mN* zFk)iEn{hO*81+ufd9k)Kh5~_e+NramHNJO61m+;zAu+oInrw)r(;lxC=XMF8qhF)2 z8=w$7weg{c;Dl*ht;H5AJ>k0+MF*;Ru^?$VjRDS+O?XkCLyrQzFR|}PaRB1Rxk;F3 zDSL~v(bG6!gZV;yYteV3f;#m_uI2JTV~bt3GV}^(&C1lQMPJ%I2KV5lMVgnhu{(%6 z@m=qRnoMYvTJ6Bha>wezJk%-Uph^3Ge)LY;{>HgrWFP6%2yg~~^TC73VjOVZ2b@P7 z>?YRn!5#wVhfyarmlIU912_l!DK&q9&o1EHS$CGk5WIq#shCr|S)j=oucmC^{KO_+ zvjF{#cEGvCyZxG>&_K8ZoL_p~(bUafcB3|_9??kL)EnNBCBXl)k(djdrvvlmKYNQ6 z7h~ur;zqQ#x43g4@{Ta{Sey;T*d?K~81=qFr=ED@yg#i4A4xCej^^=gZ|aIz`l$U$ z%@aT1pheGN+X>AZ^xS6QclqOgT%$!F&l7h_zD~ZT2kt?4njZtuFU^Lxa=Rv)3G+R{B?f0{%*jF{)F}%dMbeI` zD+-O`{K)}%_5bYcd&d5r@Ep*=pziQXbGIQj&ML5shtk%o) zpg%JX_u!EosWRC(7_$l`rBl8B%c8Jxj9DZ2% z?!x_u-#uz(w1qwLjXj9@b@{`1drwLZgf`LTKPRevz{fL*qVy0_U;wEyS9C&+~ z4R9_GYRL^dj(7{4$KH$PD#yaV2{_*g*K)6c^D^KZF!d*Akqm8E;9QY z^##LubJRQA&ew5HCi1Uw584Cge!VC0gVSTEI0rFml?8tpy!g95;Mlx0 zwwsxxaFwW2Dp3zcm&9_r;RSRXcfix-c3e5)#=#wi>`kmfFVx73AH5#^Qk>84^;7un;D#0BzLVVc^RK7I z)B5Y^@2!w{AHqlQPzc8>K!n;E|!XNQ@`h`xsu9YW!z6&4fcAfd3n&o5ytnR$($csysQ)9%3PmkL2 zN$7uiC@`W9ArK zE)J}SqaH0$Q}mx8`eOIW%>Z@5$gIMn!RW2^LT_P|87JytryifdShow@j)HjlG#8wK zv;Fze6QDN;OwJmI@_M<*Ju(pA0y6pTm|=zB3_t30o?q7qI9K4_S@D{`UKe?C?5p``Whl+S&vg$!%==#Ur&X8G zV>epEx4Pg>jlG~l5uxA%5kC(vLvQWwQvP5NV#U!Yy1#WP{}E@>A6N~P&EqR|P_rOb z4|+JB&qdvR0r`f1L~lNz5U~P(@7Vt*clD%#G|h0fzwG12SuH0X&++juYp%W=y3>oJ z=yUTN*&3YZKkcKaeBK`OPCiuCnu85m&#L;lX zv?-UY#0l7^IDmYzw!>ZXJSDj0{gKOM_;c>vEyNj) zLr<)7JMXSl6T=zq(DE8@f*h~kMdZ~P^@RT5lzs)C;!H!~=OD~hz5>IH0Yc&TIJ){B zT>5vTgblr8$?O5*Op}qqdc=}M+@be(nhIgY;nZm+dUU!?gq_xbbmJOgV`v5c5xy$2 zQ8>d6`+1uqo;2r8B(49J&PStnG_YwD6>UoAtI>Ze3V{ZTkjnR{RM6oH@NyR=@)OX< z*o@D)|1EFc3$c3r+bHOzTkyY7kN3-nqTFHi_*`q`-iX8ElTBPBXPoEbku*E08F$Xp zoAzU`@bI`D7Qb*0J|7%O>HqrCPn-BR&gE^LB|Xdp$27&gu(?9yz{|D4b9Yc!iachr zzq^39Y2QqC2YFpM?jV~_o4KXH=QVPn#Z!Cn!*9n^syq7R9tnJex0+Iu(FZiS7AP8vU7oFo~MOytP}D&UF>o%nJsKY-#e|jl74=45r%_1 zs`DAShpUJ1#zaXr_&(RvON2G<5tJcE%se_qI0=vM37_FZJ-(wb0h*I{J3!ae{S$wF zniq5wB1tyAoPWb34le}`Gfwk9*$VR54XuOjr}&F_Jwp$Dr~AkF4|xh&H3b?J4w-yY zNr?|W8rTbE#u9=*_wD`#<6(Xaa)A3^ai zd&(-I=g}Gay3)UX^!kZ^=XGbcxJnw}JXaSz=T>*b@H=tjqL2DZm&DDO6)r$bE?68a z3rWRH9Cu%Dg_gUD{{jq}|hk8V|4fjsvbKd2VnzZHEad>Gc z6duA1>jProW|?5pOij01C~3U^BB2ww9LXIZEM_ZwUR;LygmIwr~bMdVAVoXLD^IL1y4hx?@l~ zz=Qq}`bh7~B9O0t;1@0iX9Iqd-K;0O3JB9th3gkj@d!6~q*pZ))dab;@hTjif!Sq~kgD*A~qCO%%-$P!ZZzgO$rY6%y z!1I-z@DTZPbT`bU3L=EkPv|4{$1ZpJT47*L9DVDhq=3#lgw7*kskgq8xX1ehF-S>n z)wsV{t`PStl62RjZtZYYNIHvJ?Fr(1&1%7YLjbKBj@``d4#Lrx^2)42&Z13m6YhIC-lbbd!l~?naG+6icJa{1djm4u6O+L zcM58PeueR<0=@6trq9A?TK+?>279tku@Ce6(LLEQxj$VP3J;!t z{pfSc|L!A=u~A5O_0ZpFj+}YeBQYHL#zEYD?jtP3Lzt)3Oli}}A>=aHzLu}J9CDq?^MCj8D-o7~J>e>>a@fKi%IMXuZ zj!=TnjSBJSciwB^ZI>w8id<#?eI4>Y7ePjNrgIj-j~;wovtP(D>^e|)ctuVcrKAtJ zJ^s=7pOT0e)TbW>XJHTSwvrZ_48&edDE)30Lmc&?)5RfF^;Jm`a}B9whhWMJP}0#2 zAB2S^0W{PD{g%Vv;lQ70pFTW{Ui1(w5wF@}K4lR%n%5m2K-RvYRQ<0Xy{6(nJN0!r zUfq9}XL?E*$dhwgpg(r-iD-)*tEU|ipZAXvt$M5IHtxPV>SkQyW9Wg5N8e_9Yu;ly zcwgx646jP!i~3-vI}IER&2!u-YPxYA_2cc{LV5cH66z_b<(UP-h$1!l;@lo+5-%+J z7EiOsE6F-|i*W0LibhOP(xueHLO+){DETSr-lkF^_D&2H;LHy*x+gqa0*)^3%A3F6 z3kL?E=X4Wi;6($<3W}u8$Pc3yx5lmpG)_+A%sX|Wf|lXb;WqBsR(+@=dcdyDlyt^@ z1bx)QYdgd%Q!6?FpX5%3N}A_Ag}Qb<$mD=wc(2f>|QZ4g8CT8t%UXqVO;#@FPV zAjgMpWC7;p5miDD@~8L~@b$}BDipSaU(kzCN<8Mri|}&VJT!!6{<`{4{=Dc$-Ofhc zpa0;zsk66KjQ-~(1q=s_O%_%` z>)2)<;>O;+!u&$`-7Hd4QT}PcZd@D)5ZINbo*aF`bRha)`h6t z<|A1kK746~-tVs$ViNezAzg6~S`8KTcoi){@1;lKFmBWh6`A7h^Z3w*e*$j6e$0|m zy?65iFhg-eOwPU1M9BWF##uv8Z{b+sy?FwKA>KB=8ZHdI27i!QO6p#=Nw^7)?l2D} zxjsB1lw_;uBwiP!UILzR^blWDHnv7+9U4O_5b!g6GV1w`Z@?#5HW`^7fJ*ZO= z?P)*!2_O34?kH_fgN#DR{9P37-rJ1Iy9dyn2;>Il4}?bW;O(?5oLJ|zLPHl1N-qkb zinKOD*-uxB-cqN{(T#6s??Op^0%>^h`4ii-T&R3Y06o(rS}bn?e~A?V(4W+o-7AvQ z66*j8i!qeBzlS%%2kgz>(X}}9$dkH(?{)Nvrtr)i_yM{8KW!6ZXpa5&d5*a4E4dh} z$hZx9JBMD0IzQs*c6a3SS%by=NytM+q1N-T;xcQXFKUN#K7T0xbU$|CW9oVr2l*#{ zn41)WlYF6-FvBQ;n*Tt3@nN!XWNHFEH&@cT_&CA-u9_TNm89i%3ZucR`4yogMK%+R zF{9ZRs-#!9V=&hcTLc%`@2@SE+7LL!6RkdK-A%uh>=q<|& zgdOAy@0xHj9I!|jxzK~QY!9KJ)o1xHNiH^WQiRI`1dF z?gL(ETl8B>UW+!UwQW$Veo7iB+Jj%`CBqrEpT_zARH2uN&t~~(ejoJfI;}$f*8V8} zCkZ@8)DjEQz=ar@KtqtTeOxqCXycGTC#NdOHZ4K$s8-X-FeNSRw_7+5eS_?^O6mZv z^6n_i5uj-j68%7kya!!JN4&26CcOBBuLURRuXDdGViz69F@L!ljfEgazWSm#F{IU2c#U*KOjw+--@ z?7%BfAs1~o^Nn}{HTW4*+&9|?h_l_$3nlCnx0=P3wZVR|6K1k&W&BXg_%7k@yT9)^ zzi~gjv2gE?IM`lzJS&0DcTv*U-?IgEU;=#Il{9o%qHyG;n#Ka#0o`+iOz=Ir>;ezw z)>+}52cF}4Ijl7W6j;fMe&_t|2V}SE3eo{qTg}LRn*YN~6~6 z;BZS=e*n9CTsSS+ku0by;4#gD$t>4MFxR@!C+uPF^_k08RXEbwanR=%=5Z-~9O+;) zc*W))DS zW*EM{ypIuoVTT8uf`7f;Arr2{8c*sBUB|=lqaTcO{n!9{ckrXXGS!3hdj5^G;XQvT z5A&20s7>a{--xR*Lm7iy?mo_QN}!6W&|m0vYC4x;g5Hrk^3`kR{5a$cM^TTISRCU| zma1vtBgFH~?F4I|1gadYq$xvZ3BwZ;$U0C-YikpPHy@GjL4$kRuHC{_>;%m@f@fh? zEX^7P&MNrPXT~^@kJaBe_pKiw z1)%@@ydCPk?r%gN+=+GjeLAg&h_kV4+|3%i?!vL$fsygF3HMHylSBE%*e}jQ-?CMk zLwqP=g5^7KPHwgq%vUFn{#fLkHdBP$%?WfA`D!Zo@C|;#FY<(vB8TpT|9d=*DN)iV z?3EOZg9hdS#D}6gg4RElT6ijHl;sDZCGw78@4*3h^<8LXj9M1&&3naL;f`q#jT0m2 zQqnnLHh7Fv!RI!*nIPD8aHnVSf#mY5lVG^QndJDqA1Y1ejiH_2e3dutripwSbVn0M zdr`N_B!1X7N3y=*N!y2>;`JpbayW`vRMjWGrnSpIp7p217Q&i1_=bT?H>RDAV9{Al zp`*bkI69AS2!E?-%b=?cKl(mJm?PwY`v^b!BT3NthXzWZ`SikwG4`Z0^zZoGCMrOx z27lu%YCyL1z4#Qpqmjr{9a>EiH{!f4M<1goqcOJt`#ZgS(PvoFfnQpVIqV+fAs;vL zyU}N^c#Zi~?Jr($K?1cGl$7Z{O0Y^#pn5Bm6m`&B=xdTd*}z$SBvsf49RuT1B^~rU zDA;O{Pv$DgJ*-S<+5~eP+?DcS_l0Hn+9~Cz`?zXhF!~23kF44x*Vm!|BA- zeL_m57qEdY%tJ@vI0s!&=*~MOG!!O3b)u#-e9(JI;oF^appm!1GkBK9UwYy|4Gy8N zbn*&s_s)@)!@pztie^He5%5q#KYES2zaVaPp(B?Sw5Y;TnArom#9I_pdajFL>?J3Q z7tqNyzr)=W-AR4boesc{{(}$vR?wfC3_tp^yd{*q-iMZr4=Yr?n@3%+|NP(g;HPGe zQlY+zvVe2GvQl*Yg}SUi_6{m-#BktjiSukzEtl=riKkjGY0L~3-m~jDe3Lr z5Fxn$njV{#^!P!NFt>gj9hs}7XT5g_kL$(IG}Ick?{kD3AL{yE;4EF=Ej)3DzcF+- z8ZS>5rny5u8~Tch12oX97>fHpR`Tn`FGzG8?oEv>8Y{_fj;AqViFk-ckc8He)QY0Yp;)gOYo!b-OH6;NBaDQv-1^O zsR}W9E^ywwr&KhlhZusm@nX;*6K}2AyJP6zIiQ-x|0QT5pUP#@T+a%XTI8p?$_G!ooo>w zz$eh!rDR^RuE6H;||4I1(S(EP)2DLY{2v$scWjS#28rzHBvb zzZ-d72;y_*F8)_-Eai+)(&-i__>MhdXizEmd*4d=9`);VUNIB&xX8Ch&n5)DwF!nL zyz#O?TGlz7K1@BpkEn&lORo?r^NQgsfX#RGm3}lG!ta>vN(N58w07k~?(z>Osy+`7 z`^atFAn2K2e~Gx^dYtp=;!F$C>o*Op{S`@`U4O*Ub>TR{r>#3r_g%c zFDLrgkuSgKLC0O;yIEMk^#Z5yOtdR4+kZ&b0A5k&!d)o>e)QAz;7@YmKiawfS9g!x zFi<)VoHKFP3{Tu8*5Eu(>x-WJb{p~Q0u}ZeQGfX~7k~do40pwhd(jom*-~i2q@&i3 z+N+t60^hN#z&}4-GgFp8yE`bUlTnJMi+=)X=b(p^oUY0Kqo(tSAz!-e(9|@5zHS`u z%4NBlraREDlPf7lSED)h1$&yNN;(&HPUF}!hIXR%30hF0DQga1i~;62%kOBKg@@5y zcqsH3c|+4Y273I^sFWKNYgQN`FS8Dz-XpU#C!>Hf^p_`?t27svxYDfMzO?i9Tuo2l zY}v}2Bp-9l7r}{kcJ(CwHm|X0?M%ApH6MLAL(?|Kg{A?=oZ-%zdtKbnA9JVc?Y%Su z5jVc+$!UM*C7P>69@KliD=j=dK=TfJ1kU)(JP&zUIB%IBr4>8V3;5AnqE>YovWFFj+Lko~BzL^bk}NMb%v7U1QM`n>R+({f3?r^5-%GUvZokyFBYK z*Ra?tx~VafDnlRb&pUDRzy#`pI;HAKPs!FLf#zGI|Mq2?RD-;3$#Nz2`4K9We212! zKVrB}iga|7imcJ=82e~9G=Gq9;2DANB2C134%-hdS^x9W0`&6hIBA<(U65`L4x=PX z=vAIPB|ZBXK*FmqN;JuoRv<5X39Y(@-4#;PBzL^`04ix`B$=kWP;!JXb(tlJyX5eH zZisnp_-e7oS4YwrR_A+qL^RZK#;%Ei_^0p1bve1L7)7wj>&ESJD(VbFCO{KJQ z_%7{oqtiL+#D4yXq&zIBV>?xjR!q^%so<-P{rWPSgs1^u5Z$Xx!Al^`Fc3 zG?y6qb@!1!mt{ta(@}Sa_eMQ<%u1YWi$2d7@ZLWz7aiVWhP4c{$nYcLad5?xS7S~c z+)~;XqNdyEn|V*1De+wsXdQZVH|5Eamt6wAwLq`zc%kI}41A=;O3K?^Ev3K5o(1BG z-LXb&FJ=dtiAp;A%8+G$h^3p2m1I!RpH1x@L*jPi8@mOz6*vd%xkNK`^6;#DwfgMMZ}H2j-xMKim}L9}&XIL$o}$rghnwB8l|6doSz;#kxf z@W<8YS+Q8m!E>SQl|8XN>vq%~dmBD!Zeg*3Gj;h z=g)uoqAL^?VkzcU`oKBgOAt@Khu074?s4} z#glC;a)3%VscfN|G7Hdm>Yp#2`~|<8SKu3$)=FDOCy;Y@)O7QEuwNH22S;C2vKr5L z)a?%G4@9O|Qr`hcXiFy{8TUj7h2W5-BuArxfSyfDJ7irJx zc$ylC{CR4;REwRp;pmI@x_wc~e~q~nYVg{Cw(N7?1d2fa8L~7?JO!?o8T$OgU04oy z=Bi=HN$k}uK&7Ic21@jyHnC&C`OO{VitwX9G%SWDqetgzb&`Ewi`jk)?AsPyW7EJp zZZ{cTdoeZaAiP2jt%DBc)8DM*Whkkjv-YlW3vK=T@b-0tPpY+%wonKmSL|z@PU@!( z{uxYde8TB|1gF)3f3M+%Fv_W%ti4biOjUcJ?Qbwg+sz`F#+3)tx;-30Cl z93j)nUC=9S0`DBxhFbL*U)qeBqIGB@Tei-JHZ*aiMK00Ogr@$~2A;gtdliLm8-~#Q znx%i?yw564^utc~1mN8D&QHy3X!jKxn`LBIajjcDe7 z5q%P4CACtev(HN0zfI9QGRtKf5T7rj2E1c%n!PrUp_Qod#ogCgMg+K)Kj3-VcjiVjnF-$kru-TH0P@YtHynXf)<=HMwl_cQ4BC9s-}rB(`N9w6bpm(wIxZ zY$m*B(n|cvq{@fIrOIh7{7x1)t5~g}J6&1oL%ze3Sq1!Ho2~F7Pp35YD9eME+QU-} zy76{P6|@ch6F$Wgm|5%Pl>N|^`rfUO+Fikp^F=56^08Q)yvUDCT079TlBtC+CI^$N z&)+z=%<>SE8mp)pebF*|rZ#3H>jRyzm{8n%a-`7eLE~&{LJdJJ$t3)TJ2VOxQ&bHf+mFz3{ z9vj*z$txq1eUDU8&sy+sI*3dc`Nl_v8b9DFn+%=6_Q)Y8c6-F`Ps2068bu?rpRz=G zIQ7FBu1&6FgGz$v0kp3bowRIOvM)`%9ZFwaH?d)_my^LdXyaaqWYgjAdTM1Ly}jVd z41ML~de)ze?1Pzo6zYkIepGM!3Kj{EFi-5(dfrH3`Wkn-Cwb9^ooOsR*n`%hma!~V zF@-7iRvLIv{t$tk#(vP+Kk(f=T`C;~SH%Cd6Yj-4@i*eh@lFnuI&4tk+>{_%G4OAk z&utkfc1O=y37nTqiq*Jd4yyy4v&&nE&wD|ue*}6Ob{g@_Q5E%_j$P3MW2JtIc>0JM zyo=RdDaAxh*V3_T;M0(`Lwq<~gr5IY8B42|K$dTin?3er4N)`hMgQ%4PAXdlzVv3i z-f;c^TM-U@j~D0@?k-^h^5?=s*p--lkF|pC<#9XgvNfn-v9;JO17Ahl{FpVsJUIgO z;E0zO*}D7CZH8Wd^10otcCI%SO+gL*OU1IS6_jOz{kLdGR`Fa;Usnavw^NSHh~(sF z2w%YH2-awYoN{vgXh}{Y>sSx|#lPUKd3PPt+3HTmphvJ=7k5V2mh6;$E2QHJxLr0Z>_L&aXp^fyr~Wp20!|J)q&K{;BTBKKYpMY zff}#}a4r}0G>-S;s8D9((~0!~#05 zp(;wf3;x*8OKilqSn7%RV>0p)%c)iV!*{x2_LL0*pQzRjJ7q0yvzW~x6oI^Aw98R; zImM4kUxZOnleLURcv8iW5PB2k#-4ZeAe)K7)VBX@mal{lCgR4)v92tCnVj;Vg}u!% zk{PU*Q-iMlly10!W!B2+BYO4K4U^dJSa+HX?)dc7m8__z2fQ{s$+DS(^+nD+EWv}G zCii6bp^IXd=0-VRGo|oEPrA7Zb%;)2Oy@+_9O3qF_&gQ#nuD>K3w-rG5lR=o^m znc493frcF)pkg(j?1zZ$yGiM*MjwS^xwZsiCK-t{LQV6J#?$=^7eTzO%xiyF`w zIM+{0xA2ATWgPkm@>8Xn0L;NF%utJs(THxlRCEnJC9}EHqzf~^4|hNwF!-3%1a*r9va={}DhbwMnvP+?EA5?odD9Za4F4ifT;xxNxh3RY2! z7SAZ;8oMgSQs)@V%CFvLUf_59&;<|2shmw58cv~yBkA6)J?tm6QoX-JA8=wUiz)J= zuh===_#X937X>-i52dX0RxD$&JAL~C|Mjq0%>A*PEZ@TC{)Q7fd{~bBF_3Kc`?L9l z@bEPXAbw;t`}#pnrIY>Wh`W;Yoaau-);{z^?aPMTaHo?E;lIL-W#M)nbjC?Rn~dwT z+F1$`66N%JT7+Z(&Bo+p7aA(>C#pvIk!|XKYLoue{?z{1-#GsmF-MkzdT<+Xe(|=- z;yEy{(?~CBeq3{DmWuY`JTIBNSJZ!vJs_OtN4wzx1TOA0oaeNrJEhp^s8iI)J*vJ- zZ7S4=!QhP#8O(-0K^}rwJ?qI*<_L|o56C4ttVv+Lw$T2oP}9Z_%&r zx_kjE*d(VzZ&901w`V1--O2d5H+4*($;`9h?U?IH4KDO!UB-C8+gw2xH$9PVK~v(> zB01fbEtQhcuk#4Qd4AME^c;;n=(YdB`8wv|r;h%O^WwbAvR9}FGk|l!b6#fjJC3Y@ zvoJeI^KK@%xWJiu#EUC|^Ht!iqu)-NoC*C6;Jni}Mq)G6cen$b}G(1dLWj&7BUBLal4~_oM08r7Jy@RWgTX?hHKf5Zn1QBGU9*6 zdN%ziu-_R)^~%<=wea&9Ya2;xyn~pJ8?;j4b>g-Ssb;PhB|(?JIJ*N&z&rGwLQK~9lX?Cy=9UisQ+PBs zav#my_1$UWD{v8Zn=zL|=+zzeq^q87S@ zYtiD3itYmEgDbNJBo4k?K@WB~9oijSBOmbfpVr47{Nk$@x)0 zvLofekG_{4JZt_3=YfN5xvStYt^>}m!}4Uq&_@~tobxh{ocJ~a=Nvd2`ZN>!p^sDp zoV&VaiM{qf;|Ms1+|id(=BlY2IESBgmPVnEu^KqXS8kJD-d5A2GuR1AFPH3PYRW%{ zxbgO@v=Z~&5yz1$?rOtY9F3!*Rd~J1nAtXprK97aBf4rJv#yIPTcc>~)PAgqUN~); zi`vAz13T6sko@6Yb!+=`siQIcd4aRR^8%@pj)Eq|gg_5ulaz(n`v)Fv&U9W4^e121p)02f`05RtTqKcaRa(PmX=|XgCF);FvoiQ=9}0e7CK;Y=#~%FUQ}OnS$><1UOH9u-)P{aNY!*Z4{ZBrSGsC3!HbHT_DP# z=X@DBtDm10&E`YzD*@-P#z=Z{S52pY^ZizKk~?BZI&dB}WrdUs4W$#Ms9E&0rCS}K znTfd2B<_^-a#!3xJF`ZHccrs7L4n9iSi&D(| zKpK5MoYsf!kPgrDrcJ;(JtA0gYlq!c=v{UkJww``Cnpos&kgR+myCezb}oq4O!AiE zKDkjl_%9yY6DQf5;(j~;UU;Lm(vSo>&9C((`)%pcCCp;w-t1CO@N$n@a zNKMzGS316KpKz$OBt}7EAm)*84v7P?LzkG~LVkJf8aw25sp}jm3V!s#LojDJ@^^d= zSh0asbqQIjaKRg zl5U=X)YL#u{c`I3l}#lxlZG0()0l?PHri(j4?0PgcY098 zGzIDB-xMDvLuV-x^Y34C#X~8cG9)9#jb-U;PgL9W3$GL$m zu}2S_3sxI)x8YOM7dVFuQ^`&O=bgYg>T*Ym?2o8rfO9*chb9BLSzlM=C(Vy)uGu3` z2F^o9wH2q`SJTja&?Or&L2PyzT6VyBt9Ot%xTl(ao<)wgZ=I-*o$d~Y@ipD|h(*wX zcp8U#&`uOhuEzZ1yZ3tdIng&CJ?GRYYS^h%tepjZ9M1Eaiv?oh@jxnpF4bOPwK(XI zH|oVOiVB-8-Wd+95~mOnvj>Q@8L^^$F#Lwi#QS&MXjc0m3VCZKZa?ovM}G#;p}2)& zaT7V++vQI=ZoZ-sW_{m(`4atBih(%Ksm*<;(WzL`{yy@$OPB?8SBQ!N4+_Km_j#y^ zSc|>FN|l^?+V0S7#xA+bTEyr6-3o7mk5dDjb>T;U9@^#`{s-suFW0%z=-0&o=Z6;u zb1A^NH*n7FeL$9mye4-&mK57l%Jo`nM#e-$&Zvf|lew!>> zAjj|m&QZCaExMr>`tCHeE0q?qBqMlT0cU?BrK|-$7aI>D&X{D&uKC1KI&$WYU(U-4 zwK1d}4ZR@0=Q5Uq`D79_bM(H+e$GQL6Y+UT>|5Csc)%WmmPp}^bFzzi+BG=N#!xGx$y>v1wFJ&{ zL#Vv12WJ_N9?|z8aC|+vula5?;4^r$4`aCk%$>}iqL17@m0S7L?Vozk-Y<)bbw*yT zPDK0H8tes+L+dCh~ax+*BMLo}y@T_G*%_RUwDa67@T zo3qh{JXgH2xM2hB?lecb2S56bn8lCyADkmA&|rD4WhgB-8T;ZpAO9Tj~$fVj~0EoU=3jv^va8%}A)cibF9kMXkxtn0{6OToF0 zkD@a#y7C6-=eL3m`%2Re{GsQ8^z~Xet+a#_Zub^GvF+S~=!SxQ7 z(<{_~M_O#*%D1E6gMU+Cdw|=S>_%4i0;txzh}(DFjef4fJ?L?ddp%!H4{@HC-Tla2 zL!I)evkwg&q{DZ6gFa}DCvA=W$Q3{Ipp{+TJo~I^hX_dlzcF z)mWB1#gClUJJK)s(bq%;P=o)$xgq#PRp>uQ0O!Rm!ny1J#*K8T3D?(7MWy)N`wloF z+YY{HDscAewpX?RJKeRwIVj?`Y?udn_`vy1ht8bUQ`Cm2> zXAS4L){Uk-giqMEtz1^L8`<4J+%P%JsWAJKulA?ciDg{9sd9RP`21b*h)dQ*AGNCw z2?p=E*5JS7y@vJyJ?AXmpkEgRzul(!+&yq=?&iqpr0y7Qe~~Bc+vP%^+d*f3x*xfv zJJJqiON+#$0J>7}cfQd^H0ApO=TP8W@_i-O2Kh!G#0~Sl`kc=^^fZ8T;Q1WcbMOlC zfpd@c&N3x~PrVy>1xj04A5Zj-fOBAjDA^UvTSI{J=T-+~3(i3Q891N2T_YQ-13h`% ziQ@v=acwa#sKD0@A3TE7vxozS2l-6N94;svnn;7dTNvrf-48;37Xe>;DT=#{Io@~c zND5yc$Z^M!SP!AmlVR6v(z6u0@Og2D>qq-Rtn<1TyB${ZJZ@lv!nKGTnqHaPy{M{m9@ zfVTb*&PlN&c+aLPs`I`2nz@M+{>9nwX(w(2_|Nx%^DCEl**EaME&%7c(PHmY@w5au zC#vRaDzP&-DiJaH#0||L^yoCeu&j@fIPny;&4F{~5-TzPdptz}=U>cClwn@*39;pF zfl8b)2-;$p%M9Yyi=#YasOqbOwt(u%X; z6!6kllxM?p3OeQ;%!Y|RA3f+c7lM4LmFR3CC*gh&S$xnJH34q8>jFuF212xh8^v5k z+*o5NKHCP4K&(I6-dZNU9VDknaGU=`DMkOUa_V3JUT(}9(F$?n#VdHIWF(0l8Yt*{ zoB|&0uHyE#&F?!i{>AxIc@HjX0rWS3bJHt&vOMsS9s}q1VwT4F3^-uGBG+%OXzZt^AmIFF z+Yxcn3-pnIvww}%_ys4!698Uv*vumEU)Ee`G5x_a)lDniZjw5+6cDNeH zOZv-VXih(9P?x7jQ|2Ll`y;Pwxh?RmbZ~!xe5+{y31nf9xe~o8v|)SK)=wa*X7jRG@amDf2pFIq|^o9V<%@Oc+e1NmP;I23ocVZBB-1_>uN;Rk9?*`72gU<XYQ$3*4|+@bSVLv$MD2s5N#~x@WwR3VMO3fcMip^sr{#?Y=Jt;teHX;1%+-JMWbVE^&tIH^9fwYsr}!=9s|(dM z0r}PH)WLlCD0o9pK_BT*C*BviT=7!Gib<{c#Y3P&<%^toa(#Xt<}B}{&k+iMDHA!{JkGuv(&^=j+#Ik(o0rHb2gR7+LsB0=Ngwy=~-=rR&yl7fjIQ9S9 zjO8hyGkiRZyevDj?mfNexO*rS+YVuk2YS(=?ZKqKz=r8(0^2o#G^=z}wfA3I6+$9w!W?{@iF&TjzD$2vm8p{;_SETUc> zf;(&J7(UtpeTfOku__1iyH3D!Z9euc-c0$<~l-fZF3GIuPR=hiOkfzVX9*T`QUm(LA7H8Xo_2bt|Dk@fhCv&|8|HTo0>xj3{UMFy~ zFn`&Ov+eD+P^=t>U3=7kGGn}FJd zn#=UDOYs7_tP>`Bv%M?4DfcZrzD?CkYUx9IgTZMC-^kYe!TCk6w&l0I>@YMymh+*s zq0I(%KQ54dwhsOW+e3L#l=b=l?OxS!MxQ;q%&(c0Ks(!`7XA~>?*h)DebL7_zJxag zH)DwmeY|h8`6t?V(wmIhL~jajLGk2>yK1^C#~(Tk9Y|#;Z$yX z1~^Vie9u$SV$tw;TC^SW!7Xu8);s8`m15>NyaC&m3{Ed_+jwmndwvrdDczJbD|jWF zJ`?@w0q_#*w4XhMR-Ta&_J*dOV^cHYs4dR(bM}yJN8jn@e#9&5x6GrNl2+n9BzAnu zhW3r50)3o;rIl==4t8CUx3qqHm~A|U87zyWMVD5yh>gBf>J&-896eYN<|m_9N0R!i zC%d@Qn=WDQyXa~h>;J)V9Ay)r! zapn!d2e@d3-^Fw>-+T=8a=|g!U^9geE>e*<;z?7X5AW{)?+*ve5KFgl`M4kV`(d^l zwN|w639U=?^ZPGdCsp5yr_Z<_2Y9z(H-pgYyNCV6caCga5oU`Guy3fliRokh5(K`- zX@Ri?ct&@@w<%m%#kw7eBfIX<=v3;-_+IaQiRZk2f!`!32Sg9fZjsmsJ+Dzrd#bx8||T?ZI{9-z?Tt^ zM3LM!iT$+j`KJ%RHfuIc!h7CSYOFPQ7ECknyZp&)sx{gXK*ta#{hw5@eWre7jIY_Ev!6A3 z?L(KMp?{^fhh=v4rQzlHy}V8^Darjwv^+k`F zQRLM1Z{41#)fK!5et2-}I!(nj{K|ajaUsXscR7Y1i`>8hIqj1j(R>8>046xwvW}s= z=`ir?1bDJ6apfy<4`z=?+!#ds*r_V|gV<8``#8s8H}Dx^OTAfJ#qOBJjPyjm+AULZ z-yBar6A@Q+jM-&8$GW;Eex{P;rl=|QBI5k3Jaz?tU;F?wg__%Ju@FxU5YP4d{$Wj^ zp(LX3m)O3I_Wi6_%0euOZ{Q`FHWIM0^x{MRhR3Osk?MzMSb;y?s2 zztGT+56Q%=95MWUqe*=3Na#F_fnH+8IWBdIijsi&(KQ>yi1Vl`7bC~>*e%ugBPT>% z{bX%#_CgQ4S82EtcdOV=f9&9+|3CWRQMLwifjPiSb>$Ir0?tv0=Pqv>YP&;Afj^G< zTF(yJ<({$hY!hY#pG>u_+s9B8&ff9z5!$%dILm&BSK$-1yTDObgh0z{`fTkn<4Ee6 zgc#Cffp%ZFa2k~d-Q!&|wO`MNQ05Kfio-@~gLL3K_8T?nhGyCo*h}sSUa{VhD=eq2 zAANRK(w{tu1un(j>s}=_X?~pPrGo=7v&zHZLYa_8o+annHXZ|Fu5#pa5cX42|g<5fEB;DMCe(P{2 z?K$+Y3yPuh@L{R8=b=z)kGpvDLL05OUNGhNRgzOnBdvM=0D6f$({}JfHYmuCC{amU z;1|5j%a1OcRZ@7*e3qBtPX>>bq<_txZN3&r*RuYDt-LYx3upX|^QV-Xe6fB4&CrE* zV!QSHLA9FBB35tcwuayR6B^n$+byTA;o}1kH*lv|H($m7egXY$obyKQWBHdZ;C1vy ze2BH@-@gUd6me#w&S%aYeDyrwFQz((iSF>T0OrRWwoB{v5I1ZQ_q=+sF-Nf{j{3do zPdp3gi<}vl^!ixH-0P{SBo*g#>vMJw_u$tI#Nh?HS`NKL>vYuqd?)RgO|cZW0<(!F z{k3Cf#E?e>&O9&EHUa0?G7PgGHd*^{96T`+kpF}%((d{Ozk+PkVgWANZn6mac^P%? zEk|uy7wlrxSJIw{DcVy(!PE}C_bu+7wB6kUNWBa>dSVrGS?Nb**kjV~eUx?a^P^Tp z*!Lfm!>UsJ$*f8V&3qfyrx^UQ{mOs*=rf@EwGVqD{~b39r`+Vn)=!`*O@Q;Y^?W__ zE1tB3Zg6xGzw8mT_w^AQN37+O=EhS?L&V|WHGC?1ZdsjhU$l?sd&7HWHqLz8c`p3( zqBwHu4vkz@BiC)j!?9dT3J^J-v(Q)zAaTe;wj&bZT zdU}WC(7~8@oZWnmzYhog+%tA=Ks-%Qq1QU1skS4yB_r|LNY_Yf3m*_2d=_4R?yFtq z5rg-I*;%-`_ASm)1N_@D@iyA7E|}G?LVwI-zP5B^6wTX*|F2x8{ox!zO|PNHa(j{1 zu2&eIGxER(mf9ZR(_TP68Gfs^wt-0i^_i-qMFYxNDRxgbBPQ%?d4QF9_>oJdlIB=! zWv1vwaYumdrD5#c;XvxPrfyGU?un?fNScT`>%VdKn{|W#^iEAP8sYiQUC&o7R+B+9 z+(Dz0_?i-6+X}tnertKlQSme!=REV$8onQ5a-BzBb^|qk3f!=Th%*hAy7N_=pdH-- zoFe^Je3R5TiZa6I!n9KJ6#Tt9Z!dA&Dya>4dQS#{>t)}ONwec=1~A{%ERtP8zNbYU z)MtA>Ta5k022Q}|$pcnv3?47;l%~fUYUhG)x!4zagZ(>bdx9tS#~VHK?eO4^`Tw~3 z5~!Nmw|zsDP$FZ7qD&bR(b;?7C81DcNX7`w!#T}!=TxUb8kCZuWS%llb@tvFN`?#} zkq{#DOlJS9*ZW)F>;J9wt+jtvui@IyzMp%z?(0&}Gb!di8Kxy_*j>JYn0)<-Rf&BZ zW*5Nu%C;FL>|Er(yO48A=al4OuVU8)%ue zk9-`l{l7TZDsHghnCmTU3Es={EcUl8_9$E99{HHUR$$(GP6KDAcoqAj2XyLy|Aw#> zwjnN_z9F7VjN;kh_?BO^1ApMQ8+#!rj<(@jNYU@eT6#eLwgYO+BrnwqXon62{+@Nw z!jW+76CwV1hHHy`QG=8s&L`jY6(=K~sbj!(zP?K|Lk<}}wJC4BDYn#8(p}_=!#4aB z&02wPxu{7GQ@iBD`B>V5T)mZL?~)79$y|f@qp@&E$$KSsL;aDbZ80y2MLbSWf=9h* zLW#2tv@r3%bE~aNRN(jr9)%v`@KGfLKZlY5Fn?2l{ghcjw7d#E@YHkSl}+FY)S;%Z zSSMc3mr(>_c+7!pvBc7!%D~?)%ZL??q1EvP&j%Hn;>6@2>hb+gjxlL%6b-uncfL`e zs$`FX7bk6w{Pt2hyMO@)qXq67=+RBx2t5_H2=L*@%wb!C>EE=s2%c?&3ux0MJA(n8}Ro$ zogfZ3@TZ*JI1k(0M8jbLl(Zeaa`yS{ZIg*8L| zIesPEX)bz|c%Ek~XR9#RPQkOnB!)fNRY|+>Jhf*8>k*0k4bPKxeOPPkvpmN0@T%#o z$Fewjk7pXB!FIBaql&I3lqfbC5 za|&WefKJKJU2?iP8-G?nw~`alO=lT3(eSP%>!FqCy97P<$~GkyO~8T#jmHrf6(Z!G4;2ZF>7J!B*s3Jkybi!1GARESuoIOi?i!M?=++%*<0z?y0k zK2{+<8)dyjbh*-8H|&gy>0*+zBjt^$Y30ylP*3;0Di+w8}wY>Ttd zro;0d(+O-R6X;{(xwC{}59Pt<6lXqa_%L>kE<8c-th-8=_05f=XL#;B_yDsT*dE2V zFxVwib+{$=#DVRLUc-c%&G9q?=X_UxUWj6ql!^QIYH|;8^&a%M5u?J!IErS;N~*=L zAJ0&VkCA(~#?KcwZWOO?j-$5tJw09@6ce3s5904UFy@R{Z>%5@^)IV+Lo~u(QH#&f z*mt-qvenU~jvRWk!5#6IZX_{ZP!D%MD-J3TMV$nl?UG!v;B_FKXoEYky|dV?lRpj7 z#XW96QuL{kQgtuH(&Hv#U--bDGsGFz8ZLgmC;LaAWP!7;c=?AvodV9u8?ywX1wr%( z@1+Ub{%%n;eAM6P`O1jR?C_R})Djq$4CUCBi^226vzqY&*t~fifiXez#u-3h0Ja!q(zEk=$y$4Z#JEQl64|G`#V5=By%zj6L3 zU&UU>F3Ch-TlKy(Yvqi519-03beB1W`P4f+Z_X)VB1b6cHn2S;+suTb?x+Bsy`M`zVQy&#s=#$)p>}?z*g;UOY;F8;_0Fm>dkiy&m4`X9r(T${JO)3 z&xS4y&dly%V+F&e+@?S3?%Oef-WK@R8{-~aULah!5B?<1iNjh!n0W{}4DQWWd#VH% z_gK0Jd~)AB7qUhuNHGw(vH4G-lP2~-@#`b|wh*2DqiG|4{&es+!C+AY$wtP|$;xV> z=l&4di};Y!vp|Tf51`}L=m}i(76wIPe&vLF;mUNus1n*d$YD;jn=d3;%P24bF(h-Y zkdN8;l-0N+w9JL?T?5Dy&yDd|JM#*nDgVZ2r}k4>UUoVqn_6FA!-}vb2HIl~d z;EVxV^#jW!j|=0dC(iA)cczl**mLQCv!|BaQ&NT8`zWvti0mOLcT-}n4$t3tLnM{A zq0@-idoIUTVuyQSE{9xVptmIPMLZdgN8E0fC`m5H4yh&X*08mbPu{Umg2$QB-YL<* zzM(muFE}5OO#6Tw0Y9^D*a=BUOK6-=Ks@iTUor_AjHWiwv&vj8(cclZ-1a1H~bj3o>7Wz>lK%hJD}B<8M^wAZ88ls8CXK2t^uj^o|s_Lr>J^oMpkdLtHE zlDfVD)bR|yqvb2jJIa8wfH@TW=u0O>(edKH&-3!%Q`n^%iBt)kZLD({H!sYuf$jI) z=aT+a(5VBqE^%?@_pFs<0&F)1^i_34@8}Y+E%!)Nl@9}F4A`D%Oj0$Th@))edp7xd zirr5`KNERf?eRU5jb`z*6W{*ysWD8=J?ygK+}_>)fl)+*a}I20PqSdJzD8|=bG2+; zEL(FL&ojW`h}pu{G{)0@e6wriC2W^7aWu>kF|(+ey&#K)b_IGVxi8t}h#QyiGuE#g z+4kj#ZFA8-%=pMgIz-W}dC1TGYuV+QVN|#f{r1~?*t^SvpjiQ|?4wzmS^iWEY{S>v zu?>jHAAs%Xa7WhRxs;60!r!g83tO-l@%agI)bmSNtge7<|e?lu%#9M^->&-MSN(SyjRt}CXQC(3@7Kc zWNN2Fm%b0~wUnn!8gvidetBjy8$i1Wta=c zb%#zVX6v4KcjrcNUoRqVcsIpNTh1UPmNw$qnC5d)x(Z74L7t%L%)J6;Ie6aLeKr@2 zz0Re0R_|)c^=KbT1M%~7Z>e(+u-}#!gj_W7GV7Bgqwj0*eeG1SElQ+hkMr5M;39hg zI#=I-=fRUV+2ja&gDiXSU!YcSrm=6o(e2eWcHd@e@D za4yhV{~3qxt0avZ84ycRO5_RGbGSaY<*4=1cfPuY`}6~QaQJz*mrCybxp2~oL_W{Y z)Guee}^t`eyJq&S$TS zjB~FQFz<#C^2s$t+fiyd@83*#F2C zHs>OK&-uugl!n|l^tuai#_Zyqxp9q3lCDILXwXWo3+98na!})++|1dbCR&jPuE?iD z+*tcqI)mp+yN+?e=-H&?BL8vS!;M=RMM=1WHs`J46h}iT1n=cjh9h?(2i%op<7v48&UQ>1bAJQ8-bTR}uU`zi6uI28Dd%z<3JN~b zRQsIe_MXIduoHTcgZ6Uz;0v_DdpUMJjvKuxm_DpRf52)g*Ty=4p6@_xc{745K;PcA z7TDUboEpya8N>m@l4)G@S1BJCcT;;X1^kT4qpa+C-~7f$Iij8>3`#FvhRh&VsIi&Lriv_uHYMU zp!xgP@Np8FBzPq8`cW^y7k2&|=fTQ*Mcala!qW_Sd*6M0(8dJ%4V=WF`VIuCtZXS1EIr)oK3bp zlJ7PFb>d*$Yd=J$rVQLg3(WYmx3PYRKT*i-vp)Cces@S9D}2|n_d>bp=*PC%i<#5B zT^tR;U3>{TDqkzOojt+pdx(77qu9AKuR{T6@E9~t89V+A!xzi^I!%!RE?v6hHw0=TYoZ;E}$Xog)@Rish>N*_Q z`d(w=Zi06@2|c=*#y!#*H2UFPkU8 zT(^q*f_hN>D{`k@)m)`3v?E@jjwn0E6(imUmLtySr*K=KCu4pX_sG}zoH}?iM{(wh zk4)jR)&x+dHsZj^h1{qOIETQN50`RRFyr1@fbV@(EO&YZxHOmLq~@H;#Wux?`-t@g zYdEv^G8+9zPWI~A+%|I=nd8@udM9#I3ZYSopYOSR9H$xYPezzwop>F{o@fLK1@$~7 ztw1heY3U@CqgT1A3wqA0X9(Z(<7ou$JCmbBg;Mi)TF?(QHJ8daEWmsgF}dTEhs>LL z>>k=7o~WN>r=drr7l1rOYb>{QEI3F7m@5rP=OQ-1^Rx=@al62A-4dwnZ@eSJYg`-K zc(QH-9GaixUPCY9>kIT@T4!+#d|98Cp`R&V#@+ZGLjKplYwc>oSqurH1?VAfs-4RX zx`F;1beZe|y|}td{`3uVCCeu<-2E2*GzU3K)YKHN)EBtDmXnWk4YyPWeYubL^^Lil z4f5w&%y%be!;ik1jE+B*(+ayV?xT~8RsiRfYjwH8QT~*V_jS;!1KX-DklqE$|M8>G zOb(=uo`2)KSvbhonuAvWoWCTs7Z&b-_a$(S7t94SeVlE?WY2GNh0B}JD@Lra>AqZe z)LV%iR@`6n76|LXI|}ZNGbtG(^ucV!p+A0RX%=6(Jf4Oie@mbCnqje%QjeJ2Kkhu6 zwGH`j6wdP-3vTC>1WG@MJ8oAtmkwUR2b|Sy{YB3AI<)f8r)bss6nB0}939ibzW2R# zT;JQ6MIdgBJnPBnK&#*e{|Ay??7j2u6mJKz>XKb_>XI^2b8)gcf&-O!46 z2;oM2@~69Xa;i`%xfbo9*Z2*ys=aBPY_5zpHB-=4t!!?_6DhT9p`e1{Io#5NQmXlm zUdhoU?$=H!&3+=McfF=^3mT;KLPVZC`3igPA@0X?U~V*)F+LecpV9w+R6O4NEA)IO z|9|oMV&~`lS>zl0fwO+6-hyuu_M~w4bw6w)EJ1!H0OxMb?t&&XH&y{>(`_Nbth?ZB zASSQ(3=r&)Kfl9ye!a#~h(vz-y>FAZ=67CM4&TO+IKx%uOd9l3-XO;~H+LQDTNh8} zGQ^f0MqEH4av06uPo=hu4X=~Y;-Ek0*63g$X+R^c$&da?AbdQh{e7OxzJKTEpiVgg zoZoKO5-Nh=DFd7%{e}of>y&g4I4d-)gfTO5?*r%3{?mlhrSaH3LT~)cB&bWrQw;9D zjOt;+Yt+U25jQrSy2yv~@NERn9q;KfD&X9ADstEOVAc`u=!O(|wTT+{V6&2XA|Kcq zzkthG0S*H&)Lxj%y{(47A#irAOX7|UhR%7rCVenRt_1I7+*8bJP7UM+wFNhz5i_!1 zJ-IFILTSl3%tI}VIit{EI)XFy`S)1v3N)Bc+ya+(t`*0;2%yE#EtMXc%>BIPPo}LE zwEx>gZv0F5tpooqz7j6fR7O7Uzy+DrmpigsN?WVtbm!?ucK9+W&q)F~E7? zV;v#79{ZTUS+1uqSkJ{XaL(9fB#gfZZ+gTHpXfe<^CZl$fb)s~O`$~vJgN-Q(@+-h zXG-E|jtSz)w+E6t#^CD$=MCs%#GsZ`0Ou90FR>*!x0+kPANV?$`?Uc3;E%z(zPE&X z39Sh|;QaQ%GA<6jDmyy?LlZO3q&N5}co)I8T3isc%=7U4`0N+fzh5ZXgU1rbt8oqC z!L%E>Nc>POE@=>A^?BT7J9W7y;1w?Y0sP;0;ZpDTQMwBj0q0;a*E$T8 z(Q?GdoSp0xTPZz4Ua@k|Jof8$aKj>@Ihpo=8FF7nd3JKj{?w9D z+zF(8_#oLA25@#OYviARgR}_oS<$wNKZZKuG;sc$63SmX6-T+i+4*L^4#f`KgGFWaz&4U}ab^x>oMZ!LhtgZb@YA_vtPmDVn^7;!(YeNI8VAvY z6R7D*Z?nU`1&|wJ!p4Rgw*3Qtx&SYaYwUHlzClK#5I0(UDq$n^WR(8`XEkIan+YA2 z`U{vfS}kMWK|lM^COPR|)?wAwf)C~oKHs)XrdO2=TopMT&Dbe1!H$vXum8igGUorD zn|hdrtX)gDsVpiaUs@fQEW@1GUJ8frs_;~DfJ3+>q9;5kn?3;pC7y6h(-Df)TH zJ?vFXQi_z+QRf>rlQ8v{(DMi1qcUN-G9#L?Igj2oa2C&NvJd6p669eHwb7OR z2@de4JGcjp^Vx`r@W8@1xQ!`f9TVX9)Dv~Vn=JO#NCh2z)5KSIV@o=t_gD#UAPtu7 zbUBpr@atoio3P(x!SqQ2P6bI=-Uu`3Y;by=iEaM{9DrKny5m^Z4(C~kyh7`p2|Ehk z{-&RDs3_Li1v#=O zR=~OW9vMF${kkCF-1D~szqTfxv{0Mal#J$0=Rt3+5AMgxPW)>0dA0&)$1cZIn-Mq4 zfpgP4)$W5mec=4zOlzj-H2i#h@$>s~n9-QM9@>b0;GJJg8?ywGBTwt?If6Zfy$Pp| z=zZO^WUKao`_v0(j33CFx+_S6f6JMNE!pj!m|0vzo)dk8ar_-hi;(Xv+jN>?0)pxL zVCYK+Tws9^ELTz-a8`JB zI<9?c|29QqaGOnoRiItsJ=e{w!pb;qKB%-N%+hHXCW`B*r7)}4F%2~cY8}- zs1QSdb5+`P$!^r(r#9d@-i$Fp4R{@KAW}buu>zm}X9xI;-A`fm;JpOnJin<5VAjBA z(*fsp#6p%a-WElEXVDus>B7t~fIsg|%x;FZX0{-1Nb&QF$7?dbp*vL`g8F(-TgLEh z0F6c**xf^eX={&VyYpsRZO^!+^8(=v0;V zBJ?zXv+D{Q)phirYk{-#ijJ!BB7EO~^Qrik#Q~i$hqXmN@YS2*0hkX;eQ@>^T~*6H z(T~FXqJ8sOs)OK&rUI)SOq!~}F@Y|lUhX<*t19qPJatEWzGAUXCEEZF|4ZcI*A%KR zC!^@*Nz^{E&Z_YyVe|=Sd-4u@RUhPaT6jliB4(+&bVqN;3pIuP9Mu=(b(uUkp9g2C zQmf!C^A@?{tqH2{S7mhLJNCKu4^?%2BBlPoS#4N5)l3s9tpUz~SvQIYHJ8$N#0}H# z*~J$FrR0yk=&LQ`i|fzGsK!!G-E3YLwLpBnjr?=tzkc+t!rwSE1pz{XK_cA%&e~_L z^IEa+`~uGPZti>rb{w35bLvYCzS zOzP+WehSVr-wHk9hQa*D&OzAeKyS^%m^XVGKrTnHmoc_KZ&K+`4#+E>Kk3d7u0Y+5 z+A!t18gB;Pely^#^1GrsIao?_5I6V**((1Ze)J6YATP649q~sD2|%q~bHCUO=h=4( zJRNq=C{Dc|NWO?~kN@?fAAav|oK2$Rg}MC_=@xL7m7|9boP&Y$(I=t2?46Pp0q5Ie zwE1h8ndSiJcR8C?zwTo{0yt~+GF7RZ!P^JUoeORhzkUM#25`RMai#b)W~Kvx^M@Ct zQnrhy*EX0B9_Ljecm)h_{yNr>Z-E>pXC2~6Z#kb~m_Q?dbGGY2UXFdMH|^o^@f~pt zaibG*JdIuZc^jpI=n-Q3t5y8ftx@QcVLw9Z!B6NLM)!dE#^hQ2Vcdf&eM(A}UK0)1KXTfKe%gFgFIEt?gdHrfB-A3;ycziQH z&rnLG=*z8LTcmpN#g7v5@tp3j3YMWBM1H%ssly;)`Jgbs&v}G_YF83TsovWf_}(hFZ6sK zcjS-G13v^fd-hq%2Lk6Vzj~xfDH?hf8%rhyF4Mke?t7sQzjYKY-&@SEOo*^Gpu##5s0CW%3|^E^kHcV{u3&ob{*F`-mZ; z;75i#QPw|Q6?PFEB;cHB=AmNsq-0knC-X65RP`VH&{LPwwNdJ-9l&{bBIYKGP8P4m zx8Q&~vDuuY;$gS3TLix7|NQ9NN&d!ph<%};9GFP;z`4x~L!mF`g9*Sn-Kvtm^GQj* zzntRv&Pu5e zIQz8wVZI&v^u3UubT}Vlu7w>p!(D%H3jof`SHW{<{O_X5bBOJT)w6c{6c^V7QuSiw zjjoBsP5H$qVE*6pe7cGkc4BVz3^-r8&Ine?xc7lGJH5HE^ox>0fU|qhIbQTbZw)vP zJh6rU@D#BEI5)OP;7@wMs~0#YInCvNKnwjFaPD!iGd~^o;0ECAxYa?m9XOu`&cmMM zNYpVa+yb17^t>2%#EmY98!r8-nG2Z1nj^0Z)9lP9k4FDr6MY8t9&96OoVUNhXL$dO z@xwi)hWjpRz-gu-Dw2BR9R)Ps#ONlY?#9_3Hewx9>Jv;;ah|_9ZDbZehwTe$L-JqG ztOCvx3ebyi&t&GG_NR__upinwj`2Prqt2+u9d0@@E~ll)&E<6HUQZ@g7rjv6>{oYD zVh>Hbg58+I=FX9r0_V9I@SFSYZN3k6N_4oKZ1YAGe@B1gvj^Vkzkc+lE`Q^!-RH7k zjr_S9I6odXPsm38><6634AB?nBCl(zQ!LWegbd_$bAfYrzj}T?^13qAgTKk0(spRL)3{k=ktfR#L?N|mX~c2*sSm9euot24?zr z%)fw@%Eg{Nf?3sU)PtE?sjNEAb~$phjc3x>NBBkznj^m&&_lX3?^ONgGKXuva8Ya|1uZ#vS|-?2DB&}5uf7*bY!cs z1Ah7e@NeIe^*JS@EPN-W!>gIjZ{L|>vsccB72nMJ_1u8)Q=7P;0&U~7HmHGkO-UiLV{M#g9P zc=Vs&8Dma*DxTK^&aq=r*DSJ8sXoM!)B$~`hjM0F7BtMm&__CH$f^)G=IzIPHZGmD z83m6*oWn_DF0v9=i)JyT1gI-Vo#}8cW!?y8*N@6*cDOx$Nd@e@el5{$eqa z-G*L$5PBWyR|c@^Kcv)vzO>%1A4~^J=$#<8Ot;_59EMiJWeN<6h13cj?@YrbuK0=688~ z82Xvn<54@L8L8qCH-yEwPn#WPHXXozN(%Cd;q%z&U?pjlV;-%|vpW!zbF{HL->)@y zBNI3yPgwi48y7nc`_7BxlwsSB%O4m^-E}Z~nskqCeO&2&Q)fya>VDchw)sH%$`FJ`4-|v!we}q z%>Xq^E8u+DoYixe(v&*nD#6X!E6DMj_hQG*d_7~aQc4T(U3Gt`$#klO2jVQ`E#C{w zJ0Na6G?&x5fBonO;Q7DjdF|3FAp|?@2M{X~Zbb6dg4f25@RzALds{yh zhjzp68*=6z4h@XuWq3K^{_0ko#9rQj9k)81J?1&v9lV0W!;m|58pt)C0B03(&mw#x z_h>6-I=FXEH;(6|zhkM!20l2+eYgo8_zrMxdo20R9_SWM@o&7o*h5~aX)56pJJauqdRB?dPI^F>|^wi3Q#9n9^c9y1;=0x`WqeQ z#IfDerL?C~PHDQp95wizG~m4H5o4YyrBgG|kJ6aM5YDp-`CDjkKgkR9MZe-65&!k0 zx7GL?=YsHRVckpY?zIK~#5!Kc!#CT+b#XCWE;!UG;WL65o9_6}c@9NPh+I5XIEtQI zF3xSgOA>)5LrjE=+#E(utI$)*Y%z>$rXNB1zz2lrY?z+uRjw^b9Fk zEx|n)(3cI#l~Qa+Ii>1tU|L*6Y`+ezX5~srQ-9;e0nGLO^`oyr@8!Se*>vu0VGQ=I z^4lY4E=v~NJg{@!1F_mMP|&)sq-Xu{^Uj_^_G~4onIK=Cw^ZnjxG@;#_K}r?a0)nw z16#H0qlI|PQ239)Pmo{IdHa(&$1t0pl8xe zPUAN8=W+@YsB;i@OFH{-8-FCwfGe1jPF&3$MBL7Jk6u~+2F@9M>>21eoOzkf4Q{WX z7{u-1AMRWSCvf%s(I1#Pj@!zBzfluS#TwnY{;vY4n{PB7nWxPShOW-Q@@Vqg)rrf$ zC8NqEm`fISE_snq10G4I}Jf`0yxckF}1QtB}kHA}$}b_8OGK~KEb-pg6% zO;TD>f}ECn$fThjl*pQTEcYbF=L0DO-|y#t{pf3g|He7|QH{|06Ex5elM71I1O@cF z(t1P7LQf$CJyOzyA(*RHL<&cpus4BwZPuqC;UT{L&sKPMk*-2L;&TsRn>x=%*nSl` z2F|ed^k#x7?!;d{`1yV*=8?#On{NQG{?%mmj){^s-Us(p^D(Q7y;lZ(@~qdyZNM2m zv=Otp$V9FhecHi4u-kiYFBb;h&SNtL*{UkIFzn=hvRBZ2t*6|NiTFll;n(YbbN6-P z=mhkYmYKJuW9`8sU5OrkY!`B}QqZq^3d;R#K<)Q~&w?EQN#tN!qX&O8HTZ?c45hKi zeH?LT@7Oqyru~3kEb^PO1Kr3CdIRggYkxN41Ggg|8V_Z$w5DqwSGpyL)Tb$ErbA!u zu~{HheMMaQK9-dyK=Tc_o&VR5zHP6+acBBd7$J|1bWVe;9Bfi!3H8{e$$9M_iA%4!WuCOd6(Dax!m=(@Hs6GVzbDHJQ{TghljHkDI3G}9a7tcW=S-umTOO0Jzsvv6KSc^sKMnno!` z(UgeVH7<5MWsZrYGtJ|njna?SC5O>4Xp{ZeUd@%kBR$4dL2WiTa5aekC0p^0uX19Y z7Y5N#_=`XJ*N@&g@Nc~W?W48Aaq#&M;_h3&Ek`JcNT9ih6+1?x3R)kPYuV4d|;5H+^&E3|4+aC;H8{Bt8)BL!PEIg?{q9?Y0CpQWHr<>;~C`A7T z*BtSrJPYS@!Z+@sR7vUu3d-Eno@RmfYnG&-?RGt>G9{Ll_$#P;!eEMBq@as|3Tjz2 znphTnIP7q8F5{p(6;0`33YxIegc`m^&?8#~rTp$mF|nbv`MR8*2oE@qp@CG3c&j%r z9Q}n3JvYyH`*C>w`84QnUDaVZOrwStrng(OCVd^agjlpLQp7l zn-L#u&#V?czJ-qNLd?hCt`su8!DIA99#t72-2Vn0k`UC_j=I89edwp52FcgCCs~Yp zlSl6&^J6-@`8YUZ$SYds_2%va!_S+rPdYf3n<7g@U5NeR{l~a=p?L4;>E}1rbM;5i zyDL@DJ+oF+1MLDY9$uSk+S8X$u@q*bAdguZB=*IwstoV$##8R&tMGqzD+14K;%4;> zr24=}>M?Ny=YJCTTnwXvdBN;M`1>6D5kl;-WOGaSfcVV*qqj2=I?u+}{yh7+dC{`C zKbkQ0Y2MUU`;Xu2OlVd4z$dKfj$5}-N`bfjJl{6Q-0BcKiT?RNaBLq!hvMJoCah}~ z*9sZn6*P23zM)z#R3LYa9fmrh`x?OtJVR%ES6Lc4Lh?#@hs{AQeJ@*>0luh(E9$aQ z>B2h&e6Nr@rEUus_Up!zMLcSpt-8WCYyA3d@P&N!m{H*Iu6>Cf>8Cul8)h_{r-46g zX3PzIiW&ELU|yKQ8ShFYx7i9RCXv%!2<e6OhxvoFm-V6^LA05`=r8jA7g_71F1J$%3PZ|b4u%>^m>WBw@|M17_ z*~8O=X2W};>DOgx9u%|p&$Cl!Pg4B+^Xvv+%?jn8|8~kSZ(6PK2Y<23hwg>_c^*AT z3f=5K?_zd8XvN$7!Mq9ATIeY?{r>+u&xzJ|gsy`aN`9O+w+)j|#W73~!0vEPUkW|@NXoCzL_Oh?f0 z1HX<(j`w2<(*wKk!RWnzPu#=i4@#i^zQ|q6M{}=?pqqzSvDi3^i@l#n5r_j@UY2ur zl!+Ao7~go_1MW6>*PC}@&nM<8r*m9EIV-^@w94d?;0@b;Vl=%Nsn7k2fo5HFIC*zm zz>aG42Iu+@4u^C+DQwLj+_V`F$^$p6>0dto9kgC21XBC@HmVNLBG%FiB+rJN;ze6M z=(@$9pLvS29l9MmZ*AU>yH*Vy@7_U}4<;Asz*9wkT@c02s3^XKeyP^XKkuSjd-R{5 zL#IZ6VUch&fX?msTeqiW^lhQVh(sFO6F7HVFPI)kAWg*NI-fPdXj5oIO-FC7`C4HP zzIRic;m)Ji3fX4JX(JGa(=&ukMc@^rqSvt`Tv&qHch+X~C&#oE9-%L{`YP_bRuRls z7bVTn$F4!{QI_1GdA=I{q%xNCbxov)eZg%TlFQX}Num}f6*MvN5~tV+o^a1tdOqVR zcLp4fglYwq+TZ3bmMdr|`etKs??>N&&m(Z&Yh=Q?M1hA4Z^fkKc=lqsH*K!OzkT*3 z3BTKe($jHQeeS8sErG`?^aV8SMi=jc9y#|2T3yD2Bzo{wnUe2My++)YMA>`LvjgzG zdT+p}Px7Rq=Foa|7{Hug1N~CB0IEzEC6{OU(91^wv?cst(b@BU@Z<`lBk-edeg*oD z#liF@rlv@L7c`=m|Bds)meqm@c#O-ClceITYKqvSm!NLCwp!4@e7_K};^Uw-Ld#2k ze5H3XYXq+u;1MMt_GY9CC&9VBydM1XH35PicI3kk;mn_JA%s<+xBnRXAfBt4VAOrP zQCGYyRk7te5@_EEaE(S-a!$JwDQ6~n%HP*Dq{i2|Oy)JXhOA<+QMl6N@c*2Ph zN*eK5LA}Cnawib8BhlNu6}Fx`CJ86aM^R*}HiGlT?xbUM7_EOF$NG==rlhCv{kh>I z(HZJNrG5c4FE`D6$P9OU2k=yz^+?y5FLM|Ax(CL|X!u(dBkKU~15Sp# zfZD^4K5T#wU4mw; zPygP<9sO2NmyEx0?pS_Z*ld+ZY5K_DUStVvE+o(iN&Qx1Cfg@T7zQqA$6e_Cmb(kf5kn51MsLUVJ-;3?xg%;lGw*!H>ALbC z4rh4;&t^PMpuP7ogRUj6@d(xOGkBTxwYW) zFZ-dO2eZy{p6IL1L+>$XdNQX~6-q+OD3YJ*%8f*yE#Ehk78=fG!&Z3Ft>b~zxqFVp z5&FRr#-A*I_hppuL6`}C#+9JG%*<*x)EQE;O>f8U913sl`+j8F*_vhGx9d^m2QLW^ zb_n$OMfCT#%$m+V=;1|UpbMS(IEU#EZ?PWW&=h?9SsbhDM>nBGco=^42Vc078?+&s z{OJ4aa;B9*f5+#MZLbO!EfQ%Ja^@*!>4G=T^EBLjqs2sFswH&wkq>i9>>F8B78hp8>D_xE|MGb|Uq6R#0V$g4<&ToONQ!lMKqt`4MEj;SPH##*b`1Lc?5CXYU4j5@!Q$sL2rKoh9M} zbp7V8Kf{y>Zj>$fQKIKS_Gy_LX}$8L1wtr09A5UC3SY{u-@@+u4Sz8wU&>sqV$U}7 zBm-w(%n4SrAK~kyv&@&4k27F?W_eTZ)6mC+AN_tK53gsA6U_Y^Zt~BNhpYq6fv^S)$mA|GLMKoi-h^7I z+_@pKG#35#5f|rkM%edpFODMTdm7v%75YM$UF}_=WD9e>X$Wdy)60bn`_rBD(Z@fS z<-$0fbE8uDe6KrjgZWnOMqS`BZPt4Ldw8rn%?|OUj{96$vv0T`JHY=2-r|dYc+d~g zhZerbVuy|QqHYO3)MJp06`p$2_`N>#%dCRwXyr$ecxaDSG!|2VAK9wQ$Qpk1*7*I` ze*JSl{x9DM?6y@<>zqivf%EW76NJQ_2^0gImuMOZeQ*!90L~G)-Gyf=aKM0bi`P1W z9s2W?+2AG#>cZ~wcv=dadklrxG-{TQr_ryATFobCVm|d2^-k+T^R@PvEm~k-=HdsY zH+-6k55cSSP!hXw4t%IB6%^s~gq7(h(MZ(D?fdImnC@?ihf|34{e7Z{c$0Z z%+0Xg*(2?uwj9F^vIsQ4c3)&;c&>wJ^ zx3$3>d<|+DgH8NV@Dfk#!A#IOk)O3Zo*tY;PLec=-?J9^GrsX%TIY-VPRFbqydA5` z2~0N5a~@`zfp+hilQxO;bEtxLPqSyk+b5B5T0yOkXRsD;6LFu!l4IU}*1|7=POHU| z@az~{<^iwIE(-ctw3)R7ALO+Y^yM7A*{?Oh*qM$X52p@n<4r$!8->t>-${&p7caWL zE`ZWo9h5W+hZjdj8O0AtkvQLXBd48y6n(ud(+zs&moEBJyQPbmdgObjKKf8uK@PL+ zjR&>R@uB^<4=^F{4RO@>rj0oTj3eT+0)D71H<>ZLJNl7zjVCFGwv@D96o4Hjc)G!l zo}d?NHu;Zs?*GnnZLc6N3}Ym+UJ6PfPj6yYXz!>IM2HquwPcZN@akZ!ORhu zwOvuFrXW5qU5nYVe~M}=_K#}1!T(^uMwRZTMEbE!LA~t{t2ArS-vG8cZ_89|F?Xfkj^r^rV-+NC~1>=5xJ{Nx} zZiU=f)>YMVy*o`z29I`qd(}SNi58e=_sh^#-JR%8_j^OL+pv!+`;9w&)%B(R=LW0R zH+ay?58gE6&PY`;Jj5ylFLFLNNac9in}!#7Qs9kts?49hq_-D-3BRk0pG^uNy9DHg z@T1qo-=#3k>#y_t-pXEh1pf0#;9MD0z^~q&K!FzE$>gZK9O;BC%2IbSfll?b0M?1t=JBN*|h4eL;MPd_LGg5UT6 z^~vZ*M}?IB@J74@u8U6|v}mHK$tUrH^%7zE$Y2t6BjB^vTKMJSM?`CRza z6n*ig_aVp4v&9J#{LLuI@H&F zZLJy2vCuqOg+AxwMN9~IiO|KQ`K~>or_lpi zaEBZDfHu%>4FM;xL!fZ{8{Xp!%;?XT3b`lXtL_0kDIE>5{vdRc&nRfzs=;Cl_++Wo zC@3%9M!bf4=P2s&_tnl~OIaLcm?*%{_YhAG!Z!gP#ciz>V%D^1T8?wxXfR#e@(o&x z^^tV=jG?%1K>&518;0G6dLb>xm)`FRqA_1r2|Llpu!hg0{DGn1bOWBqi~Wed{*!0w zJSe)K57}CG7PdmOd}fRn8A;j+n>VA^QR6{@jYs*(cYJA(1n)`zjj9WFkZt<8(NE>( z;>8-_w7kgeFPtCAS_#F_36uiojx!@vYMZdn&Y=&ouM4vl+?ASn!2DS<(`mPoYy%K` zEgfguFkdu+w$&$d;CtzS_z-i$v*2B{4m~Y?#q6|dy_}?@szi14-qbOl zs-DmwI$w<@1!C8_i66yn*CS~M;+xyfPvTmKa5|YB4Zq2H(R>Wz&DaPUeSjCg!O!hR zR4_#^jS{QoOKAi+j-K;dikr~8)2Q{LkTgpn#?+5~%yFlj!#(-OeFA8rpDU@skA5HK zl`>b?zi@6WEahFb(cb{hOweq}mRxvnu;}?iE4x{5csSy&8D3w(^vXy6EW(#A>Z65ljI3@BtUVJ9^!dZ`pvoLN&}f`&tWk zDwLG&i22Bh3ZX+W^esg>-Dv1976+j=fiBF<7jEK&h(u!L=q<;s7I&ZzV7FF5RtpP7 zGt4N1gA`QQtxUXj6uoZfBGp`~5r>$^QayMAW0t%XkD!)$zXQDV$d)C8KY;Tdi8*Pz z4kZbLF*kF@j)qOYhEKQ0nd zk%zaKET_WD&joQEJSotx=v84M<{`%$4IPaE%@RaUmqb!5Mg7ucx7d`=M};eBs?&Lq zMSfU-x<iyH z`8E~%kx|IKXO1qhvWuq65;^Uwv@9uo8c7bjagRtRmzcwQD0n_}8)r`_F`XYq+3+xP zG8EbCgyBsJ#(}zLMHuF6b-adiWpue%^LNE4yvXYwlU?%l$Bs-)v z?llEspw(#B5B10a)Zme=4B6Wn@npLRoc#Hxm@mEl^y}jEba^w>GW*_OZg^fM#NmBS zM2@GC)LiU`T^Jp3P6q9pEe;r)Nb|qSX{uVb*n3JMC0L_of!=boV*=eqJeh1!C$6%? zj1qIJb+U5t9M1ktE$}Fcc8eoCBWYi8G*!d1xCi*pZ}Gpcs1}K=tv{_y38!8UCyKw$ z_>uFAQ2JWzAl`z9@3jnQiMClLwjf^$|Bji{45@go5&k~NPi6=CizUx}DD$X{Y|bta zBU<><4mCg0FYF_ppX5ue?|4C%WUtU0-h5k7+xOkGiI?LZWN*O36n^yD14HP=@V{|x z>J#>Y4%HL%ksPn=XWpXE?}|Q>Fj$+t(K>;wXM>YD)|5S{fR+wsCGO#q*_a>klo<_f z+izR8AUK{p((sP9n6cx3#F5?xa0Xu2G9BAvzy26%8GTK@e?dHre}Z{sag4ApTuD=n z5i=iYir!1WwU*22@SEkL5q4yz*U2e2v_K5OUcVG~+tIIy%4C%o&(=gat zY`i}+;%fp82F|Y^{bFLUZ*_kh=F}HW*r*>$y5fL5*xkO?IdVuXwPB|!OK0Kh4|3DC3^yxuRxvX5dK)zGYY#8m|G2QNEEVA8+wCN zRAA9XygEFA?kxZ}9^U0%?-MBNsGNkNLUBEMdY|9p{(4v@+K+%�n#uAC5`!3#2} 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

1!cG~@*-*h=qf7D%0 zy_!Xno1I3dgf@b;ZB5)(0FO{6t9d58i)HpT&rj-rdxajX`pjnzK@a#37WCTe01Ael zQT5k7Wd6vnH8H<}{>A1?O%DGzKPRnq5YFdnNr5=`alXL!G1XE!;{52_Uj7yC!HovgkBhC}%XY#^UHT6TBTh7kmeV}(&fH)`CJ&)K?y{#h_@>`61A7m> zRQ;BVBxSSUd4ao{R6@!iaXfw+tMeu1aeRV(o0BIq9a zxLL(5gbtX^FFXQI;jH$;CqEhP0eGB$=_Evb2_;V>@Tq$@7DiZL{xeBRb-&%+hzF*Drn6KFRPppZv056q>(Cn-J9*J!LeSK2%teD_WY4D1u{`#v+0aPlf z$>IOTxqh~VFttESA&B#n(lFklftHpb&SQ4l^Yuhq~Y6JUPI$XsCqta~ zMS){}z(n`l0zP_I5c8|8b1N`wN#lT&watM@i_biS4V zu8NO@W~^G^Y}*_h3P)&~^!IQs0N36&N=i!#%$)Cy2CsIKj2`@WHF!_!2y(~%rUNr4 zcLDYbPh7zP>r|9mbQYR(p74fQ@;q0y6`vja;H%@a4Y}ySqMGLd$7HVl8;`~@; z$q%frrLVXLjo5a&o`b=S#XV?06#FvVrPhJC4|drw7oyd);0}7dp&rb=!_eg(3@!ax zGNuTcKik1S9oTCJqj?fTgHdCMi%&3BZ=-3tvxIb=FERNap~DsmO)jg4jL};q?S;lx z(wp~;Xm=#FeTn{Jm=Qa%1$;0opvB{C&K`y4?F^lSTApvhCajmymNn3^R5fRRSYgjH z8K0e7UA7hQ|JQ-pIOAT(y!HkjCR0X&`CO*`*rs%`Gwn=*QhI;lD$nKOasy;&3I4$vepPp^rU9y5j{=oVFfPx!My+T>mnPcQ7d zFGtkW+w|LyDuIQr{+^~s{OS2W-~Vr%zZ_2Gci=qtM4W49oYoDmt%c(xu=M-uG97xv zk!u@h2=l>A>@?IV==)C0JjP6ijzLfK%bv1lOnO2r=Fsq$KWfH4z$|>aQcO*{wqrB$ zVyHFllISM=*u7_>saYQhF$0FP&!E>kauc)^Ts_!3`AYJ~-N)XZ&(1g=Nw#m`HSg`i z_S_H55_AWOCvIRr#3*Rs2q`&v`LiWc;J3RFGyK`X?6|tf+rR-_dm6 m1{^+!Fm> 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%0DbB1t;>I@A-S?p- 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
  • &uccIM=|)bPGnlvfNxP2(!8(G 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

    nvY)nRL%m%bT(SYeImbb+sP358!c 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 Date: Fri, 21 Aug 2020 00:55:02 +0200 Subject: [PATCH 075/185] Renamed DCPs to use same capitalization as in metadata --- ... EOS 5D MARK IV.dcp => Canon EOS 5D Mark IV.dcp} | Bin ... EOS M6 MARK II.dcp => Canon EOS M6 Mark II.dcp} | Bin ...MARK II.dcp => Canon PowerShot G1 X Mark II.dcp} | Bin .../{FUJIFILM X-PRO3.dcp => FUJIFILM X-Pro3.dcp} | Bin ...LYMPUS E-M5MARKII.dcp => OLYMPUS E-M5MarkII.dcp} | Bin 5 files changed, 0 insertions(+), 0 deletions(-) rename rtdata/dcpprofiles/{CANON EOS 5D MARK IV.dcp => Canon EOS 5D Mark IV.dcp} (100%) rename rtdata/dcpprofiles/{CANON EOS M6 MARK II.dcp => Canon EOS M6 Mark II.dcp} (100%) rename rtdata/dcpprofiles/{CANON POWERSHOT G1 X MARK II.dcp => Canon PowerShot G1 X Mark II.dcp} (100%) rename rtdata/dcpprofiles/{FUJIFILM X-PRO3.dcp => FUJIFILM X-Pro3.dcp} (100%) rename rtdata/dcpprofiles/{OLYMPUS E-M5MARKII.dcp => OLYMPUS E-M5MarkII.dcp} (100%) diff --git a/rtdata/dcpprofiles/CANON EOS 5D MARK IV.dcp b/rtdata/dcpprofiles/Canon EOS 5D Mark IV.dcp similarity index 100% rename from rtdata/dcpprofiles/CANON EOS 5D MARK IV.dcp rename to rtdata/dcpprofiles/Canon EOS 5D Mark IV.dcp diff --git a/rtdata/dcpprofiles/CANON EOS M6 MARK II.dcp b/rtdata/dcpprofiles/Canon EOS M6 Mark II.dcp similarity index 100% rename from rtdata/dcpprofiles/CANON EOS M6 MARK II.dcp rename to rtdata/dcpprofiles/Canon EOS M6 Mark II.dcp diff --git a/rtdata/dcpprofiles/CANON POWERSHOT G1 X MARK II.dcp b/rtdata/dcpprofiles/Canon PowerShot G1 X Mark II.dcp similarity index 100% rename from rtdata/dcpprofiles/CANON POWERSHOT G1 X MARK II.dcp rename to rtdata/dcpprofiles/Canon PowerShot G1 X Mark II.dcp diff --git a/rtdata/dcpprofiles/FUJIFILM X-PRO3.dcp b/rtdata/dcpprofiles/FUJIFILM X-Pro3.dcp similarity index 100% rename from rtdata/dcpprofiles/FUJIFILM X-PRO3.dcp rename to rtdata/dcpprofiles/FUJIFILM X-Pro3.dcp diff --git a/rtdata/dcpprofiles/OLYMPUS E-M5MARKII.dcp b/rtdata/dcpprofiles/OLYMPUS E-M5MarkII.dcp similarity index 100% rename from rtdata/dcpprofiles/OLYMPUS E-M5MARKII.dcp rename to rtdata/dcpprofiles/OLYMPUS E-M5MarkII.dcp From 86471c88e0727c0e85766b6da8c088c836cc3105 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 24 Aug 2020 14:04:47 +0200 Subject: [PATCH 076/185] Canon EOS R5 CR3 pegs cpu at 100% with no GUI, #5882 --- rtengine/canon_cr3_decoder.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index f9850189c..51beb66f3 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -602,7 +602,9 @@ int DCraw::parseCR3( relpos_inBox += lTag; } } - + if (!szItem) { + goto fin; + } relpos_inDir += szItem; } From 6d8a31961fc50379ef404eb84c736a71b495cc7d Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Thu, 27 Aug 2020 16:35:39 -0700 Subject: [PATCH 077/185] Color the vectorscope lines --- rtgui/histogrampanel.cc | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 142bafb43..2c9d6bb0e 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1378,19 +1378,34 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in std::valarray ch_ds(1); cr->translate(w / 2.0, h / 2.0); - cr->set_source_rgba (1., 1., 1., 0.25); cr->set_line_width (1.0 * s); cr->set_antialias(Cairo::ANTIALIAS_SUBPIXEL); ch_ds[0] = 4; if (scopeType == 2) { // Hue-Saturation. // RYGCBM lines. + cr->set_line_width (2.0 * s); + constexpr double color_labels[6][3] = { + {1, 0, 0}, // R + {1, 1, 0}, // Y + {0, 1, 0}, // G + {0, 1, 1}, // C + {0, 0, 1}, // B + {1, 0, 1}, // M + }; for (int i = 0; i < 6; i++) { + auto gradient = Cairo::LinearGradient::create(0, 0, scope_size / 2.0, 0); + const double (&color)[3] = color_labels[i]; + cr->set_source(gradient); + gradient->add_color_stop_rgba(0, 1, 1, 1, 0.25); + gradient->add_color_stop_rgba(1, color[0], color[1], color[2], 0.5); cr->move_to(line_spacing, 0); cr->line_to(line_spacing + line_length, 0); - cr->rotate_degrees(60); + cr->rotate_degrees(-60); + cr->stroke(); } - cr->stroke(); + cr->set_line_width (1.0 * s); + cr->set_source_rgba (1, 1, 1, 0.25); // 100% saturation circle. cr->arc(0, 0, scope_size / 2.0, 0, 2 * RT_PI); cr->stroke(); @@ -1408,15 +1423,30 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in cr->unset_dash(); } else if (scopeType == 3) { // Hue-Chroma. // a and b axes. + Cairo::RefPtr gradient; + cr->set_line_width (2.0 * s); + gradient = Cairo::LinearGradient::create(0, -scope_size / 2.0, 0, scope_size / 2.0); + cr->set_source(gradient); + gradient->add_color_stop_rgba(0, 1, 1, 0, 0.5); // "yellow" + gradient->add_color_stop_rgba(0.5, 1, 1, 1, 0.25); // neutral + gradient->add_color_stop_rgba(1, 0, 0, 1, 0.5); // "blue" cr->move_to(0, line_spacing); cr->line_to(0, line_spacing + line_length); cr->move_to(0, -line_spacing); cr->line_to(0, -line_spacing - line_length); + cr->stroke(); + gradient = Cairo::LinearGradient::create(-scope_size / 2.0, 0, scope_size / 2.0, 0); + cr->set_source(gradient); + gradient->add_color_stop_rgba(0, 0, 1, 0, 0.5); // "green" + gradient->add_color_stop_rgba(0.5, 1, 1, 1, 0.25); // neutral + gradient->add_color_stop_rgba(1, 1, 0, 1, 0.5); // "magenta" cr->move_to(line_spacing, 0); cr->line_to(line_spacing + line_length, 0); cr->move_to(-line_spacing, 0); cr->line_to(-line_spacing - line_length, 0); cr->stroke(); + cr->set_source_rgba (1, 1, 1, 0.25); + cr->set_line_width (1.0 * s); // 25%, 50%, 75%, and 100% of standard chroma range. cr->set_dash(ch_ds, 0); for (int i = 1; i <= 4; i++) { From 8f483496b26f711ec9ce8cfa14d1ff902fd9ab39 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 28 Aug 2020 14:23:40 +0200 Subject: [PATCH 078/185] captureSharpening(): let the compiler vectorize the last loop. Tested with gcc 10.2.0 and clang 10.0.1 --- rtengine/capturesharpening.cc | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 4dcdd0734..7f3da40ed 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -1160,17 +1160,12 @@ BENCHFUN #pragma omp parallel for schedule(dynamic, 16) #endif for (int i = 0; i < H; ++i) { - int j = 0; -#ifdef __SSE2__ - for (; j < W - 3; j += 4) { - const vfloat factor = LVFU(YNew[i][j]) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f)); - STVFU(red[i][j], LVFU(redVals[i][j]) * factor); - STVFU(green[i][j], LVFU(greenVals[i][j]) * factor); - STVFU(blue[i][j], LVFU(blueVals[i][j]) * factor); - } - +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep #endif - for (; j < W; ++j) { + for (int j = 0; j < W; ++j) { const float factor = YNew[i][j] / std::max(YOld[i][j], 0.00001f); red[i][j] = redVals[i][j] * factor; green[i][j] = greenVals[i][j] * factor; From 813ebd83599aa200249b2afb1d9213d6203d3bf4 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 28 Aug 2020 14:33:40 +0200 Subject: [PATCH 079/185] captureSharpening(): std::unique_ptr --- rtengine/capturesharpening.cc | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index 7f3da40ed..e70b7a152 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -1116,23 +1116,23 @@ BENCHFUN return; } - array2D* Lbuffer = nullptr; + std::unique_ptr> Lbuffer; if (!redCache) { - Lbuffer = new array2D(W, H); + Lbuffer.reset(new array2D(W, H)); } - array2D* YOldbuffer = nullptr; + std::unique_ptr> YOldbuffer; if (!greenCache) { - YOldbuffer = new array2D(W, H); + YOldbuffer.reset(new array2D(W, H)); } - array2D* YNewbuffer = nullptr; + std::unique_ptr> YNewbuffer; if (!blueCache) { - YNewbuffer = new array2D(W, H); + YNewbuffer.reset(new array2D(W, H)); } - array2D& L = Lbuffer ? *Lbuffer : red; - array2D& YOld = YOldbuffer ? * YOldbuffer : green; - array2D& YNew = YNewbuffer ? * YNewbuffer : blue; + array2D& L = Lbuffer.get() ? *Lbuffer.get() : red; + array2D& YOld = YOldbuffer.get() ? *YOldbuffer.get() : green; + array2D& YNew = YNewbuffer.get() ? *YNewbuffer.get() : blue; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) @@ -1173,9 +1173,6 @@ BENCHFUN } } - delete Lbuffer; - delete YOldbuffer; - delete YNewbuffer; if (plistener) { plistener->setProgress(1.0); } From b2942fd949f38ee97a567bcdff6f6960fb3d6e83 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Fri, 28 Aug 2020 22:33:52 -0700 Subject: [PATCH 080/185] Improve performance of scopes If a scope update is requested, don't recalculate scope data if it is already up-to-date. Eliminate double and triple scope rendering. --- rtengine/improccoordinator.cc | 195 ++++++++++++++++++++++------------ rtengine/improccoordinator.h | 19 +++- rtengine/rtengine.h | 17 +-- rtgui/editorpanel.cc | 65 ++++++------ rtgui/editorpanel.h | 7 +- rtgui/histogrampanel.cc | 80 +++++++++----- rtgui/histogrampanel.h | 23 ++-- 7 files changed, 259 insertions(+), 147 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index f25395c2d..ea4c8a92b 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -131,7 +131,8 @@ ImProcCoordinator::ImProcCoordinator() : histLRETI(256), vectorscopeScale(0), - vectorscope(VECTORSCOPE_SIZE, VECTORSCOPE_SIZE), + vectorscope_hc(VECTORSCOPE_SIZE, VECTORSCOPE_SIZE), + vectorscope_hs(VECTORSCOPE_SIZE, VECTORSCOPE_SIZE), waveformScale(0), waveformRed(0, 0), waveformGreen(0, 0), @@ -1644,12 +1645,16 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) imageListener->imageReady(params->crop); } + hist_lrgb_dirty = vectorscope_hc_dirty = vectorscope_hs_dirty = waveform_dirty = true; if (hListener) { if (hListener->updateHistogram()) { updateLRGBHistograms(); } - if (hListener->updateVectorscope()) { - updateVectorscope(); + if (hListener->updateVectorscopeHC()) { + updateVectorscopeHC(); + } + if (hListener->updateVectorscopeHS()) { + updateVectorscopeHS(); } if (hListener->updateWaveform()) { updateWaveforms(); @@ -1774,7 +1779,8 @@ void ImProcCoordinator::notifyHistogramChanged() histChroma, histLRETI, vectorscopeScale, - vectorscope, + vectorscope_hc, + vectorscope_hs, waveformScale, waveformRed, waveformGreen, @@ -1784,9 +1790,13 @@ void ImProcCoordinator::notifyHistogramChanged() } } -void ImProcCoordinator::updateLRGBHistograms() +bool ImProcCoordinator::updateLRGBHistograms() { + if (!hist_lrgb_dirty) { + return false; + } + int x1, y1, x2, y2; params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); @@ -1843,86 +1853,109 @@ void ImProcCoordinator::updateLRGBHistograms() } } + hist_lrgb_dirty = false; + return true; + } -void ImProcCoordinator::updateVectorscope() +bool ImProcCoordinator::updateVectorscopeHC() { - if (!workimg) { - return; + if (!workimg || !vectorscope_hc_dirty) { + return false; } int x1, y1, x2, y2; params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); constexpr int size = VECTORSCOPE_SIZE; - vectorscope.fill(0); + vectorscope_hc.fill(0); vectorscopeScale = (x2 - x1) * (y2 - y1); - if (hListener->vectorscopeType() == 0) { // HS + + const std::unique_ptr a(new float[vectorscopeScale]); + const std::unique_ptr b(new float[vectorscopeScale]); + const std::unique_ptr L(new float[vectorscopeScale]); + ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L.get(), a.get(), b.get(), params->icm); #ifdef _OPENMP - #pragma omp parallel + #pragma omp parallel #endif - { - array2D vectorscopeThr(size, size, ARRAY2D_CLEAR_DATA); + { + array2D vectorscopeThr(size, size, ARRAY2D_CLEAR_DATA); #ifdef _OPENMP - #pragma omp for nowait + #pragma omp for nowait #endif - for (int i = y1; i < y2; ++i) { - int ofs = (i * pW + x1) * 3; - for (int j = x1; j < x2; ++j) { - const float red = 257.f * workimg->data[ofs++]; - const float green = 257.f * workimg->data[ofs++]; - const float blue = 257.f * workimg->data[ofs++]; - float h, s, l; - Color::rgb2hslfloat(red, green, blue, h, s, l); - const auto sincosval = xsincosf(2.f * RT_PI_F * h); - const int col = s * sincosval.y * (size / 2) + size / 2; - const int row = s * sincosval.x * (size / 2) + size / 2; - if (col >= 0 && col < size && row >= 0 && row < size) { - vectorscopeThr[row][col]++; - } + for (int i = y1; i < y2; ++i) { + for (int j = x1, ofs_lab = (i - y1) * (x2 - x1); j < x2; ++j, ++ofs_lab) { + const int col = (size / 96000.f) * a[ofs_lab] + size / 2; + const int row = (size / 96000.f) * b[ofs_lab] + size / 2; + if (col >= 0 && col < size && row >= 0 && row < size) { + vectorscopeThr[row][col]++; } } -#ifdef _OPENMP - #pragma omp critical -#endif - { - vectorscope += vectorscopeThr; - } } - } else if (hListener->vectorscopeType() == 1) { // CH - const std::unique_ptr a(new float[vectorscopeScale]); - const std::unique_ptr b(new float[vectorscopeScale]); - const std::unique_ptr L(new float[vectorscopeScale]); - ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L.get(), a.get(), b.get(), params->icm); #ifdef _OPENMP - #pragma omp parallel + #pragma omp critical #endif { - array2D vectorscopeThr(size, size, ARRAY2D_CLEAR_DATA); -#ifdef _OPENMP - #pragma omp for nowait -#endif - for (int i = y1; i < y2; ++i) { - for (int j = x1, ofs_lab = (i - y1) * (x2 - x1); j < x2; ++j, ++ofs_lab) { - const int col = (size / 96000.f) * a[ofs_lab] + size / 2; - const int row = (size / 96000.f) * b[ofs_lab] + size / 2; - if (col >= 0 && col < size && row >= 0 && row < size) { - vectorscopeThr[row][col]++; - } - } - } -#ifdef _OPENMP - #pragma omp critical -#endif - { - vectorscope += vectorscopeThr; - } + vectorscope_hc += vectorscopeThr; } } + + vectorscope_hc_dirty = false; + return true; } -void ImProcCoordinator::updateWaveforms() +bool ImProcCoordinator::updateVectorscopeHS() +{ + if (!workimg || !vectorscope_hs_dirty) { + return false; + } + + int x1, y1, x2, y2; + params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); + + constexpr int size = VECTORSCOPE_SIZE; + vectorscope_hs.fill(0); + + vectorscopeScale = (x2 - x1) * (y2 - y1); + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + array2D vectorscopeThr(size, size, ARRAY2D_CLEAR_DATA); +#ifdef _OPENMP + #pragma omp for nowait +#endif + for (int i = y1; i < y2; ++i) { + int ofs = (i * pW + x1) * 3; + for (int j = x1; j < x2; ++j) { + const float red = 257.f * workimg->data[ofs++]; + const float green = 257.f * workimg->data[ofs++]; + const float blue = 257.f * workimg->data[ofs++]; + float h, s, l; + Color::rgb2hslfloat(red, green, blue, h, s, l); + const auto sincosval = xsincosf(2.f * RT_PI_F * h); + const int col = s * sincosval.y * (size / 2) + size / 2; + const int row = s * sincosval.x * (size / 2) + size / 2; + if (col >= 0 && col < size && row >= 0 && row < size) { + vectorscopeThr[row][col]++; + } + } + } +#ifdef _OPENMP + #pragma omp critical +#endif + { + vectorscope_hs += vectorscopeThr; + } + } + + vectorscope_hs_dirty = false; + return true; +} + +bool ImProcCoordinator::updateWaveforms() { if (!workimg) { // free memory @@ -1930,7 +1963,11 @@ void ImProcCoordinator::updateWaveforms() waveformGreen.free(); waveformBlue.free(); waveformLuma.free(); - return; + return true; + } + + if (!waveform_dirty) { + return false; } int x1, y1, x2, y2; @@ -1966,6 +2003,8 @@ void ImProcCoordinator::updateWaveforms() } waveformScale = y2 - y1; + waveform_dirty = false; + return true; } bool ImProcCoordinator::getAutoWB(double& temp, double& green, double equal, double tempBias) @@ -2412,24 +2451,44 @@ void ImProcCoordinator::setHighQualComputed() void ImProcCoordinator::requestUpdateWaveform() { - if (hListener) { - updateWaveforms(); + if (!hListener) { + return; + } + bool updated = updateWaveforms(); + if (updated) { notifyHistogramChanged(); } } void ImProcCoordinator::requestUpdateHistogram() { - if (hListener) { - updateLRGBHistograms(); + if (!hListener) { + return; + } + bool updated = updateLRGBHistograms(); + if (updated) { notifyHistogramChanged(); } } -void ImProcCoordinator::requestUpdateVectorscope() +void ImProcCoordinator::requestUpdateVectorscopeHC() { - if (hListener) { - updateVectorscope(); + if (!hListener) { + return; + } + bool updated = updateVectorscopeHC(); + if (updated) { + notifyHistogramChanged(); + } +} + +void ImProcCoordinator::requestUpdateVectorscopeHS() +{ + if (!hListener) { + return; + } + bool updated = updateVectorscopeHS(); + if (updated) { notifyHistogramChanged(); } } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 8a112b270..791679678 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -126,10 +126,13 @@ protected: LUTu histBlue, histBlueRaw; LUTu histLuma, histToneCurve, histToneCurveBW, histLCurve, histCCurve; LUTu histLLCurve, histLCAM, histCCAM, histClad, bcabhist, histChroma, histLRETI; + bool hist_lrgb_dirty; int vectorscopeScale; - array2D vectorscope; + bool vectorscope_hc_dirty, vectorscope_hs_dirty; + array2D vectorscope_hc, vectorscope_hs; /// Waveform's intensity. Same as height of reference image. int waveformScale; + bool waveform_dirty; array2D waveformRed, waveformGreen, waveformBlue, waveformLuma; LUTf CAMBrightCurveJ, CAMBrightCurveQ; @@ -200,9 +203,14 @@ protected: void notifyHistogramChanged(); void reallocAll(); - void updateLRGBHistograms(); - void updateVectorscope(); - void updateWaveforms(); + /// Updates L, R, G, and B histograms. Returns true unless not updated. + bool updateLRGBHistograms(); + /// Updates the H-C vectorscope. Returns true unless not updated. + bool updateVectorscopeHC(); + /// Updates the H-S vectorscope. Returns true unless not updated. + bool updateVectorscopeHS(); + /// Updates all waveforms. Returns true unless not updated. + bool updateWaveforms(); void setScale(int prevscale); void updatePreviewImage (int todo, bool panningRelatedChange); @@ -561,7 +569,8 @@ public: } denoiseInfoStore; void requestUpdateHistogram() override; - void requestUpdateVectorscope() override; + void requestUpdateVectorscopeHC() override; + void requestUpdateVectorscopeHS() override; void requestUpdateWaveform() override; }; diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index e6749a9f0..43848e70c 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -334,7 +334,8 @@ public: const LUTu& histChroma, const LUTu& histLRETI, int vectorscopeScale, - const array2D& vectorscope, + const array2D& vectorscopeHC, + const array2D& vectorscopeHS, int waveformScale, const array2D& waveformRed, const array2D& waveformGreen, @@ -345,12 +346,12 @@ public: virtual void setObservable(HistogramObservable* observable) = 0; /** Returns if the listener wants the histogram to be updated. */ virtual bool updateHistogram(void) const = 0; - /** Returns if the listener wants the vectorscope to be updated. */ - virtual bool updateVectorscope(void) const = 0; + /** Returns if the listener wants the H-C vectorscope to be updated. */ + virtual bool updateVectorscopeHC(void) const = 0; + /** Returns if the listener wants the H-S vectorscope to be updated. */ + virtual bool updateVectorscopeHS(void) const = 0; /** Returns if the listener wants the waveform to be updated. */ virtual bool updateWaveform(void) const = 0; - /** Returns the vectorscope type: 0 for H-S and 1 for H-C. */ - virtual int vectorscopeType(void) const = 0; }; class HistogramObservable @@ -358,8 +359,10 @@ class HistogramObservable public: /** Tells the observable to update the histogram data. */ virtual void requestUpdateHistogram() = 0; - /** Tells the observable to update the vectorscope data. */ - virtual void requestUpdateVectorscope() = 0; + /** Tells the observable to update the H-C vectorscope data. */ + virtual void requestUpdateVectorscopeHC() = 0; + /** Tells the observable to update the H-S vectorscope data. */ + virtual void requestUpdateVectorscopeHS() = 0; /** Tells the observable to update the waveform data. */ virtual void requestUpdateWaveform() = 0; }; diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index d3d339783..c53877736 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -472,7 +472,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) beforeIarea (nullptr), beforeBox (nullptr), afterBox (nullptr), beforeLabel (nullptr), afterLabel (nullptr), beforeHeaderBox (nullptr), afterHeaderBox (nullptr), parent (nullptr), parentWindow (nullptr), openThm (nullptr), selectedFrame(0), isrc (nullptr), ipc (nullptr), beforeIpc (nullptr), err (0), isProcessing (false), - histogram_observable(nullptr), histogram_scope_type(HistogramPanelListener::NONE) + histogram_observable(nullptr), histogram_scope_type(ScopeType::NONE) { epih = new EditorPanelIdleHelper; @@ -2249,7 +2249,8 @@ void EditorPanel::histogramChanged( const LUTu& histChroma, const LUTu& histLRETI, int vectorscopeScale, - const array2D& vectorscope, + const array2D& vectorscopeHC, + const array2D& vectorscopeHS, int waveformScale, const array2D& waveformRed, const array2D& waveformGreen, @@ -2258,7 +2259,7 @@ void EditorPanel::histogramChanged( ) { if (histogramPanel) { - histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscope, waveformScale, waveformRed, waveformGreen, waveformBlue, waveformLuma); + histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscopeHC, vectorscopeHS, waveformScale, waveformRed, waveformGreen, waveformBlue, waveformLuma); } tpc->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); @@ -2271,34 +2272,28 @@ void EditorPanel::setObservable(rtengine::HistogramObservable* observable) bool EditorPanel::updateHistogram(void) const { - return histogram_scope_type == HistogramPanelListener::HISTOGRAM - || histogram_scope_type == HistogramPanelListener::NONE; + return histogram_scope_type == ScopeType::HISTOGRAM + || histogram_scope_type == ScopeType::NONE; } -bool EditorPanel::updateVectorscope(void) const +bool EditorPanel::updateVectorscopeHC(void) const { return - histogram_scope_type == HistogramPanelListener::VECTORSCOPE_HS - || histogram_scope_type == HistogramPanelListener::VECTORSCOPE_CH - || histogram_scope_type == HistogramPanelListener::NONE; + histogram_scope_type == ScopeType::VECTORSCOPE_HC + || histogram_scope_type == ScopeType::NONE; +} + +bool EditorPanel::updateVectorscopeHS(void) const +{ + return + histogram_scope_type == ScopeType::VECTORSCOPE_HS + || histogram_scope_type == ScopeType::NONE; } bool EditorPanel::updateWaveform(void) const { - return histogram_scope_type == HistogramPanelListener::WAVEFORM - || histogram_scope_type == HistogramPanelListener::NONE; -} - -int EditorPanel::vectorscopeType(void) const -{ - switch (histogram_scope_type) { - case HistogramPanelListener::VECTORSCOPE_HS: - return 0; - case HistogramPanelListener::VECTORSCOPE_CH: - return 1; - default: - return -1; - } + return histogram_scope_type == ScopeType::WAVEFORM + || histogram_scope_type == ScopeType::NONE; } void EditorPanel::scopeTypeChanged(ScopeType new_type) @@ -2311,14 +2306,22 @@ void EditorPanel::scopeTypeChanged(ScopeType new_type) // Make sure the new scope is updated since we only actively update the // current scope. - if (new_type == HistogramPanelListener::HISTOGRAM) { - histogram_observable->requestUpdateHistogram(); - } else if (new_type == HistogramPanelListener::VECTORSCOPE_HS) { - histogram_observable->requestUpdateVectorscope(); - } else if (new_type == HistogramPanelListener::VECTORSCOPE_CH) { - histogram_observable->requestUpdateVectorscope(); - } else if (new_type == HistogramPanelListener::WAVEFORM) { - histogram_observable->requestUpdateWaveform(); + switch (new_type) { + case ScopeType::HISTOGRAM: + histogram_observable->requestUpdateHistogram(); + break; + case ScopeType::VECTORSCOPE_HC: + histogram_observable->requestUpdateVectorscopeHC(); + break; + case ScopeType::VECTORSCOPE_HS: + histogram_observable->requestUpdateVectorscopeHS(); + break; + case ScopeType::WAVEFORM: + histogram_observable->requestUpdateWaveform(); + break; + case ScopeType::HISTOGRAM_RAW: + case ScopeType::NONE: + break; } } diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 9f0ebf8cb..f6bc0b606 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -135,7 +135,8 @@ public: const LUTu& histChroma, const LUTu& histLRETI, int vectorscopeScale, - const array2D& vectorscope, + const array2D& vectorscopeHC, + const array2D& vectorscopeHS, int waveformScale, const array2D& waveformRed, const array2D& waveformGreen, @@ -144,9 +145,9 @@ public: ) override; void setObservable(rtengine::HistogramObservable* observable) override; bool updateHistogram(void) const override; - bool updateVectorscope(void) const override; + bool updateVectorscopeHC(void) const override; + bool updateVectorscopeHS(void) const override; bool updateWaveform(void) const override; - int vectorscopeType(void) const override; // HistogramPanelListener void scopeTypeChanged(ScopeType new_type) override; diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 2c9d6bb0e..a07133204 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -309,8 +309,10 @@ void HistogramPanel::showRGBBar() void HistogramPanel::resized (Gtk::Allocation& req) { - histogramArea->updateBackBuffer (); - histogramArea->queue_draw (); + if (!histogramArea->updatePending()) { + histogramArea->updateBackBuffer (); + histogramArea->queue_draw (); + } // set histogramRGBArea invalid; if (histogramRGBArea) { @@ -394,7 +396,10 @@ void HistogramPanel::type_pressed() scopeType->set_image(*vectHcImage); } type_changed(); - rgbv_toggled(); + updateHistAreaOptions(); + if (histogramRGBArea) { + updateHistRGBAreaOptions(); + } } void HistogramPanel::type_changed() @@ -415,7 +420,7 @@ void HistogramPanel::type_changed() histogramRGBArea = histogramRGBAreaHori.get(); if (panel_listener) { updateHistAreaOptions(); - panel_listener->scopeTypeChanged(HistogramPanelListener::HISTOGRAM); + panel_listener->scopeTypeChanged(ScopeType::HISTOGRAM); } } else if (options.histogramScopeType == 1) { showRed->set_sensitive(); @@ -428,7 +433,7 @@ void HistogramPanel::type_changed() histogramRGBArea = histogramRGBAreaVert.get(); if (panel_listener) { updateHistAreaOptions(); - panel_listener->scopeTypeChanged(HistogramPanelListener::WAVEFORM); + panel_listener->scopeTypeChanged(ScopeType::WAVEFORM); } } else { showRed->set_sensitive(false); @@ -441,13 +446,13 @@ void HistogramPanel::type_changed() histogramRGBArea = nullptr; if (panel_listener) { updateHistAreaOptions(); - HistogramPanelListener::ScopeType type = HistogramPanelListener::NONE; + ScopeType type = ScopeType::NONE; switch (options.histogramScopeType) { case 2: - type = HistogramPanelListener::VECTORSCOPE_HS; + type = ScopeType::VECTORSCOPE_HS; break; case 3: - type = HistogramPanelListener::VECTORSCOPE_CH; + type = ScopeType::VECTORSCOPE_HC; break; } panel_listener->scopeTypeChanged(type); @@ -479,7 +484,7 @@ void HistogramPanel::rgbv_toggled () histogramArea->queue_draw (); if (histogramRGBArea) { - histogramRGBArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showChro->get_active(), showRAW->get_active(), showBAR->get_active() && options.histogramScopeType < 2); + updateHistRGBAreaOptions(); histogramRGBArea->updateBackBuffer (0, 0, 0); histogramRGBArea->queue_draw (); } @@ -532,17 +537,17 @@ void HistogramPanel::setPanelListener(HistogramPanelListener* listener) panel_listener = listener; if (listener) { - HistogramPanelListener::ScopeType type; + ScopeType type; if (options.histogramScopeType == 0) { - type = HistogramPanelListener::HISTOGRAM; + type = ScopeType::HISTOGRAM; } else if (options.histogramScopeType == 1) { - type = HistogramPanelListener::WAVEFORM; + type = ScopeType::WAVEFORM; } else if (options.histogramScopeType == 2) { - type = HistogramPanelListener::VECTORSCOPE_HS; + type = ScopeType::VECTORSCOPE_HS; } else if (options.histogramScopeType == 3) { - type = HistogramPanelListener::VECTORSCOPE_CH; + type = ScopeType::VECTORSCOPE_HC; } else { - type = HistogramPanelListener::NONE; + type = ScopeType::NONE; } listener->scopeTypeChanged(type); } @@ -563,6 +568,19 @@ void HistogramPanel::updateHistAreaOptions() ); } +void HistogramPanel::updateHistRGBAreaOptions() +{ + histogramRGBArea->updateOptions( + showRed->get_active(), + showGreen->get_active(), + showBlue->get_active(), + showValue->get_active(), + showChro->get_active(), + showRAW->get_active(), + showBAR->get_active() && options.histogramScopeType < 2 + ); +} + // // // @@ -897,8 +915,8 @@ void HistogramRGBAreaVert::get_preferred_width_for_height_vfunc (int height, int // HistogramArea HistogramArea::HistogramArea (DrawModeListener *fml) : vectorscope_scale(0), - vect(0, 0), - vect_buffer_dirty(true), + vect_hc(0, 0), vect_hs(0, 0), + vect_hc_buffer_dirty(true), vect_hs_buffer_dirty(true), waveform_scale(0), rwave(0, 0), gwave(0, 0),bwave(0, 0), lwave(0, 0), wave_buffer_dirty(true), @@ -986,6 +1004,11 @@ void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool wave_buffer_dirty = true; } +bool HistogramArea::updatePending(void) +{ + return haih->pending > 0 && !haih->destroyed; +} + void HistogramArea::update( const LUTu& histRed, const LUTu& histGreen, @@ -996,7 +1019,8 @@ void HistogramArea::update( const LUTu& histGreenRaw, const LUTu& histBlueRaw, int vectorscopeScale, - const array2D& vectorscope, + const array2D& vectorscopeHC, + const array2D& vectorscopeHS, int waveformScale, const array2D& waveformRed, const array2D& waveformGreen, @@ -1021,10 +1045,14 @@ void HistogramArea::update( bwave = waveformBlue; lwave = waveformLuma; wave_buffer_dirty = true; - } else if (scopeType >= 2) { + } else if (scopeType == 2) { vectorscope_scale = vectorscopeScale; - vect = vectorscope; - vect_buffer_dirty = true; + vect_hs = vectorscopeHS; + vect_hs_buffer_dirty = true; + } else if (scopeType == 3) { + vectorscope_scale = vectorscopeScale; + vect_hc = vectorscopeHC; + vect_hc_buffer_dirty = true; } valid = true; } else { @@ -1060,7 +1088,6 @@ void HistogramArea::update( void HistogramArea::updateBackBuffer () { - if (!get_realized ()) { return; } @@ -1333,6 +1360,10 @@ void HistogramArea::drawMarks(Cairo::RefPtr &cr, void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, int h) { + const auto& vect = (scopeType == 3) ? vect_hc : vect_hs; + auto& vect_buffer = (scopeType == 3) ? vect_hc_buffer : vect_hs_buffer; + auto& vect_buffer_dirty = (scopeType == 3) ? vect_hc_buffer_dirty : vect_hs_buffer_dirty; + const int vect_width = vect.getWidth(); const int vect_height = vect.getHeight(); // Arbitrary scale factor multiplied by vectorscope area and divided by @@ -1582,7 +1613,7 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h bool HistogramArea::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) { - if (get_width() != oldwidth || get_height() != oldheight || isDirty ()) { + if (!updatePending() && (get_width() != oldwidth || get_height() != oldheight || isDirty())) { updateBackBuffer (); } @@ -1651,8 +1682,7 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) double dx = (event->x - movingPosition) / get_width(); float new_brightness = LIM(trace_brightness * pow(RANGE, dx), MIN_BRIGHT, MAX_BRIGHT); if (new_brightness != trace_brightness) { - wave_buffer_dirty = true; - vect_buffer_dirty = true; + wave_buffer_dirty = vect_hc_buffer_dirty = vect_hs_buffer_dirty = true; trace_brightness = new_brightness; setDirty(true); queue_draw(); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 935a30bfd..975a6d8ab 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -36,6 +36,11 @@ class HistogramArea; +enum ScopeType +{ + HISTOGRAM, HISTOGRAM_RAW, VECTORSCOPE_HC, VECTORSCOPE_HS, WAVEFORM, NONE +}; + struct HistogramAreaIdleHelper { HistogramArea* harea; bool destroyed; @@ -161,9 +166,9 @@ protected: LUTu rhist, ghist, bhist, lhist, chist; LUTu rhistRaw, ghistRaw, bhistRaw, lhistRaw; //lhistRaw is unused? int vectorscope_scale; - array2D vect; - std::vector vect_buffer; - bool vect_buffer_dirty; + array2D vect_hc, vect_hs; + std::vector vect_hc_buffer, vect_hs_buffer; + bool vect_hc_buffer_dirty, vect_hs_buffer_dirty; int waveform_scale; array2D rwave, gwave, bwave, lwave; std::vector wave_buffer; @@ -208,7 +213,8 @@ public: const LUTu& histGreenRaw, const LUTu& histBlueRaw, int vectorscopeScale, - const array2D& vectorscope, + const array2D& vectorscopeHC, + const array2D& vectorscopeHS, int waveformScale, const array2D& waveformRed, const array2D& waveformGreen, @@ -216,6 +222,7 @@ public: const array2D& waveformLuma ); void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, int type, bool pointer); + bool updatePending(); void on_realize() override; bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; bool on_button_press_event (GdkEventButton* event) override; @@ -238,8 +245,6 @@ private: class HistogramPanelListener { public: - enum ScopeType {HISTOGRAM, VECTORSCOPE_CH, VECTORSCOPE_HS, WAVEFORM, NONE}; - virtual void scopeTypeChanged(ScopeType new_type) = 0; }; @@ -297,6 +302,7 @@ protected: void setHistInvalid (); void showRGBBar(); void updateHistAreaOptions(); + void updateHistRGBAreaOptions(); public: @@ -313,7 +319,8 @@ public: const LUTu& histGreenRaw, const LUTu& histBlueRaw, int vectorscopeScale, - const array2D& vectorscope, + const array2D& vectorscopeHC, + const array2D& vectorscopeHS, int waveformScale, const array2D& waveformRed, const array2D& waveformGreen, @@ -321,7 +328,7 @@ public: const array2D& waveformLuma ) { - histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscope, waveformScale, waveformRed, waveformGreen, waveformBlue, waveformLuma); + histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscopeHC, vectorscopeHS, waveformScale, waveformRed, waveformGreen, waveformBlue, waveformLuma); } // pointermotionlistener interface void pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw = false) override; From 287fe7459340381a389b469cdafcd2d0c1e646f3 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 29 Aug 2020 15:39:39 +0200 Subject: [PATCH 081/185] Fixed bug in Linux mask Blur denoise - rationalise code (#5896) * First version mask bl * Added others improvments * Other changes to blur mask * Improvment to blur mask * Improvment to maskcacol --- rtengine/improcfun.h | 2 +- rtengine/iplocallab.cc | 490 +++++++++-------------------------------- 2 files changed, 107 insertions(+), 385 deletions(-) diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index d9618ba9f..a702dfbd8 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -233,7 +233,7 @@ public: const LocCCmaskCurve & locccmasCurve, bool lcmasutili, const LocLLmaskCurve & locllmasCurve, bool llmasutili, const LocHHmaskCurve & lochhmasCurve, bool lhmasutili, const LocHHmaskCurve & lochhhmasCurve, bool lhhmasutili, - bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, float blendmab, int shado, float amountcd, float anchorcd, + bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, float blendmab, int shado, int highl, float amountcd, float anchorcd, const LUTf& lmasklocalcurve, bool localmaskutili, const LocwavCurve & loclmasCurvecolwav, bool lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr, int shortcu, bool delt, const float hueref, const float chromaref, const float lumaref, diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index cfd4a271e..0e016089e 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -3789,7 +3789,7 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int const LocCCmaskCurve & locccmasCurve, bool lcmasutili, const LocLLmaskCurve & locllmasCurve, bool llmasutili, const LocHHmaskCurve & lochhmasCurve, bool lhmasutili, const LocHHmaskCurve & lochhhmasCurve, bool lhhmasutili, - bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, float blendmab, int shado, float amountcd, float anchorcd, + bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, float blendmab, int shado, int highl, float amountcd, float anchorcd, const LUTf& lmasklocalcurve, bool localmaskutili, const LocwavCurve & loclmasCurvecolwav, bool lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr, int shortcu, bool delt, const float hueref, const float chromaref, const float lumaref, @@ -4111,6 +4111,10 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int ImProcFunctions::shadowsHighlights(bufmaskblurcol, true, 1, 0, shado, 40, sk, 0, 60); } + if (highl > 0) { + ImProcFunctions::shadowsHighlights(bufmaskblurcol, true, 1, highl, 0, 40, sk, 50, 0); + } + int wavelet_level = level_br; int minwin = rtengine::min(bfw, bfh); @@ -9684,8 +9688,9 @@ void ImProcFunctions::Lab_Local( const int GW = transformed->W; const int GH = transformed->H; + const std::unique_ptr bufblorig(new LabImage(GW, GH)); - LabImage * originalmaskbl = nullptr; + std::unique_ptr originalmaskbl; std::unique_ptr bufmaskorigbl; std::unique_ptr bufmaskblurbl; std::unique_ptr bufgb; @@ -9693,385 +9698,93 @@ void ImProcFunctions::Lab_Local( if (denoiz || blurz || lp.denoiena || lp.blurena) { bufgb.reset(new LabImage(GW, GH)); - - if (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) { - bufmaskorigbl.reset(new LabImage(GW, GH)); - bufmaskblurbl.reset(new LabImage(GW, GH)); - originalmaskbl = new LabImage(GW, GH); - } - - array2D ble(GW, GH); - array2D blechro(GW, GH); - array2D hue(GW, GH); - array2D guid(GW, GH); - float meanfab, fab; - mean_fab(0, 0, GW, GH, bufgb.get(), original, fab, meanfab, lp.chromabl, multiThread); - float chromult = 1.f - 0.01f * lp.chromabl; - -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if (multiThread) -#endif - for (int y = 0; y < GH; y++) { - for (int x = 0; x < GW; x++) { - bufgb->L[y][x] = original->L[y][x]; - bufgb->a[y][x] = original->a[y][x]; - bufgb->b[y][x] = original->b[y][x]; - } - } - - const float strumask = 0.02f * params->locallab.spots.at(sp).strumaskbl; - JaggedArray blendstru(GW, GH); - - if (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) { - if (strumask > 0.f) { - float delstrumask = 4.1f - strumask;//4.1 = 2 * max slider strumask + 0.1 - buildBlendMask(bufgb->L, blendstru, GW, GH, delstrumask); - const float radblur = 0.02f * 0.1f * std::fabs(lp.radmabl); - const float rm = radblur / sk; - - if (rm > 0) { -#ifdef _OPENMP - #pragma omp parallel if (multiThread) -#endif - { - gaussianBlur(blendstru, blendstru, GW, GH, rm); - } - } - } - -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if (multiThread) -#endif - for (int ir = 0; ir < GH; ir++) { - for (int jr = 0; jr < GW; jr++) { - float kmaskLexp = 0.f; - float kmaskCH = 0.f; - float kmasstru = 0.f; - - if (strumask > 0.f && !astool) { - kmasstru = bufgb->L[ir][jr] * blendstru[ir][jr]; - } - - if (locllmasblCurve && llmasblutili) { - const float ligh = bufgb->L[ir][jr] / 32768.f; - kmaskLexp = 32768.f * LIM01(1.f - locllmasblCurve[500.f * ligh]); - } - - if (lp.showmaskblmet != 4) { - if (locccmasblCurve && lcmasblutili) { - const float chromask = 0.0001f + std::sqrt(SQR((bufgb->a[ir][jr]) / fab) + SQR((bufgb->b[ir][jr]) / fab)); - kmaskCH = LIM01(1.f - locccmasblCurve[500.f * chromask]); - } - } - - if (lochhmasblCurve && lhmasblutili) { - const float huema = xatan2f(bufgb->b[ir][jr], bufgb->a[ir][jr]); - float h = Color::huelab_to_huehsv2(huema); - h += 1.f / 6.f; - - if (h > 1.f) { - h -= 1.f; - } - - const float valHH = LIM01(1.f - lochhmasblCurve[500.f * h]); - - if (lp.showmaskblmet != 4) { - kmaskCH += chromult * valHH; - } - - kmaskLexp += 32768.f * valHH; - } - - bufmaskblurbl->L[ir][jr] = clipLoc(kmaskLexp + kmasstru); - bufmaskblurbl->a[ir][jr] = kmaskCH; - bufmaskblurbl->b[ir][jr] = kmaskCH; - ble[ir][jr] = bufmaskblurbl->L[ir][jr] / 32768.f; - hue[ir][jr] = xatan2f(bufmaskblurbl->b[ir][jr], bufmaskblurbl->a[ir][jr]); - const float chromah = std::sqrt(SQR(bufmaskblurbl->b[ir][jr]) + SQR(bufmaskblurbl->a[ir][jr])); - blechro[ir][jr] = chromah / 32768.f; - guid[ir][jr] = Color::L2Y(bufgb->L[ir][jr]) / 32768.f; - } - } - - const std::unique_ptr bufprov(new LabImage(GW, GH)); - - bufprov->CopyFrom(bufmaskblurbl.get(), multiThread); - - if (lp.radmabl != 0.f) { - float blur = lp.radmabl; - blur = blur < 0.f ? -1.f / blur : 1.f + blur; - const int r1 = rtengine::max(4 / sk * blur + 0.5f, 1); - const int r2 = rtengine::max(25 / sk * blur + 0.5f, 1); - - constexpr float epsilmax = 0.005f; - constexpr float epsilmin = 0.00001f; - - const float aepsil = (epsilmax - epsilmin) / 100.f; - const float bepsil = epsilmin; //epsilmax - 100.f * aepsil; - const float epsil = lp.radmabl < 0.f ? 0.001f : aepsil * lp.radmabl + bepsil; - - rtengine::guidedFilter(guid, blechro, blechro, r1, epsil, multiThread); - rtengine::guidedFilter(guid, ble, ble, r2, 0.2 * epsil, multiThread); - - // guidedFilter(guid, ble, ble, lp.radmabl * 10.f / sk, 0.001, multiThread, 4); - } - - LUTf lutTonemaskbl(65536); - calcGammaLut(lp.gammabl, lp.slomabl, lutTonemaskbl); - -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if (multiThread) -#endif - for (int ir = 0; ir < GH; ir++) { - for (int jr = 0; jr < GW; jr++) { - const float2 sincosval = xsincosf(hue[ir][jr]); - bufmaskblurbl->L[ir][jr] = LIM01(ble[ir][jr]) * 32768.f; - const float L_ = 2.f * bufmaskblurbl->L[ir][jr]; - bufmaskblurbl->L[ir][jr] = lutTonemaskbl[L_]; - bufmaskblurbl->a[ir][jr] = 32768.f * sincosval.y * blechro[ir][jr]; - bufmaskblurbl->b[ir][jr] = 32768.f * sincosval.x * blechro[ir][jr]; - } - } - } - - if (strumask > 0.f && astool && (lp.enablMask || lp.showmaskblmet == 3)) { - -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if (multiThread) -#endif - for (int ir = 0; ir < GH; ir++) { - for (int jr = 0; jr < GW; jr++) { - bufmaskblurbl->L[ir][jr] *= (1.f + blendstru[ir][jr]); - } - } - } - - if (lmaskbllocalcurve && localmaskblutili && (lp.enablMask || lp.showmaskblmet == 3)) { -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if (multiThread) -#endif - for (int ir = 0; ir < GH; ir++) - for (int jr = 0; jr < GW; jr++) { - bufmaskblurbl->L[ir][jr] = 0.5f * lmaskbllocalcurve[2.f * bufmaskblurbl->L[ir][jr]]; - } - } - - const int highli = params->locallab.spots.at(sp).shadmaskbl; - - if (highli > 0 && (lp.enablMask || lp.showmaskblmet == 3)) { - ImProcFunctions::shadowsHighlights(bufmaskblurbl.get(), true, 1, highli, 0, 40, sk, 50, 0); - } - - const int shado = params->locallab.spots.at(sp).shadmaskblsha; - - if (shado > 0 && (lp.enablMask || lp.showmaskblmet == 3)) { - ImProcFunctions::shadowsHighlights(bufmaskblurbl.get(), true, 1, 0, shado, 40, sk, 0, 60); - } - - int wavelet_level = params->locallab.spots.at(sp).shadmaskbl; - int maxlvl = wavelet_level; - - int minwin = rtengine::min(GW, GH); - int maxlevelspot = 9; - - while ((1 << maxlevelspot) >= (minwin * sk) && maxlevelspot > 1) { - --maxlevelspot ; - } - - wavelet_level = rtengine::min(wavelet_level, maxlevelspot); - bool wavcurvemask = false; - - if (loclmasCurveblwav && lmasutiliblwav && (lp.enablMask || lp.showmaskblmet == 3)) { - for (int i = 0; i < 500; i++) { - if (loclmasCurveblwav[i] != 0.5) { - wavcurvemask = true; - } - } - } - - if (wavcurvemask && (lp.enablMask || lp.showmaskblmet == 3)) { - const int level_bl = params->locallab.spots.at(sp).csthresholdblur.getBottomLeft(); - const int level_hl = params->locallab.spots.at(sp).csthresholdblur.getTopLeft(); - const int level_br = params->locallab.spots.at(sp).csthresholdblur.getBottomRight(); - const int level_hr = params->locallab.spots.at(sp).csthresholdblur.getTopRight(); - -#ifdef _OPENMP - const int numThreads = omp_get_max_threads(); -#else - const int numThreads = 1; - -#endif - - wavelet_decomposition *wdspotbl = new wavelet_decomposition(bufmaskblurbl->L[0], GW, GH, maxlvl, 1, sk, numThreads, lp.daubLen); - if (wdspotbl->memory_allocation_failed()) { - return; - } - - - float mean[10]; - float meanN[10]; - float sigma[10]; - float sigmaN[10]; - float MaxP[10]; - float MaxN[10]; - - Evaluate2(*wdspotbl, mean, meanN, sigma, sigmaN, MaxP, MaxN, numThreads); - float alow = 1.f; - float blow = 0.f; - if (level_hl != level_bl) { - alow = 1.f / (level_hl - level_bl); - blow = -alow * level_bl; - } - float ahigh = 1.f; - float bhigh = 0.f; - - if (level_hr != level_br) { - ahigh = 1.f / (level_hr - level_br); - bhigh = -ahigh * level_br; + if (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) { + bufmaskorigbl.reset(new LabImage(GW, GH)); + bufmaskblurbl.reset(new LabImage(GW, GH, true)); + originalmaskbl.reset (new LabImage(GW, GH)); } - - for (int dir = 1; dir < 4; dir++) { - for (int level = level_bl; level < maxlvl; ++level) { - int W_L = wdspotbl->level_W(level); - int H_L = wdspotbl->level_H(level); - float* const *wav_L = wdspotbl->level_coeffs(level); - - if (MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { - float insigma = 0.666f; //SD - float logmax = log(MaxP[level]); //log Max - float rapX = (mean[level] + sigma[level]) / MaxP[level]; //rapport between sD / max - float inx = log(insigma); - float iny = log(rapX); - float rap = inx / iny; //koef - float asig = 0.166f / (sigma[level]); - float bsig = 0.5f - asig * mean[level]; - float amean = 0.5f / mean[level]; - -#ifdef _OPENMP - #pragma omp parallel for if (multiThread) -#endif - for (int i = 0; i < W_L * H_L; i++) { - if(loclmasCurveblwav && lmasutiliblwav) { - float absciss; - float &val = wav_L[dir][i]; - - if (fabsf(val) >= (mean[level] + sigma[level])) { //for max - float valcour = xlogf(fabsf(val)); - float valc = valcour - logmax; - float vald = valc * rap; - absciss = xexpf(vald); - } else if (fabsf(val) >= mean[level]) { - absciss = asig * fabsf(val) + bsig; - } else { - absciss = amean * fabsf(val); - } - - float klev = 1.f; - if (level >= level_hl && level <= level_hr) { - klev = 1.f; - } - if (level_hl != level_bl) { - if (level >= level_bl && level < level_hl) { - klev = alow * level + blow; - } - } - - if (level_hr != level_br) { - if (level > level_hr && level <= level_br) { - klev = ahigh * level + bhigh; - } - } - float kc = klev * (loclmasCurveblwav[absciss * 500.f] - 0.5f); - float amplieffect = kc <= 0.f ? 1.f : 4.f; - - float kinterm = 1.f + amplieffect * kc; - kinterm = kinterm <= 0.f ? 0.01f : kinterm; - - val *= kinterm; - - } - } - } - - } - } - wdspotbl->reconstruct(bufmaskblurbl->L[0], 1.f); - delete wdspotbl; - - } - - - // deltae Mask with scope - int sco = params->locallab.spots.at(sp).scopemask; - const float mindE = 2.f + MINSCOPE * sco * lp.thr; - const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); - const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; - const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); - - if (delt && lp.blurmet == 0 && (lp.enablMask || lp.showmaskblmet == 3)) { - JaggedArray rdE(GW, GH); - deltaEforMask(rdE, GW, GH, bufgb.get(), hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.balance, lp.balanceh); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) -#endif - for (int ir = 0; ir < GH; ir++) { - for (int jr = 0; jr < GW; jr++) { - bufmaskblurbl->L[ir][jr] = bufprov->L[ir][jr] + rdE[ir][jr] * (bufmaskblurbl->L[ir][jr] - bufprov->L[ir][jr]); - bufmaskblurbl->a[ir][jr] = bufprov->a[ir][jr] + rdE[ir][jr] * (bufmaskblurbl->a[ir][jr] - bufprov->a[ir][jr]); - bufmaskblurbl->b[ir][jr] = bufprov->b[ir][jr] + rdE[ir][jr] * (bufmaskblurbl->b[ir][jr] - bufprov->b[ir][jr]); - } - } - } - - const float lap = params->locallab.spots.at(sp).lapmaskbl; - const bool pde = params->locallab.spots.at(sp).laplac; - const float lumask = params->locallab.spots.at(sp).lumask; - - if (lap > 0.f && (lp.enablMask || lp.showmaskblmet == 3)) { - const float *datain = bufmaskblurbl->L[0]; - const std::unique_ptr data_tmp(new float[GH * GW]); - - if (!pde) { - ImProcFunctions::discrete_laplacian_threshold(data_tmp.get(), datain, GW, GH, 200.f * lap); - } else { - ImProcFunctions::retinex_pde(datain, data_tmp.get(), GW, GH, 12.f * lap, 1.f, nullptr, 0, 0, 1); - } - -#ifdef _OPENMP - #pragma omp parallel for if (multiThread) #endif for (int y = 0; y < GH; y++) { for (int x = 0; x < GW; x++) { - bufmaskblurbl->L[y][x] = data_tmp[y * GW + x]; + bufblorig->L[y][x] = original->L[y][x]; } } - } - const float radiusb = 1.f / sk; + int inv = 0; + bool showmaske = false; + bool enaMask = false; + bool deltaE = false; + bool modmask = false; + bool zero = false; + bool modif = false; - if (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) { - const int invers = lp.blurmet == 1 ? 1 : 0; - -#ifdef _OPENMP - #pragma omp parallel if (multiThread) -#endif - { - gaussianBlur(bufmaskblurbl->L, bufmaskorigbl->L, GW, GH, radiusb); - gaussianBlur(bufmaskblurbl->a, bufmaskorigbl->a, GW, GH, 1.f + (0.005f * lp.radmabl) / sk); - gaussianBlur(bufmaskblurbl->b, bufmaskorigbl->b, GW, GH, 1.f + (0.005f * lp.radmabl) / sk); + if (lp.showmaskblmet == 3) { + showmaske = true; } - if (lp.showmaskblmet == 0 || lp.showmaskblmet == 1 || lp.showmaskblmet == 2 || lp.showmaskblmet == 4 || lp.enablMask) { - blendmask(lp, 0, 0, cx, cy, GW, GH, bufgb.get(), original, bufmaskorigbl.get(), originalmaskbl, lp.blendmabl, lp.blendmabl, invers); - } else if (lp.showmaskblmet == 3) { - showmask(lumask, lp, 0, 0, cx, cy, GW, GH, bufgb.get(), transformed, bufmaskorigbl.get(), invers); - return; + if (lp.enablMask) { + enaMask = true; + } + + if (lp.showmaskblmet == 4) { + deltaE = true; + } + + if (lp.showmaskblmet == 2) { + modmask = true; + } + + if (lp.showmaskblmet == 1) { + modif = true; + } + + if (lp.showmaskblmet == 0) { + zero = true; + } + + float chrom = lp.chromabl; + float rad = lp.radmabl; + float gamma = lp.gammabl; + float slope = lp.slomabl; + float blendm = lp.blendmabl; + float lap = params->locallab.spots.at(sp).lapmaskbl; + bool pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + bool delt = params->locallab.spots.at(sp).deltae; + int lumask = params->locallab.spots.at(sp).lumask; + int sco = params->locallab.spots.at(sp).scopemask; + int shortcu = 0; + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + const int shado = params->locallab.spots.at(sp).shadmaskblsha; + const int highl = params->locallab.spots.at(sp).shadmaskbl; + constexpr float amountcd = 0.f; + constexpr float anchorcd = 50.f; + LocHHmaskCurve lochhhmasCurve; + constexpr bool lhhmasutili = false; + const float strumask = 0.02f * params->locallab.spots.at(sp).strumaskbl; + bool astool = params->locallab.spots.at(sp).toolbl; + + maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufblorig.get(), bufmaskblurbl.get(), originalmaskbl.get(), original, reserved, inv, lp, + strumask, astool, + locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, lochhhmasCurve, lhhmasutili, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskbllocalcurve, localmaskblutili, loclmasCurveblwav, lmasutiliblwav, 1, 1, 5, 5, + shortcu, delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, 0 + ); + + if (lp.showmaskblmet == 3) { + showmask(lumask, lp, 0, 0, cx, cy, GW, GH, bufblorig.get(), transformed, bufmaskblurbl.get(), inv); + return; } - } -//end mask } bool execmaskblur = (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) && lp.smasktyp != 1; @@ -10544,7 +10257,7 @@ void ImProcFunctions::Lab_Local( // BlurNoise_Local(tmp1.get(), originalmaskbl, bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); if(lp.smasktyp != 1) { - BlurNoise_Local(tmp1.get(), originalmaskbl, bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); + BlurNoise_Local(tmp1.get(), originalmaskbl.get(), bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); } else { BlurNoise_Local(tmp1.get(), original, bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); } @@ -10557,7 +10270,7 @@ void ImProcFunctions::Lab_Local( } else if (lp.blurmet == 1) { // InverseBlurNoise_Local(originalmaskbl, bufchro, lp, hueref, chromaref, lumaref, original, transformed, tmp1.get(), cx, cy, sk); if(lp.smasktyp != 1) { - InverseBlurNoise_Local(originalmaskbl, bufchro, lp, hueref, chromaref, lumaref, original, transformed, tmp1.get(), cx, cy, sk); + InverseBlurNoise_Local(originalmaskbl.get(), bufchro, lp, hueref, chromaref, lumaref, original, transformed, tmp1.get(), cx, cy, sk); } else { InverseBlurNoise_Local(original, bufchro, lp, hueref, chromaref, lumaref, original, transformed, tmp1.get(), cx, cy, sk); } @@ -10612,7 +10325,7 @@ void ImProcFunctions::Lab_Local( ImProcFunctions::impulse_nr(bufwv.get(), threshold); } - DeNoise_Local(call, lp, originalmaskbl, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, *(bufwv.get()), cx, cy, sk); + DeNoise_Local(call, lp, originalmaskbl.get(), levred, huerefblur, lumarefblur, chromarefblur, original, transformed, *(bufwv.get()), cx, cy, sk); if (params->locallab.spots.at(sp).recurs) { original->CopyFrom(transformed, multiThread); @@ -10628,7 +10341,7 @@ void ImProcFunctions::Lab_Local( float slida[8] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}; float slidb[8] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}; constexpr int aut = 0; - DeNoise(call, del, slidL, slida, slidb, aut, noiscfactiv, lp, originalmaskbl, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, cx, cy, sk); + DeNoise(call, del, slidL, slida, slidb, aut, noiscfactiv, lp, originalmaskbl.get(), levred, huerefblur, lumarefblur, chromarefblur, original, transformed, cx, cy, sk); if (params->locallab.spots.at(sp).recurs) { original->CopyFrom(transformed, multiThread); @@ -10637,9 +10350,6 @@ void ImProcFunctions::Lab_Local( } } - if (denoiz || blurz || lp.denoiena || lp.blurena) { - delete originalmaskbl; - } //begin cbdl if ((lp.mulloc[0] != 1.f || lp.mulloc[1] != 1.f || lp.mulloc[2] != 1.f || lp.mulloc[3] != 1.f || lp.mulloc[4] != 1.f || lp.mulloc[5] != 1.f || lp.clarityml != 0.f || lp.contresid != 0.f || lp.enacbMask || lp.showmaskcbmet == 2 || lp.showmaskcbmet == 3 || lp.showmaskcbmet == 4 || lp.prevdE) && lp.cbdlena) { @@ -10729,10 +10439,11 @@ void ImProcFunctions::Lab_Local( int shortcu = 0; //lp.mergemet; //params->locallab.spots.at(sp).shortc; LocHHmaskCurve lochhhmasCurve; bool lhhmasutili = false; + const int highl = 0; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, loctemp.get(), bufmaskorigcb.get(), originalmaskcb.get(), original, reserved, inv, lp, 0.f, false, locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, lochhhmasCurve, lhhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, amountcd, anchorcd, lmaskcblocalcurve, localmaskcbutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskcblocalcurve, localmaskcbutili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.0f, 0.f, -1 ); @@ -10944,11 +10655,12 @@ void ImProcFunctions::Lab_Local( bool lhhmasutili = false; float amountcd = 0.f; float anchorcd = 50.f; + const int highl = 0; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskorigvib.get(), originalmaskvib.get(), original, reserved, inv, lp, 0.f, false, locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, lochhhmasCurve, lhhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, amountcd, anchorcd, lmaskviblocalcurve, localmaskvibutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskviblocalcurve, localmaskvibutili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1 ); @@ -11175,11 +10887,12 @@ void ImProcFunctions::Lab_Local( float anchorcd = 50.f; LocHHmaskCurve lochhhmasCurve; bool lhhmasutili = false; + const int highl = 0; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufgbm.get(), bufmaskorigtm.get(), originalmasktm.get(), original, reserved, inv, lp, 0.f, false, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, lochhhmasCurve, lhhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, amountcd, anchorcd, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1 ); @@ -11216,11 +10929,12 @@ void ImProcFunctions::Lab_Local( float anchorcd = 50.f; LocHHmaskCurve lochhhmasCurve; bool lhhmasutili = false; + const int highl = 0; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, tmp1.get(), bufmaskorigtm.get(), originalmasktm.get(), original, reserved, inv, lp, 0.f, false, locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, lochhhmasCurve, lhhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, amountcd, anchorcd, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasktmlocalcurve, localmasktmutili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1 ); @@ -11399,11 +11113,12 @@ void ImProcFunctions::Lab_Local( int lumask = params->locallab.spots.at(sp).lumask; LocHHmaskCurve lochhhmasCurve; bool lhhmasutili = false; + const int highl = 0; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskorigSH.get(), originalmaskSH.get(), original, reserved, inv, lp, 0.f, false, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, lochhhmasCurve, lhhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, amountcd, anchorcd, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1 ); @@ -11550,11 +11265,12 @@ void ImProcFunctions::Lab_Local( int lumask = params->locallab.spots.at(sp).lumask; LocHHmaskCurve lochhhmasCurve; bool lhhmasutili = false; + const int highl = 0; maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskSH.get(), original, reserved, inv, lp, 0.f, false, locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, lochhhmasCurve, lhhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, amountcd, anchorcd, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskSHlocalcurve, localmaskSHutili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1 ); @@ -11822,10 +11538,11 @@ void ImProcFunctions::Lab_Local( int lumask = params->locallab.spots.at(sp).lumask; LocHHmaskCurve lochhhmasCurve; bool lhhmasutili = false; + const int highl = 0; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufgb.get(), bufmaskoriglc.get(), originalmasklc.get(), original, reserved, inv, lp, 0.f, false, locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, lochhhmasCurve, lhhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, amountcd, anchorcd, lmasklclocalcurve, localmasklcutili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasklclocalcurve, localmasklcutili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1 ); @@ -12987,11 +12704,12 @@ void ImProcFunctions::Lab_Local( int lumask = params->locallab.spots.at(sp).lumask; LocHHmaskCurve lochhhmasCurve; bool lhhmasutili = false; + const int highl = 0; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, reserved, inv, lp, 0.f, false, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, lochhhmasCurve, lhhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, amountcd, anchorcd, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, 0 ); @@ -13262,11 +12980,12 @@ void ImProcFunctions::Lab_Local( constexpr float anchorcd = 50.f; LocHHmaskCurve lochhhmasCurve; constexpr bool lhhmasutili = false; + const int highl = 0; maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, reserved, inv, lp, 0.f, false, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, lochhhmasCurve, lhhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, amountcd, anchorcd, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskexplocalcurve, localmaskexputili, dummy, lmasutilicolwav, 1, 1, 5, 5, shortcu, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, 0 ); @@ -13462,11 +13181,12 @@ void ImProcFunctions::Lab_Local( const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); const float amountcd = 0.f; const float anchorcd = 50.f; + const int highl = 0; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, reserved, inv, lp, strumask, astool, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, amountcd, anchorcd, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, level_bl, level_hl, level_br, level_hr, shortcu, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.fftColorMask, lp.blurcolmask, lp.contcolmask, -1 @@ -14425,11 +14145,12 @@ void ImProcFunctions::Lab_Local( const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); constexpr float amountcd = 0.f; constexpr float anchorcd = 50.f; + const int highl = 0; maskcalccol(false, pde, GW, GH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, reserved, inv, lp, strumask, params->locallab.spots.at(sp).toolcol, locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, amountcd, anchorcd, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, level_bl, level_hl, level_br, level_hr, shortcu, false, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.fftColorMask, lp.blurcolmask, lp.contcolmask, -1 @@ -14545,11 +14266,12 @@ void ImProcFunctions::Lab_Local( const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); const float amountcd = 0.f; const float anchorcd = 50.f; + const int highl = 0; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, reserved, inv, lp, strumask, astool, locccmas_Curve, lcmas_utili, locllmas_Curve, llmas_utili, lochhmas_Curve, lhmas_utili, lochhhmas_Curve, lhhmas_utili, multiThread, - enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendmab, shado, amountcd, anchorcd, lmasklocal_curve, localmask_utili, loclmasCurve_wav, lmasutili_wav, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendmab, shado, highl, amountcd, anchorcd, lmasklocal_curve, localmask_utili, loclmasCurve_wav, lmasutili_wav, level_bl, level_hl, level_br, level_hr, shortcu, delt, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.fftma, lp.blurma, lp.contma, 12 From 467bac3dea145bb1e10d709a7d4251bbb7fec144 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 30 Aug 2020 08:16:31 +0200 Subject: [PATCH 082/185] Wavelet levels: denoise and guided filter with hue curve and local contrast (#5894) * First wavelet denoise * Gui for wavel denoise * First version local contrast and denoise * Second version local contrast and denoise * second version GUI equalizer * enable equalizer local contrast denoise 1234 * change local contrast curve defaut * disable local contrast when curve 1 * denmethod in advanced - standard * Simulate slider denoise with curve * Some various chnages * Chnage reference local contrast * GUI part reference local contrast * Enable reference noise mix denoise for local contrast denoise * Improvment to reference local contrast denoise * Display comment in console * Best format string in console * Change agressive denoise limit to 50 - added tooltip * Added method quality denoise - change madL in ftblockdn * Change equalizer 1234 settings - added high level local contrast * added high levels local contrast curve * Fixed sigma local contrast * clean format code * Some improvments * normalize level slider high level threshold * change ordonate curve high level contrast * Fixed bad level for curve high levels - simplify GUI standard * several changes - guidefilter final - new double slider threshold * save provisory work * save GUI work GF threshold * save provisory work * Fixed some bad behavior GUI * save GUI Hue GF * Curve Hue for GF * OMP for hue GF * addes noisevarhue and fixed some bug * save GUI equalizer hue * enable equalizer hue * Fixed bad behavior GUI in advanced mode * change some default values * Others change default values * Change in progressivity slider threshold local contrast * simplifie algorithm and GUI * Added tooltip and chnage some labels * Change labels and tooltip wavelet denoise * added level 5 denoise * Change typo in label guided theshold * Various changes labels tooltip * Change minimum wavelet level * Added level 5 to denoise * Change slider sigm for a double slider sigm03 sigm45 * small delay for double slider sigm * Fixed wrong values sigm * Hide level56 in standard complexity * Improve in standard complexity * Various improvment levels 14 * interaction 56 14 - advanced complexity --- rtdata/languages/default | 74 +++- rtengine/FTblockDN.cc | 25 +- rtengine/dcrop.cc | 9 +- rtengine/improccoordinator.cc | 8 +- rtengine/improccoordinator.h | 2 + rtengine/improcfun.h | 2 +- rtengine/ipwavelet.cc | 707 ++++++++++++++++++++++++++++++---- rtengine/procparams.cc | 130 ++++++- rtengine/procparams.h | 19 + rtengine/simpleprocess.cc | 8 +- rtgui/paramsedited.cc | 102 +++++ rtgui/paramsedited.h | 17 + rtgui/wavelet.cc | 477 ++++++++++++++++++++++- rtgui/wavelet.h | 53 ++- 14 files changed, 1527 insertions(+), 106 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5026a80f7..b4dade718 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -833,11 +833,11 @@ HISTORY_MSG_580;Local - Denoise HISTORY_MSG_581;Local - deNoise lum f 1 HISTORY_MSG_582;Local - deNoise lum c HISTORY_MSG_583;Local - deNoise lum detail -HISTORY_MSG_584;Local - deNoise Equalizer white-black +HISTORY_MSG_584;Local - deNoise equalizer White-Black HISTORY_MSG_585;Local - deNoise chro f HISTORY_MSG_586;Local - deNoise chro c HISTORY_MSG_587;Local - deNoise chro detail -HISTORY_MSG_588;Local - deNoise Equalizer blue-red +HISTORY_MSG_588;Local - deNoise equalizer Blue-Red HISTORY_MSG_589;Local - deNoise bilateral HISTORY_MSG_590;Local - deNoise Scope HISTORY_MSG_591;Local - Avoid color shift @@ -1288,18 +1288,35 @@ HISTORY_MSG_WAVBL;Blur levels HISTORY_MSG_WAVCHROMCO;Chroma coarse HISTORY_MSG_WAVCHROMFI;Chroma fine HISTORY_MSG_WAVCLARI;Clarity +HISTORY_MSG_WAVDENLH;Level 5 +HISTORY_MSG_WAVDENOISE;Local contrast +HISTORY_MSG_WAVDENOISEH;High levels Local contrast +HISTORY_MSG_WAVDENMET;Local equalizer +HISTORY_MSG_WAVDETEND;Details soft HISTORY_MSG_WAVEDGS;Edge stopping +HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +HISTORY_MSG_WAVHUE;Equalizer hue +HISTORY_MSG_WAVLEVDEN;High level local contrast +HISTORY_MSG_WAVLEVSIGM;Radius +HISTORY_MSG_WAVLIMDEN;Interaction 56 14 HISTORY_MSG_WAVLOWTHR;Threshold low contrast HISTORY_MSG_WAVMERGEC;Merge C HISTORY_MSG_WAVMERGEL;Merge L +HISTORY_MSG_WAVMIXMET;Reference local contrast HISTORY_MSG_WAVOFFSET;Offset HISTORY_MSG_WAVOLDSH;Old algorithm +HISTORY_MSG_WAVQUAMET;Denoise mode HISTORY_MSG_WAVRADIUS;Radius shadows-highlights HISTORY_MSG_WAVSCALE;Scale HISTORY_MSG_WAVSHOWMASK;Show wavelet mask HISTORY_MSG_WAVSIGMA;Attenuation response +HISTORY_MSG_WAVSIGM;Sigma HISTORY_MSG_WAVSOFTRAD;Soft radius clarity HISTORY_MSG_WAVSOFTRADEND;Soft radius final +HISTORY_MSG_WAVSLIMET;Method +HISTORY_MSG_WAVTHRDEN;Threshold local contrast +HISTORY_MSG_WAVTHREND;Threshold local contrast +HISTORY_MSG_WAVSTREND;Strength soft HISTORY_MSG_WAVUSHAMET;Clarity method HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s @@ -3259,8 +3276,8 @@ TP_WAVELET_BALANCE;Contrast balance d/v-h TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified. TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the vertical, horizontal and diagonal wavelet directions: .\nActivating contrast, chroma or residual tone mapping amplifies the effect due to balance TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. -TP_WAVELET_BALCHROM;Denoise equalizer blue-yellow red-green -TP_WAVELET_BALLUM;Denoise Equalizer White-Black +TP_WAVELET_BALCHROM;Denoise equalizer Blue-Yellow Red-Green +TP_WAVELET_BALLUM;Denoise equalizer White-Black TP_WAVELET_BANONE;None TP_WAVELET_BASLI;Slider TP_WAVELET_BATYPE;Contrast balance method @@ -3323,6 +3340,33 @@ TP_WAVELET_DAUB10;D10 - medium TP_WAVELET_DAUB14;D14 - high TP_WAVELET_DAUBLOCAL;Wavelet Edge performance TP_WAVELET_DAUB_TOOLTIP;Changes Daubechies coefficients:\nD4 = Standard,\nD14 = Often best performance, 10% more time-intensive.\n\nAffects edge detection as well as the general quality of the first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. +TP_WAVELET_DENOISE;Guide curve based on Local contrast +TP_WAVELET_DENOISEGUID;Guided threshold based on hue +TP_WAVELET_DENOISEH;High levels Curve Local contrast +TP_WAVELET_DENOISEHUE;Denoise equalizer Hue +TP_WAVELET_DENCONTRAST;Local contrast Equalizer +TP_WAVELET_DENEQUAL;1 2 3 4 Equal +TP_WAVELET_DEN14PLUS;1 4 High +TP_WAVELET_DEN14LOW;1 4 Low +TP_WAVELET_DEN12PLUS;1 2 High +TP_WAVELET_DEN12LOW;1 2 Low +TP_WAVELET_DEN5THR;Guided threshold +//TP_WAVELET_DENH;Low levels (1234)- Finest details +//TP_WAVELET_DENLH;Guided threshold by detail levels 1-4 +//TP_WAVELET_DENL;High levels - Coarsest details +TP_WAVELET_DENH;Threshold +TP_WAVELET_DENLH;Guided threshold by detail levels 1-4 +TP_WAVELET_DENL;Correction structure +TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained +TP_WAVELET_DENMIX_TOOLTIP;Balances the action of the guide taking into account the original image and the denoised image +TP_WAVELET_DENQUA;Mode +TP_WAVELET_DENSLILAB;Method +TP_WAVELET_DENSLI;Slider +TP_WAVELET_DENCURV;Curve +TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide +TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color +TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter +TP_WAVELET_DETEND;Details TP_WAVELET_DIRFRAME;Directional contrast TP_WAVELET_DONE;Vertical TP_WAVELET_DTHR;Diagonal @@ -3352,6 +3396,8 @@ TP_WAVELET_FINAL;Final Touchup TP_WAVELET_FINCFRAME;Final local contrast TP_WAVELET_FINCOAR_TOOLTIP;The left (positive) part of the curve acts on the finer levels (increase).\nThe 2 points on the abscissa represent the respective action limits of finer and coarser levels 5 and 6 (default).\nThe right (negative) part of the curve acts on the coarser levels (increase).\nAvoid moving the left part of the curve with negative values. Avoid moving the right part of the curve with positives values TP_WAVELET_FINEST;Finest +TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter +TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) TP_WAVELET_HIGHLIGHT;Finer levels luminance range TP_WAVELET_HS1;Whole luminance range TP_WAVELET_HS2;Selective luminance range @@ -3364,18 +3410,24 @@ TP_WAVELET_ITER_TOOLTIP;Left: increase low levels and reduce high levels,\nRight TP_WAVELET_LABEL;Wavelet Levels TP_WAVELET_LARGEST;Coarsest TP_WAVELET_LEVCH;Chroma +TP_WAVELET_LEVDEN;Level 5-6 denoise TP_WAVELET_LEVDIR_ALL;All levels, in all directions TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level TP_WAVELET_LEVDIR_ONE;One level TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level TP_WAVELET_LEVELS;Wavelet levels +TP_WAVELET_LEVELLOW;Radius 1-4 +TP_WAVELET_LEVELHIGH;Radius 5-6 +TP_WAVELET_LEVELSIGM;Radius TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. TP_WAVELET_LEVF;Contrast TP_WAVELET_LEVLABEL;Preview maximum possible levels = %1 +TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold TP_WAVELET_LEVONE;Level 2 TP_WAVELET_LEVTHRE;Level 4 TP_WAVELET_LEVTWO;Level 3 TP_WAVELET_LEVZERO;Level 1 +TP_WAVELET_LIMDEN;Interaction levels 56 on levels 14 TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength TP_WAVELET_LIPST;Enhanced algoritm TP_WAVELET_LOWLIGHT;Coarser levels luminance range @@ -3387,9 +3439,14 @@ TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- TP_WAVELET_MERGEC;Merge chroma TP_WAVELET_MERGEL;Merge Luma TP_WAVELET_NEUTRAL;Neutral +TP_WAVELET_MIXCONTRAST;Reference local contrast +TP_WAVELET_MIXDENOISE;Denoise +TP_WAVELET_MIXNOISE;Noise +TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise TP_WAVELET_NOIS;Denoise TP_WAVELET_NOISE;Denoise and Refine -TP_WAVELET_NOISE_TOOLTIP;If level 4 luminance denoise superior to 20, mode Agressive is used.\nIf chrominance coarse superior to 20, mode Agressive is used. +TP_WAVELET_NOISE_TOOLTIP;If level 4 luminance denoise superior to 50, mode Agressive is used.\nIf chrominance coarse superior to 20, mode Agressive is used. TP_WAVELET_NPHIGH;High TP_WAVELET_NPLOW;Low TP_WAVELET_NPNONE;None @@ -3404,6 +3461,8 @@ TP_WAVELET_OPACITYWL_TOOLTIP;Modify the final local contrast at the end of the w TP_WAVELET_PASTEL;Pastel chroma TP_WAVELET_PROC;Process TP_WAVELET_PROTAB;Protection +TP_WAVELET_QUAAGRES;Agressive +TP_WAVELET_QUACONSER;Conservative TP_WAVELET_RADIUS;Radius shadows - highlight TP_WAVELET_RANGEAB;Range a and b % TP_WAVELET_RE1;Reinforced @@ -3422,6 +3481,7 @@ TP_WAVELET_SHA;Sharp mask TP_WAVELET_SHFRAME;Shadows/Highlights TP_WAVELET_SHOWMASK;Show wavelet 'mask' TP_WAVELET_SIGMA;Attenuation response +TP_WAVELET_SIGM;Radius TP_WAVELET_SIGMAFIN;Attenuation response TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values TP_WAVELET_SKIN;Skin targetting/protection @@ -3430,9 +3490,13 @@ TP_WAVELET_SKY;Hue targetting/protection TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. TP_WAVELET_SOFTRAD;Soft radius TP_WAVELET_STREN;Refine +TP_WAVELET_STREND;Strength TP_WAVELET_STRENGTH;Strength TP_WAVELET_SUPE;Extra TP_WAVELET_THR;Shadows threshold +TP_WAVELET_THREND;Local contrast threshold +TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained +TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped denoise curve based on local contrast.\nReduces noise in uniform areas and preserves image structure TP_WAVELET_THRESHOLD;Finer levels TP_WAVELET_THRESHOLD2;Coarser levels TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of ‘wavelet levels’ will be affected by the Shadow luminance range. diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index a2929acbb..d43fa6baa 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -2099,12 +2099,12 @@ float ImProcFunctions::Mad(const float * DataList, const int datalen) } //computes Median Absolute Deviation - //DataList values should mostly have abs val < 256 because we are in Lab mode - int histo[256] ALIGNED64 = {0}; + //DataList values should mostly have abs val < 256 because we are in Lab mode (32768) + int histo[32768] ALIGNED64 = {0}; //calculate histogram of absolute values of wavelet coeffs for (int i = 0; i < datalen; ++i) { - histo[static_cast(rtengine::min(255.f, fabsf(DataList[i])))]++; + histo[static_cast(rtengine::min(32768.f, fabsf(DataList[i])))]++; } //find median of histogram @@ -2196,6 +2196,10 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition& Wavelet maxlvl = 4; //for refine denoise edge wavelet } + if (edge == 6) { + maxlvl = 6; //for wavelet denoise + } + if (edge == 2) { maxlvl = 7; //for locallab denoise } @@ -2264,7 +2268,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition& Wavelet for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) { nvl[i] = 0.f; } - if ((edge == 1 || edge == 2 || edge == 3 || edge == 5) && vari) { + if ((edge == 1 || edge == 2 || edge == 3 || edge == 5 || edge == 6) && vari) { // nvl = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer if ((edge == 1 || edge == 3)) { for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) { @@ -2272,7 +2276,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition& Wavelet } } - if (edge == 2 || edge == 4 || edge == 5) { + if (edge == 2 || edge == 4 || edge == 5 || edge == 6) { for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) { nvl[i] = vari[lvl] * SQR(noisevarlum[i]); } @@ -2550,6 +2554,10 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition& WaveletCoeffs_L, maxlvl = 4; //for refine denoise edge wavelet } + if (edge == 6) { + maxlvl = 6; //for wavelet denoise + } + if (edge == 2) { maxlvl = 7; //for locallab denoise } @@ -2565,7 +2573,6 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition& WaveletCoeffs_L, maxHL = WaveletCoeffs_L.level_H(lvl); } } - bool memoryAllocationFailed = false; #ifdef _OPENMP #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) @@ -2690,15 +2697,15 @@ void ImProcFunctions::ShrinkAllL(wavelet_decomposition& WaveletCoeffs_L, float * nvl[i] = 0.f; } - if ((edge == 1 || edge == 2 || edge == 3 || edge == 5) && vari) { + if ((edge == 1 || edge == 2 || edge == 3 || edge == 5 || edge == 6) && vari) { // nvl = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer if ((edge == 1 || edge == 3)) { for (int i = 0; i < W_L * H_L; ++i) { nvl[i] = vari[level]; //* SQR(1.f + 4.f * noisevarchrom[p]); } - } + } - if (edge == 2 || edge == 4 || edge == 5) { + if (edge == 2 || edge == 4 || edge == 5 || edge == 6) { for (int i = 0; i < W_L * H_L; ++i) { nvl[i] = vari[level] * SQR(noisevarlum[i]); } diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index c89d2bdb0..0d191c087 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -1231,6 +1231,8 @@ void Crop::update(int todo) } WavCurve wavCLVCurve; + WavCurve wavdenoise; + WavCurve wavdenoiseh; Wavblcurve wavblcurve; WavOpacityCurveRG waOpacityCurveRG; WavOpacityCurveSH waOpacityCurveSH; @@ -1240,7 +1242,7 @@ void Crop::update(int todo) LUTf wavclCurve; - params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + params.wavelet.getCurves(wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); LabImage *unshar = nullptr; Glib::ustring provis; LabImage *provradius = nullptr; @@ -1267,7 +1269,7 @@ void Crop::update(int todo) provis = params.wavelet.CLmethod; params.wavelet.CLmethod = "all"; - parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); unshar = new LabImage(*labnCrop, true); params.wavelet.CLmethod = provis; @@ -1284,7 +1286,7 @@ void Crop::update(int todo) // parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); - parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { WaveParams.expcontrast = procont; @@ -1406,6 +1408,7 @@ void Crop::update(int todo) } + } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index fc9d215b7..a538391c4 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1277,7 +1277,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if ((params->wavelet.enabled)) { WaveletParams WaveParams = params->wavelet; - WaveParams.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + WaveParams.getCurves(wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); int kall = 0; LabImage *unshar = nullptr; Glib::ustring provis; @@ -1301,7 +1301,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { provis = params->wavelet.CLmethod; params->wavelet.CLmethod = "all"; - ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); unshar = new LabImage(*nprevl, true); params->wavelet.CLmethod = provis; @@ -1314,7 +1314,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) WaveParams.expnoise = false; } - ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { @@ -1435,6 +1435,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) delete unshar; unshar = NULL; + + /* if (WaveParams.softrad > 0.f) { array2D ble(pW, pH); diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index ab57a4419..d90ee68ae 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -139,6 +139,8 @@ protected: NoiseCurve noiseLCurve; NoiseCurve noiseCCurve; WavCurve wavCLVCurve; + WavCurve wavdenoise; + WavCurve wavdenoiseh; Wavblcurve wavblcurve; WavOpacityCurveRG waOpacityCurveRG; WavOpacityCurveSH waOpacityCurveSH; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index a702dfbd8..d3ee81701 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -368,7 +368,7 @@ public: //Wavelet and denoise void Tile_calc(int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip); - void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveSH & waOpacityCurveSH, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip); + void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavCurve & wavdenoise, WavCurve & wavdenoiseh, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveSH & waOpacityCurveSH, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip); void WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition& WaveletCoeffs_L, const Wavblcurve & wavblcurve, struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 21fffb76c..8ab63c940 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -80,7 +80,7 @@ struct cont_params { float b_lsl, t_lsl, b_rsl, t_rsl; float b_lhl, t_lhl, b_rhl, t_rhl; float edg_low, edg_mean, edg_sd, edg_max; - float lev0s, lev0n, lev1s, lev1n, lev2s, lev2n, lev3s, lev3n; + float lev0s, lev0n, lev1s, lev1n, lev2s, lev2n, lev3s, lev3n, lev4n, lev4t; float b_lpast, t_lpast, b_rpast, t_rpast; float b_lsat, t_lsat, b_rsat, t_rsat; int rad; @@ -96,6 +96,8 @@ struct cont_params { bool opaRG; bool edgcurv; bool diagcurv; + bool denoicurv; + bool denoicurvh; int CHmet; int CHSLmet; int EDmet; @@ -118,6 +120,10 @@ struct cont_params { float sigmaton; float sigmacol; float sigmadir; + int denmet; + int mixmet; + int quamet; + int slimet; int ite; int contmet; bool opaW; @@ -160,6 +166,13 @@ struct cont_params { float b_low; float rangeab; float protab; + float sigmm; + float sigmm14; + float sigmm56; + float levden; + float thrden; + float limden; + int complex; }; int wavNestedLevels = 1; @@ -200,7 +213,7 @@ std::unique_ptr ImProcFunctions::buildMeaLut(const float inVals[11], const return std::unique_ptr(new LUTf(lutVals)); } -void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveSH & waOpacityCurveSH, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) +void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavCurve & wavdenoise, WavCurve & wavdenoiseh, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveSH & waOpacityCurveSH, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) { @@ -211,11 +224,43 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const {wiprof[2][0], wiprof[2][1], wiprof[2][2]} }; const int imheight = lab->H, imwidth = lab->W; + int levwavL; + //Flat curve for H=f(H) in final touchup for guidedfilter + FlatCurve* wavguidCurve = new FlatCurve(params->wavelet.wavguidcurve); //curve H=f(H) + bool wavguidutili = false; + + if (!wavguidCurve || wavguidCurve->isIdentity()) { + if (wavguidCurve) { + delete wavguidCurve; + wavguidCurve = nullptr; + } + } else { + wavguidutili = true; + } +//flat curve for equalizer H + FlatCurve* wavhueCurve = new FlatCurve(params->wavelet.wavhuecurve); //curve H=f(H) + bool wavhueutili = false; + + if (!wavhueCurve || wavhueCurve->isIdentity()) { + if (wavhueCurve) { + delete wavhueCurve; + wavhueCurve = nullptr; + } + } else { + wavhueutili = true; + } struct cont_params cp; cp.avoi = params->wavelet.avoid; + if (params->wavelet.complexmethod == "normal") { + cp.complex = 0; + } else if (params->wavelet.complexmethod == "expert") { + cp.complex = 1; + } + + if (params->wavelet.Medgreinf == "more") { cp.reinforce = 1; } else if (params->wavelet.Medgreinf == "none") { @@ -244,6 +289,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.sigmaton = params->wavelet.sigmaton; cp.sigmacol = params->wavelet.sigmacol; cp.sigmadir = params->wavelet.sigmadir; + cp.sigmm = params->wavelet.sigm; + cp.levden = params->wavelet.levden; + cp.thrden = 0.01f * params->wavelet.thrden; + cp.limden = params->wavelet.limden; if (params->wavelet.TMmethod == "cont") { cp.contmet = 1; @@ -251,6 +300,41 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.contmet = 2; } + + if (params->wavelet.denmethod == "equ") { + cp.denmet = 0; + } else if (params->wavelet.denmethod == "high") { + cp.denmet = 1; + } else if (params->wavelet.denmethod == "low") { + cp.denmet = 2; + } else if (params->wavelet.denmethod == "12high") { + cp.denmet = 3; + } else if (params->wavelet.denmethod == "12low") { + cp.denmet = 4; + } + + if (params->wavelet.mixmethod == "nois") { + cp.mixmet = 0; + } else if (params->wavelet.mixmethod == "mix") { + cp.mixmet = 1; + } else if (params->wavelet.mixmethod == "mix7") { + cp.mixmet = 2; + } else if (params->wavelet.mixmethod == "den") { + cp.mixmet = 3; + } + + if (params->wavelet.quamethod == "cons") { + cp.quamet = 0; + } else if (params->wavelet.quamethod == "agre") { + cp.quamet = 1; + } + + if (params->wavelet.slimethod == "sli") { + cp.slimet = 0; + } else if (params->wavelet.slimethod == "cur") { + cp.slimet = 1; + } + if (params->wavelet.BAmethod != "none") { cp.bam = true; @@ -341,6 +425,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.curv = false; cp.edgcurv = false; cp.diagcurv = false; + cp.denoicurv = false; + cp.denoicurvh = false; cp.opaRG = false; cp.opaBY = false; cp.opaW = false; @@ -425,6 +511,28 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.diagcurv = true; } + if (wavdenoise) { + for (int i = 0; i < 500; i++) { + if (wavdenoise[i] != 1.0) { + cp.denoicurv = true; + break; + } + } + } + + if(cp.complex == 0) { + wavdenoiseh = wavdenoise; + } + + if (wavdenoiseh) { + for (int i = 0; i < 500; i++) { + if (wavdenoiseh[i] != 1.0) { + cp.denoicurvh = true; + break; + } + } + } + for (int m = 0; m < maxmul; m++) { cp.mul[m] = waparams.c[m]; } @@ -531,6 +639,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.lev2n = static_cast(params->wavelet.level2noise.getTop()); cp.lev3s = static_cast(params->wavelet.level3noise.getBottom()); cp.lev3n = static_cast(params->wavelet.level3noise.getTop()); + cp.lev4n = static_cast(params->wavelet.leveldenoise.getTop()); + cp.lev4t = 0.01f * static_cast(params->wavelet.leveldenoise.getBottom()); + cp.sigmm14 = static_cast(params->wavelet.levelsigm.getTop()); + cp.sigmm56 = static_cast(params->wavelet.levelsigm.getBottom()); cp.detectedge = params->wavelet.medianlev; int minwin = rtengine::min(imwidth, imheight); @@ -561,8 +673,11 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const maxlevelcrop = 5; } - + int levwav = params->wavelet.thres; + if(params->wavelet.expnoise) { + levwav = 6; + } if (levwav == 9 && cp.mul[9] != 0) { levwav = 10; @@ -714,6 +829,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float sigmaN[10]; float MaxP[10]; float MaxN[10]; + float meand[10]; + float meanNd[10]; + float sigmad[10]; + float sigmaNd[10]; + float MaxPd[10]; + float MaxNd[10]; float meanab[10]; float meanNab[10]; @@ -877,7 +998,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const int datalen = labco->W * labco->H; - int levwavL = levwav; + levwavL = levwav; bool ref0 = false; if ((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) { @@ -914,8 +1035,17 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } - if (levwavL < 4) { - levwavL = 4; //to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! + if (levwavL < 5 && cp.noiseena) { + levwavL = 6; //to allow edge and denoise => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! + } +/* + if(cp.denoicurvh || cp.levdenhigh > 0.01f) { + levwavL = levwav; + } +*/ + float th = 0.01f * (float) waparams.thrend; + if(th > 0.f) { + levwavL = levwav; } if (settings->verbose) { @@ -926,6 +1056,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (levwavL > 0) { const std::unique_ptr Ldecomp(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + // const std::unique_ptr Ldecomp2(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!Ldecomp->memory_allocation_failed()) { float madL[10][3]; @@ -945,7 +1076,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const madL[lvl][dir - 1] = SQR(Mad(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); if (settings->verbose) { - printf("sqrt madL=%f lvl=%i dir=%i\n", sqrt(madL[lvl][dir - 1]), lvl, dir - 1); + printf("Luminance noise estimate (sqr) madL=%.0f lvl=%i dir=%i\n", madL[lvl][dir - 1], lvl, dir - 1); } } } @@ -954,6 +1085,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if ((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) { ref = true; + } bool contr = false; @@ -964,82 +1096,372 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } - if (cp.val > 0 || ref || contr) { //edge - Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN, wavNestedLevels); + // if (cp.val > 0 || ref || contr || cp.denoicurv || cp.denoicurvh || cp.noiseena || cp.levdenlow > 0.f || cp.thrden > 0.f ) { //edge + if (cp.val > 0 || ref || contr || cp.denoicurv || cp.denoicurvh || cp.noiseena || cp.thrden > 0.f ) { //edge + Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN, wavNestedLevels); } //init for edge and denoise - float vari[4]; + float vari[6]; vari[0] = 0.8f * SQR((cp.lev0n / 125.f) * (1.f + cp.lev0n / 25.f)); vari[1] = 0.8f * SQR((cp.lev1n / 125.f) * (1.f + cp.lev1n / 25.f)); vari[2] = 0.8f * SQR((cp.lev2n / 125.f) * (1.f + cp.lev2n / 25.f)); vari[3] = 0.8f * SQR((cp.lev3n / 125.f) * (1.f + cp.lev3n / 25.f)); + vari[4] = 0.8f * SQR((cp.lev4n / 125.f) * (1.f + cp.lev4n / 25.f)); + vari[5] = 0.8f * SQR((cp.lev4n / 125.f) * (1.f + cp.lev4n / 25.f)); float kr3 = 1.f; if (cp.lev3n < 10.f) { - kr3 = 0.f; + kr3 = 0.3f; } else if (cp.lev3n < 30.f) { - kr3 = 0.5f; + kr3 = 0.6f; } else if (cp.lev3n < 70.f) { - kr3 = 0.7f; + kr3 = 0.8f; } else { kr3 = 1.f; } - if ((cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f || cp.lev3n > 0.1f) && cp.noiseena) { - int edge = 5; + float kr4 = 1.f; + + if (cp.lev4n < 10.f) { + kr4 = 0.6f; + } else if (cp.lev4n < 30.f) { + kr4 = 0.8f; + } else if (cp.lev4n < 70.f) { + kr4 = 0.9f; + } else { + kr4 = 1.f; + } + + if ((cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f || cp.lev3n > 0.1f || cp.lev4n > 0.1f) && cp.noiseena) { + int edge = 6; vari[0] = rtengine::max(0.000001f, vari[0]); vari[1] = rtengine::max(0.000001f, vari[1]); vari[2] = rtengine::max(0.000001f, vari[2]); vari[3] = rtengine::max(0.000001f, kr3 * vari[3]); - - if (settings->verbose) { - printf("LUM var0=%f var1=%f var2=%f var3=%f\n", vari[0], vari[1], vari[2], vari[3]); - } + vari[4] = rtengine::max(0.000001f, kr4 * vari[4]); + vari[5] = rtengine::max(0.000001f, kr4 * vari[5]); + + const std::unique_ptr Ldecomp2(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + if(!Ldecomp2->memory_allocation_failed()){ + if (settings->verbose) { + printf("LUM var0=%f var1=%f var2=%f var3=%f var4=%f\n", vari[0], vari[1], vari[2], vari[3], vari[4]); + } // float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL - int GWL = labco->W; - int GHL = labco->H; - float* noisevarlum = new float[GHL * GWL]; - int GW2L = (GWL + 1) / 2; + int GWL = labco->W; + int GHL = labco->H; + float* noisevarlum = new float[GHL * GWL]; + float* noisevarhue = new float[GHL * GWL]; + int GW2L = (GWL + 1) / 2; - float nvlh[13] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 0.7f, 0.5f}; //high value - float nvll[13] = {0.1f, 0.15f, 0.2f, 0.25f, 0.3f, 0.35f, 0.4f, 0.45f, 0.7f, 0.8f, 1.f, 1.f, 1.f}; //low value + float nvlh[13] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 0.7f, 0.5f}; //high value + float nvll[13] = {0.1f, 0.15f, 0.2f, 0.25f, 0.3f, 0.35f, 0.4f, 0.45f, 0.7f, 0.8f, 1.f, 1.f, 1.f}; //low value - float seuillow = 3000.f;//low - float seuilhigh = 18000.f;//high - int i = 10 - cp.ballum; - float ac = (nvlh[i] - nvll[i]) / (seuillow - seuilhigh); - float bc = nvlh[i] - seuillow * ac; + float seuillow = 3000.f;//low + float seuilhigh = 18000.f;//high + int i = 10 - cp.ballum; + float ac = (nvlh[i] - nvll[i]) / (seuillow - seuilhigh); + float bc = nvlh[i] - seuillow * ac; #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel for #endif - for (int ir = 0; ir < GHL; ir++) - for (int jr = 0; jr < GWL; jr++) { - float lN = labco->L[ir][jr]; + for (int ir = 0; ir < GHL; ir++) + for (int jr = 0; jr < GWL; jr++) { + float lN = labco->L[ir][jr]; - if (lN < seuillow) { - noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = nvlh[i]; - } else if (lN < seuilhigh) { - noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = ac * lN + bc; - } else { - noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = nvll[i]; + if (lN < seuillow) { + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = nvlh[i]; + } else if (lN < seuilhigh) { + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = ac * lN + bc; + } else { + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = nvll[i]; + } } + + if(wavhueutili) { +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int ir = 0; ir < GHL; ir++) + for (int jr = 0; jr < GWL; jr++) { + float hueG = xatan2f(labco->b[ir][jr], labco->a[ir][jr]); + noisevarhue[(ir >> 1)*GW2L + (jr >> 1)] = 1.f + 2.f * (static_cast(wavhueCurve->getVal(Color::huelab_to_huehsv2(hueG))) - 0.5f); + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] *= noisevarhue[(ir >> 1)*GW2L + (jr >> 1)]; + } } - if (cp.lev3n < 20.f) { - WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge, 1); - } else { - WaveletDenoiseAll_BiShrinkL(*Ldecomp, noisevarlum, madL, vari, edge, 1); + - WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge, 1); + + if(cp.quamet == 0) { + if (settings->verbose) { + printf("denoise standard\n"); + } + WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge, 1); + } else { + if (settings->verbose) { + printf("denoise bishrink\n"); + } + WaveletDenoiseAll_BiShrinkL(*Ldecomp, noisevarlum, madL, vari, edge, 1); + + WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge, 1); + } + delete[] noisevarlum; + + //evaluate after denoise + Evaluate2(*Ldecomp, meand, meanNd, sigmad, sigmaNd, MaxPd, MaxNd, wavNestedLevels); + //for level 0 1 2 3 + float thr = 0.f; + float thrend = cp.thrden; //cp.levdenlow; + if(thrend < 0.02f) thr = 0.5f; + else if(thrend < 0.05f) thr = 0.2f; + else thr = 0.f; + + FlatCurve wavlow({ + FCT_MinMaxCPoints, + 0, 1, 0.35, 0.35,thrend, 1.0, 0.35, 0.35, thrend + 0.01f, thr, 0.35, 0.35, 1, thr, 0.35, 0.35 + }); + //for level 4 + float thrhigh = 0.f; + float threndhigh = cp.lev4t; //cp.levdenlow; + if(threndhigh < 0.02f) thrhigh = 0.5f; + else if(threndhigh < 0.05f) thrhigh = 0.2f; + else thrhigh = 0.f; + + FlatCurve wavhigh({ + FCT_MinMaxCPoints, + 0, 1, 0.35, 0.35,threndhigh, 1.0, 0.35, 0.35, threndhigh + 0.01f, thrhigh, 0.35, 0.35, 1, thrhigh, 0.35, 0.35 + }); + + float thrmed = 0.f; + float threndmed = 1.f - cp.limden; + if(threndmed < 0.02f) thrmed = 0.5f; + else if(threndmed < 0.05f) thrmed = 0.2f; + else thrmed = 0.f; + + FlatCurve wavmed({ + FCT_MinMaxCPoints, + 0, 1, 0.35, 0.35,threndmed, 1.0, 0.35, 0.35, threndmed + 0.01f, thrmed, 0.35, 0.35, 1, thrmed, 0.35, 0.35 + }); + + float siglh[10]; + float levref = 6; + //levref = levwavL-1; + if(cp.complex == 1){ + for (int level = 0; level < levref; level++) { + if(level > 3) { + siglh[level] = cp.sigmm56; + } else { + siglh[level] = cp.sigmm14; + } + } + } else { + levref = 4; + for (int level = 0; level < levref; level++) { + siglh[level] = cp.sigmm; + } + } + +// printf("sig0=%f sig1=%f sig2=%f sig3=%f sig4=%f sig5=%f\n", siglh[0], siglh[1],siglh[2],siglh[3],siglh[4],siglh[5]); + + + bool execut = false; + + if(cp.slimet == 0) { + // if(cp.levdenlow > 0.f) { + if(cp.thrden > 0.f) { + execut = true; + } + } else { + if(cp.denoicurv) { + execut = true; + } + } + // } + if (execut) { + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < levref; level++) { + int Wlvl_L = Ldecomp->level_W(level); + int Hlvl_L = Ldecomp->level_H(level); + float* const* WavCoeffs_L = Ldecomp->level_coeffs(level);//first decomp denoised + float* const* WavCoeffs_L2 = Ldecomp2->level_coeffs(level);//second decomp before denoise + int k4 = 3; + int k5 = 3; + if(cp.complex == 1){ + k4= 4; + k5= 5; + } + auto WavL0 = Ldecomp->level_coeffs(0)[dir]; + auto WavL1 = Ldecomp->level_coeffs(1)[dir]; + auto WavL2 = Ldecomp->level_coeffs(2)[dir]; + auto WavL3 = Ldecomp->level_coeffs(3)[dir]; + auto WavL4 = Ldecomp->level_coeffs(k4)[dir]; + auto WavL5 = Ldecomp->level_coeffs(k5)[dir]; + //not denoise + const auto WavL02 = Ldecomp2->level_coeffs(0)[dir]; + const auto WavL12 = Ldecomp2->level_coeffs(1)[dir]; + const auto WavL22 = Ldecomp2->level_coeffs(2)[dir]; + const auto WavL32 = Ldecomp2->level_coeffs(3)[dir]; + const auto WavL42 = Ldecomp2->level_coeffs(k4)[dir]; + const auto WavL52 = Ldecomp2->level_coeffs(k5)[dir]; + if (settings->verbose) { + printf("level=%i mean=%.0f meanden=%.0f sigma=%.0f sigmaden=%.0f Max=%.0f Maxden=%.0f\n", level, mean[level], meand[level], sigma[level], sigmad[level],MaxP[level], MaxPd[level]); + } + + //find local contrast + float tempmean = 0.f; + float tempsig = 0.f; + float tempmax = 0.f; + if(cp.mixmet == 0){ + tempmean = mean[level]; + tempsig = sigma[level]; + tempmax = MaxP[level]; + } else if(cp.mixmet == 1){ + tempmean = 0.5f * mean[level] + 0.5f * meand[level] ; + tempsig = 0.5f * sigma[level] + 0.5f * sigmad[level] ; + tempmax = 0.5f * MaxP[level] + 0.5f * MaxPd[level] ; + } else if(cp.mixmet == 2){ + tempmean = 0.3f * mean[level] + 0.7f * meand[level] ; + tempsig = 0.3f * sigma[level] + 0.7f * sigmad[level] ; + tempmax = 0.3f * MaxP[level] + 0.7f * MaxPd[level] ; + } else if(cp.mixmet == 3){ + tempmean = meand[level]; + tempsig = sigmad[level]; + tempmax = MaxPd[level]; + } + + if (MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { //curve + float insigma = 0.666f; //SD + float logmax = log(tempmax); //log Max + //cp.sigmm change the "wider" of sigma + float rapX = (tempmean + siglh[level] * tempsig) / (tempmax); //rapport between sD / max + float inx = log(insigma); + float iny = log(rapX); + float rap = inx / iny; //koef + float asig = 0.166f / (tempsig * siglh[level]); + float bsig = 0.5f - asig * tempmean; + float amean = 0.5f / (tempmean); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, Wlvl_L * 16) num_threads(wavNestedLevels) if (wavNestedLevels>1) +#endif + + for (int i = 0; i < Wlvl_L * Hlvl_L; i++) { + float absciss; + float tempwav = 0.f; + if(cp.mixmet == 0){ + tempwav = WavCoeffs_L2[dir][i]; + } else if(cp.mixmet == 1){ + tempwav = 0.5f * WavCoeffs_L[dir][i] + 0.5f * WavCoeffs_L2[dir][i]; + } else if(cp.mixmet == 2){ + tempwav = 0.7f * WavCoeffs_L[dir][i] + 0.3f * WavCoeffs_L2[dir][i]; + } else if(cp.mixmet == 3){ + tempwav = WavCoeffs_L[dir][i]; + } + + if (std::fabs(tempwav) >= (tempmean + siglh[level] * tempsig)) { //for max + float valcour = xlogf(std::fabs(tempwav)); + float valc = valcour - logmax; + float vald = valc * rap; + absciss = xexpf(vald); + } else if (std::fabs(tempwav) >= tempmean) { + absciss = asig * std::fabs(tempwav) + bsig; + } else { + absciss = amean * std::fabs(tempwav); + float k = siglh[level]; + if(siglh[level] > 1.f) { + k = SQR(siglh[level]); + } + float abs = pow(2.f * absciss, (1.f / k)); + absciss = 0.5f * abs; + } + float kc = 0.f; + if(cp.slimet == 0) { + kc = wavlow.getVal(absciss) -1.f; + } else { + kc = wavdenoise[absciss * 500.f] - 1.f; + } + + float kchigh = 0.f; + kchigh = wavhigh.getVal(absciss) -1.f; + kchigh = -SQR(kchigh); + + float kcmed = 0.f; + kcmed = wavmed.getVal(absciss) -1.f; + kcmed = -SQR(kcmed); + + if(kc < 0) { + kc = -SQR(kc);//approximation to simulate sliders denoise + } + //equalizer for levels 0 1 and 3... 1.33 and 0.75 arbitrary values + if(cp.denmet == 1) { + if(level == 0 || level == 3) { + kc *= 1.7f; + } + } else if(cp.denmet == 2) { + if(level == 0 || level == 3) { + kc *= 0.3f; + } + } else if(cp.denmet == 3) { + if(level == 0 || level == 1) { + kc *= 1.7f; + } + } else if(cp.denmet == 4) { + if(level == 0 || level == 1) { + kc *= 0.3f; + } + } + + float reduceeffect = kc <= 0.f ? 1.f : 1.2f;//1.2 allows to increase denoise (not used) + + float kinterm = 1.f + reduceeffect * kc; + kinterm = kinterm <= 0.f ? 0.01f : kinterm; + + float kintermhigh = 1.f + reduceeffect * kchigh; + kintermhigh = kintermhigh <= 0.f ? 0.01f : kintermhigh; + + float kintermed = 1.f + reduceeffect * kcmed; + kintermed = kintermed <= 0.f ? 0.01f : kintermed; + + float kintermlow = kinterm; + if(level < 4) { + WavL0[i] = WavL02[i] + (WavL0[i] - WavL02[i]) * kintermlow; + WavL1[i] = WavL12[i] + (WavL1[i] - WavL12[i]) * kintermlow; + WavL2[i] = WavL22[i] + (WavL2[i] - WavL22[i]) * kintermlow; + WavL3[i] = WavL32[i] + (WavL3[i] - WavL32[i]) * kintermlow; + } + if(cp.complex == 1){ + if(cp.limden > 0.f) { + WavL0[i] = WavL02[i] + (WavL0[i] - WavL02[i]) * kintermed; + WavL1[i] = WavL12[i] + (WavL1[i] - WavL12[i]) * kintermed; + WavL2[i] = WavL22[i] + (WavL2[i] - WavL22[i]) * kintermed; + WavL3[i] = WavL32[i] + (WavL3[i] - WavL32[i]) * kintermed; + } + WavL4[i] = WavL42[i] + (WavL4[i] - WavL42[i]) * kintermhigh; + WavL5[i] = WavL52[i] + (WavL5[i] - WavL52[i]) * kintermhigh; + } + } + } + } + } + if (settings->verbose) { + Evaluate2(*Ldecomp, meand, meanNd, sigmad, sigmaNd, MaxPd, MaxNd, wavNestedLevels); + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < levref; level++) { + printf("AFTER LC level=%i mean=%.0f meanden=%.0f sigma=%.0f sigmaden=%.0f Max=%.0f Maxden=%.0f\n", level, mean[level], meand[level], sigma[level], sigmad[level],MaxP[level], MaxPd[level]); + } + } + } + + } + delete[] noisevarhue; } - } - + } //Flat curve for Contrast=f(H) in levels FlatCurve* ChCurve = new FlatCurve(params->wavelet.Chcurve); //curve C=f(H) bool Chutili = false; @@ -1322,7 +1744,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memory_allocation_failed()) { - if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f )) { + if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.quamet == 0 )) { WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ @@ -1359,7 +1781,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!bdecomp->memory_allocation_failed()) { - if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f )) { + // if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f )) { + if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.quamet == 0)) { + WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); @@ -1385,7 +1809,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); if (!adecomp->memory_allocation_failed() && !bdecomp->memory_allocation_failed()) { - if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f)) { + if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.quamet == 0)) { WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); @@ -1394,7 +1818,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab, wavNestedLevels); WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); - if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f)) { + if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.quamet == 0)) { WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); @@ -1422,6 +1846,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (usechrom) { Ldecomp->reconstruct(labco->data, cp.strength); } + if (settings->verbose) { + printf("OK END\n"); + } + } } @@ -1626,8 +2054,30 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } if (waparams.softradend > 0.f && cp.finena) { - array2D ble(lab->W, lab->H); - array2D guid(lab->W, lab->H); + float guid = waparams.softradend; + float strend = waparams.strend; + float detend = (float) waparams.detend; + float thrend = 0.01f * (float) waparams.thrend; + int ww = lab->W; + int hh = lab->H; + array2D LL(ww, hh); + array2D LLbef(ww, hh); + array2D LAbef(ww, hh); + array2D LBbef(ww, hh); + array2D guide(ww, hh); + const float blend = LIM01(float(strend) / 100.f); + float mean[10]; + float meanN[10]; + float sigma[10]; + float sigmaN[10]; + float MaxP[10]; + float MaxN[10]; + float meang[10]; + float meanNg[10]; + float sigmag[10]; + float sigmaNg[10]; + float MaxPg[10]; + float MaxNg[10]; bool multiTh = false; @@ -1639,31 +2089,142 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const #pragma omp parallel for #endif - - for (int ir = 0; ir < lab->H; ir++) { - for (int jr = 0; jr < lab->W; jr++) { - guid[ir][jr] = Color::L2Y(lab->L[ir][jr]) / 32768.f; - ble[ir][jr] = Color::L2Y(dst->L[ir][jr]) / 32768.f; + for (int y = 0; y < hh; y++) { + for (int x = 0; x < ww; x++) { + LL[y][x] = dst->L[y][x]; + LLbef[y][x] = dst->L[y][x]; + LAbef[y][x] = dst->a[y][x]; + LBbef[y][x] = dst->b[y][x]; + float ll = LL[y][x] / 32768.f; + guide[y][x] = xlin2log(rtengine::max(ll, 0.f), 10.f); } } + array2D iL(ww, hh, LL, 0); + int r = rtengine::max(int(guid / skip), 1); - constexpr double epsilmax = 0.002; - constexpr double epsilmin = 0.0005; - constexpr double aepsil = 0.01f * (epsilmax - epsilmin); - constexpr double bepsil = epsilmin; - const double epsil = aepsil * waparams.softradend + bepsil; - - const float blur = 10.f / scale * (0.001f + 0.8f * waparams.softradend); - - rtengine::guidedFilter(guid, ble, ble, blur, epsil, multiTh); - + const float epsil = 0.001f * std::pow(2, - detend); + rtengine::guidedFilterLog(guide, 10.f, LL, r, epsil, multiTh); + //take Hue to modulate LL + //LL in function of LLbef and Labef Lbbef + if(wavguidutili) { #ifdef _OPENMP #pragma omp parallel for #endif + for (int y = 0; y < hh ; y++) { + for (int x = 0; x < ww; x++) { + float hueG = xatan2f(LBbef[y][x], LAbef[y][x]); + float valparam = 1.f * (static_cast(wavguidCurve->getVal(Color::huelab_to_huehsv2(hueG))) - 0.5f); + LL[y][x] = LLbef[y][x] + (LL[y][x] - LLbef[y][x]) * (1.f + valparam); + } + } + } + //end hue + +// printf("LEVWAV=%i\n", levwavL); + + if (thrend > 0.f) { + //2 decomposition LL after guidefilter and dst before (perhaps dst no need) + const std::unique_ptr LdecompLL(new wavelet_decomposition(LL[0], ww, hh, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + const std::unique_ptr Ldecompdst(new wavelet_decomposition(dst->L[0], ww, hh, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + if (!LdecompLL->memory_allocation_failed() && !Ldecompdst->memory_allocation_failed()) { - for (int ir = 0; ir < lab->H; ir++) { - for (int jr = 0; jr < lab->W; jr++) { - dst->L[ir][jr] = Color::computeXYZ2LabY(32768.f * ble[ir][jr]); + Evaluate2(*LdecompLL, meang, meanNg, sigmag, sigmaNg, MaxPg, MaxNg, wavNestedLevels); + Evaluate2(*Ldecompdst, mean, meanN, sigma, sigmaN, MaxP, MaxN, wavNestedLevels); + float sig = 2.f; + float thr = 0.f; + if(thrend < 0.02f) thr = 0.5f; + else if(thrend < 0.1f) thr = 0.2f; + else thr = 0.f; + + FlatCurve wavguid({ + FCT_MinMaxCPoints, + 0, 1, 0.35, 0.35,thrend, 1.0, 0.35, 0.35, thrend + 0.01f, thr, 0.35, 0.35, 1, thr, 0.35, 0.35 + }); + + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < levwavL-1; level++) { + int Wlvl_L = LdecompLL->level_W(level); + int Hlvl_L = LdecompLL->level_H(level); + float* const* WavCoeffs_L = LdecompLL->level_coeffs(level);//first decomp denoised + float* const* WavCoeffs_L2 = Ldecompdst->level_coeffs(level);//second decomp before denoise + if (settings->verbose) { + printf("level=%i mean=%.0f meanden=%.0f sigma=%.0f sigmaden=%.0f Max=%.0f Maxden=%.0f\n", level, mean[level], meang[level], sigma[level], sigmag[level],MaxP[level], MaxPg[level]); + } + + //find local contrast + float tempmean = 0.f; + float tempsig = 0.f; + float tempmax = 0.f; + tempmean = 0.3f * mean[level] + 0.7f * meang[level] ; + tempsig = 0.3f * sigma[level] + 0.7f * sigmag[level] ; + tempmax = 0.3f * MaxP[level] + 0.7f * MaxPg[level] ; + + if (MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { //curve + float insigma = 0.666f; //SD + float logmax = log(tempmax); //log Max + //cp.sigmm change the "wider" of sigma + float rapX = (tempmean + sig * tempsig) / (tempmax); //rapport between sD / max + float inx = log(insigma); + float iny = log(rapX); + float rap = inx / iny; //koef + float asig = 0.166f / (tempsig * sig); + float bsig = 0.5f - asig * tempmean; + float amean = 0.5f / (tempmean); + + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, Wlvl_L * 16) num_threads(wavNestedLevels) if (wavNestedLevels>1) +#endif + + for (int i = 0; i < Wlvl_L * Hlvl_L; i++) { + float absciss; + float tempwav = 0.f; + tempwav = 0.7f * WavCoeffs_L[dir][i] + 0.3f * WavCoeffs_L2[dir][i]; + + if (std::fabs(tempwav) >= (tempmean + sig * tempsig)) { //for max + float valcour = xlogf(std::fabs(tempwav)); + float valc = valcour - logmax; + float vald = valc * rap; + absciss = xexpf(vald); + } else if (std::fabs(tempwav) >= tempmean) { + absciss = asig * std::fabs(tempwav) + bsig; + } else { + absciss = amean * std::fabs(tempwav); + float k = sig; + if(sig > 1.f) { + k = SQR(sig); + } + float abs = pow(2.f * absciss, (1.f / k)); + absciss = 0.5f * abs; + } + float kc = wavguid.getVal(absciss) -1.f; + + if(kc < 0) { + kc = -SQR(kc);//approximation to simulate sliders denoise + } + float reduceeffect = kc <= 0.f ? 1.f : 1.2f;//1.2 allows to increase denoise (not used) + + float kinterm = 1.f + reduceeffect * kc; + kinterm = kinterm <= 0.f ? 0.01f : kinterm; + float prov = WavCoeffs_L2[dir][i];//save before denoise + WavCoeffs_L[dir][i] = prov + (WavCoeffs_L[dir][i] - prov) * kinterm;//only apply local contrast on difference between denoise and normal + } + } + } + } + LdecompLL->reconstruct(LL[0], cp.strength); + } + } + + + //end local contrast +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < hh ; y++) { + for (int x = 0; x < ww; x++) { + LL[y][x] = intp(blend, LL[y][x] , iL[y][x]); + dst->L[y][x] = LL[y][x]; } } } @@ -2967,11 +3528,11 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float maxkoeLi, bool lipschitz, for (int sc = 0; sc < 10; sc++) { scaleskip[sc] = scales[sc] / skip; } - +/* if (settings->verbose) { printf("level=%i mean=%f sigma=%f maxp=%f\n", level, mean[level], sigma[level], MaxP[level]); } - +*/ constexpr float t_r = 40.f; constexpr float t_l = 10.f; constexpr float b_r = 75.f; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index d7ead7513..ab7924cd3 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2204,6 +2204,36 @@ WaveletParams::WaveletParams() : 0.35, 0.35 }, + wavdenoise{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + wavdenoiseh{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, blcurve{ static_cast(FCT_MinMaxCPoints), 0.0, @@ -2339,6 +2369,12 @@ WaveletParams::WaveletParams() : hhcurve{ FCT_Linear }, + wavguidcurve{ + FCT_Linear + }, + wavhuecurve{ + FCT_Linear + }, Chcurve{ FCT_Linear }, @@ -2357,6 +2393,10 @@ WaveletParams::WaveletParams() : greenhigh(0), bluehigh(0), ballum(7.), + sigm(1.0), + levden(0.), + thrden(0.), + limden(0.), balchrom(0.), chromfi(0.), chromco(0.), @@ -2364,6 +2404,9 @@ WaveletParams::WaveletParams() : mergeC(20.), softrad(0.), softradend(0.), + strend(50.), + detend(0), + thrend(0), lipst(false), avoid(false), showmask(false), @@ -2398,6 +2441,10 @@ WaveletParams::WaveletParams() : Backmethod("grey"), Tilesmethod("full"), complexmethod("normal"), + denmethod("equ"), + mixmethod("mix"), + slimethod("sli"), + quamethod("cons"), daubcoeffmethod("4_"), CHmethod("without"), Medgreinf("less"), @@ -2454,7 +2501,9 @@ WaveletParams::WaveletParams() : level0noise(0, 0, false), level1noise(0, 0, false), level2noise(0, 0, false), - level3noise(0, 0, false) + level3noise(0, 0, false), + leveldenoise(0, 0, false), + levelsigm(1, 1, false) { } @@ -2462,6 +2511,8 @@ bool WaveletParams::operator ==(const WaveletParams& other) const { return ccwcurve == other.ccwcurve + && wavdenoise == other.wavdenoise + && wavdenoiseh == other.wavdenoiseh && blcurve == other.blcurve && opacityCurveRG == other.opacityCurveRG && opacityCurveSH == other.opacityCurveSH @@ -2469,6 +2520,8 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && opacityCurveW == other.opacityCurveW && opacityCurveWL == other.opacityCurveWL && hhcurve == other.hhcurve + && wavguidcurve == other.wavguidcurve + && wavhuecurve == other.wavhuecurve && Chcurve == other.Chcurve && wavclCurve == other.wavclCurve && enabled == other.enabled @@ -2483,6 +2536,10 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && greenhigh == other.greenhigh && bluehigh == other.bluehigh && ballum == other.ballum + && sigm == other.sigm + && levden == other.levden + && thrden == other.thrden + && limden == other.limden && balchrom == other.balchrom && chromfi == other.chromfi && chromco == other.chromco @@ -2490,6 +2547,9 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && mergeC == other.mergeC && softrad == other.softrad && softradend == other.softradend + && strend == other.strend + && detend == other.detend + && thrend == other.thrend && lipst == other.lipst && avoid == other.avoid && showmask == other.showmask @@ -2531,6 +2591,10 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && Backmethod == other.Backmethod && Tilesmethod == other.Tilesmethod && complexmethod == other.complexmethod + && denmethod == other.denmethod + && mixmethod == other.mixmethod + && slimethod == other.slimethod + && quamethod == other.quamethod && daubcoeffmethod == other.daubcoeffmethod && CHmethod == other.CHmethod && Medgreinf == other.Medgreinf @@ -2587,7 +2651,9 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && level0noise == other.level0noise && level1noise == other.level1noise && level2noise == other.level2noise - && level3noise == other.level3noise; + && level3noise == other.level3noise + && leveldenoise == other.leveldenoise + && levelsigm == other.levelsigm; } bool WaveletParams::operator !=(const WaveletParams& other) const @@ -2597,6 +2663,8 @@ bool WaveletParams::operator !=(const WaveletParams& other) const void WaveletParams::getCurves( WavCurve& cCurve, + WavCurve& wavdenoise, + WavCurve& wavdenoiseh, Wavblcurve& tCurve, WavOpacityCurveRG& opacityCurveLUTRG, WavOpacityCurveSH& opacityCurveLUTSH, @@ -2606,6 +2674,8 @@ void WaveletParams::getCurves( ) const { cCurve.Set(this->ccwcurve); + wavdenoise.Set(this->wavdenoise); + wavdenoiseh.Set(this->wavdenoiseh); tCurve.Set(this->blcurve); opacityCurveLUTRG.Set(this->opacityCurveRG); opacityCurveLUTSH.Set(this->opacityCurveSH); @@ -5997,6 +6067,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.thres, "Wavelet", "MaxLev", wavelet.thres, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Tilesmethod, "Wavelet", "TilesMethod", wavelet.Tilesmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.complexmethod, "Wavelet", "complexMethod", wavelet.complexmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.denmethod, "Wavelet", "denMethod", wavelet.denmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.mixmethod, "Wavelet", "mixMethod", wavelet.mixmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.slimethod, "Wavelet", "sliMethod", wavelet.slimethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.quamethod, "Wavelet", "quaMethod", wavelet.quamethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.daubcoeffmethod, "Wavelet", "DaubMethod", wavelet.daubcoeffmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.CLmethod, "Wavelet", "ChoiceLevMethod", wavelet.CLmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Backmethod, "Wavelet", "BackMethod", wavelet.Backmethod, keyFile); @@ -6009,6 +6083,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.bluemed, "Wavelet", "CBbluemed", wavelet.bluemed, keyFile); saveToKeyfile(!pedited || pedited->wavelet.bluelow, "Wavelet", "CBbluelow", wavelet.bluelow, keyFile); saveToKeyfile(!pedited || pedited->wavelet.ballum, "Wavelet", "Ballum", wavelet.ballum, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sigm, "Wavelet", "Sigm", wavelet.sigm, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.levden, "Wavelet", "Levden", wavelet.levden, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.thrden, "Wavelet", "Thrden", wavelet.thrden, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.limden, "Wavelet", "Limden", wavelet.limden, keyFile); saveToKeyfile(!pedited || pedited->wavelet.balchrom, "Wavelet", "Balchrom", wavelet.balchrom, keyFile); saveToKeyfile(!pedited || pedited->wavelet.chromfi, "Wavelet", "Chromfine", wavelet.chromfi, keyFile); saveToKeyfile(!pedited || pedited->wavelet.chromco, "Wavelet", "Chromcoarse", wavelet.chromco, keyFile); @@ -6016,6 +6094,9 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.mergeC, "Wavelet", "MergeC", wavelet.mergeC, keyFile); saveToKeyfile(!pedited || pedited->wavelet.softrad, "Wavelet", "Softrad", wavelet.softrad, keyFile); saveToKeyfile(!pedited || pedited->wavelet.softradend, "Wavelet", "Softradend", wavelet.softradend, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.strend, "Wavelet", "Strend", wavelet.strend, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.detend, "Wavelet", "Detend", wavelet.detend, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.thrend, "Wavelet", "Thrend", wavelet.thrend, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expcontrast, "Wavelet", "Expcontrast", wavelet.expcontrast, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expchroma, "Wavelet", "Expchroma", wavelet.expchroma, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expedge, "Wavelet", "Expedge", wavelet.expedge, keyFile); @@ -6053,6 +6134,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.level1noise, "Wavelet", "Level1noise", wavelet.level1noise.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.level2noise, "Wavelet", "Level2noise", wavelet.level2noise.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.level3noise, "Wavelet", "Level3noise", wavelet.level3noise.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.leveldenoise, "Wavelet", "Leveldenoise", wavelet.leveldenoise.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.levelsigm, "Wavelet", "Levelsigm", wavelet.levelsigm.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.threshold, "Wavelet", "ThresholdHighlight", wavelet.threshold, keyFile); saveToKeyfile(!pedited || pedited->wavelet.threshold2, "Wavelet", "ThresholdShadow", wavelet.threshold2, keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgedetect, "Wavelet", "Edgedetect", wavelet.edgedetect, keyFile); @@ -6077,9 +6160,13 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.opacityCurveRG, "Wavelet", "OpacityCurveRG", wavelet.opacityCurveRG, keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveSH, "Wavelet", "Levalshc", wavelet.opacityCurveSH, keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveBY, "Wavelet", "OpacityCurveBY", wavelet.opacityCurveBY, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.wavdenoise, "Wavelet", "wavdenoise", wavelet.wavdenoise, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.wavdenoiseh, "Wavelet", "wavdenoiseh", wavelet.wavdenoiseh, keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveW, "Wavelet", "OpacityCurveW", wavelet.opacityCurveW, keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveWL, "Wavelet", "OpacityCurveWL", wavelet.opacityCurveWL, keyFile); saveToKeyfile(!pedited || pedited->wavelet.hhcurve, "Wavelet", "HHcurve", wavelet.hhcurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.wavguidcurve, "Wavelet", "Wavguidcurve", wavelet.wavguidcurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.wavhuecurve, "Wavelet", "Wavhuecurve", wavelet.wavhuecurve, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Chcurve, "Wavelet", "CHcurve", wavelet.Chcurve, keyFile); saveToKeyfile(!pedited || pedited->wavelet.wavclCurve, "Wavelet", "WavclCurve", wavelet.wavclCurve, keyFile); saveToKeyfile(!pedited || pedited->wavelet.median, "Wavelet", "Median", wavelet.median, keyFile); @@ -7836,6 +7923,10 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "CBbluemed", pedited, wavelet.bluemed, pedited->wavelet.bluemed); assignFromKeyfile(keyFile, "Wavelet", "CBbluelow", pedited, wavelet.bluelow, pedited->wavelet.bluelow); assignFromKeyfile(keyFile, "Wavelet", "Ballum", pedited, wavelet.ballum, pedited->wavelet.ballum); + assignFromKeyfile(keyFile, "Wavelet", "Sigm", pedited, wavelet.sigm, pedited->wavelet.sigm); + assignFromKeyfile(keyFile, "Wavelet", "Levden", pedited, wavelet.levden, pedited->wavelet.levden); + assignFromKeyfile(keyFile, "Wavelet", "Thrden", pedited, wavelet.thrden, pedited->wavelet.thrden); + assignFromKeyfile(keyFile, "Wavelet", "Limden", pedited, wavelet.limden, pedited->wavelet.limden); assignFromKeyfile(keyFile, "Wavelet", "Balchrom", pedited, wavelet.balchrom, pedited->wavelet.balchrom); assignFromKeyfile(keyFile, "Wavelet", "Chromfine", pedited, wavelet.chromfi, pedited->wavelet.chromfi); assignFromKeyfile(keyFile, "Wavelet", "Chromcoarse", pedited, wavelet.chromco, pedited->wavelet.chromco); @@ -7843,6 +7934,9 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "MergeC", pedited, wavelet.mergeC, pedited->wavelet.mergeC); assignFromKeyfile(keyFile, "Wavelet", "Softrad", pedited, wavelet.softrad, pedited->wavelet.softrad); assignFromKeyfile(keyFile, "Wavelet", "Softradend", pedited, wavelet.softradend, pedited->wavelet.softradend); + assignFromKeyfile(keyFile, "Wavelet", "Strend", pedited, wavelet.strend, pedited->wavelet.strend); + assignFromKeyfile(keyFile, "Wavelet", "Detend", pedited, wavelet.detend, pedited->wavelet.detend); + assignFromKeyfile(keyFile, "Wavelet", "Thrend", pedited, wavelet.thrend, pedited->wavelet.thrend); assignFromKeyfile(keyFile, "Wavelet", "Lipst", pedited, wavelet.lipst, pedited->wavelet.lipst); assignFromKeyfile(keyFile, "Wavelet", "AvoidColorShift", pedited, wavelet.avoid, pedited->wavelet.avoid); assignFromKeyfile(keyFile, "Wavelet", "Showmask", pedited, wavelet.showmask, pedited->wavelet.showmask); @@ -7869,6 +7963,10 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "BackMethod", pedited, wavelet.Backmethod, pedited->wavelet.Backmethod); assignFromKeyfile(keyFile, "Wavelet", "TilesMethod", pedited, wavelet.Tilesmethod, pedited->wavelet.Tilesmethod); assignFromKeyfile(keyFile, "Wavelet", "complexMethod", pedited, wavelet.complexmethod, pedited->wavelet.complexmethod); + assignFromKeyfile(keyFile, "Wavelet", "denMethod", pedited, wavelet.denmethod, pedited->wavelet.denmethod); + assignFromKeyfile(keyFile, "Wavelet", "mixMethod", pedited, wavelet.mixmethod, pedited->wavelet.mixmethod); + assignFromKeyfile(keyFile, "Wavelet", "sliMethod", pedited, wavelet.slimethod, pedited->wavelet.slimethod); + assignFromKeyfile(keyFile, "Wavelet", "quaMethod", pedited, wavelet.quamethod, pedited->wavelet.quamethod); assignFromKeyfile(keyFile, "Wavelet", "DaubMethod", pedited, wavelet.daubcoeffmethod, pedited->wavelet.daubcoeffmethod); assignFromKeyfile(keyFile, "Wavelet", "CHromaMethod", pedited, wavelet.CHmethod, pedited->wavelet.CHmethod); assignFromKeyfile(keyFile, "Wavelet", "Medgreinf", pedited, wavelet.Medgreinf, pedited->wavelet.Medgreinf); @@ -7917,9 +8015,13 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveRG", pedited, wavelet.opacityCurveRG, pedited->wavelet.opacityCurveRG); assignFromKeyfile(keyFile, "Wavelet", "Levalshc", pedited, wavelet.opacityCurveSH, pedited->wavelet.opacityCurveSH); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveBY", pedited, wavelet.opacityCurveBY, pedited->wavelet.opacityCurveBY); + assignFromKeyfile(keyFile, "Wavelet", "wavdenoise", pedited, wavelet.wavdenoise, pedited->wavelet.wavdenoise); + assignFromKeyfile(keyFile, "Wavelet", "wavdenoiseh", pedited, wavelet.wavdenoiseh, pedited->wavelet.wavdenoiseh); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveW", pedited, wavelet.opacityCurveW, pedited->wavelet.opacityCurveW); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveWL", pedited, wavelet.opacityCurveWL, pedited->wavelet.opacityCurveWL); assignFromKeyfile(keyFile, "Wavelet", "HHcurve", pedited, wavelet.hhcurve, pedited->wavelet.hhcurve); + assignFromKeyfile(keyFile, "Wavelet", "Wavguidcurve", pedited, wavelet.wavguidcurve, pedited->wavelet.wavguidcurve); + assignFromKeyfile(keyFile, "Wavelet", "Wavhuecurve", pedited, wavelet.wavhuecurve, pedited->wavelet.wavhuecurve); assignFromKeyfile(keyFile, "Wavelet", "CHcurve", pedited, wavelet.Chcurve, pedited->wavelet.Chcurve); assignFromKeyfile(keyFile, "Wavelet", "WavclCurve", pedited, wavelet.wavclCurve, pedited->wavelet.wavclCurve); @@ -8031,6 +8133,30 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } + if (keyFile.has_key("Wavelet", "Leveldenoise")) { + const std::vector thresh = keyFile.get_double_list("Wavelet", "Leveldenoise"); + + if (thresh.size() >= 2) { + wavelet.leveldenoise.setValues(thresh[0], thresh[1]); + } + + if (pedited) { + pedited->wavelet.leveldenoise = true; + } + } + + if (keyFile.has_key("Wavelet", "Levelsigm")) { + const std::vector thresh = keyFile.get_double_list("Wavelet", "Levelsigm"); + + if (thresh.size() >= 2) { + wavelet.levelsigm.setValues(thresh[0], thresh[1]); + } + + if (pedited) { + pedited->wavelet.levelsigm = true; + } + } + if (keyFile.has_key("Wavelet", "Pastlev")) { const std::vector thresh = keyFile.get_integer_list("Wavelet", "Pastlev"); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 0e70e8821..c435e317a 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1725,6 +1725,8 @@ private: struct WaveletParams { std::vector ccwcurve; + std::vector wavdenoise; + std::vector wavdenoiseh; std::vector blcurve; std::vector levelshc; std::vector opacityCurveRG; @@ -1733,6 +1735,8 @@ struct WaveletParams { std::vector opacityCurveW; std::vector opacityCurveWL; std::vector hhcurve; + std::vector wavguidcurve; + std::vector wavhuecurve; std::vector Chcurve; std::vector wavclCurve; bool enabled; @@ -1747,6 +1751,10 @@ struct WaveletParams { int greenhigh; int bluehigh; double ballum; + double sigm; + double levden; + double thrden; + double limden; double balchrom; double chromfi; double chromco; @@ -1754,6 +1762,9 @@ struct WaveletParams { double mergeC; double softrad; double softradend; + double strend; + int detend; + double thrend; bool lipst; bool avoid; @@ -1792,6 +1803,10 @@ struct WaveletParams { Glib::ustring Backmethod; Glib::ustring Tilesmethod; Glib::ustring complexmethod; + Glib::ustring denmethod; + Glib::ustring mixmethod; + Glib::ustring slimethod; + Glib::ustring quamethod; Glib::ustring daubcoeffmethod; Glib::ustring CHmethod; Glib::ustring Medgreinf; @@ -1849,6 +1864,8 @@ struct WaveletParams { Threshold level1noise; Threshold level2noise; Threshold level3noise; + Threshold leveldenoise; + Threshold levelsigm; WaveletParams(); @@ -1857,6 +1874,8 @@ struct WaveletParams { void getCurves( WavCurve& cCurve, + WavCurve& wavdenoise, + WavCurve& wavdenoiseh, Wavblcurve& tCurve, WavOpacityCurveRG& opacityCurveLUTRG, WavOpacityCurveSH& opacityCurveLUTSH, diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 7b8575635..1455b0c64 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1364,6 +1364,8 @@ private: LabImage *unshar = nullptr; WaveletParams WaveParams = params.wavelet; WavCurve wavCLVCurve; + WavCurve wavdenoise; + WavCurve wavdenoiseh; Wavblcurve wavblcurve; WavOpacityCurveRG waOpacityCurveRG; WavOpacityCurveSH waOpacityCurveSH; @@ -1388,14 +1390,14 @@ private: provradius = new LabImage(*labView, true); } - params.wavelet.getCurves(wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + params.wavelet.getCurves(wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); CurveFactory::diagonalCurve2Lut(params.wavelet.wavclCurve, wavclCurve, 1); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { const Glib::ustring provis = params.wavelet.CLmethod; params.wavelet.CLmethod = "all"; - ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); unshar = new LabImage(*labView, true); params.wavelet.CLmethod = provis; @@ -1407,7 +1409,7 @@ private: WaveParams.expnoise = false; } - ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { WaveParams.expcontrast = procont; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 3cd93064e..5b8188f80 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -515,6 +515,10 @@ void ParamsEdited::set(bool v) wavelet.bluelow = v; wavelet.lipst = v; wavelet.ballum = v; + wavelet.sigm = v; + wavelet.levden = v; + wavelet.thrden = v; + wavelet.limden = v; wavelet.balchrom = v; wavelet.chromfi = v; wavelet.chromco = v; @@ -522,6 +526,9 @@ void ParamsEdited::set(bool v) wavelet.mergeC = v; wavelet.softrad = v; wavelet.softradend = v; + wavelet.strend = v; + wavelet.detend = v; + wavelet.thrend = v; wavelet.Medgreinf = v; wavelet.ushamethod = v; wavelet.avoid = v; @@ -533,6 +540,10 @@ void ParamsEdited::set(bool v) wavelet.Backmethod = v; wavelet.Tilesmethod = v; wavelet.complexmethod = v; + wavelet.denmethod = v; + wavelet.mixmethod = v; + wavelet.slimethod = v; + wavelet.quamethod = v; wavelet.daubcoeffmethod = v; wavelet.CHmethod = v; wavelet.CHSLmethod = v; @@ -586,14 +597,20 @@ void ParamsEdited::set(bool v) wavelet.level1noise = v; wavelet.level2noise = v; wavelet.level3noise = v; + wavelet.leveldenoise = v; + wavelet.levelsigm = v; wavelet.ccwcurve = v; wavelet.blcurve = v; wavelet.opacityCurveSH = v; wavelet.opacityCurveRG = v; wavelet.opacityCurveBY = v; + wavelet.wavdenoise = v; + wavelet.wavdenoiseh = v; wavelet.opacityCurveW = v; wavelet.opacityCurveWL = v; wavelet.hhcurve = v; + wavelet.wavguidcurve = v; + wavelet.wavhuecurve = v; wavelet.Chcurve = v; wavelet.wavclCurve = v; @@ -1666,6 +1683,10 @@ void ParamsEdited::initFrom(const std::vector& wavelet.lipst = wavelet.lipst && p.wavelet.lipst == other.wavelet.lipst; wavelet.bluehigh = wavelet.bluehigh && p.wavelet.bluehigh == other.wavelet.bluehigh; wavelet.ballum = wavelet.ballum && p.wavelet.ballum == other.wavelet.ballum; + wavelet.sigm = wavelet.sigm && p.wavelet.sigm == other.wavelet.sigm; + wavelet.levden = wavelet.levden && p.wavelet.levden == other.wavelet.levden; + wavelet.thrden = wavelet.thrden && p.wavelet.thrden == other.wavelet.thrden; + wavelet.limden = wavelet.limden && p.wavelet.limden == other.wavelet.limden; wavelet.balchrom = wavelet.balchrom && p.wavelet.balchrom == other.wavelet.balchrom; wavelet.chromfi = wavelet.chromfi && p.wavelet.chromfi == other.wavelet.chromfi; wavelet.chromco = wavelet.chromco && p.wavelet.chromco == other.wavelet.chromco; @@ -1673,6 +1694,9 @@ void ParamsEdited::initFrom(const std::vector& wavelet.mergeC = wavelet.mergeC && p.wavelet.mergeC == other.wavelet.mergeC; wavelet.softrad = wavelet.softrad && p.wavelet.softrad == other.wavelet.softrad; wavelet.softradend = wavelet.softradend && p.wavelet.softradend == other.wavelet.softradend; + wavelet.strend = wavelet.strend && p.wavelet.strend == other.wavelet.strend; + wavelet.detend = wavelet.detend && p.wavelet.detend == other.wavelet.detend; + wavelet.thrend = wavelet.thrend && p.wavelet.thrend == other.wavelet.thrend; wavelet.ushamethod = wavelet.ushamethod && p.wavelet.ushamethod == other.wavelet.ushamethod; wavelet.avoid = wavelet.avoid && p.wavelet.avoid == other.wavelet.avoid; wavelet.showmask = wavelet.showmask && p.wavelet.showmask == other.wavelet.showmask; @@ -1683,6 +1707,10 @@ void ParamsEdited::initFrom(const std::vector& wavelet.Backmethod = wavelet.Backmethod && p.wavelet.Backmethod == other.wavelet.Backmethod; wavelet.Tilesmethod = wavelet.Tilesmethod && p.wavelet.Tilesmethod == other.wavelet.Tilesmethod; wavelet.complexmethod = wavelet.complexmethod && p.wavelet.complexmethod == other.wavelet.complexmethod; + wavelet.denmethod = wavelet.denmethod && p.wavelet.denmethod == other.wavelet.denmethod; + wavelet.mixmethod = wavelet.mixmethod && p.wavelet.mixmethod == other.wavelet.mixmethod; + wavelet.slimethod = wavelet.slimethod && p.wavelet.slimethod == other.wavelet.slimethod; + wavelet.quamethod = wavelet.quamethod && p.wavelet.quamethod == other.wavelet.quamethod; wavelet.daubcoeffmethod = wavelet.daubcoeffmethod && p.wavelet.daubcoeffmethod == other.wavelet.daubcoeffmethod; wavelet.CHmethod = wavelet.CHmethod && p.wavelet.CHmethod == other.wavelet.CHmethod; wavelet.CHSLmethod = wavelet.CHSLmethod && p.wavelet.CHSLmethod == other.wavelet.CHSLmethod; @@ -1735,6 +1763,8 @@ void ParamsEdited::initFrom(const std::vector& wavelet.level1noise = wavelet.level1noise && p.wavelet.level1noise == other.wavelet.level1noise; wavelet.level2noise = wavelet.level2noise && p.wavelet.level2noise == other.wavelet.level2noise; wavelet.level3noise = wavelet.level3noise && p.wavelet.level3noise == other.wavelet.level3noise; + wavelet.leveldenoise = wavelet.leveldenoise && p.wavelet.leveldenoise == other.wavelet.leveldenoise; + wavelet.levelsigm = wavelet.levelsigm && p.wavelet.levelsigm == other.wavelet.levelsigm; wavelet.pastlev = wavelet.pastlev && p.wavelet.pastlev == other.wavelet.pastlev; wavelet.satlev = wavelet.satlev && p.wavelet.satlev == other.wavelet.satlev; wavelet.ccwcurve = wavelet.ccwcurve && p.wavelet.ccwcurve == other.wavelet.ccwcurve; @@ -1742,10 +1772,14 @@ void ParamsEdited::initFrom(const std::vector& wavelet.opacityCurveSH = wavelet.opacityCurveSH && p.wavelet.opacityCurveSH == other.wavelet.opacityCurveSH; wavelet.opacityCurveRG = wavelet.opacityCurveRG && p.wavelet.opacityCurveRG == other.wavelet.opacityCurveRG; wavelet.opacityCurveBY = wavelet.opacityCurveBY && p.wavelet.opacityCurveBY == other.wavelet.opacityCurveBY; + wavelet.wavdenoise = wavelet.wavdenoise && p.wavelet.wavdenoise == other.wavelet.wavdenoise; + wavelet.wavdenoiseh = wavelet.wavdenoiseh && p.wavelet.wavdenoiseh == other.wavelet.wavdenoiseh; wavelet.opacityCurveW = wavelet.opacityCurveW && p.wavelet.opacityCurveW == other.wavelet.opacityCurveW; wavelet.opacityCurveWL = wavelet.opacityCurveWL && p.wavelet.opacityCurveWL == other.wavelet.opacityCurveWL; wavelet.wavclCurve = wavelet.wavclCurve && p.wavelet.wavclCurve == other.wavelet.wavclCurve; wavelet.hhcurve = wavelet.hhcurve && p.wavelet.hhcurve == other.wavelet.hhcurve; + wavelet.wavguidcurve = wavelet.wavguidcurve && p.wavelet.wavguidcurve == other.wavelet.wavguidcurve; + wavelet.wavhuecurve = wavelet.wavhuecurve && p.wavelet.wavhuecurve == other.wavelet.wavhuecurve; wavelet.Chcurve = wavelet.Chcurve && p.wavelet.Chcurve == other.wavelet.Chcurve; wavelet.skinprotect = wavelet.skinprotect && p.wavelet.skinprotect == other.wavelet.skinprotect; // wavelet.enacont = wavelet.enacont && p.wavelet.enacont == other.wavelet.enacont; @@ -5510,6 +5544,22 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.ballum = mods.wavelet.ballum; } + if (wavelet.sigm) { + toEdit.wavelet.sigm = mods.wavelet.sigm; + } + + if (wavelet.levden) { + toEdit.wavelet.levden = mods.wavelet.levden; + } + + if (wavelet.thrden) { + toEdit.wavelet.thrden = mods.wavelet.thrden; + } + + if (wavelet.limden) { + toEdit.wavelet.limden = mods.wavelet.limden; + } + if (wavelet.balchrom) { toEdit.wavelet.balchrom = mods.wavelet.balchrom; } @@ -5538,6 +5588,18 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.softradend = mods.wavelet.softradend; } + if (wavelet.strend) { + toEdit.wavelet.strend = mods.wavelet.strend; + } + + if (wavelet.detend) { + toEdit.wavelet.detend = mods.wavelet.detend; + } + + if (wavelet.thrend) { + toEdit.wavelet.thrend = mods.wavelet.thrend; + } + if (wavelet.lipst) { toEdit.wavelet.lipst = mods.wavelet.lipst; } @@ -5586,6 +5648,22 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.complexmethod = mods.wavelet.complexmethod; } + if (wavelet.denmethod) { + toEdit.wavelet.denmethod = mods.wavelet.denmethod; + } + + if (wavelet.mixmethod) { + toEdit.wavelet.mixmethod = mods.wavelet.mixmethod; + } + + if (wavelet.slimethod) { + toEdit.wavelet.slimethod = mods.wavelet.slimethod; + } + + if (wavelet.quamethod) { + toEdit.wavelet.quamethod = mods.wavelet.quamethod; + } + if (wavelet.daubcoeffmethod) { toEdit.wavelet.daubcoeffmethod = mods.wavelet.daubcoeffmethod; } @@ -5682,6 +5760,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.level3noise = mods.wavelet.level3noise; } + if (wavelet.leveldenoise) { + toEdit.wavelet.leveldenoise = mods.wavelet.leveldenoise; + } + + if (wavelet.levelsigm) { + toEdit.wavelet.levelsigm = mods.wavelet.levelsigm; + } + if (wavelet.pastlev) { toEdit.wavelet.pastlev = mods.wavelet.pastlev; } @@ -5710,6 +5796,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.opacityCurveBY = mods.wavelet.opacityCurveBY; } + if (wavelet.wavdenoise) { + toEdit.wavelet.wavdenoise = mods.wavelet.wavdenoise; + } + + if (wavelet.wavdenoiseh) { + toEdit.wavelet.wavdenoiseh = mods.wavelet.wavdenoiseh; + } + if (wavelet.opacityCurveW) { toEdit.wavelet.opacityCurveW = mods.wavelet.opacityCurveW; } @@ -5722,6 +5816,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.hhcurve = mods.wavelet.hhcurve; } + if (wavelet.wavguidcurve) { + toEdit.wavelet.wavguidcurve = mods.wavelet.wavguidcurve; + } + + if (wavelet.wavhuecurve) { + toEdit.wavelet.wavhuecurve = mods.wavelet.wavhuecurve; + } + if (wavelet.Chcurve) { toEdit.wavelet.Chcurve = mods.wavelet.Chcurve; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index f8230a577..f0ef04b1c 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -1041,6 +1041,10 @@ struct WaveletParamsEdited { bool Backmethod; bool Tilesmethod; bool complexmethod; + bool denmethod; + bool mixmethod; + bool slimethod; + bool quamethod; bool daubcoeffmethod; bool Dirmethod; bool sigma; @@ -1087,14 +1091,20 @@ struct WaveletParamsEdited { bool level1noise; bool level2noise; bool level3noise; + bool leveldenoise; + bool levelsigm; bool ccwcurve; bool blcurve; bool opacityCurveSH; bool opacityCurveBY; + bool wavdenoise; + bool wavdenoiseh; bool opacityCurveRG; bool opacityCurveW; bool opacityCurveWL; bool hhcurve; + bool wavguidcurve; + bool wavhuecurve; bool Chcurve; bool pastlev; bool satlev; @@ -1106,6 +1116,10 @@ struct WaveletParamsEdited { bool greenhigh; bool bluehigh; bool ballum; + bool sigm; + bool levden; + bool thrden; + bool limden; bool balchrom; bool chromfi; bool chromco; @@ -1113,6 +1127,9 @@ struct WaveletParamsEdited { bool mergeC; bool softrad; bool softradend; + bool strend; + bool detend; + bool thrend; bool expcontrast; bool expchroma; bool expedge; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 19d458dad..78fa49144 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . * - * 2014 - 2019Jacques Desmis + * 2014 - 2020 Jacques Desmis */ #include "wavelet.h" @@ -29,6 +29,7 @@ #include "eventmapper.h" #include "labgrid.h" #include "../rtengine/color.h" +#include using namespace rtengine; using namespace rtengine::procparams; @@ -72,6 +73,10 @@ Wavelet::Wavelet() : separatoredge(Gtk::manage(new Gtk::HSeparator())), opaCurveEditorG(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_COLORT"))), opacityCurveEditorG(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_OPACITY"))), + CurveEditorwavnoise(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_DENOISE"))), + CurveEditorwavnoiseh(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_DENOISEH"))), + CurveEditorwavguid(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_DENOISEGUID"))), + CurveEditorwavhue(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_DENOISEHUE"))), opacityCurveEditorW(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_OPACITYW"))), opacityCurveEditorWL(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_OPACITYWL"))), median(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_MEDI")))), @@ -99,7 +104,7 @@ Wavelet::Wavelet() : gamma(Gtk::manage(new Adjuster(M("TP_WAVELET_COMPGAMMA"), 0.4, 2.0, 0.01, 1.0))), sup(Gtk::manage(new Adjuster(M("TP_WAVELET_SUPE"), -100, 350, 1, 0))), sky(Gtk::manage(new Adjuster(M("TP_WAVELET_SKY"), -100., 100.0, 1., 0.))), - thres(Gtk::manage(new Adjuster(M("TP_WAVELET_LEVELS"), 4, 9, 1, 7))),//3 + thres(Gtk::manage(new Adjuster(M("TP_WAVELET_LEVELS"), 5, 9, 1, 7))),//3 chroma(Gtk::manage(new Adjuster(M("TP_WAVELET_CHRO"), 1, 9, 1, 5))), chro(Gtk::manage(new Adjuster(M("TP_WAVELET_CHR"), 0., 100., 1., 0.))), contrast(Gtk::manage(new Adjuster(M("TP_WAVELET_CONTRA"), -100, 100, 1, 0))), @@ -131,6 +136,12 @@ Wavelet::Wavelet() : level1noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVONE"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), level2noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVTWO"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), level3noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVTHRE"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), + leveldenoise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVFOUR"), 0., 100., 0., M("TP_WAVELET_DEN5THR"), 1, 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), + levelsigm(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVELSIGM"), 0.05, 3., 1., M("TP_WAVELET_LEVELHIGH"), 1, 0.05, 3., 1., M("TP_WAVELET_LEVELLOW"), 1., nullptr, false))), + sigm(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGM"), 0.05, 3.5, 0.01, 1.))), + levden(Gtk::manage(new Adjuster(M("TP_WAVELET_LEVDEN"), 0., 100., 0.5, 0.))), + thrden(Gtk::manage(new Adjuster(M("TP_WAVELET_DENLH"), 0., 100., 0.5, 0.))), + limden(Gtk::manage(new Adjuster(M("TP_WAVELET_LIMDEN"), 0., 1., 0.01, 0.))), threshold(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESHOLD"), 1, 9, 1, 4))), // threshold2(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESHOLD2"), 1, 9, 1, 4))), threshold2(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESHOLD2"), 3, 9, 1, 5))), @@ -146,7 +157,10 @@ Wavelet::Wavelet() : mergeL(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEL"), -50, 100, 1, 20))), mergeC(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEC"), -50, 100, 1, 20))), softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), - softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), + softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 1000., 1., 0.))), + strend(Gtk::manage(new Adjuster(M("TP_WAVELET_STREND"), 0.0, 100., 1.0, 50.))), + detend(Gtk::manage(new Adjuster(M("TP_WAVELET_DETEND"), -10, 10, 1, 0))), + thrend(Gtk::manage(new Adjuster(M("TP_WAVELET_THREND"), 0.0, 100., 0.5, 0.))), chrwav(Gtk::manage(new Adjuster(M("TP_WAVELET_CHRWAV"), 0., 100., 0.5, 0.))), Lmethod(Gtk::manage(new MyComboBoxText())), CHmethod(Gtk::manage(new MyComboBoxText())), @@ -164,6 +178,10 @@ Wavelet::Wavelet() : Dirmethod(Gtk::manage(new MyComboBoxText())), Medgreinf(Gtk::manage(new MyComboBoxText())), ushamethod(Gtk::manage(new MyComboBoxText())), + denmethod(Gtk::manage(new MyComboBoxText())), + mixmethod(Gtk::manage(new MyComboBoxText())), + quamethod(Gtk::manage(new MyComboBoxText())), + slimethod(Gtk::manage(new MyComboBoxText())), chanMixerHLFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_HIGHLIGHT")))), chanMixerMidFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_MIDTONES")))), chanMixerShadowsFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_SHADOWS")))), @@ -175,6 +193,7 @@ Wavelet::Wavelet() : fincFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_FINCFRAME")))), dirFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_DIRFRAME")))), tonFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_TONFRAME")))), + guidFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_GUIDFRAME")))), wavLabels(Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER))), labmC(Gtk::manage(new Gtk::Label(M("TP_WAVELET_CTYPE") + ":"))), labmNP(Gtk::manage(new Gtk::Label(M("TP_WAVELET_NPTYPE") + ":"))), @@ -193,6 +212,10 @@ Wavelet::Wavelet() : neutrHBox(Gtk::manage(new Gtk::HBox())), usharpHBox(Gtk::manage(new Gtk::HBox())), ctboxch(Gtk::manage(new Gtk::HBox())), + quaHBox(Gtk::manage(new Gtk::HBox())), + sliHBox(Gtk::manage(new Gtk::HBox())), + denHBox(Gtk::manage(new Gtk::HBox())), + mixHBox(Gtk::manage(new Gtk::HBox())), ctboxBA(Gtk::manage(new Gtk::VBox())) { @@ -232,6 +255,24 @@ Wavelet::Wavelet() : EvWavprotab = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_PROTAB"); EvWavlevelshc = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_LEVELSHC"); EvWavcomplexmet = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_COMPLEX"); + EvWavsigm = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSIGM"); + EvWavdenoise = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVDENOISE"); + EvWavdenmethod = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVDENMET"); + EvWavmixmethod = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVMIXMET"); + EvWavquamethod = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVQUAMET"); + EvWavlevden = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVLEVDEN"); + EvWavdenoiseh = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVDENOISEH"); + EvWavstrend = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSTREND"); + EvWavdetend = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVDETEND"); + EvWavlevdenois = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVDENLH"); + EvWavslimethod = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSLIMET"); + EvWavthrend = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVTHREND"); + EvWavguid = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVGUIDH"); + EvWavhue = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVHUE"); + EvWavthrden = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVTHRDEN"); + EvWavlevelsigm = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVLEVELSIGM"); + EvWavlimden = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVLIMDEN"); + labgrid = Gtk::manage(new LabGrid(EvWavLabGridValue, M("TP_WAVELET_LABGRID_VALUES"))); @@ -447,7 +488,7 @@ Wavelet::Wavelet() : curveEditorC->set_tooltip_text(M("TP_WAVELET_FINCOAR_TOOLTIP")); - opacityShapeSH = static_cast(curveEditorC->addCurve(CT_Flat, "", nullptr, false, false)); + opacityShapeSH = static_cast(curveEditorC->addCurve(CT_Flat, "", nullptr, false, false)); opacityShapeSH->setIdentityValue(0.); opacityShapeSH->setResetCurve(FlatCurveType(default_params.opacityCurveSH.at(0)), default_params.opacityCurveSH); @@ -605,13 +646,121 @@ Wavelet::Wavelet() : level3noise->setAdjusterListener(this); level3noise->setUpdatePolicy(RTUP_DYNAMIC); + + leveldenoise->setAdjusterListener(this); + leveldenoise->setUpdatePolicy(RTUP_DYNAMIC); + + levelsigm->setAdjusterListener(this); + levelsigm->setUpdatePolicy(RTUP_DYNAMIC); + ballum->setAdjusterListener(this); + sigm->setAdjusterListener(this); + levden->setAdjusterListener(this); + thrden->setAdjusterListener(this); + limden->setAdjusterListener(this); + CurveEditorwavnoise->setCurveListener(this); + CurveEditorwavnoiseh->setCurveListener(this); + CurveEditorwavguid->setCurveListener(this); + CurveEditorwavhue->setCurveListener(this); + + quamethod->append(M("TP_WAVELET_QUACONSER")); + quamethod->append(M("TP_WAVELET_QUAAGRES")); + quamethodconn = quamethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::quamethodChanged)); +// quamethod->set_tooltip_text(M("TP_WAVELET_DENQUA_TOOLTIP")); + Gtk::Label* const quaLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_DENQUA") + ":")); + quaHBox->pack_start(*quaLabel, Gtk::PACK_SHRINK, 4); + quaHBox->pack_start(*quamethod); + + slimethod->append(M("TP_WAVELET_DENSLI")); + slimethod->append(M("TP_WAVELET_DENCURV")); + slimethodconn = slimethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::slimethodChanged)); +// slimethod->set_tooltip_text(M("TP_WAVELET_DENSLI_TOOLTIP")); + Gtk::Label* const sliLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_DENSLILAB") + ":")); + sliHBox->pack_start(*sliLabel, Gtk::PACK_SHRINK, 4); + sliHBox->pack_start(*slimethod); + + + denmethod->append(M("TP_WAVELET_DENEQUAL")); + denmethod->append(M("TP_WAVELET_DEN14PLUS")); + denmethod->append(M("TP_WAVELET_DEN14LOW")); + denmethod->append(M("TP_WAVELET_DEN12PLUS")); + denmethod->append(M("TP_WAVELET_DEN12LOW")); + denmethodconn = denmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::denmethodChanged)); + denmethod->set_tooltip_text(M("TP_WAVELET_DENEQUAL_TOOLTIP")); +// Gtk::HBox* const denHBox = Gtk::manage(new Gtk::HBox()); + Gtk::Label* const denLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_DENCONTRAST") + ":")); + denHBox->pack_start(*denLabel, Gtk::PACK_SHRINK, 4); + denHBox->pack_start(*denmethod); + + mixmethod->append(M("TP_WAVELET_MIXNOISE")); + mixmethod->append(M("TP_WAVELET_MIXMIX")); + mixmethod->append(M("TP_WAVELET_MIXMIX70")); + mixmethod->append(M("TP_WAVELET_MIXDENOISE")); + mixmethodconn = mixmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::mixmethodChanged)); + mixmethod->set_tooltip_text(M("TP_WAVELET_DENMIX_TOOLTIP")); + Gtk::Label* const mixLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_MIXCONTRAST") + ":")); + mixHBox->pack_start(*mixLabel, Gtk::PACK_SHRINK, 4); + mixHBox->pack_start(*mixmethod); + + wavdenoise = static_cast(CurveEditorwavnoise->addCurve(CT_Flat, "", nullptr, false, false)); + wavdenoise->setIdentityValue(0.); + wavdenoise->setResetCurve(FlatCurveType(default_params.wavdenoise.at(0)), default_params.wavdenoise); + CurveEditorwavnoise->set_tooltip_text(M("TP_WAVELET_DENLOCAL_TOOLTIP")); + + CurveEditorwavnoise->curveListComplete(); + CurveEditorwavnoise->show(); + const std::vector milestones4 = makeWholeHueRange(); + + wavdenoiseh = static_cast(CurveEditorwavnoiseh->addCurve(CT_Flat, "", nullptr, false, false)); + wavdenoiseh->setIdentityValue(0.); + wavdenoiseh->setResetCurve(FlatCurveType(default_params.wavdenoiseh.at(0)), default_params.wavdenoiseh); + CurveEditorwavnoiseh->set_tooltip_text(M("TP_WAVELET_DENLOCAL_TOOLTIP")); + CurveEditorwavnoiseh->curveListComplete(); + CurveEditorwavnoiseh->show(); + + wavhue = static_cast(CurveEditorwavhue->addCurve(CT_Flat, M("TP_WAVELET_CURVEEDITOR_HH"))); +// wavhue->setTooltip(M("TP_WAVELET_WAVHUE_HH_TOOLTIP")); + wavhue->setCurveColorProvider(this, 5); + CurveEditorwavhue->set_tooltip_text(M("TP_WAVELET_DENWAVHUE_TOOLTIP")); + CurveEditorwavhue->curveListComplete(); + wavhue->setBottomBarBgGradient(milestones4); + + + + + wavguidf = static_cast(CurveEditorwavguid->addCurve(CT_Flat, M("TP_WAVELET_CURVEEDITOR_HH"))); +// wavguidf->setTooltip(M("TP_WAVELET_WAVGUID_HH_TOOLTIP")); + wavguidf->setCurveColorProvider(this, 5); + CurveEditorwavguid->set_tooltip_text(M("TP_WAVELET_DENWAVGUID_TOOLTIP")); + CurveEditorwavguid->curveListComplete(); + wavguidf->setBottomBarBgGradient(milestones4); + + + + levelsigm->set_tooltip_text(M("TP_WAVELET_DENSIGMA_TOOLTIP")); +// levden->set_tooltip_text(M("TP_WAVELET_DENLEV_TOOLTIP")); + thrden->set_tooltip_text(M("TP_WAVELET_THRDEN_TOOLTIP")); +// limden->set_tooltip_text(M("TP_WAVELET_LIMDEN_TOOLTIP")); noiseBox->pack_start(*ballum); + noiseBox->pack_start(*CurveEditorwavhue); noiseBox->pack_start(*level0noise, Gtk::PACK_SHRINK, 0); noiseBox->pack_start(*level1noise, Gtk::PACK_SHRINK, 0); noiseBox->pack_start(*level2noise, Gtk::PACK_SHRINK, 0); noiseBox->pack_start(*level3noise, Gtk::PACK_SHRINK, 0); + // noiseBox->pack_start(*levden); + noiseBox->pack_start(*leveldenoise, Gtk::PACK_SHRINK, 0); + noiseBox->pack_start(*thrden); + noiseBox->pack_start(*quaHBox); + noiseBox->pack_start(*sliHBox); + noiseBox->pack_start(*denHBox); + noiseBox->pack_start(*mixHBox); + noiseBox->pack_start(*levelsigm, Gtk::PACK_SHRINK, 0); + noiseBox->pack_start(*limden); + noiseBox->pack_start(*sigm); + noiseBox->pack_start(*CurveEditorwavnoise); +// noiseBox->pack_start(*CurveEditorwavnoiseh); + balchrom->setAdjusterListener(this); chromfi->setAdjusterListener(this); @@ -624,7 +773,7 @@ Wavelet::Wavelet() : chroBox->pack_start(*chromco); chroFrame->add(*chroBox); noiseBox->pack_start(*chroFrame); - noiseBox->set_tooltip_text(M("TP_WAVELET_NOISE_TOOLTIP")); +// noiseBox->set_tooltip_text(M("TP_WAVELET_NOISE_TOOLTIP")); //Clarity @@ -1043,6 +1192,9 @@ Wavelet::Wavelet() : balance->setAdjusterListener(this); balance->set_tooltip_text(M("TP_WAVELET_BALANCE_TOOLTIP")); softradend->setAdjusterListener(this); + strend->setAdjusterListener(this); + detend->setAdjusterListener(this); + thrend->setAdjusterListener(this); opacityCurveEditorW->setCurveListener(this); @@ -1108,7 +1260,18 @@ Wavelet::Wavelet() : finalBox->pack_start(*fincFrame); finalBox->pack_start(*curveEditorG, Gtk::PACK_SHRINK, 4); - finalBox->pack_start(*softradend); + thrend->set_tooltip_text(M("TP_WAVELET_FINTHR_TOOLTIP")); + + guidFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const guidBox = Gtk::manage(new ToolParamBlock()); + guidBox->pack_start(*softradend); + guidBox->pack_start(*strend); + guidBox->pack_start(*detend); + guidBox->pack_start(*thrend); + guidBox->pack_start(*CurveEditorwavguid); + guidFrame->add(*guidBox); + finalBox->pack_start(*guidFrame); + //----------------------------- @@ -1167,6 +1330,10 @@ Wavelet::~Wavelet() delete opaCurveEditorG; delete curveEditorC; delete opacityCurveEditorG; + delete CurveEditorwavnoise; + delete CurveEditorwavnoiseh; + delete CurveEditorwavguid; + delete CurveEditorwavhue; delete curveEditorbl; delete CCWcurveEditorG; delete curveEditorRES; @@ -1253,6 +1420,10 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) Backmethodconn.block(true); Tilesmethodconn.block(true); complexmethodconn.block(true); + denmethodconn.block(true); + mixmethodconn.block(true); + slimethodconn.block(true); + quamethodconn.block(true); daubcoeffmethodconn.block(true); Dirmethodconn.block(true); CHmethodconn.block(true); @@ -1380,6 +1551,39 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) complexmethod->set_active(1); } + if (pp->wavelet.denmethod == "equ") { + denmethod->set_active(0); + } else if (pp->wavelet.denmethod == "high") { + denmethod->set_active(1); + } else if (pp->wavelet.denmethod == "low") { + denmethod->set_active(2); + } else if (pp->wavelet.denmethod == "12high") { + denmethod->set_active(3); + } else if (pp->wavelet.denmethod == "12low") { + denmethod->set_active(4); + } + + if (pp->wavelet.mixmethod == "nois") { + mixmethod->set_active(0); + } else if (pp->wavelet.mixmethod == "mix") { + mixmethod->set_active(1); + } else if (pp->wavelet.mixmethod == "mix7") { + mixmethod->set_active(2); + } else if (pp->wavelet.mixmethod == "den") { + mixmethod->set_active(3); + } + + if (pp->wavelet.slimethod == "sli") { + slimethod->set_active(0); + } else if (pp->wavelet.slimethod == "cur") { + slimethod->set_active(1); + } + + if (pp->wavelet.quamethod == "cons") { + quamethod->set_active(0); + } else if (pp->wavelet.quamethod == "agre") { + quamethod->set_active(1); + } //Tilesmethod->set_active (2); if (pp->wavelet.Tilesmethod == "full") { @@ -1420,11 +1624,15 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) ccshape->setCurve(pp->wavelet.ccwcurve); blshape->setCurve(pp->wavelet.blcurve); opacityShapeRG->setCurve(pp->wavelet.opacityCurveRG); + wavdenoise->setCurve(pp->wavelet.wavdenoise); + wavdenoiseh->setCurve(pp->wavelet.wavdenoiseh); opacityShapeSH->setCurve(pp->wavelet.opacityCurveSH); opacityShapeBY->setCurve(pp->wavelet.opacityCurveBY); opacityShape->setCurve(pp->wavelet.opacityCurveW); opacityShapeWL->setCurve(pp->wavelet.opacityCurveWL); hhshape->setCurve(pp->wavelet.hhcurve); + wavguidf->setCurve(pp->wavelet.wavguidcurve); + wavhue->setCurve(pp->wavelet.wavhuecurve); Chshape->setCurve(pp->wavelet.Chcurve); clshape->setCurve(pp->wavelet.wavclCurve); expcontrast->setEnabled(pp->wavelet.expcontrast); @@ -1534,8 +1742,15 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) mergeC->setValue(pp->wavelet.mergeC); softrad->setValue(pp->wavelet.softrad); softradend->setValue(pp->wavelet.softradend); + strend->setValue(pp->wavelet.strend); + detend->setValue(pp->wavelet.detend); + thrend->setValue(pp->wavelet.thrend); labgrid->setParams(pp->wavelet.labgridALow / WaveletParams::LABGRID_CORR_MAX, pp->wavelet.labgridBLow / WaveletParams::LABGRID_CORR_MAX, pp->wavelet.labgridAHigh / WaveletParams::LABGRID_CORR_MAX, pp->wavelet.labgridBHigh / WaveletParams::LABGRID_CORR_MAX, false); + sigm->setValue(pp->wavelet.sigm); + levden->setValue(pp->wavelet.levden); + thrden->setValue(pp->wavelet.thrden); + limden->setValue(pp->wavelet.limden); ballum->setValue(pp->wavelet.ballum); balchrom->setValue(pp->wavelet.balchrom); chromfi->setValue(pp->wavelet.chromfi); @@ -1544,6 +1759,8 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) level1noise->setValue(pp->wavelet.level1noise); level2noise->setValue(pp->wavelet.level2noise); level3noise->setValue(pp->wavelet.level3noise); + leveldenoise->setValue(pp->wavelet.leveldenoise); + levelsigm->setValue(pp->wavelet.levelsigm); strength->setValue(pp->wavelet.strength); balance->setValue(pp->wavelet.balance); iter->setValue(pp->wavelet.iter); @@ -1585,6 +1802,21 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) complexmethod->set_active_text(M("GENERAL_UNCHANGED")); } + if (!pedited->wavelet.denmethod) { + denmethod->set_active_text(M("GENERAL_UNCHANGED")); + } + + if (!pedited->wavelet.mixmethod) { + mixmethod->set_active_text(M("GENERAL_UNCHANGED")); + } + + if (!pedited->wavelet.slimethod) { + slimethod->set_active_text(M("GENERAL_UNCHANGED")); + } + + if (!pedited->wavelet.quamethod) { + quamethod->set_active_text(M("GENERAL_UNCHANGED")); + } if (!pedited->wavelet.Tilesmethod) { Tilesmethod->set_active_text(M("GENERAL_UNCHANGED")); @@ -1650,9 +1882,13 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) opacityShapeRG->setCurve(pp->wavelet.opacityCurveRG); opacityShapeSH->setCurve(pp->wavelet.opacityCurveSH); opacityShapeBY->setCurve(pp->wavelet.opacityCurveBY); + wavdenoise->setCurve(pp->wavelet.wavdenoise); + wavdenoiseh->setCurve(pp->wavelet.wavdenoiseh); opacityShape->setCurve(pp->wavelet.opacityCurveW); opacityShapeWL->setCurve(pp->wavelet.opacityCurveWL); hhshape->setUnChanged(!pedited->wavelet.hhcurve); + wavguidf->setUnChanged(!pedited->wavelet.wavguidcurve); + wavhue->setUnChanged(!pedited->wavelet.wavhuecurve); Chshape->setUnChanged(!pedited->wavelet.Chcurve); clshape->setUnChanged(!pedited->wavelet.wavclCurve); avoid->set_inconsistent(!pedited->wavelet.avoid); @@ -1703,7 +1939,14 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) mergeC->setEditedState(pedited->wavelet.mergeC ? Edited : UnEdited); softrad->setEditedState(pedited->wavelet.softrad ? Edited : UnEdited); softradend->setEditedState(pedited->wavelet.softradend ? Edited : UnEdited); + strend->setEditedState(pedited->wavelet.strend ? Edited : UnEdited); + detend->setEditedState(pedited->wavelet.detend ? Edited : UnEdited); + thrend->setEditedState(pedited->wavelet.thrend ? Edited : UnEdited); + sigm->setEditedState(pedited->wavelet.sigm ? Edited : UnEdited); + levden->setEditedState(pedited->wavelet.levden ? Edited : UnEdited); + thrden->setEditedState(pedited->wavelet.thrden ? Edited : UnEdited); + limden->setEditedState(pedited->wavelet.limden ? Edited : UnEdited); ballum->setEditedState(pedited->wavelet.ballum ? Edited : UnEdited); balchrom->setEditedState(pedited->wavelet.balchrom ? Edited : UnEdited); chromfi->setEditedState(pedited->wavelet.chromfi ? Edited : UnEdited); @@ -1737,6 +1980,8 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) level1noise->setEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); level3noise->setEditedState(pedited->wavelet.level3noise ? Edited : UnEdited); + leveldenoise->setEditedState(pedited->wavelet.leveldenoise ? Edited : UnEdited); + levelsigm->setEditedState(pedited->wavelet.levelsigm ? Edited : UnEdited); for (int i = 0; i < 9; i++) { correction[i]->setEditedState(pedited->wavelet.c[i] ? Edited : UnEdited); @@ -1824,6 +2069,10 @@ void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) Backmethodconn.block(false); Tilesmethodconn.block(false); complexmethodconn.block(false); + denmethodconn.block(false); + mixmethodconn.block(false); + slimethodconn.block(false); + quamethodconn.block(false); daubcoeffmethodconn.block(false); CHmethodconn.block(false); CHSLmethodconn.block(false); @@ -1853,9 +2102,13 @@ void Wavelet::setEditProvider(EditDataProvider *provider) opacityShapeRG->setEditProvider(provider); opacityShapeSH->setEditProvider(provider); opacityShapeBY->setEditProvider(provider); + wavdenoise->setEditProvider(provider); + wavdenoiseh->setEditProvider(provider); opacityShape->setEditProvider(provider); opacityShapeWL->setEditProvider(provider); hhshape->setEditProvider(provider); + wavguidf->setEditProvider(provider); + wavhue->setEditProvider(provider); Chshape->setEditProvider(provider); clshape->setEditProvider(provider); } @@ -1926,20 +2179,30 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.level1noise = level1noise->getValue (); pp->wavelet.level2noise = level2noise->getValue (); pp->wavelet.level3noise = level3noise->getValue (); + pp->wavelet.leveldenoise = leveldenoise->getValue (); + pp->wavelet.levelsigm = levelsigm->getValue (); pp->wavelet.ccwcurve = ccshape->getCurve(); pp->wavelet.blcurve = blshape->getCurve(); pp->wavelet.opacityCurveRG = opacityShapeRG->getCurve(); pp->wavelet.opacityCurveSH = opacityShapeSH->getCurve(); pp->wavelet.opacityCurveBY = opacityShapeBY->getCurve(); + pp->wavelet.wavdenoise = wavdenoise->getCurve(); + pp->wavelet.wavdenoiseh = wavdenoiseh->getCurve(); pp->wavelet.opacityCurveW = opacityShape->getCurve(); pp->wavelet.opacityCurveWL = opacityShapeWL->getCurve(); pp->wavelet.hhcurve = hhshape->getCurve(); + pp->wavelet.wavguidcurve = wavguidf->getCurve(); + pp->wavelet.wavhuecurve = wavhue->getCurve(); pp->wavelet.Chcurve = Chshape->getCurve(); pp->wavelet.pastlev = pastlev->getValue (); pp->wavelet.satlev = satlev->getValue (); pp->wavelet.strength = (int) strength->getValue(); pp->wavelet.balance = (int) balance->getValue(); pp->wavelet.balchrom = balchrom->getValue(); + pp->wavelet.sigm = sigm->getValue(); + pp->wavelet.levden = levden->getValue(); + pp->wavelet.thrden = thrden->getValue(); + pp->wavelet.limden = limden->getValue(); pp->wavelet.ballum = ballum->getValue(); pp->wavelet.chromfi = chromfi->getValue(); pp->wavelet.chromco = chromco->getValue(); @@ -1959,6 +2222,9 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.mergeC = mergeC->getValue(); pp->wavelet.softrad = softrad->getValue(); pp->wavelet.softradend = softradend->getValue(); + pp->wavelet.strend = strend->getValue(); + pp->wavelet.detend = detend->getIntValue(); + pp->wavelet.thrend = thrend->getValue(); pp->wavelet.expcontrast = expcontrast->getEnabled(); pp->wavelet.expchroma = expchroma->getEnabled(); pp->wavelet.expedge = expedge->getEnabled(); @@ -2004,6 +2270,10 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.Backmethod = Backmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.Tilesmethod = Tilesmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.complexmethod = complexmethod->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->wavelet.denmethod = denmethod->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->wavelet.mixmethod = mixmethod->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->wavelet.slimethod = slimethod->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->wavelet.quamethod = quamethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.daubcoeffmethod = daubcoeffmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.CHmethod = CHmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.CHSLmethod = CHSLmethod->get_active_text() != M("GENERAL_UNCHANGED"); @@ -2058,12 +2328,18 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.level1noise = level1noise->getEditedState(); pedited->wavelet.level2noise = level2noise->getEditedState(); pedited->wavelet.level3noise = level3noise->getEditedState(); + pedited->wavelet.leveldenoise = leveldenoise->getEditedState(); + pedited->wavelet.levelsigm = levelsigm->getEditedState(); pedited->wavelet.opacityCurveRG = !opacityShapeRG->isUnChanged(); pedited->wavelet.opacityCurveSH = !opacityShapeSH->isUnChanged(); pedited->wavelet.opacityCurveBY = !opacityShapeBY->isUnChanged(); + pedited->wavelet.wavdenoise = !wavdenoise->isUnChanged(); + pedited->wavelet.wavdenoiseh = !wavdenoiseh->isUnChanged(); pedited->wavelet.opacityCurveW = !opacityShape->isUnChanged(); pedited->wavelet.opacityCurveWL = !opacityShapeWL->isUnChanged(); pedited->wavelet.hhcurve = !hhshape->isUnChanged(); + pedited->wavelet.wavguidcurve = !wavguidf->isUnChanged(); + pedited->wavelet.wavhuecurve = !wavhue->isUnChanged(); pedited->wavelet.Chcurve = !Chshape->isUnChanged(); pedited->wavelet.bllev = bllev->getEditedState(); pedited->wavelet.pastlev = pastlev->getEditedState(); @@ -2075,6 +2351,10 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.bluemed = bluemed->getEditedState(); pedited->wavelet.greenhigh = greenhigh->getEditedState(); pedited->wavelet.bluehigh = bluehigh->getEditedState(); + pedited->wavelet.sigm = sigm->getEditedState(); + pedited->wavelet.levden = levden->getEditedState(); + pedited->wavelet.thrden = thrden->getEditedState(); + pedited->wavelet.limden = limden->getEditedState(); pedited->wavelet.ballum = ballum->getEditedState(); pedited->wavelet.balchrom = balchrom->getEditedState(); pedited->wavelet.chromfi = chromfi->getEditedState(); @@ -2083,6 +2363,9 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.mergeC = mergeC->getEditedState(); pedited->wavelet.softrad = softrad->getEditedState(); pedited->wavelet.softradend = softradend->getEditedState(); + pedited->wavelet.strend = strend->getEditedState(); + pedited->wavelet.detend = detend->getEditedState(); + pedited->wavelet.thrend = thrend->getEditedState(); pedited->wavelet.balance = balance->getEditedState(); pedited->wavelet.iter = iter->getEditedState(); pedited->wavelet.sigmafin = sigmafin->getEditedState(); @@ -2213,6 +2496,40 @@ void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) pp->wavelet.complexmethod = "expert"; } + if (denmethod->get_active_row_number() == 0) { + pp->wavelet.denmethod = "equ"; + } else if (denmethod->get_active_row_number() == 1) { + pp->wavelet.denmethod = "high"; + } else if (denmethod->get_active_row_number() == 2) { + pp->wavelet.denmethod = "low"; + } else if (denmethod->get_active_row_number() == 3) { + pp->wavelet.denmethod = "12high"; + } else if (denmethod->get_active_row_number() == 4) { + pp->wavelet.denmethod = "12low"; + } + + if (mixmethod->get_active_row_number() == 0) { + pp->wavelet.mixmethod = "nois"; + } else if (mixmethod->get_active_row_number() == 1) { + pp->wavelet.mixmethod = "mix"; + } else if (mixmethod->get_active_row_number() == 2) { + pp->wavelet.mixmethod = "mix7"; + } else if (mixmethod->get_active_row_number() == 3) { + pp->wavelet.mixmethod = "den"; + } + + if (slimethod->get_active_row_number() == 0) { + pp->wavelet.slimethod = "sli"; + } else if (slimethod->get_active_row_number() == 1) { + pp->wavelet.slimethod = "cur"; + } + + if (quamethod->get_active_row_number() == 0) { + pp->wavelet.quamethod = "cons"; + } else if (quamethod->get_active_row_number() == 1) { + pp->wavelet.quamethod = "agre"; + } + if (daubcoeffmethod->get_active_row_number() == 0) { pp->wavelet.daubcoeffmethod = "2_"; } else if (daubcoeffmethod->get_active_row_number() == 1) { @@ -2252,12 +2569,20 @@ void Wavelet::curveChanged(CurveEditor* ce) listener->panelChanged(EvWavlevelshc, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeBY) { listener->panelChanged(EvWavOpac, M("HISTORY_CUSTOMCURVE")); + } else if (ce == wavdenoise) { + listener->panelChanged(EvWavdenoise, M("HISTORY_CUSTOMCURVE")); + } else if (ce == wavdenoiseh) { + listener->panelChanged(EvWavdenoiseh, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShape) { listener->panelChanged(EvWavopacity, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeWL) { listener->panelChanged(EvWavopacityWL, M("HISTORY_CUSTOMCURVE")); } else if (ce == hhshape) { listener->panelChanged(EvWavHHCurve, M("HISTORY_CUSTOMCURVE")); + } else if (ce == wavguidf) { + listener->panelChanged(EvWavguid, M("HISTORY_CUSTOMCURVE")); + } else if (ce == wavhue) { + listener->panelChanged(EvWavhue, M("HISTORY_CUSTOMCURVE")); } else if (ce == Chshape) { listener->panelChanged(EvWavCHCurve, M("HISTORY_CUSTOMCURVE")); } else if (ce == clshape) { @@ -2331,6 +2656,12 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit level1noise->setDefault (defParams->wavelet.level1noise); level2noise->setDefault (defParams->wavelet.level2noise); level3noise->setDefault (defParams->wavelet.level3noise); + leveldenoise->setDefault (defParams->wavelet.leveldenoise); + levelsigm->setDefault (defParams->wavelet.levelsigm); + sigm->setDefault(defParams->wavelet.sigm); + levden->setDefault(defParams->wavelet.levden); + thrden->setDefault(defParams->wavelet.thrden); + limden->setDefault(defParams->wavelet.limden); ballum->setDefault(defParams->wavelet.ballum); balchrom->setDefault(defParams->wavelet.balchrom); chromfi->setDefault(defParams->wavelet.chromfi); @@ -2347,6 +2678,9 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit mergeC->setDefault(defParams->wavelet.mergeC); softrad->setDefault(defParams->wavelet.softrad); softradend->setDefault(defParams->wavelet.softradend); + strend->setDefault(defParams->wavelet.strend); + detend->setDefault(defParams->wavelet.detend); + thrend->setDefault(defParams->wavelet.thrend); if (pedited) { greenlow->setDefaultEditedState(pedited->wavelet.greenlow ? Edited : UnEdited); @@ -2359,6 +2693,13 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit mergeC->setDefaultEditedState(pedited->wavelet.mergeC ? Edited : UnEdited); softrad->setDefaultEditedState(pedited->wavelet.softrad ? Edited : UnEdited); softradend->setDefaultEditedState(pedited->wavelet.softradend ? Edited : UnEdited); + strend->setDefaultEditedState(pedited->wavelet.strend ? Edited : UnEdited); + detend->setDefaultEditedState(pedited->wavelet.detend ? Edited : UnEdited); + thrend->setDefaultEditedState(pedited->wavelet.thrend ? Edited : UnEdited); + sigm->setDefaultEditedState(pedited->wavelet.sigm ? Edited : UnEdited); + levden->setDefaultEditedState(pedited->wavelet.levden ? Edited : UnEdited); + thrden->setDefaultEditedState(pedited->wavelet.thrden ? Edited : UnEdited); + limden->setDefaultEditedState(pedited->wavelet.limden ? Edited : UnEdited); ballum->setDefaultEditedState(pedited->wavelet.ballum ? Edited : UnEdited); balchrom->setDefaultEditedState(pedited->wavelet.balchrom ? Edited : UnEdited); chromfi->setDefaultEditedState(pedited->wavelet.chromfi ? Edited : UnEdited); @@ -2420,6 +2761,8 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit level1noise->setDefaultEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setDefaultEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); level3noise->setDefaultEditedState(pedited->wavelet.level3noise ? Edited : UnEdited); + leveldenoise->setDefaultEditedState(pedited->wavelet.leveldenoise ? Edited : UnEdited); + levelsigm->setDefaultEditedState(pedited->wavelet.levelsigm ? Edited : UnEdited); for (int i = 0; i < 9; i++) { correction[i]->setDefaultEditedState(pedited->wavelet.c[i] ? Edited : UnEdited); @@ -2473,6 +2816,8 @@ void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedit level1noise->setDefaultEditedState(Irrelevant); level2noise->setDefaultEditedState(Irrelevant); level3noise->setDefaultEditedState(Irrelevant); + leveldenoise->setDefaultEditedState(Irrelevant); + levelsigm->setDefaultEditedState(Irrelevant); pastlev->setDefaultEditedState(Irrelevant); satlev->setDefaultEditedState(Irrelevant); strength->setDefaultEditedState(Irrelevant); @@ -2511,6 +2856,13 @@ void Wavelet::adjusterChanged(ThresholdAdjuster* a, double newBottom, double new } else if (a == level3noise) { listener->panelChanged(EvWavlev3nois, Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); + } else if (a == leveldenoise) { + listener->panelChanged(EvWavlevdenois, + Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_DEN5THR") + ": %2"), int(newTop), int(newBottom))); + } else if (a == levelsigm) { + usleep(150); + listener->panelChanged(EvWavlevelsigm, + Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_LEVELLOW") + ": %1" + "\n" + M("TP_WAVELET_LEVELHIGH") + ": %2"), (newTop), (newBottom))); } } @@ -2896,6 +3248,15 @@ void Wavelet::convertParamToNormal() //denoise chromfi->setValue(def_params.chromfi); chromco->setValue(def_params.chromco); + denmethod->set_active(0); + mixmethod->set_active(2); + slimethod->set_active(0); + levelsigm->setValue(def_params.levelsigm); + leveldenoise->setValue(def_params.leveldenoise); + limden->setValue(def_params.limden); + +// quamethod->set_active(0); +// sigm->setValue(def_params.sigm); //toning exptoning->setEnabled(def_params.exptoning); //gamut @@ -2945,6 +3306,17 @@ void Wavelet::updateGUIToMode(int mode) blurFrame->hide(); cbenab->hide(); sigmafin->hide(); + denHBox->hide(); + mixHBox->hide(); + sliHBox->hide(); + sigm->show(); + levelsigm->hide(); + CurveEditorwavnoiseh->hide(); + CurveEditorwavnoise->hide(); + // levden->hide(); + thrden->show(); + leveldenoise->hide(); + limden->hide(); } else { offset->show(); sigma->show(); @@ -2962,6 +3334,28 @@ void Wavelet::updateGUIToMode(int mode) blurFrame->show(); cbenab->show(); sigmafin->show(); + denHBox->hide(); + mixHBox->show(); + sigm->hide(); + levelsigm->show(); + limden->show(); + // levden->show(); + sliHBox->show(); + if (slimethod->get_active_row_number() == 0){ + leveldenoise->show(); + thrden->show(); + CurveEditorwavnoiseh->hide(); + CurveEditorwavnoise->hide(); + } else { + thrden->hide(); + leveldenoise->show(); + CurveEditorwavnoiseh->show(); + CurveEditorwavnoise->show(); + } + disableListener(); + denmethod->set_active(0); + enableListener(); + } } @@ -2982,7 +3376,54 @@ void Wavelet::complexmethodChanged() } } +void Wavelet::denmethodChanged() +{ + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavdenmethod, denmethod->get_active_text()); + } +} + +void Wavelet::mixmethodChanged() +{ + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavmixmethod, mixmethod->get_active_text()); + } +} + +void Wavelet::slimethodChanged() +{ + + if (slimethod->get_active_row_number() == 0 && complexmethod->get_active_row_number() == 0) { + updateGUIToMode(0); + convertParamToNormal(); + leveldenoise->show(); + } else if (slimethod->get_active_row_number() == 0 && complexmethod->get_active_row_number() == 1){ + updateGUIToMode(1); + leveldenoise->show(); + CurveEditorwavnoiseh->hide(); + CurveEditorwavnoise->hide(); + } else if (slimethod->get_active_row_number() == 1 && complexmethod->get_active_row_number() == 1){ + updateGUIToMode(1); + leveldenoise->show(); + CurveEditorwavnoiseh->show(); + CurveEditorwavnoise->show(); + } + + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavslimethod, slimethod->get_active_text()); + } +} + +void Wavelet::quamethodChanged() +{ + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavquamethod, quamethod->get_active_text()); + } +} void Wavelet::TilesmethodChanged() { @@ -3066,6 +3507,10 @@ void Wavelet::setBatchMode(bool batchMode) Backmethod->append(M("GENERAL_UNCHANGED")); Tilesmethod->append(M("GENERAL_UNCHANGED")); complexmethod->append(M("GENERAL_UNCHANGED")); + denmethod->append(M("GENERAL_UNCHANGED")); + mixmethod->append(M("GENERAL_UNCHANGED")); + slimethod->append(M("GENERAL_UNCHANGED")); + quamethod->append(M("GENERAL_UNCHANGED")); daubcoeffmethod->append(M("GENERAL_UNCHANGED")); CHmethod->append(M("GENERAL_UNCHANGED")); Medgreinf->append(M("GENERAL_UNCHANGED")); @@ -3081,6 +3526,10 @@ void Wavelet::setBatchMode(bool batchMode) opaCurveEditorG->setBatchMode(batchMode); curveEditorC->setBatchMode(batchMode); opacityCurveEditorG->setBatchMode(batchMode); + CurveEditorwavnoise->setBatchMode(batchMode); + CurveEditorwavnoiseh->setBatchMode(batchMode); + CurveEditorwavguid->setBatchMode(batchMode); + CurveEditorwavhue->setBatchMode(batchMode); opacityCurveEditorW->setBatchMode(batchMode); opacityCurveEditorWL->setBatchMode(batchMode); curveEditorbl->setBatchMode(batchMode); @@ -3141,6 +3590,8 @@ void Wavelet::setBatchMode(bool batchMode) level1noise->showEditedCB(); level2noise->showEditedCB(); level3noise->showEditedCB(); + leveldenoise->showEditedCB(); + levelsigm->showEditedCB(); ToolPanel::setBatchMode(batchMode); @@ -3309,6 +3760,14 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavbluehigh, bluehigh->getTextValue()); } else if (a == ballum) { listener->panelChanged(EvWavballum, ballum->getTextValue()); + } else if (a == sigm) { + listener->panelChanged(EvWavsigm, sigm->getTextValue()); + } else if (a == levden) { + listener->panelChanged(EvWavlevden, levden->getTextValue()); + } else if (a == thrden) { + listener->panelChanged(EvWavthrden, thrden->getTextValue()); + } else if (a == limden) { + listener->panelChanged(EvWavlimden, limden->getTextValue()); } else if (a == balchrom) { listener->panelChanged(EvWavbalchrom, balchrom->getTextValue()); } else if (a == chromfi) { @@ -3323,6 +3782,12 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvWavsoftrad, softrad->getTextValue()); } else if (a == softradend) { listener->panelChanged(EvWavsoftradend, softradend->getTextValue()); + } else if (a == strend) { + listener->panelChanged(EvWavstrend, strend->getTextValue()); + } else if (a == detend) { + listener->panelChanged(EvWavdetend, detend->getTextValue()); + } else if (a == thrend) { + listener->panelChanged(EvWavthrend, thrend->getTextValue()); } else if (a == greenmed) { listener->panelChanged(EvWavgreenmed, greenmed->getTextValue()); } else if (a == bluemed) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index a497d2c4f..c7e002a64 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . * - * 2014 Jacques Desmis + * 2014 2020 Jacques Desmis */ #pragma once @@ -102,6 +102,23 @@ private: rtengine::ProcEvent EvWavprotab; rtengine::ProcEvent EvWavlevelshc; rtengine::ProcEvent EvWavcomplexmet; + rtengine::ProcEvent EvWavsigm; + rtengine::ProcEvent EvWavdenoise; + rtengine::ProcEvent EvWavdenmethod; + rtengine::ProcEvent EvWavmixmethod; + rtengine::ProcEvent EvWavquamethod; + rtengine::ProcEvent EvWavlevden; + rtengine::ProcEvent EvWavdenoiseh; + rtengine::ProcEvent EvWavstrend; + rtengine::ProcEvent EvWavdetend; + rtengine::ProcEvent EvWavlevdenois; + rtengine::ProcEvent EvWavslimethod; + rtengine::ProcEvent EvWavthrend; + rtengine::ProcEvent EvWavguid; + rtengine::ProcEvent EvWavhue; + rtengine::ProcEvent EvWavthrden; + rtengine::ProcEvent EvWavlevelsigm; + rtengine::ProcEvent EvWavlimden; LabGrid *labgrid; @@ -122,6 +139,10 @@ private: void MedgreinfChanged(); void TMmethodChanged(); void complexmethodChanged(); + void denmethodChanged(); + void mixmethodChanged(); + void quamethodChanged(); + void slimethodChanged(); void TilesmethodChanged(); void avoidToggled(); void showmaskToggled (); @@ -183,6 +204,14 @@ private: FlatCurveEditor* opacityShapeRG; CurveEditorGroup* const opacityCurveEditorG; FlatCurveEditor* opacityShapeBY; + CurveEditorGroup* const CurveEditorwavnoise; + FlatCurveEditor* wavdenoise; + CurveEditorGroup* const CurveEditorwavnoiseh; + FlatCurveEditor* wavdenoiseh; + CurveEditorGroup* const CurveEditorwavguid; + FlatCurveEditor* wavguidf; + CurveEditorGroup* const CurveEditorwavhue; + FlatCurveEditor* wavhue; CurveEditorGroup* const opacityCurveEditorW; CurveEditorGroup* const opacityCurveEditorWL; FlatCurveEditor* opacityShape; @@ -261,7 +290,13 @@ private: ThresholdAdjuster* const level1noise; ThresholdAdjuster* const level2noise; ThresholdAdjuster* const level3noise; + ThresholdAdjuster* const leveldenoise; + ThresholdAdjuster* const levelsigm; + Adjuster* const sigm; + Adjuster* const levden; + Adjuster* const thrden; + Adjuster* const limden; Adjuster* const threshold; Adjuster* const threshold2; Adjuster* const edgedetect; @@ -277,6 +312,9 @@ private: Adjuster* const mergeC; Adjuster* const softrad; Adjuster* const softradend; + Adjuster* const strend; + Adjuster* const detend; + Adjuster* const thrend; Adjuster* const chrwav; MyComboBoxText* const Lmethod; @@ -311,6 +349,14 @@ private: sigc::connection MedgreinfConn; MyComboBoxText* const ushamethod; sigc::connection ushamethodconn; + MyComboBoxText* const denmethod; + sigc::connection denmethodconn; + MyComboBoxText* const mixmethod; + sigc::connection mixmethodconn; + MyComboBoxText* const quamethod; + sigc::connection quamethodconn; + MyComboBoxText* const slimethod; + sigc::connection slimethodconn; Gtk::Frame* const chanMixerHLFrame; Gtk::Frame* const chanMixerMidFrame; @@ -323,6 +369,7 @@ private: Gtk::Frame* const fincFrame; Gtk::Frame* const dirFrame; Gtk::Frame* const tonFrame; + Gtk::Frame* const guidFrame; Gtk::Label* const wavLabels; Gtk::Label* const labmC; @@ -343,6 +390,10 @@ private: Gtk::HBox* const neutrHBox; Gtk::HBox* const usharpHBox; Gtk::HBox* const ctboxch; + Gtk::HBox* const quaHBox; + Gtk::HBox* const sliHBox; + Gtk::HBox* const denHBox; + Gtk::HBox* const mixHBox; Gtk::VBox* const ctboxBA;// = Gtk::manage(new Gtk::VBox()); sigc::connection enableChromaConn, enableContrastConn, enableEdgeConn, enabletmConn, enableFinalConn, enableclariConn; From 390d62f6384d50300ac62ffa6871cd38f20c7435 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 30 Aug 2020 11:48:46 +0200 Subject: [PATCH 083/185] Hide little 'RawTherapee ...' window frame when starting RT --- rtgui/inspector.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/inspector.cc b/rtgui/inspector.cc index 7d5d44e44..526343fca 100644 --- a/rtgui/inspector.cc +++ b/rtgui/inspector.cc @@ -98,7 +98,6 @@ Inspector::Inspector () : currImage(nullptr), scaled(false), scale(1.0), zoomSca gestureZoom->signal_scale_changed().connect(sigc::mem_fun(*this, &Inspector::on_zoom_scale_changed)); window.add(*this); - window.show_all(); window.set_visible(false); active = true; // always track inspected thumbnails } @@ -112,6 +111,7 @@ void Inspector::showWindow(bool scaled) { this->scaled = scaled; window.fullscreen(); + window.show_all(); window.set_visible(true); pinned = false; } From c65a27ce19baeaf95f878a7f0f17c92361101a6b Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 2 Sep 2020 18:21:02 +0200 Subject: [PATCH 084/185] Wavelet levels - Fixed crash in rare cases in flat areas --- rtengine/ipwavelet.cc | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 8ab63c940..90edc9510 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1214,23 +1214,42 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const delete[] noisevarlum; //evaluate after denoise + bool exitifzero = true; Evaluate2(*Ldecomp, meand, meanNd, sigmad, sigmaNd, MaxPd, MaxNd, wavNestedLevels); + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < levwavL; level++) { + if(mean[level] < 0.1f || meand[level] < 0.1f || sigma[level] < 0.1f || sigmad[level] < 0.1f) { + printf("near zero - exit\n"); + exitifzero = false; + } + } + } + //for level 0 1 2 3 float thr = 0.f; float thrend = cp.thrden; //cp.levdenlow; - if(thrend < 0.02f) thr = 0.5f; - else if(thrend < 0.05f) thr = 0.2f; + if(thrend < 0.01f) thr = 0.95f; + else if(thrend < 0.02f) thr = 0.9f; + else if(thrend < 0.04f) thr = 0.8f; + else if(thrend < 0.06f) thr = 0.7f; + else if(thrend < 0.08f) thr = 0.6f; + else if(thrend < 0.1f) thr = 0.5f; + else if(thrend < 0.2f) thr = 0.2f; else thr = 0.f; FlatCurve wavlow({ FCT_MinMaxCPoints, 0, 1, 0.35, 0.35,thrend, 1.0, 0.35, 0.35, thrend + 0.01f, thr, 0.35, 0.35, 1, thr, 0.35, 0.35 }); - //for level 4 + //for level 4 float thrhigh = 0.f; float threndhigh = cp.lev4t; //cp.levdenlow; - if(threndhigh < 0.02f) thrhigh = 0.5f; - else if(threndhigh < 0.05f) thrhigh = 0.2f; + if(threndhigh < 0.01f) thrhigh = 0.95f; + else if(threndhigh < 0.02f) thrhigh = 0.9f; + else if(threndhigh < 0.04f) thrhigh = 0.8f; + else if(threndhigh < 0.06f) thrhigh = 0.7f; + else if(threndhigh < 0.08f) thrhigh = 0.6f; + else if(threndhigh < 0.1f) thrhigh = 0.5f; else thrhigh = 0.f; FlatCurve wavhigh({ @@ -1283,7 +1302,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } // } - if (execut) { + if (execut && exitifzero) { for (int dir = 1; dir < 4; dir++) { for (int level = 0; level < levref; level++) { int Wlvl_L = Ldecomp->level_W(level); From d98e070ea6ebefe9dafb5294c2c8740641f5e714 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 2 Sep 2020 19:15:13 +0200 Subject: [PATCH 085/185] wavelet levels LC denoise - change some default settings --- rtengine/procparams.cc | 2 +- rtgui/wavelet.cc | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index ab7924cd3..235a20e9b 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2441,7 +2441,7 @@ WaveletParams::WaveletParams() : Backmethod("grey"), Tilesmethod("full"), complexmethod("normal"), - denmethod("equ"), + denmethod("12low"), mixmethod("mix"), slimethod("sli"), quamethod("cons"), diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 78fa49144..47cdc9342 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -3248,7 +3248,7 @@ void Wavelet::convertParamToNormal() //denoise chromfi->setValue(def_params.chromfi); chromco->setValue(def_params.chromco); - denmethod->set_active(0); + denmethod->set_active(4); mixmethod->set_active(2); slimethod->set_active(0); levelsigm->setValue(def_params.levelsigm); @@ -3339,7 +3339,7 @@ void Wavelet::updateGUIToMode(int mode) sigm->hide(); levelsigm->show(); limden->show(); - // levden->show(); + levden->show(); sliHBox->show(); if (slimethod->get_active_row_number() == 0){ leveldenoise->show(); @@ -3353,7 +3353,7 @@ void Wavelet::updateGUIToMode(int mode) CurveEditorwavnoise->show(); } disableListener(); - denmethod->set_active(0); + denmethod->set_active(4); enableListener(); } From 33c5d6ab3e3d9eec130ecda1e967d80b1cf1f374 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 3 Sep 2020 22:04:11 +0200 Subject: [PATCH 086/185] SSE code for the most expensive loop. Also small cleanups --- rtengine/rcd_demosaic.cc | 97 +++++++++++++++++++++++++--------------- 1 file changed, 62 insertions(+), 35 deletions(-) diff --git a/rtengine/rcd_demosaic.cc b/rtengine/rcd_demosaic.cc index 6587d3930..624b309b1 100644 --- a/rtengine/rcd_demosaic.cc +++ b/rtengine/rcd_demosaic.cc @@ -1,7 +1,7 @@ /* * This file is part of RawTherapee. * - * Copyright (c) 2017-2018 Luis Sanz Rodriguez (luis.sanz.rodriguez(at)gmail(dot)com) and Ingo Weyrich (heckflosse67@gmx.de) + * Copyright (c) 2017-2020 Luis Sanz Rodriguez (luis.sanz.rodriguez(at)gmail(dot)com) and Ingo Weyrich (heckflosse67@gmx.de) * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -82,8 +82,8 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) const int numTw = W / (tileSizeN) + ((W % (tileSizeN)) ? 1 : 0); constexpr int w1 = tileSize, w2 = 2 * tileSize, w3 = 3 * tileSize, w4 = 4 * tileSize; //Tolerance to avoid dividing by zero - static constexpr float eps = 1e-5f; - static constexpr float epssq = 1e-10f; + constexpr float eps = 1e-5f; + constexpr float epssq = 1e-10f; #ifdef _OPENMP #pragma omp parallel @@ -99,16 +99,16 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) #ifdef _OPENMP #pragma omp for schedule(dynamic, chunkSize) collapse(2) nowait #endif - for(int tr = 0; tr < numTh; ++tr) { - for(int tc = 0; tc < numTw; ++tc) { + for (int tr = 0; tr < numTh; ++tr) { + for (int tc = 0; tc < numTw; ++tc) { const int rowStart = tr * tileSizeN; const int rowEnd = std::min(rowStart + tileSize, H); - if(rowStart + rcdBorder == rowEnd - rcdBorder) { + if (rowStart + rcdBorder == rowEnd - rcdBorder) { continue; } const int colStart = tc * tileSizeN; const int colEnd = std::min(colStart + tileSize, W); - if(colStart + rcdBorder == colEnd - rcdBorder) { + if (colStart + rcdBorder == colEnd - rcdBorder) { continue; } @@ -125,7 +125,7 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) cfa[indx] = rgb[c0][indx] = LIM01(rawData[row][col] / 65535.f); cfa[indx + 1] = rgb[c1][indx + 1] = LIM01(rawData[row][col + 1] / 65535.f); } - if(col < colEnd) { + if (col < colEnd) { cfa[indx] = rgb[c0][indx] = LIM01(rawData[row][col] / 65535.f); } } @@ -160,36 +160,68 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) * STEP 3: Populate the green channel */ // Step 3.1: Populate the green channel at blue and red CFA positions - for (int row = 4; row < tileRows - 4; row++) { - for (int col = 4 + (fc(cfarray, row, 0) & 1), indx = row * tileSize + col; col < tilecols - 4; col += 2, indx += 2) { + for (int row = 4; row < tileRows - 4; row++) { + int col = 4 + (fc(cfarray, row, 0) & 1); + int indx = row * tileSize + col; - // Refined vertical and horizontal local discrimination - float VH_Central_Value = VH_Dir[indx]; - float VH_Neighbourhood_Value = 0.25f * ((VH_Dir[indx - w1 - 1] + VH_Dir[indx - w1 + 1]) + (VH_Dir[indx + w1 - 1] + VH_Dir[indx + w1 + 1])); - - float VH_Disc = std::fabs(0.5f - VH_Central_Value) < std::fabs(0.5f - VH_Neighbourhood_Value) ? VH_Neighbourhood_Value : VH_Central_Value; - - // Cardinal gradients - float N_Grad = eps + std::fabs(cfa[indx - w1] - cfa[indx + w1]) + std::fabs(cfa[indx] - cfa[indx - w2]) + std::fabs(cfa[indx - w1] - cfa[indx - w3]) + std::fabs(cfa[indx - w2] - cfa[indx - w4]); - float S_Grad = eps + std::fabs(cfa[indx - w1] - cfa[indx + w1]) + std::fabs(cfa[indx] - cfa[indx + w2]) + std::fabs(cfa[indx + w1] - cfa[indx + w3]) + std::fabs(cfa[indx + w2] - cfa[indx + w4]); - float W_Grad = eps + std::fabs(cfa[indx - 1] - cfa[indx + 1]) + std::fabs(cfa[indx] - cfa[indx - 2]) + std::fabs(cfa[indx - 1] - cfa[indx - 3]) + std::fabs(cfa[indx - 2] - cfa[indx - 4]); - float E_Grad = eps + std::fabs(cfa[indx - 1] - cfa[indx + 1]) + std::fabs(cfa[indx] - cfa[indx + 2]) + std::fabs(cfa[indx + 1] - cfa[indx + 3]) + std::fabs(cfa[indx + 2] - cfa[indx + 4]); +#ifdef __SSE2__ + for (; col < tilecols - 7; col += 8, indx += 8) { + // Cardinal gradients + const vfloat cfai = LC2VFU(cfa[indx]); + const vfloat N_Grad = eps + (vabsf(LC2VFU(cfa[indx - w1]) - LC2VFU(cfa[indx + w1])) + vabsf(cfai - LC2VFU(cfa[indx - w2]))) + (vabsf(LC2VFU(cfa[indx - w1]) - LC2VFU(cfa[indx - w3])) + vabsf(LC2VFU(cfa[indx - w2]) - LC2VFU(cfa[indx - w4]))); + const vfloat S_Grad = eps + (vabsf(LC2VFU(cfa[indx - w1]) - LC2VFU(cfa[indx + w1])) + vabsf(cfai - LC2VFU(cfa[indx + w2]))) + (vabsf(LC2VFU(cfa[indx + w1]) - LC2VFU(cfa[indx + w3])) + vabsf(LC2VFU(cfa[indx + w2]) - LC2VFU(cfa[indx + w4]))); + const vfloat W_Grad = eps + (vabsf(LC2VFU(cfa[indx - 1]) - LC2VFU(cfa[indx + 1])) + vabsf(cfai - LC2VFU(cfa[indx - 2]))) + (vabsf(LC2VFU(cfa[indx - 1]) - LC2VFU(cfa[indx - 3])) + vabsf(LC2VFU(cfa[indx - 2]) - LC2VFU(cfa[indx - 4]))); + const vfloat E_Grad = eps + (vabsf(LC2VFU(cfa[indx - 1]) - LC2VFU(cfa[indx + 1])) + vabsf(cfai - LC2VFU(cfa[indx + 2]))) + (vabsf(LC2VFU(cfa[indx + 1]) - LC2VFU(cfa[indx + 3])) + vabsf(LC2VFU(cfa[indx + 2]) - LC2VFU(cfa[indx + 4]))); // Cardinal pixel estimations - float N_Est = cfa[indx - w1] * (1.f + (lpf[indx>>1] - lpf[(indx - w2)>>1]) / (eps + lpf[indx>>1] + lpf[(indx - w2)>>1])); - float S_Est = cfa[indx + w1] * (1.f + (lpf[indx>>1] - lpf[(indx + w2)>>1]) / (eps + lpf[indx>>1] + lpf[(indx + w2)>>1])); - float W_Est = cfa[indx - 1] * (1.f + (lpf[indx>>1] - lpf[(indx - 2)>>1]) / (eps + lpf[indx>>1] + lpf[(indx - 2)>>1])); - float E_Est = cfa[indx + 1] * (1.f + (lpf[indx>>1] - lpf[(indx + 2)>>1]) / (eps + lpf[indx>>1] + lpf[(indx + 2)>>1])); + const vfloat lpfi = LVFU(lpf[indx>>1]); + const vfloat N_Est = LC2VFU(cfa[indx - w1]) + (LC2VFU(cfa[indx - w1]) * (lpfi - LVFU(lpf[(indx - w2)>>1])) / (eps + lpfi + LVFU(lpf[(indx - w2)>>1]))); + const vfloat S_Est = LC2VFU(cfa[indx + w1]) + (LC2VFU(cfa[indx + w1]) * (lpfi - LVFU(lpf[(indx + w2)>>1])) / (eps + lpfi + LVFU(lpf[(indx + w2)>>1]))); + const vfloat W_Est = LC2VFU(cfa[indx - 1]) + (LC2VFU(cfa[indx - 1]) * (lpfi - LVFU(lpf[(indx - 2)>>1])) / (eps + lpfi + LVFU(lpf[(indx - 2)>>1]))); + const vfloat E_Est = LC2VFU(cfa[indx + 1]) + (LC2VFU(cfa[indx + 1]) * (lpfi - LVFU(lpf[(indx + 2)>>1])) / (eps + lpfi + LVFU(lpf[(indx + 2)>>1]))); // Vertical and horizontal estimations - float V_Est = (S_Grad * N_Est + N_Grad * S_Est) / (N_Grad + S_Grad); - float H_Est = (W_Grad * E_Est + E_Grad * W_Est) / (E_Grad + W_Grad); + const vfloat V_Est = (S_Grad * N_Est + N_Grad * S_Est) / (N_Grad + S_Grad); + const vfloat H_Est = (W_Grad * E_Est + E_Grad * W_Est) / (E_Grad + W_Grad); // G@B and G@R interpolation - rgb[1][indx] = VH_Disc * H_Est + (1.f - VH_Disc) * V_Est; + // Refined vertical and horizontal local discrimination + const vfloat VH_Central_Value = LC2VFU(VH_Dir[indx]); + const vfloat VH_Neighbourhood_Value = 0.25f * ((LC2VFU(VH_Dir[indx - w1 - 1]) + LC2VFU(VH_Dir[indx - w1 + 1])) + (LC2VFU(VH_Dir[indx + w1 - 1]) + LC2VFU(VH_Dir[indx + w1 + 1]))); + const vfloat VH_Disc = vabsf(0.5f - VH_Central_Value) < vabsf(0.5f - VH_Neighbourhood_Value) ? VH_Neighbourhood_Value : VH_Central_Value; + STC2VFU(rgb[1][indx], vintpf(VH_Disc, H_Est, V_Est)); + } +#endif + for (; col < tilecols - 4; col += 2, indx += 2) { + // Cardinal gradients + const float cfai = cfa[indx]; + const float N_Grad = eps + (std::fabs(cfa[indx - w1] - cfa[indx + w1]) + std::fabs(cfai - cfa[indx - w2])) + (std::fabs(cfa[indx - w1] - cfa[indx - w3]) + std::fabs(cfa[indx - w2] - cfa[indx - w4])); + const float S_Grad = eps + (std::fabs(cfa[indx - w1] - cfa[indx + w1]) + std::fabs(cfai - cfa[indx + w2])) + (std::fabs(cfa[indx + w1] - cfa[indx + w3]) + std::fabs(cfa[indx + w2] - cfa[indx + w4])); + const float W_Grad = eps + (std::fabs(cfa[indx - 1] - cfa[indx + 1]) + std::fabs(cfai - cfa[indx - 2])) + (std::fabs(cfa[indx - 1] - cfa[indx - 3]) + std::fabs(cfa[indx - 2] - cfa[indx - 4])); + const float E_Grad = eps + (std::fabs(cfa[indx - 1] - cfa[indx + 1]) + std::fabs(cfai - cfa[indx + 2])) + (std::fabs(cfa[indx + 1] - cfa[indx + 3]) + std::fabs(cfa[indx + 2] - cfa[indx + 4])); + + // Cardinal pixel estimations + const float lpfi = lpf[indx>>1]; + const float N_Est = cfa[indx - w1] * (1.f + (lpfi - lpf[(indx - w2)>>1]) / (eps + lpfi + lpf[(indx - w2)>>1])); + const float S_Est = cfa[indx + w1] * (1.f + (lpfi - lpf[(indx + w2)>>1]) / (eps + lpfi + lpf[(indx + w2)>>1])); + const float W_Est = cfa[indx - 1] * (1.f + (lpfi - lpf[(indx - 2)>>1]) / (eps + lpfi + lpf[(indx - 2)>>1])); + const float E_Est = cfa[indx + 1] * (1.f + (lpfi - lpf[(indx + 2)>>1]) / (eps + lpfi + lpf[(indx + 2)>>1])); + + // Vertical and horizontal estimations + const float V_Est = (S_Grad * N_Est + N_Grad * S_Est) / (N_Grad + S_Grad); + const float H_Est = (W_Grad * E_Est + E_Grad * W_Est) / (E_Grad + W_Grad); + + // G@B and G@R interpolation + // Refined vertical and horizontal local discrimination + const float VH_Central_Value = VH_Dir[indx]; + const float VH_Neighbourhood_Value = 0.25f * ((VH_Dir[indx - w1 - 1] + VH_Dir[indx - w1 + 1]) + (VH_Dir[indx + w1 - 1] + VH_Dir[indx + w1 + 1])); + + const float VH_Disc = std::fabs(0.5f - VH_Central_Value) < std::fabs(0.5f - VH_Neighbourhood_Value) ? VH_Neighbourhood_Value : VH_Central_Value; + rgb[1][indx] = VH_Disc * H_Est + (1.f - VH_Disc) * V_Est; } } + /** * STEP 4: Populate the red and blue channels */ @@ -203,7 +235,6 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) float Q_Stat = max(epssq, - 18.f * cfai * (cfa[indx + w1 - 1] + cfa[indx - w1 + 1] + 2.f * (cfa[indx + w2 - 2] + cfa[indx - w2 + 2]) - cfa[indx + w3 - 3] - cfa[indx - w3 + 3]) - 2.f * cfai * (cfa[indx + w4 - 4] + cfa[indx - w4 + 4] - 19.f * cfai) - cfa[indx + w1 - 1] * (70.f * cfa[indx - w1 + 1] - 12.f * cfa[indx + w2 - 2] + 24.f * cfa[indx - w2 + 2] - 38.f * cfa[indx + w3 - 3] + 16.f * cfa[indx - w3 + 3] + 12.f * cfa[indx + w4 - 4] - 6.f * cfa[indx - w4 + 4] + 46.f * cfa[indx + w1 - 1]) + cfa[indx - w1 + 1] * (24.f * cfa[indx + w2 - 2] - 12.f * cfa[indx - w2 + 2] + 16.f * cfa[indx + w3 - 3] - 38.f * cfa[indx - w3 + 3] - 6.f * cfa[indx + w4 - 4] + 12.f * cfa[indx - w4 + 4] + 46.f * cfa[indx - w1 + 1]) + cfa[indx + w2 - 2] * (14.f * cfa[indx - w2 + 2] - 12.f * cfa[indx - w3 + 3] - 2.f * (cfa[indx + w4 - 4] - cfa[indx - w4 + 4]) + 11.f * cfa[indx + w2 - 2]) - cfa[indx - w2 + 2] * (12.f * cfa[indx + w3 - 3] + 2.f * (cfa[indx + w4 - 4] - cfa[indx - w4 + 4]) + 11.f * cfa[indx - w2 + 2]) + cfa[indx + w3 - 3] * (2.f * cfa[indx - w3 + 3] - 6.f * cfa[indx + w4 - 4] + 10.f * cfa[indx + w3 - 3]) - cfa[indx - w3 + 3] * (6.f * cfa[indx - w4 + 4] + 10.f * cfa[indx - w3 + 3]) + cfa[indx + w4 - 4] * cfa[indx + w4 - 4] + cfa[indx - w4 + 4] * cfa[indx - w4 + 4]); PQ_Dir[indx] = P_Stat / (P_Stat + Q_Stat); - } } @@ -235,7 +266,6 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) // R@B and B@R interpolation rgb[c][indx] = rgb[1][indx] + (1.f - PQ_Disc) * P_Est + PQ_Disc * Q_Est; - } } @@ -279,7 +309,6 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) // R@G and B@G interpolation rgb[c][indx] = rgb1 + (1.f - VH_Disc) * V_Est + VH_Disc * H_Est; - } } } @@ -293,9 +322,9 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) } } - if(plistener) { + if (plistener) { progresscounter++; - if(progresscounter % 32 == 0) { + if (progresscounter % 32 == 0) { #ifdef _OPENMP #pragma omp critical (rcdprogress) #endif @@ -306,7 +335,6 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) } } } - } } @@ -321,7 +349,6 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) if (plistener) { plistener->setProgress(1); } - // ------------------------------------------------------------------------- } } /* namespace */ From 498a39a88f50676fe9f5a535240e1a021b8896fc Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 5 Sep 2020 13:50:50 +0200 Subject: [PATCH 087/185] Speedup and reduced memory usage for xtrans dual demosaic --- rtengine/dual_demosaic_RT.cc | 45 +++++++++++--------------- rtengine/rawimagesource.h | 1 + rtengine/xtrans_demosaic.cc | 61 ++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 26 deletions(-) diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc index ad95776ce..6e90e04d7 100644 --- a/rtengine/dual_demosaic_RT.cc +++ b/rtengine/dual_demosaic_RT.cc @@ -111,41 +111,34 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams buildBlendMask(L, blend, winw, winh, contrastf, autoContrast); contrast = contrastf * 100.f; - array2D& redTmp = L; // L is not needed anymore => reuse it - array2D greenTmp; - array2D blueTmp; - if (isBayer) { if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEBILINEAR) || raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) || raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBBILINEAR)) { bayer_bilinear_demosaic(blend, rawData, red, green, blue); - return; } else { - greenTmp(winw, winh); - blueTmp(winw, winh); + array2D& redTmp = L; // L is not needed anymore => reuse it + array2D greenTmp(winw, winh); + array2D blueTmp(winw, winh); vng4_demosaic(rawData, redTmp, greenTmp, blueTmp); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + for(int i = 0; i < winh; ++i) { + // the following is split into 3 loops intentionally to avoid cache conflicts on CPUs with only 4-way cache + for(int j = 0; j < winw; ++j) { + red[i][j] = intp(blend[i][j], red[i][j], redTmp[i][j]); + } + for(int j = 0; j < winw; ++j) { + green[i][j] = intp(blend[i][j], green[i][j], greenTmp[i][j]); + } + for(int j = 0; j < winw; ++j) { + blue[i][j] = intp(blend[i][j], blue[i][j], blueTmp[i][j]); + } + } } } else { - greenTmp(winw, winh); - blueTmp(winw, winh); - fast_xtrans_interpolate(rawData, redTmp, greenTmp, blueTmp); - } - -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - for(int i = 0; i < winh; ++i) { - // the following is split into 3 loops intentionally to avoid cache conflicts on CPUs with only 4-way cache - for(int j = 0; j < winw; ++j) { - red[i][j] = intp(blend[i][j], red[i][j], redTmp[i][j]); - } - for(int j = 0; j < winw; ++j) { - green[i][j] = intp(blend[i][j], green[i][j], greenTmp[i][j]); - } - for(int j = 0; j < winw; ++j) { - blue[i][j] = intp(blend[i][j], blue[i][j], blueTmp[i][j]); - } + fast_xtrans_interpolate_blend(blend, rawData, red, green, blue); } } } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 7b1b4197c..12db6be74 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -299,6 +299,7 @@ protected: void xtransborder_interpolate (int border, array2D &red, array2D &green, array2D &blue); void xtrans_interpolate (const int passes, const bool useCieLab, size_t chunkSize = 1, bool measure = false); void fast_xtrans_interpolate (const array2D &rawData, array2D &red, array2D &green, array2D &blue); + void fast_xtrans_interpolate_blend (const float* const * blend, const array2D &rawData, array2D &red, array2D &green, array2D &blue); void pixelshift(int winx, int winy, int winw, int winh, const procparams::RAWParams &rawParams, unsigned int frame, const std::string &make, const std::string &model, float rawWpCorrection); void bayer_bilinear_demosaic(const float *const * blend, const array2D &rawData, array2D &red, array2D &green, array2D &blue); void hflip (Imagefloat* im); diff --git a/rtengine/xtrans_demosaic.cc b/rtengine/xtrans_demosaic.cc index 5f5afa073..bcad4d7d3 100644 --- a/rtengine/xtrans_demosaic.cc +++ b/rtengine/xtrans_demosaic.cc @@ -1027,6 +1027,67 @@ void RawImageSource::fast_xtrans_interpolate (const array2D &rawData, arr plistener->setProgress (1.0); } } + +void RawImageSource::fast_xtrans_interpolate_blend (const float* const * blend, const array2D &rawData, array2D &red, array2D &green, array2D &blue) +{ + + if (plistener) { + plistener->setProgressStr(Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), M("TP_RAW_XTRANSFAST"))); + plistener->setProgress(0.0); + } + + int xtrans[6][6]; + ri->getXtransMatrix(xtrans); + + const float weight[3][3] = { + {0.25f, 0.5f, 0.25f}, + {0.5f, 0.f, 0.5f}, + {0.25f, 0.5f, 0.25f} + }; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + for (int row = 8; row < H - 8; ++row) { + for (int col = 8; col < W - 8; ++col) { + float sum[3] = {}; + + for (int v = -1; v <= 1; v++) { + for (int h = -1; h <= 1; h++) { + sum[fcol(row + v, col + h)] += rawData[row + v][(col + h)] * weight[v + 1][h + 1]; + } + } + + switch(fcol(row, col)) { + case 0: // red pixel + red[row][col] = intp(blend[row][col], red[row][col], rawData[row][col]); + green[row][col] = intp(blend[row][col], green[row][col], sum[1] * 0.5f); + blue[row][col] = intp(blend[row][col], blue[row][col], sum[2]); + break; + + case 1: // green pixel + green[row][col] = intp(blend[row][col], green[row][col], rawData[row][col]); + if (fcol(row, col - 1) == fcol(row, col + 1)) { // Solitary green pixel always has exactly two direct red and blue neighbors in 3x3 grid + red[row][col] = intp(blend[row][col], red[row][col], sum[0]); + blue[row][col] = intp(blend[row][col], blue[row][col], sum[2]); + } else { // Non solitary green pixel always has one direct and one diagonal red and blue neighbor in 3x3 grid + red[row][col] = intp(blend[row][col], red[row][col], sum[0] * 1.3333333f); + blue[row][col] = intp(blend[row][col], blue[row][col], sum[2] * 1.3333333f); + } + break; + + case 2: // blue pixel + red[row][col] = intp(blend[row][col], red[row][col], sum[0]); + green[row][col] = intp(blend[row][col], green[row][col], sum[1] * 0.5f); + blue[row][col] = intp(blend[row][col], blue[row][col], rawData[row][col]); + break; + } + } + } + + if (plistener) { + plistener->setProgress (1.0); + } +} #undef fcol #undef isgreen From bb0c625960e069756a3646dceb5d6eca5ebe34ba Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Mon, 7 Sep 2020 16:37:40 -0700 Subject: [PATCH 088/185] Use enum for scope types --- rtgui/histogrampanel.cc | 301 ++++++++++++++++++++++------------------ rtgui/histogrampanel.h | 10 +- rtgui/options.cc | 4 +- rtgui/options.h | 11 +- 4 files changed, 184 insertions(+), 142 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index a07133204..a9c8a95d6 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -79,15 +79,18 @@ HistogramPanel::HistogramPanel () : histogramRGBAreaVert->show(); switch (options.histogramScopeType) { - case 2: - case 3: + case ScopeType::NONE: + case ScopeType::VECTORSCOPE_HC: + case ScopeType::VECTORSCOPE_HS: histogramRGBArea = nullptr; break; - case 1: + case ScopeType::WAVEFORM: histogramRGBArea = histogramRGBAreaVert.get(); break; - default: + case ScopeType::HISTOGRAM: + case ScopeType::HISTOGRAM_RAW: histogramRGBArea = histogramRGBAreaHori.get(); + break; } // connecting the two childs @@ -202,14 +205,22 @@ HistogramPanel::HistogramPanel () : showMode->set_image(*mode1Image); else showMode->set_image(*mode2Image); - if (options.histogramScopeType == 0) { - scopeType->set_image(*histImage); - } else if (options.histogramScopeType == 1) { - scopeType->set_image(*waveImage); - } else if (options.histogramScopeType == 2) { - scopeType->set_image(*vectHsImage); - } else if (options.histogramScopeType == 3) { - scopeType->set_image(*vectHcImage); + switch(options.histogramScopeType) { + case ScopeType::HISTOGRAM: + scopeType->set_image(*histImage); + break; + case ScopeType::WAVEFORM: + scopeType->set_image(*waveImage); + break; + case ScopeType::VECTORSCOPE_HS: + scopeType->set_image(*vectHsImage); + break; + case ScopeType::VECTORSCOPE_HC: + scopeType->set_image(*vectHcImage); + break; + case ScopeType::HISTOGRAM_RAW: + case ScopeType::NONE: + break; } showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); @@ -303,7 +314,10 @@ void HistogramPanel::showRGBBar() gfxGrid->attach_next_to(*histogramRGBArea, *histogramArea, pos); setHistRGBInvalid(); - histogramRGBArea->setShow(options.histogramScopeType < 2); + histogramRGBArea->setShow( + options.histogramScopeType == ScopeType::HISTOGRAM + || options.histogramScopeType == ScopeType::WAVEFORM + ); } void HistogramPanel::resized (Gtk::Allocation& req) @@ -363,8 +377,11 @@ void HistogramPanel::raw_toggled () showChro->set_sensitive(false); } else { showRAW->set_image(*rawImage_g); - showValue->set_sensitive(options.histogramScopeType != 1); - showChro->set_sensitive(options.histogramScopeType != 1); + showValue->set_sensitive( + options.histogramScopeType == ScopeType::HISTOGRAM + || options.histogramScopeType == ScopeType::WAVEFORM + ); + showChro->set_sensitive(options.histogramScopeType == ScopeType::HISTOGRAM); } rgbv_toggled(); @@ -384,17 +401,28 @@ void HistogramPanel::mode_released () void HistogramPanel::type_pressed() { - constexpr int TYPE_COUNT = 4; // Histogram, waveform, and 2 vectorscopes. - options.histogramScopeType = (options.histogramScopeType + 1) % TYPE_COUNT; - if (options.histogramScopeType == 0) { - scopeType->set_image(*histImage); - } else if (options.histogramScopeType == 1) { - scopeType->set_image(*waveImage); - } else if (options.histogramScopeType == 2) { - scopeType->set_image(*vectHsImage); - } else if (options.histogramScopeType == 3) { - scopeType->set_image(*vectHcImage); + // Switch to next type. + switch (options.histogramScopeType) { + case ScopeType::NONE: // Default to histogram. + case ScopeType::HISTOGRAM_RAW: // Not supported as a true scope type. + case ScopeType::VECTORSCOPE_HC: + options.histogramScopeType = ScopeType::HISTOGRAM; + scopeType->set_image(*histImage); + break; + case ScopeType::HISTOGRAM: + options.histogramScopeType = ScopeType::WAVEFORM; + scopeType->set_image(*waveImage); + break; + case ScopeType::WAVEFORM: + options.histogramScopeType = ScopeType::VECTORSCOPE_HS; + scopeType->set_image(*vectHsImage); + break; + case ScopeType::VECTORSCOPE_HS: + options.histogramScopeType = ScopeType::VECTORSCOPE_HC; + scopeType->set_image(*vectHcImage); + break; } + type_changed(); updateHistAreaOptions(); if (histogramRGBArea) { @@ -409,54 +437,46 @@ void HistogramPanel::type_changed() gfxGrid->remove(*histogramRGBArea); } - if (options.histogramScopeType == 0) { - showRed->set_sensitive(); - showGreen->set_sensitive(); - showBlue->set_sensitive(); - showValue->set_sensitive(!showRAW->get_active()); - showChro->set_sensitive(!showRAW->get_active()); - showRAW->set_sensitive(); - showMode->set_sensitive(); - histogramRGBArea = histogramRGBAreaHori.get(); - if (panel_listener) { - updateHistAreaOptions(); - panel_listener->scopeTypeChanged(ScopeType::HISTOGRAM); - } - } else if (options.histogramScopeType == 1) { - showRed->set_sensitive(); - showGreen->set_sensitive(); - showBlue->set_sensitive(); - showValue->set_sensitive(); - showChro->set_sensitive(false); - showRAW->set_sensitive(false); - showMode->set_sensitive(false); - histogramRGBArea = histogramRGBAreaVert.get(); - if (panel_listener) { - updateHistAreaOptions(); - panel_listener->scopeTypeChanged(ScopeType::WAVEFORM); - } - } else { - showRed->set_sensitive(false); - showGreen->set_sensitive(false); - showBlue->set_sensitive(false); - showValue->set_sensitive(false); - showChro->set_sensitive(false); - showRAW->set_sensitive(false); - showMode->set_sensitive(false); - histogramRGBArea = nullptr; - if (panel_listener) { - updateHistAreaOptions(); - ScopeType type = ScopeType::NONE; - switch (options.histogramScopeType) { - case 2: - type = ScopeType::VECTORSCOPE_HS; - break; - case 3: - type = ScopeType::VECTORSCOPE_HC; - break; - } - panel_listener->scopeTypeChanged(type); - } + switch (options.histogramScopeType) { + case ScopeType::HISTOGRAM: + case ScopeType::HISTOGRAM_RAW: + showRed->set_sensitive(); + showGreen->set_sensitive(); + showBlue->set_sensitive(); + showValue->set_sensitive(!showRAW->get_active()); + showChro->set_sensitive(!showRAW->get_active()); + showRAW->set_sensitive(); + showMode->set_sensitive(); + histogramRGBArea = histogramRGBAreaHori.get(); + break; + case ScopeType::WAVEFORM: + showRed->set_sensitive(); + showGreen->set_sensitive(); + showBlue->set_sensitive(); + showValue->set_sensitive(); + showChro->set_sensitive(false); + showRAW->set_sensitive(false); + showMode->set_sensitive(false); + histogramRGBArea = histogramRGBAreaVert.get(); + break; + case ScopeType::VECTORSCOPE_HC: + case ScopeType::VECTORSCOPE_HS: + showRed->set_sensitive(false); + showGreen->set_sensitive(false); + showBlue->set_sensitive(false); + showValue->set_sensitive(false); + showChro->set_sensitive(false); + showRAW->set_sensitive(false); + showMode->set_sensitive(false); + histogramRGBArea = nullptr; + break; + case ScopeType::NONE: + break; + } + + if (panel_listener) { + updateHistAreaOptions(); + panel_listener->scopeTypeChanged(options.histogramScopeType); } if (showBAR->get_active()) { @@ -537,19 +557,7 @@ void HistogramPanel::setPanelListener(HistogramPanelListener* listener) panel_listener = listener; if (listener) { - ScopeType type; - if (options.histogramScopeType == 0) { - type = ScopeType::HISTOGRAM; - } else if (options.histogramScopeType == 1) { - type = ScopeType::WAVEFORM; - } else if (options.histogramScopeType == 2) { - type = ScopeType::VECTORSCOPE_HS; - } else if (options.histogramScopeType == 3) { - type = ScopeType::VECTORSCOPE_HC; - } else { - type = ScopeType::NONE; - } - listener->scopeTypeChanged(type); + listener->scopeTypeChanged(options.histogramScopeType); } } @@ -577,7 +585,7 @@ void HistogramPanel::updateHistRGBAreaOptions() showValue->get_active(), showChro->get_active(), showRAW->get_active(), - showBAR->get_active() && options.histogramScopeType < 2 + showBAR->get_active() ); } @@ -671,7 +679,8 @@ void HistogramRGBArea::setShow(bool show) void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustring &profile, const Glib::ustring &profileW) { - if (!get_realized () || !showMode || (rawMode && options.histogramScopeType != 1)) { + //if (!get_realized () || !showMode || (rawMode && options.histogramScopeType == ScopeType::HISTOGRAM) || options.histogramScopeType == ScopeType::HISTOGRAM_RAW) { + if (!get_realized () || !showMode || !((!rawMode && options.histogramScopeType == ScopeType::HISTOGRAM) || options.histogramScopeType == ScopeType::WAVEFORM)) { return; } @@ -717,7 +726,11 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustrin drawBar(cc, b, 255.0, winw, winh, s); } - if((needLuma || needChroma) && options.histogramScopeType <= 1) { + if( + (needLuma || needChroma) + && (options.histogramScopeType == ScopeType::HISTOGRAM + || options.histogramScopeType == ScopeType::WAVEFORM) + ) { float Lab_L, Lab_a, Lab_b; rtengine::Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, Lab_L, Lab_a, Lab_b, options.rtSettings.HistogramWorking); @@ -727,7 +740,7 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustrin drawBar(cc, Lab_L, 100.0, winw, winh, s); } - if (needChroma && options.histogramScopeType == 0) { + if (needChroma && options.histogramScopeType == ScopeType::HISTOGRAM) { // Chroma double chromaval = sqrt(Lab_a * Lab_a + Lab_b * Lab_b) / 1.8; cc->set_source_rgb(0.9, 0.9, 0.0); @@ -874,7 +887,7 @@ void HistogramRGBAreaHori::get_preferred_width_for_height_vfunc (int height, int void HistogramRGBAreaVert::drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) { double pos; - if (options.histogramDrawMode < 2 || options.histogramScopeType == 1) { + if (options.histogramDrawMode < 2 || options.histogramScopeType == ScopeType::WAVEFORM) { pos = padding + value * (winh - padding * 2.0 - 1) / max_value + 0.5 * scale; } else { pos = padding + HistogramScaling::log (max_value, value) * (winh - padding * 2.0) / max_value + 0.5 * scale; @@ -988,7 +1001,7 @@ void HistogramArea::get_preferred_width_for_height_vfunc (int height, int &minim get_preferred_width_vfunc (minimum_width, natural_width); } -void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, int type, bool pointer) +void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, ScopeType type, bool pointer) { options.histogramRed = needRed = r; @@ -1029,30 +1042,38 @@ void HistogramArea::update( ) { if (histRed) { - if (scopeType == 0) { - rhist = histRed; - ghist = histGreen; - bhist = histBlue; - lhist = histLuma; - chist = histChroma; - rhistRaw = histRedRaw; - ghistRaw = histGreenRaw; - bhistRaw = histBlueRaw; - } else if (scopeType == 1) { - waveform_scale = waveformScale; - rwave = waveformRed; - gwave = waveformGreen; - bwave = waveformBlue; - lwave = waveformLuma; - wave_buffer_dirty = true; - } else if (scopeType == 2) { - vectorscope_scale = vectorscopeScale; - vect_hs = vectorscopeHS; - vect_hs_buffer_dirty = true; - } else if (scopeType == 3) { - vectorscope_scale = vectorscopeScale; - vect_hc = vectorscopeHC; - vect_hc_buffer_dirty = true; + switch (scopeType) { + case ScopeType::HISTOGRAM: + rhist = histRed; + ghist = histGreen; + bhist = histBlue; + lhist = histLuma; + chist = histChroma; + rhistRaw = histRedRaw; + ghistRaw = histGreenRaw; + bhistRaw = histBlueRaw; + break; + case ScopeType::WAVEFORM: + waveform_scale = waveformScale; + rwave = waveformRed; + gwave = waveformGreen; + bwave = waveformBlue; + lwave = waveformLuma; + wave_buffer_dirty = true; + break; + case ScopeType::VECTORSCOPE_HS: + vectorscope_scale = vectorscopeScale; + vect_hs = vectorscopeHS; + vect_hs_buffer_dirty = true; + break; + case ScopeType::VECTORSCOPE_HC: + vectorscope_scale = vectorscopeScale; + vect_hc = vectorscopeHC; + vect_hc_buffer_dirty = true; + break; + case ScopeType::HISTOGRAM_RAW: + case ScopeType::NONE: + break; } valid = true; } else { @@ -1125,7 +1146,7 @@ void HistogramArea::updateBackBuffer () int nrOfVGridPartitions = 8; // always show 8 stops (lines at 1,3,7,15,31,63,127) // draw vertical gridlines - if (options.histogramScopeType == 0) { + if (options.histogramScopeType == ScopeType::HISTOGRAM || options.histogramScopeType == ScopeType::HISTOGRAM_RAW) { for (int i = 0; i <= nrOfVGridPartitions; i++) { double xpos = padding + 0.5; if (options.histogramDrawMode < 2) { @@ -1140,14 +1161,14 @@ void HistogramArea::updateBackBuffer () } // draw horizontal gridlines - if (options.histogramScopeType == 1) { + if (options.histogramScopeType == ScopeType::WAVEFORM) { for (int i = 0; i <= nrOfVGridPartitions; i++) { const double ypos = h - padding - (pow(2.0,i) - 1) * (h - 2 * padding - 1) / 255.0; cr->move_to(0, ypos); cr->line_to(w, ypos); cr->stroke(); } - } else if (options.histogramScopeType >= 2) { + } else if (options.histogramScopeType == ScopeType::VECTORSCOPE_HC || options.histogramScopeType == ScopeType::VECTORSCOPE_HS) { // Vectorscope has no gridlines. } else if (options.histogramDrawMode == 0) { for (int i = 1; i < nrOfHGridPartitions; i++) { @@ -1165,7 +1186,7 @@ void HistogramArea::updateBackBuffer () cr->unset_dash(); - if (valid && scopeType == 0) { + if (valid && (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW)) { // For RAW mode use the other hists LUTu& rh = rawMode ? rhistRaw : rhist; LUTu& gh = rawMode ? ghistRaw : ghist; @@ -1272,9 +1293,9 @@ void HistogramArea::updateBackBuffer () drawMarks(cr, bhchanged, realhistheight, w, ui, oi); } - } else if (scopeType == 1 && rwave.getWidth() > 0) { + } else if (scopeType == ScopeType::WAVEFORM && rwave.getWidth() > 0) { drawWaveform(cr, w, h); - } else if (scopeType >= 2) { + } else if (scopeType == ScopeType::VECTORSCOPE_HC || scopeType == ScopeType::VECTORSCOPE_HS) { drawVectorscope(cr, w, h); } @@ -1289,7 +1310,7 @@ void HistogramArea::updateBackBuffer () bool HistogramArea::updatePointer(int r, int g, int b, const Glib::ustring &profile, const Glib::ustring &profileW) { - if (!needPointer || scopeType < 2) { + if (!needPointer || !(scopeType == ScopeType::VECTORSCOPE_HC || scopeType == ScopeType::VECTORSCOPE_HS)) { return false; } if (pointer_red == r && pointer_green == g && pointer_blue == b) { @@ -1360,9 +1381,13 @@ void HistogramArea::drawMarks(Cairo::RefPtr &cr, void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, int h) { - const auto& vect = (scopeType == 3) ? vect_hc : vect_hs; - auto& vect_buffer = (scopeType == 3) ? vect_hc_buffer : vect_hs_buffer; - auto& vect_buffer_dirty = (scopeType == 3) ? vect_hc_buffer_dirty : vect_hs_buffer_dirty; + if (scopeType != ScopeType::VECTORSCOPE_HC && scopeType != ScopeType::VECTORSCOPE_HS) { + return; + } + + const auto& vect = (scopeType == ScopeType::VECTORSCOPE_HC) ? vect_hc : vect_hs; + auto& vect_buffer = (scopeType == ScopeType::VECTORSCOPE_HC) ? vect_hc_buffer : vect_hs_buffer; + auto& vect_buffer_dirty = (scopeType == ScopeType::VECTORSCOPE_HC) ? vect_hc_buffer_dirty : vect_hs_buffer_dirty; const int vect_width = vect.getWidth(); const int vect_height = vect.getHeight(); @@ -1413,7 +1438,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in cr->set_antialias(Cairo::ANTIALIAS_SUBPIXEL); ch_ds[0] = 4; - if (scopeType == 2) { // Hue-Saturation. + if (scopeType == ScopeType::VECTORSCOPE_HS) { // Hue-Saturation. // RYGCBM lines. cr->set_line_width (2.0 * s); constexpr double color_labels[6][3] = { @@ -1452,7 +1477,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in cr->line_to(line_spacing + line_length, 0); cr->stroke(); cr->unset_dash(); - } else if (scopeType == 3) { // Hue-Chroma. + } else if (scopeType == ScopeType::VECTORSCOPE_HC) { // Hue-Chroma. // a and b axes. Cairo::RefPtr gradient; cr->set_line_width (2.0 * s); @@ -1508,7 +1533,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in if (needPointer && pointer_red >= 0 && pointer_green >= 0 && pointer_blue >= 0) { float cx, cy; - if (scopeType == 2) { + if (scopeType == ScopeType::VECTORSCOPE_HS) { float H, S, L; Color::rgb2hslfloat(pointer_red * 257.f, pointer_green * 257.f, pointer_blue * 257.f, H, S, L); cx = (w + scope_size * S * std::cos(H * 2 * RT_PI_F)) / 2; @@ -1630,7 +1655,10 @@ bool HistogramArea::on_button_press_event (GdkEventButton* event) isPressed = true; movingPosition = event->x; - if (event->type == GDK_2BUTTON_PRESS && event->button == 1 && scopeType == 0) { + if ( + event->type == GDK_2BUTTON_PRESS && event->button == 1 + && (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW) + ) { drawMode = (drawMode + 1) % 3; options.histogramDrawMode = (options.histogramDrawMode + 1) % 3; @@ -1654,7 +1682,10 @@ bool HistogramArea::on_button_release_event (GdkEventButton* event) bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) { - if (drawMode == 0 && scopeType == 0) { + if ( + drawMode == 0 + && (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW) + ) { return false; } @@ -1662,7 +1693,7 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) return true; } - if (scopeType == 0) { // Adjust log scale. + if (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW) { // Adjust log scale. double mod = 1 + (event->x - movingPosition) / get_width(); factor /= mod; @@ -1675,7 +1706,11 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) setDirty(true); queue_draw (); - } else if (scopeType >= 1 && scopeType <= 3) { // Adjust brightness. + } else if ( + scopeType == ScopeType::WAVEFORM + || scopeType == ScopeType::VECTORSCOPE_HC + || scopeType == ScopeType::VECTORSCOPE_HS + ) { // Adjust brightness. constexpr float MIN_BRIGHT = 0.1; constexpr float MAX_BRIGHT = 3; constexpr float RANGE = MAX_BRIGHT / MIN_BRIGHT; diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 975a6d8ab..7167168ff 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -28,6 +28,7 @@ #include "delayed.h" #include "guiutils.h" +#include "options.h" #include "pointermotionlistener.h" #include "../rtengine/array2D.h" @@ -36,10 +37,7 @@ class HistogramArea; -enum ScopeType -{ - HISTOGRAM, HISTOGRAM_RAW, VECTORSCOPE_HC, VECTORSCOPE_HS, WAVEFORM, NONE -}; +using ScopeType = Options::ScopeType; struct HistogramAreaIdleHelper { HistogramArea* harea; @@ -178,7 +176,7 @@ protected: bool valid; int drawMode; DrawModeListener *myDrawModeListener; - int scopeType; + ScopeType scopeType; int oldwidth, oldheight; /// Intensity of waveform and vectorscope trace. float trace_brightness; @@ -221,7 +219,7 @@ public: const array2D& waveformBlue, const array2D& waveformLuma ); - void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, int type, bool pointer); + void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, ScopeType type, bool pointer); bool updatePending(); void on_realize() override; bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; diff --git a/rtgui/options.cc b/rtgui/options.cc index 5e1685b20..3e9c49e1e 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -450,7 +450,7 @@ void Options::setDefaults() histogramBar = true; histogramHeight = 200; histogramDrawMode = 0; - histogramScopeType = 0; + histogramScopeType = ScopeType::HISTOGRAM; curvebboxpos = 1; complexity = 2; prevdemo = PD_Sidecar; @@ -1434,7 +1434,7 @@ void Options::readFromFile(Glib::ustring fname) } if (keyFile.has_key("GUI", "HistogramScopeType")) { - histogramScopeType = keyFile.get_integer("GUI", "HistogramScopeType"); + histogramScopeType = static_cast(keyFile.get_integer("GUI", "HistogramScopeType")); } if (keyFile.has_key("GUI", "NavigatorRGBUnit")) { diff --git a/rtgui/options.h b/rtgui/options.h index 20678f2f9..19d394a05 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -306,13 +306,22 @@ public: double sndLngEditProcDoneSecs; // Minimum processing time seconds till the sound is played bool sndEnable; + enum ScopeType + { + HISTOGRAM = 0, + HISTOGRAM_RAW = 1, + VECTORSCOPE_HC = 2, + VECTORSCOPE_HS = 3, + WAVEFORM = 4, + NONE = -1 + }; int histogramPosition; // 0=disabled, 1=left pane, 2=right pane bool histogramRed, histogramGreen, histogramBlue; bool histogramLuma, histogramChroma, histogramRAW; bool histogramBar; int histogramHeight; int histogramDrawMode; - int histogramScopeType; + ScopeType histogramScopeType; bool FileBrowserToolbarSingleRow; bool hideTPVScrollbar; int whiteBalanceSpotSize; From 38d214ed627194b1f25963b555e307ce1799b4a2 Mon Sep 17 00:00:00 2001 From: Kevin Murray Date: Thu, 10 Sep 2020 19:12:20 +1000 Subject: [PATCH 089/185] CR3 bbp fix & camconst entries for Canon EOS R5/R6 and Nikon Z7 Fix, matrices and DCP files courtesy of ART (Alberto Griggio ) --- rtdata/dcpprofiles/CANON EOS R5.dcp | Bin 0 -> 65358 bytes rtdata/dcpprofiles/CANON EOS R6.dcp | Bin 0 -> 65358 bytes rtengine/camconst.json | 21 +++++++++++++++++++++ rtengine/canon_cr3_decoder.cc | 3 ++- 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 rtdata/dcpprofiles/CANON EOS R5.dcp create mode 100644 rtdata/dcpprofiles/CANON EOS R6.dcp diff --git a/rtdata/dcpprofiles/CANON EOS R5.dcp b/rtdata/dcpprofiles/CANON EOS R5.dcp new file mode 100644 index 0000000000000000000000000000000000000000..88f94620d81db7082a8a0ca694b40482addd2612 GIT binary patch literal 65358 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 Hudn|P*ZbOi literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/CANON EOS R6.dcp b/rtdata/dcpprofiles/CANON EOS R6.dcp new file mode 100644 index 0000000000000000000000000000000000000000..7aaa04ab2ae26c27255035db864c1ab65ca15283 GIT binary patch literal 65358 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 Tul#ZU?{gIYyQ-@G{`!9ap7K-9 literal 0 HcmV?d00001 diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 578ff1811..eca17a238 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1149,6 +1149,22 @@ Camera constants: "raw_crop": [ 144, 46, 6744, 4500 ] }, + { // Quality C + "make_model": "Canon EOS R5", + "dcraw_matrix" : [9766, -2953, -1254, -4276, 12116, 2433, -437, 1336, 5131], + "raw_crop" : [ 124, 92, 8220, 5486 ], + "masked_areas" : [ 94, 20, 5578, 122 ], + "ranges" : { "white" : 16382 } + }, + + { // Quality C + "make_model": "Canon EOS R6", + "dcraw_matrix" : [8293, -1611, -1132, -4759, 12710, 2275, -1013, 2415, 5508], + "raw_crop": [ 72, 38, 5496, 3670 ], + "masked_areas" : [ 40, 10, 5534, 70 ], + "ranges" : { "white" : 16382 } + }, + // Canon Powershot { // Quality C, CHDK DNGs, raw frame correction "make_model": "Canon PowerShot A3100 IS", @@ -1729,6 +1745,11 @@ Camera constants: "pdaf_offset" : 32 }, + { // Quality C, only dcraw looted from ART commit ad88c7d97 + "make_model" : "NIKON Z 5", + "dcraw_matrix" : [8695, -2558, -648, -5015, 12711, 2575, -1279, 2215, 7514] + }, + { // Quality A, white levels and PDAF lines measured by Yann Leprince #5851 "make_model" : "Nikon Z 50", "dcraw_matrix" : [11640, -4829, -1079, -5107, 13006, 2325, -972, 1711, 7380], // Adobe DNG Converter 12.2.1 ColorMatrix2 (D65) diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 51beb66f3..e3097ad2e 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -3132,7 +3132,8 @@ void DCraw::crxLoadRaw() hdr.tileHeight >>= 1; } -// /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1; + // /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1; + tiff_bps = hdr.nBits; std::uint8_t* const hdrBuf = static_cast(malloc(hdr.mdatHdrSize)); From 1ed9444e3e5281ace1b7162ad9e894b2c7e5ef14 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 10 Sep 2020 16:48:07 +0200 Subject: [PATCH 090/185] Removed always true condition --- rtengine/capturesharpening.cc | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index e70b7a152..de9b0a4ee 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -127,12 +127,8 @@ void compute3x3kernel(float sigma, float kernel[3][3]) { float sum = 0.f; for (int i = -1; i <= 1; ++i) { for (int j = -1; j <= 1; ++j) { - if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 0.84)) { - kernel[i + 1][j + 1] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); - sum += kernel[i + 1][j + 1]; - } else { - kernel[i + 1][j + 1] = 0.f; - } + kernel[i + 1][j + 1] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); + sum += kernel[i + 1][j + 1]; } } From c03efe4878e132a05b27abb3f92c0b79c9e06db0 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sat, 12 Sep 2020 17:52:24 -0700 Subject: [PATCH 091/185] Add dedicated buttons for scope switching Previously, changing to a different scope was done by clicking the scope type button and cycling through all scopes. This commit decreases the number of clicks needed to switch between two scopes by adding a radio selector. The radio buttons can be shown or hidden by pressing the scope type button. This commit also makes the raw histogram one of the scope types. --- .../histogram-type-histogram-off-small.svg | 122 ++++++++ ...istogram-type-vectorscope-hc-off-small.svg | 131 ++++++++ ...istogram-type-vectorscope-hs-off-small.svg | 135 ++++++++ .../svg/histogram-type-waveform-off-small.svg | 122 ++++++++ rtdata/languages/default | 7 +- rtengine/improccoordinator.cc | 14 + rtengine/improccoordinator.h | 3 + rtengine/rtengine.h | 4 + rtgui/editorpanel.cc | 10 +- rtgui/editorpanel.h | 1 + rtgui/histogrampanel.cc | 293 +++++++++++++----- rtgui/histogrampanel.h | 33 +- rtgui/options.cc | 13 +- rtgui/options.h | 3 +- 14 files changed, 791 insertions(+), 100 deletions(-) create mode 100644 rtdata/images/svg/histogram-type-histogram-off-small.svg create mode 100644 rtdata/images/svg/histogram-type-vectorscope-hc-off-small.svg create mode 100644 rtdata/images/svg/histogram-type-vectorscope-hs-off-small.svg create mode 100644 rtdata/images/svg/histogram-type-waveform-off-small.svg diff --git a/rtdata/images/svg/histogram-type-histogram-off-small.svg b/rtdata/images/svg/histogram-type-histogram-off-small.svg new file mode 100644 index 000000000..456ead7e2 --- /dev/null +++ b/rtdata/images/svg/histogram-type-histogram-off-small.svg @@ -0,0 +1,122 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-type-vectorscope-hc-off-small.svg b/rtdata/images/svg/histogram-type-vectorscope-hc-off-small.svg new file mode 100644 index 000000000..3a105a671 --- /dev/null +++ b/rtdata/images/svg/histogram-type-vectorscope-hc-off-small.svg @@ -0,0 +1,131 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-type-vectorscope-hs-off-small.svg b/rtdata/images/svg/histogram-type-vectorscope-hs-off-small.svg new file mode 100644 index 000000000..253d2d9c3 --- /dev/null +++ b/rtdata/images/svg/histogram-type-vectorscope-hs-off-small.svg @@ -0,0 +1,135 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-type-waveform-off-small.svg b/rtdata/images/svg/histogram-type-waveform-off-small.svg new file mode 100644 index 000000000..787d6fe09 --- /dev/null +++ b/rtdata/images/svg/histogram-type-waveform-off-small.svg @@ -0,0 +1,122 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/languages/default b/rtdata/languages/default index 1bcc1ab51..0ec86d367 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -249,7 +249,12 @@ HISTOGRAM_TOOLTIP_L;Show/Hide CIELab luminance histogram. HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. HISTOGRAM_TOOLTIP_R;Show/Hide red histogram. HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. -HISTOGRAM_TOOLTIP_TYPE;Toggle between histogram, waveform, Hue-Saturation vectorscope, and Hue-Chroma vectorscope. +HISTOGRAM_TOOLTIP_TYPE;Toggle visibility of the scope selection buttons. +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope HISTORY_CHANGED;Changed HISTORY_CUSTOMCURVE;Custom curve HISTORY_FROMCLIPBOARD;From clipboard diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index ea4c8a92b..f8d75b050 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -358,6 +358,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } imgsrc->getRAWHistogram(histRedRaw, histGreenRaw, histBlueRaw); + hist_raw_dirty = !hListener->updateHistogramRaw(); highDetailPreprocessComputed = highDetailNeeded; @@ -2471,6 +2472,19 @@ void ImProcCoordinator::requestUpdateHistogram() } } +void ImProcCoordinator::requestUpdateHistogramRaw() +{ + if (!hListener) { + return; + } + // Don't need to actually update histogram because it is always + // up-to-date. + if (hist_raw_dirty) { + hist_raw_dirty = false; + notifyHistogramChanged(); + } +} + void ImProcCoordinator::requestUpdateVectorscopeHC() { if (!hListener) { diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 791679678..d39fa3f9e 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -127,6 +127,8 @@ protected: LUTu histLuma, histToneCurve, histToneCurveBW, histLCurve, histCCurve; LUTu histLLCurve, histLCAM, histCCAM, histClad, bcabhist, histChroma, histLRETI; bool hist_lrgb_dirty; + /// Used to simulate a lazy update of the raw histogram. + bool hist_raw_dirty; int vectorscopeScale; bool vectorscope_hc_dirty, vectorscope_hs_dirty; array2D vectorscope_hc, vectorscope_hs; @@ -569,6 +571,7 @@ public: } denoiseInfoStore; void requestUpdateHistogram() override; + void requestUpdateHistogramRaw() override; void requestUpdateVectorscopeHC() override; void requestUpdateVectorscopeHS() override; void requestUpdateWaveform() override; diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 43848e70c..6f6baccd4 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -346,6 +346,8 @@ public: virtual void setObservable(HistogramObservable* observable) = 0; /** Returns if the listener wants the histogram to be updated. */ virtual bool updateHistogram(void) const = 0; + /** Returns if the listener wants the raw histogram to be updated. */ + virtual bool updateHistogramRaw(void) const = 0; /** Returns if the listener wants the H-C vectorscope to be updated. */ virtual bool updateVectorscopeHC(void) const = 0; /** Returns if the listener wants the H-S vectorscope to be updated. */ @@ -359,6 +361,8 @@ class HistogramObservable public: /** Tells the observable to update the histogram data. */ virtual void requestUpdateHistogram() = 0; + /** Tells the observable to update the raw histogram data. */ + virtual void requestUpdateHistogramRaw() = 0; /** Tells the observable to update the H-C vectorscope data. */ virtual void requestUpdateVectorscopeHC() = 0; /** Tells the observable to update the H-S vectorscope data. */ diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index c53877736..205cf2bf2 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -2276,6 +2276,12 @@ bool EditorPanel::updateHistogram(void) const || histogram_scope_type == ScopeType::NONE; } +bool EditorPanel::updateHistogramRaw(void) const +{ + return histogram_scope_type == ScopeType::HISTOGRAM_RAW + || histogram_scope_type == ScopeType::NONE; +} + bool EditorPanel::updateVectorscopeHC(void) const { return @@ -2310,6 +2316,9 @@ void EditorPanel::scopeTypeChanged(ScopeType new_type) case ScopeType::HISTOGRAM: histogram_observable->requestUpdateHistogram(); break; + case ScopeType::HISTOGRAM_RAW: + histogram_observable->requestUpdateHistogramRaw(); + break; case ScopeType::VECTORSCOPE_HC: histogram_observable->requestUpdateVectorscopeHC(); break; @@ -2319,7 +2328,6 @@ void EditorPanel::scopeTypeChanged(ScopeType new_type) case ScopeType::WAVEFORM: histogram_observable->requestUpdateWaveform(); break; - case ScopeType::HISTOGRAM_RAW: case ScopeType::NONE: break; } diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index f6bc0b606..abfcb0a8f 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -145,6 +145,7 @@ public: ) override; void setObservable(rtengine::HistogramObservable* observable) override; bool updateHistogram(void) const override; + bool updateHistogramRaw(void) const override; bool updateVectorscopeHC(void) const override; bool updateVectorscopeHS(void) const override; bool updateWaveform(void) const override; diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index a9c8a95d6..449566007 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -80,6 +80,7 @@ HistogramPanel::HistogramPanel () : switch (options.histogramScopeType) { case ScopeType::NONE: + case ScopeType::HISTOGRAM_RAW: case ScopeType::VECTORSCOPE_HC: case ScopeType::VECTORSCOPE_HS: histogramRGBArea = nullptr; @@ -88,7 +89,6 @@ HistogramPanel::HistogramPanel () : histogramRGBArea = histogramRGBAreaVert.get(); break; case ScopeType::HISTOGRAM: - case ScopeType::HISTOGRAM_RAW: histogramRGBArea = histogramRGBAreaHori.get(); break; } @@ -113,7 +113,6 @@ HistogramPanel::HistogramPanel () : blueImage = new RTImage ("histogram-blue-on-small.png"); valueImage = new RTImage ("histogram-silver-on-small.png"); chroImage = new RTImage ("histogram-gold-on-small.png"); - rawImage = new RTImage ("histogram-bayer-on-small.png"); barImage = new RTImage ("histogram-bar-on-small.png"); redImage_g = new RTImage ("histogram-red-off-small.png"); @@ -121,7 +120,6 @@ HistogramPanel::HistogramPanel () : blueImage_g = new RTImage ("histogram-blue-off-small.png"); valueImage_g = new RTImage ("histogram-silver-off-small.png"); chroImage_g = new RTImage ("histogram-gold-off-small.png"); - rawImage_g = new RTImage ("histogram-bayer-off-small.png"); barImage_g = new RTImage ("histogram-bar-off-small.png"); mode0Image = new RTImage ("histogram-mode-linear-small.png"); @@ -129,20 +127,43 @@ HistogramPanel::HistogramPanel () : mode2Image = new RTImage ("histogram-mode-logxy-small.png"); histImage.reset(new RTImage("histogram-type-histogram-small.png")); + histRawImage.reset(new RTImage("histogram-bayer-on-small.png")); waveImage.reset(new RTImage("histogram-type-waveform-small.png")); vectHcImage.reset(new RTImage("histogram-type-vectorscope-hc-small.png")); vectHsImage.reset(new RTImage("histogram-type-vectorscope-hs-small.png")); + histImageOn.reset(new RTImage("histogram-type-histogram-small.png")); + histRawImageOn.reset(new RTImage("histogram-bayer-on-small.png")); + waveImageOn.reset(new RTImage("histogram-type-waveform-small.png")); + vectHcImageOn.reset(new RTImage("histogram-type-vectorscope-hc-small.png")); + vectHsImageOn.reset(new RTImage("histogram-type-vectorscope-hs-small.png")); + histImageOff.reset(new RTImage("histogram-type-histogram-off-small.png")); + histRawImageOff.reset(new RTImage("histogram-bayer-off-small.png")); + waveImageOff.reset(new RTImage("histogram-type-waveform-off-small.png")); + vectHcImageOff.reset(new RTImage("histogram-type-vectorscope-hc-off-small.png")); + vectHsImageOff.reset(new RTImage("histogram-type-vectorscope-hs-off-small.png")); + showRed = Gtk::manage (new Gtk::ToggleButton ()); showGreen = Gtk::manage (new Gtk::ToggleButton ()); showBlue = Gtk::manage (new Gtk::ToggleButton ()); showValue = Gtk::manage (new Gtk::ToggleButton ()); showChro = Gtk::manage (new Gtk::ToggleButton ()); - showRAW = Gtk::manage (new Gtk::ToggleButton ()); showMode = Gtk::manage (new Gtk::Button ()); - scopeType = Gtk::manage (new Gtk::Button ()); + scopeType = Gtk::manage (new Gtk::ToggleButton ()); showBAR = Gtk::manage (new Gtk::ToggleButton ()); + Gtk::RadioButtonGroup scopeTypeGroup; + scopeHistBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); + scopeHistRawBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); + scopeWaveBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); + scopeVectHcBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); + scopeVectHsBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); + scopeHistBtn->set_mode(false); + scopeHistRawBtn->set_mode(false); + scopeWaveBtn->set_mode(false); + scopeVectHcBtn->set_mode(false); + scopeVectHsBtn->set_mode(false); + showRed->set_name("histButton"); showRed->set_can_focus(false); showGreen->set_name("histButton"); @@ -153,44 +174,65 @@ HistogramPanel::HistogramPanel () : showValue->set_can_focus(false); showChro->set_name("histButton"); showChro->set_can_focus(false); - showRAW->set_name("histButton"); - showRAW->set_can_focus(false); showMode->set_name("histButton"); showMode->set_can_focus(false); scopeType->set_name("histButton"); scopeType->set_can_focus(false); showBAR->set_name("histButton"); showBAR->set_can_focus(false); + scopeHistBtn->set_name("histButton"); + scopeHistBtn->set_can_focus(false); + scopeHistRawBtn->set_name("histButton"); + scopeHistRawBtn->set_can_focus(false); + scopeWaveBtn->set_name("histButton"); + scopeWaveBtn->set_can_focus(false); + scopeVectHcBtn->set_name("histButton"); + scopeVectHcBtn->set_can_focus(false); + scopeVectHsBtn->set_name("histButton"); + scopeVectHsBtn->set_can_focus(false); showRed->set_relief (Gtk::RELIEF_NONE); showGreen->set_relief (Gtk::RELIEF_NONE); showBlue->set_relief (Gtk::RELIEF_NONE); showValue->set_relief (Gtk::RELIEF_NONE); showChro->set_relief (Gtk::RELIEF_NONE); - showRAW->set_relief (Gtk::RELIEF_NONE); showMode->set_relief (Gtk::RELIEF_NONE); scopeType->set_relief (Gtk::RELIEF_NONE); showBAR->set_relief (Gtk::RELIEF_NONE); + scopeHistBtn->set_relief (Gtk::RELIEF_NONE); + scopeHistRawBtn->set_relief (Gtk::RELIEF_NONE); + scopeWaveBtn->set_relief (Gtk::RELIEF_NONE); + scopeVectHcBtn->set_relief (Gtk::RELIEF_NONE); + scopeVectHsBtn->set_relief (Gtk::RELIEF_NONE); showRed->set_tooltip_text (M("HISTOGRAM_TOOLTIP_R")); showGreen->set_tooltip_text (M("HISTOGRAM_TOOLTIP_G")); showBlue->set_tooltip_text (M("HISTOGRAM_TOOLTIP_B")); showValue->set_tooltip_text (M("HISTOGRAM_TOOLTIP_L")); showChro->set_tooltip_text (M("HISTOGRAM_TOOLTIP_CHRO")); - showRAW->set_tooltip_text (M("HISTOGRAM_TOOLTIP_RAW")); showMode->set_tooltip_text (M("HISTOGRAM_TOOLTIP_MODE")); scopeType->set_tooltip_text (M("HISTOGRAM_TOOLTIP_TYPE")); showBAR->set_tooltip_text (M("HISTOGRAM_TOOLTIP_BAR")); + scopeHistBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM")); + scopeHistRawBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW")); + scopeWaveBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_WAVEFORM")); + scopeVectHcBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC")); + scopeVectHsBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS")); buttonGrid = Gtk::manage (new Gtk::Grid ()); - buttonGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); + buttonGrid->set_orientation(Gtk::ORIENTATION_HORIZONTAL); + persistentButtons = Gtk::manage(new Gtk::Box()); + persistentButtons->set_orientation(Gtk::ORIENTATION_VERTICAL); + scopeButtons = Gtk::manage(new Gtk::Box()); + scopeButtons->set_orientation(Gtk::ORIENTATION_VERTICAL); + showRed->set_active (options.histogramRed); showGreen->set_active (options.histogramGreen); showBlue->set_active (options.histogramBlue); showValue->set_active (options.histogramLuma); showChro->set_active (options.histogramChroma); - showRAW->set_active (options.histogramRAW); // no showMode->set_active(), as it's not a ToggleButton + scopeType->set_active(options.histogramShowScopeButtons); showBAR->set_active (options.histogramBar); showRed->set_image (showRed->get_active() ? *redImage : *redImage_g); @@ -198,33 +240,43 @@ HistogramPanel::HistogramPanel () : showBlue->set_image (showBlue->get_active() ? *blueImage : *blueImage_g); showValue->set_image (showValue->get_active() ? *valueImage : *valueImage_g); showChro->set_image (showChro->get_active() ? *chroImage : *chroImage_g); - showRAW->set_image (showRAW->get_active() ? *rawImage : *rawImage_g); if (options.histogramDrawMode == 0) showMode->set_image(*mode0Image); else if (options.histogramDrawMode == 1) showMode->set_image(*mode1Image); else showMode->set_image(*mode2Image); + scopeHistBtn->set_image(*histImageOff); + scopeHistRawBtn->set_image(*histRawImageOff); + scopeWaveBtn->set_image(*waveImageOff); + scopeVectHcBtn->set_image(*vectHcImageOff); + scopeVectHsBtn->set_image(*vectHsImageOff); switch(options.histogramScopeType) { case ScopeType::HISTOGRAM: - scopeType->set_image(*histImage); - break; - case ScopeType::WAVEFORM: - scopeType->set_image(*waveImage); - break; - case ScopeType::VECTORSCOPE_HS: - scopeType->set_image(*vectHsImage); - break; - case ScopeType::VECTORSCOPE_HC: - scopeType->set_image(*vectHcImage); + scopeHistBtn->set_active(); + scopeHistBtn->set_image(*histImageOn); break; case ScopeType::HISTOGRAM_RAW: + scopeHistRawBtn->set_active(); + scopeHistRawBtn->set_image(*histRawImageOn); + break; + case ScopeType::WAVEFORM: + scopeWaveBtn->set_active(); + scopeWaveBtn->set_image(*waveImageOn); + break; + case ScopeType::VECTORSCOPE_HS: + scopeVectHsBtn->set_active(); + scopeVectHsBtn->set_image(*vectHsImageOn); + break; + case ScopeType::VECTORSCOPE_HC: + scopeVectHcBtn->set_active(); + scopeVectHcBtn->set_image(*vectHcImageOn); + break; case ScopeType::NONE: break; } showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); - raw_toggled(); // Make sure the luma/chroma toggles are enabled or disabled type_changed(); setExpandAlignProperties(showRed , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); @@ -232,7 +284,6 @@ HistogramPanel::HistogramPanel () : setExpandAlignProperties(showBlue , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showValue, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showChro , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - setExpandAlignProperties(showRAW , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showMode , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(scopeType, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showBAR , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); @@ -242,31 +293,48 @@ HistogramPanel::HistogramPanel () : showBlue->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::blue_toggled), showBlue ); showValue->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::value_toggled), showValue ); showChro->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::chro_toggled), showChro ); - showRAW->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::raw_toggled), showRAW ); showMode->signal_released().connect( sigc::mem_fun(*this, &HistogramPanel::mode_released), showMode ); - scopeType->signal_pressed().connect( sigc::mem_fun(*this, &HistogramPanel::type_pressed), scopeType ); + scopeType->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::type_pressed) ); showBAR->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::bar_toggled), showBAR ); + scopeHistBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeHistBtn)); + scopeHistRawBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeHistRawBtn)); + scopeWaveBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeWaveBtn)); + scopeVectHcBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeVectHcBtn)); + scopeVectHsBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeVectHsBtn)); - buttonGrid->add (*showRed); - buttonGrid->add (*showGreen); - buttonGrid->add (*showBlue); - buttonGrid->add (*showValue); - buttonGrid->add (*showChro); - buttonGrid->add (*showRAW); - buttonGrid->add (*showMode); - buttonGrid->add (*scopeType); - buttonGrid->add (*showBAR); + persistentButtons->add(*showRed); + persistentButtons->add(*showGreen); + persistentButtons->add(*showBlue); + persistentButtons->add(*showValue); + persistentButtons->add(*showChro); + persistentButtons->add(*showMode); + persistentButtons->add(*scopeType); + persistentButtons->add(*showBAR); + + scopeButtons->add(*scopeHistBtn); + scopeButtons->add(*scopeHistRawBtn); + scopeButtons->add(*scopeWaveBtn); + scopeButtons->add(*scopeVectHsBtn); + scopeButtons->add(*scopeVectHcBtn); // Put the button vbox next to the window's border to be less disturbing if (options.histogramPosition == 1) { + buttonGrid->add(*persistentButtons); + buttonGrid->add(*scopeButtons); + add (*buttonGrid); add (*gfxGrid); } else { + buttonGrid->add(*scopeButtons); + buttonGrid->add(*persistentButtons); + add (*gfxGrid); add (*buttonGrid); } show_all (); + scopeButtons->set_no_show_all(); + scopeButtons->set_visible(options.histogramShowScopeButtons); rconn = signal_size_allocate().connect( sigc::mem_fun(*this, &HistogramPanel::resized) ); } @@ -280,7 +348,6 @@ HistogramPanel::~HistogramPanel () delete blueImage; delete valueImage; delete chroImage; - delete rawImage; delete mode0Image; delete mode1Image; delete mode2Image; @@ -291,7 +358,6 @@ HistogramPanel::~HistogramPanel () delete blueImage_g; delete valueImage_g; delete chroImage_g; - delete rawImage_g; delete barImage_g; } @@ -369,24 +435,6 @@ void HistogramPanel::chro_toggled () rgbv_toggled(); } -void HistogramPanel::raw_toggled () -{ - if (showRAW->get_active()) { - showRAW->set_image(*rawImage); - showValue->set_sensitive(false); - showChro->set_sensitive(false); - } else { - showRAW->set_image(*rawImage_g); - showValue->set_sensitive( - options.histogramScopeType == ScopeType::HISTOGRAM - || options.histogramScopeType == ScopeType::WAVEFORM - ); - showChro->set_sensitive(options.histogramScopeType == ScopeType::HISTOGRAM); - } - - rgbv_toggled(); -} - void HistogramPanel::mode_released () { options.histogramDrawMode = (options.histogramDrawMode + 1) % 3; @@ -401,28 +449,72 @@ void HistogramPanel::mode_released () void HistogramPanel::type_pressed() { - // Switch to next type. + options.histogramShowScopeButtons = scopeType->get_active(); + scopeButtons->set_visible(scopeType->get_active()); +} + +void HistogramPanel::type_selected(Gtk::RadioButton* button) +{ + ScopeType new_type = ScopeType::NONE; + + if (button == scopeHistBtn) { + new_type = ScopeType::HISTOGRAM; + } else if (button == scopeHistRawBtn) { + new_type = ScopeType::HISTOGRAM_RAW; + } else if (button == scopeWaveBtn) { + new_type = ScopeType::WAVEFORM; + } else if (button == scopeVectHcBtn) { + new_type = ScopeType::VECTORSCOPE_HC; + } else if (button == scopeVectHsBtn) { + new_type = ScopeType::VECTORSCOPE_HS; + } + + if (new_type == options.histogramScopeType) { + return; + } + switch (options.histogramScopeType) { - case ScopeType::NONE: // Default to histogram. - case ScopeType::HISTOGRAM_RAW: // Not supported as a true scope type. - case ScopeType::VECTORSCOPE_HC: - options.histogramScopeType = ScopeType::HISTOGRAM; - scopeType->set_image(*histImage); - break; case ScopeType::HISTOGRAM: - options.histogramScopeType = ScopeType::WAVEFORM; - scopeType->set_image(*waveImage); + scopeHistBtn->set_image(*histImageOff); + break; + case ScopeType::HISTOGRAM_RAW: + scopeHistRawBtn->set_image(*histRawImageOff); break; case ScopeType::WAVEFORM: - options.histogramScopeType = ScopeType::VECTORSCOPE_HS; - scopeType->set_image(*vectHsImage); + scopeWaveBtn->set_image(*waveImageOff); + break; + case ScopeType::VECTORSCOPE_HC: + scopeVectHcBtn->set_image(*vectHcImageOff); break; case ScopeType::VECTORSCOPE_HS: - options.histogramScopeType = ScopeType::VECTORSCOPE_HC; - scopeType->set_image(*vectHcImage); + scopeVectHsBtn->set_image(*vectHsImageOff); + break; + case ScopeType::NONE: break; } + switch (new_type) { + case ScopeType::HISTOGRAM: + scopeHistBtn->set_image(*histImageOn); + break; + case ScopeType::HISTOGRAM_RAW: + scopeHistRawBtn->set_image(*histRawImageOn); + break; + case ScopeType::WAVEFORM: + scopeWaveBtn->set_image(*waveImageOn); + break; + case ScopeType::VECTORSCOPE_HC: + scopeVectHcBtn->set_image(*vectHcImageOn); + break; + case ScopeType::VECTORSCOPE_HS: + scopeVectHsBtn->set_image(*vectHsImageOn); + break; + case ScopeType::NONE: + break; + } + + options.histogramScopeType = new_type; + type_changed(); updateHistAreaOptions(); if (histogramRGBArea) { @@ -439,15 +531,24 @@ void HistogramPanel::type_changed() switch (options.histogramScopeType) { case ScopeType::HISTOGRAM: + showRed->set_sensitive(); + showGreen->set_sensitive(); + showBlue->set_sensitive(); + showValue->set_sensitive(); + showChro->set_sensitive(); + showMode->set_sensitive(); + scopeType->set_image(*histImage); + histogramRGBArea = histogramRGBAreaHori.get(); + break; case ScopeType::HISTOGRAM_RAW: showRed->set_sensitive(); showGreen->set_sensitive(); showBlue->set_sensitive(); - showValue->set_sensitive(!showRAW->get_active()); - showChro->set_sensitive(!showRAW->get_active()); - showRAW->set_sensitive(); + showValue->set_sensitive(false); + showChro->set_sensitive(false); showMode->set_sensitive(); - histogramRGBArea = histogramRGBAreaHori.get(); + scopeType->set_image(*histRawImage); + histogramRGBArea = nullptr; break; case ScopeType::WAVEFORM: showRed->set_sensitive(); @@ -455,8 +556,8 @@ void HistogramPanel::type_changed() showBlue->set_sensitive(); showValue->set_sensitive(); showChro->set_sensitive(false); - showRAW->set_sensitive(false); showMode->set_sensitive(false); + scopeType->set_image(*waveImage); histogramRGBArea = histogramRGBAreaVert.get(); break; case ScopeType::VECTORSCOPE_HC: @@ -466,8 +567,12 @@ void HistogramPanel::type_changed() showBlue->set_sensitive(false); showValue->set_sensitive(false); showChro->set_sensitive(false); - showRAW->set_sensitive(false); showMode->set_sensitive(false); + if (options.histogramScopeType == ScopeType::VECTORSCOPE_HC) { + scopeType->set_image(*vectHcImage); + } else { + scopeType->set_image(*vectHsImage); + } histogramRGBArea = nullptr; break; case ScopeType::NONE: @@ -533,11 +638,31 @@ void HistogramPanel::reorder (Gtk::PositionType align) removeIfThere(this, gfxGrid, false); add (*gfxGrid); gfxGrid->unreference(); + + if (histogramRGBArea == histogramRGBAreaVert.get()) { + gfxGrid->remove(*histogramRGBArea); + gfxGrid->add(*histogramRGBArea); + } + + scopeButtons->reference(); + removeIfThere(buttonGrid, scopeButtons, false); + buttonGrid->add(*scopeButtons); + scopeButtons->unreference(); } else { buttonGrid->reference(); removeIfThere(this, buttonGrid, false); add (*buttonGrid); buttonGrid->unreference(); + + if (histogramRGBArea == histogramRGBAreaVert.get()) { + gfxGrid->remove(*histogramArea); + gfxGrid->add(*histogramArea); + } + + persistentButtons->reference(); + removeIfThere(buttonGrid, persistentButtons, false); + buttonGrid->add(*persistentButtons); + persistentButtons->unreference(); } } @@ -569,7 +694,6 @@ void HistogramPanel::updateHistAreaOptions() showBlue->get_active(), showValue->get_active(), showChro->get_active(), - showRAW->get_active(), options.histogramDrawMode, options.histogramScopeType, showBAR->get_active() @@ -584,7 +708,6 @@ void HistogramPanel::updateHistRGBAreaOptions() showBlue->get_active(), showValue->get_active(), showChro->get_active(), - showRAW->get_active(), showBAR->get_active() ); } @@ -606,7 +729,7 @@ double HistogramScaling::log(double vsize, double val) HistogramRGBArea::HistogramRGBArea () : val(0), r(0), g(0), b(0), valid(false), needRed(options.histogramRed), needGreen(options.histogramGreen), needBlue(options.histogramBlue), - needLuma(options.histogramLuma), needChroma(options.histogramChroma), rawMode(options.histogramRAW), + needLuma(options.histogramLuma), needChroma(options.histogramChroma), showMode(options.histogramBar), barDisplayed(options.histogramBar), parent(nullptr) { get_style_context()->add_class("drawingarea"); @@ -679,8 +802,7 @@ void HistogramRGBArea::setShow(bool show) void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustring &profile, const Glib::ustring &profileW) { - //if (!get_realized () || !showMode || (rawMode && options.histogramScopeType == ScopeType::HISTOGRAM) || options.histogramScopeType == ScopeType::HISTOGRAM_RAW) { - if (!get_realized () || !showMode || !((!rawMode && options.histogramScopeType == ScopeType::HISTOGRAM) || options.histogramScopeType == ScopeType::WAVEFORM)) { + if (!get_realized () || !showMode || !(options.histogramScopeType == ScopeType::HISTOGRAM || options.histogramScopeType == ScopeType::WAVEFORM)) { return; } @@ -791,7 +913,7 @@ void HistogramRGBArea::update (int valh, int rh, int gh, int bh) ); } -void HistogramRGBArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, bool bar) +void HistogramRGBArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool bar) { options.histogramRed = needRed = r; @@ -799,7 +921,6 @@ void HistogramRGBArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bo options.histogramBlue = needBlue = b; options.histogramLuma = needLuma = l; options.histogramChroma = needChroma = c; - options.histogramRAW = rawMode = raw; options.histogramBar = showMode = bar; } @@ -938,7 +1059,7 @@ HistogramArea::HistogramArea (DrawModeListener *fml) : oldwidth(-1), oldheight(-1), trace_brightness(1.0), needRed(options.histogramRed), needGreen(options.histogramGreen), needBlue(options.histogramBlue), - needLuma(options.histogramLuma), needChroma(options.histogramChroma), rawMode(options.histogramRAW), + needLuma(options.histogramLuma), needChroma(options.histogramChroma), isPressed(false), movingPosition(0.0), pointer_red(-1), pointer_green(-1), pointer_blue(-1) { @@ -1001,7 +1122,7 @@ void HistogramArea::get_preferred_width_for_height_vfunc (int height, int &minim get_preferred_width_vfunc (minimum_width, natural_width); } -void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, ScopeType type, bool pointer) +void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, int mode, ScopeType type, bool pointer) { options.histogramRed = needRed = r; @@ -1009,7 +1130,6 @@ void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool options.histogramBlue = needBlue = b; options.histogramLuma = needLuma = l; options.histogramChroma = needChroma = c; - options.histogramRAW = rawMode = raw; options.histogramDrawMode = drawMode = mode; options.histogramScopeType = scopeType = type; options.histogramBar = needPointer = pointer; @@ -1049,6 +1169,8 @@ void HistogramArea::update( bhist = histBlue; lhist = histLuma; chist = histChroma; + break; + case ScopeType::HISTOGRAM_RAW: rhistRaw = histRedRaw; ghistRaw = histGreenRaw; bhistRaw = histBlueRaw; @@ -1071,7 +1193,6 @@ void HistogramArea::update( vect_hc = vectorscopeHC; vect_hc_buffer_dirty = true; break; - case ScopeType::HISTOGRAM_RAW: case ScopeType::NONE: break; } @@ -1187,6 +1308,8 @@ void HistogramArea::updateBackBuffer () cr->unset_dash(); if (valid && (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW)) { + bool rawMode = scopeType == ScopeType::HISTOGRAM_RAW; + // For RAW mode use the other hists LUTu& rh = rawMode ? rhistRaw : rhist; LUTu& gh = rawMode ? ghistRaw : ghist; diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 7167168ff..980a56f4f 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -80,7 +80,6 @@ protected: bool needBlue; bool needLuma; bool needChroma; - bool rawMode; bool showMode; bool barDisplayed; @@ -111,7 +110,7 @@ public: }; void update (int val, int rh, int gh, int bh); - void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, bool show); + void updateOptions (bool r, bool g, bool b, bool l, bool c, bool show); void on_realize() override; bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; @@ -182,7 +181,6 @@ protected: float trace_brightness; bool needRed, needGreen, needBlue, needLuma, needChroma; - bool rawMode; bool isPressed; double movingPosition; bool needPointer; @@ -219,7 +217,7 @@ public: const array2D& waveformBlue, const array2D& waveformLuma ); - void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode, ScopeType type, bool pointer); + void updateOptions (bool r, bool g, bool b, bool l, bool c, int mode, ScopeType type, bool pointer); bool updatePending(); void on_realize() override; bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; @@ -255,6 +253,8 @@ protected: Gtk::Grid* gfxGrid; Gtk::Grid* buttonGrid; + Gtk::Box* persistentButtons; + Gtk::Box* scopeButtons; HistogramArea* histogramArea; HistogramRGBArea* histogramRGBArea; std::unique_ptr histogramRGBAreaHori; @@ -263,17 +263,21 @@ protected: Gtk::ToggleButton* showGreen; Gtk::ToggleButton* showBlue; Gtk::ToggleButton* showValue; - Gtk::ToggleButton* showRAW; Gtk::ToggleButton* showBAR; Gtk::ToggleButton* showChro; Gtk::Button* showMode; - Gtk::Button* scopeType; + Gtk::ToggleButton* scopeType; + + Gtk::RadioButton* scopeHistBtn; + Gtk::RadioButton* scopeHistRawBtn; + Gtk::RadioButton* scopeWaveBtn; + Gtk::RadioButton* scopeVectHcBtn; + Gtk::RadioButton* scopeVectHsBtn; Gtk::Image *redImage; Gtk::Image *greenImage; Gtk::Image *blueImage; Gtk::Image *valueImage; - Gtk::Image *rawImage; Gtk::Image *barImage; Gtk::Image *chroImage; @@ -281,15 +285,26 @@ protected: Gtk::Image *greenImage_g; Gtk::Image *blueImage_g; Gtk::Image *valueImage_g; - Gtk::Image *rawImage_g; Gtk::Image *barImage_g; Gtk::Image *chroImage_g; std::unique_ptr histImage; + std::unique_ptr histRawImage; std::unique_ptr waveImage; std::unique_ptr vectHcImage; std::unique_ptr vectHsImage; + std::unique_ptr histImageOn; + std::unique_ptr histRawImageOn; + std::unique_ptr waveImageOn; + std::unique_ptr vectHcImageOn; + std::unique_ptr vectHsImageOn; + std::unique_ptr histImageOff; + std::unique_ptr histRawImageOff; + std::unique_ptr waveImageOff; + std::unique_ptr vectHcImageOff; + std::unique_ptr vectHsImageOff; + Gtk::Image *mode0Image; Gtk::Image *mode1Image; Gtk::Image *mode2Image; @@ -339,11 +354,11 @@ public: void green_toggled (); void blue_toggled (); void value_toggled (); - void raw_toggled (); void chro_toggled (); void bar_toggled (); void mode_released (); void type_pressed (); + void type_selected(Gtk::RadioButton* button); void type_changed (); void rgbv_toggled (); void resized (Gtk::Allocation& req); diff --git a/rtgui/options.cc b/rtgui/options.cc index 3e9c49e1e..06726452e 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -446,11 +446,11 @@ void Options::setDefaults() histogramBlue = true; histogramLuma = false; histogramChroma = false; - histogramRAW = false; histogramBar = true; histogramHeight = 200; histogramDrawMode = 0; histogramScopeType = ScopeType::HISTOGRAM; + histogramShowScopeButtons = false; curvebboxpos = 1; complexity = 2; prevdemo = PD_Sidecar; @@ -1418,7 +1418,10 @@ void Options::readFromFile(Glib::ustring fname) } if (keyFile.has_key("GUI", "HistogramRAW")) { - histogramRAW = keyFile.get_boolean("GUI", "HistogramRAW"); + // Legacy option, replaced by HistogramScopeType. + if (keyFile.get_boolean("GUI", "HistogramRAW")) { + histogramScopeType = ScopeType::HISTOGRAM_RAW; + } } if (keyFile.has_key("GUI", "HistogramBar")) { @@ -1437,6 +1440,10 @@ void Options::readFromFile(Glib::ustring fname) histogramScopeType = static_cast(keyFile.get_integer("GUI", "HistogramScopeType")); } + if (keyFile.has_key("GUI", "HistogramShowScopeButtons")) { + histogramShowScopeButtons = keyFile.get_boolean("GUI", "HistogramShowScopeButtons"); + } + if (keyFile.has_key("GUI", "NavigatorRGBUnit")) { navRGBUnit = (NavigatorUnit)keyFile.get_integer("GUI", "NavigatorRGBUnit"); } @@ -2256,11 +2263,11 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_boolean("GUI", "HistogramBlue", histogramBlue); keyFile.set_boolean("GUI", "HistogramLuma", histogramLuma); keyFile.set_boolean("GUI", "HistogramChroma", histogramChroma); - keyFile.set_boolean("GUI", "HistogramRAW", histogramRAW); keyFile.set_boolean("GUI", "HistogramBar", histogramBar); keyFile.set_integer("GUI", "HistogramHeight", histogramHeight); keyFile.set_integer("GUI", "HistogramDrawMode", histogramDrawMode); keyFile.set_integer("GUI", "HistogramScopeType", histogramScopeType); + keyFile.set_boolean("GUI", "HistogramShowScopeButtons", histogramShowScopeButtons); keyFile.set_integer("GUI", "NavigatorRGBUnit", (int)navRGBUnit); keyFile.set_integer("GUI", "NavigatorHSVUnit", (int)navHSVUnit); keyFile.set_boolean("GUI", "ShowFilmStripToolBar", showFilmStripToolBar); diff --git a/rtgui/options.h b/rtgui/options.h index 19d394a05..4bc4ccc42 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -317,11 +317,12 @@ public: }; int histogramPosition; // 0=disabled, 1=left pane, 2=right pane bool histogramRed, histogramGreen, histogramBlue; - bool histogramLuma, histogramChroma, histogramRAW; + bool histogramLuma, histogramChroma; bool histogramBar; int histogramHeight; int histogramDrawMode; ScopeType histogramScopeType; + bool histogramShowScopeButtons; bool FileBrowserToolbarSingleRow; bool hideTPVScrollbar; int whiteBalanceSpotSize; From af29bf84e6809640e1fa3740c5004ea0f244e05f Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sun, 13 Sep 2020 12:33:25 -0700 Subject: [PATCH 092/185] Fix cppcheck warnings for uninitialized variables --- rtengine/improccoordinator.cc | 6 ++++++ rtgui/histogrampanel.cc | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index f8d75b050..339cdfa07 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -130,10 +130,16 @@ ImProcCoordinator::ImProcCoordinator() : histLRETI(256), + hist_lrgb_dirty(false), + hist_raw_dirty(false), + vectorscopeScale(0), + vectorscope_hc_dirty(false), + vectorscope_hs_dirty(false), vectorscope_hc(VECTORSCOPE_SIZE, VECTORSCOPE_SIZE), vectorscope_hs(VECTORSCOPE_SIZE, VECTORSCOPE_SIZE), waveformScale(0), + waveform_dirty(false), waveformRed(0, 0), waveformGreen(0, 0), waveformBlue(0, 0), diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 449566007..23d443aea 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1061,7 +1061,9 @@ HistogramArea::HistogramArea (DrawModeListener *fml) : needRed(options.histogramRed), needGreen(options.histogramGreen), needBlue(options.histogramBlue), needLuma(options.histogramLuma), needChroma(options.histogramChroma), isPressed(false), movingPosition(0.0), - pointer_red(-1), pointer_green(-1), pointer_blue(-1) + needPointer(false), + pointer_red(-1), pointer_green(-1), pointer_blue(-1), + pointer_a(0), pointer_b(0) { rhist(256); From 97c7794a5a3d4c6f862ebf78bcd2c719b4f2de38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 14 Sep 2020 09:44:29 +0200 Subject: [PATCH 093/185] Turn `Options::ScopeType` into a scoped enum :) Also remove global `using ...` from header file. --- rtgui/editorpanel.cc | 2 ++ rtgui/editorpanel.h | 4 ++-- rtgui/histogrampanel.cc | 1 + rtgui/histogrampanel.h | 8 +++----- rtgui/options.cc | 2 +- rtgui/options.h | 20 ++++++++++---------- 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 205cf2bf2..ab7aa873d 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -48,6 +48,8 @@ using namespace rtengine::procparams; +using ScopeType = Options::ScopeType; + namespace { diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index abfcb0a8f..a277ffd3a 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -151,7 +151,7 @@ public: bool updateWaveform(void) const override; // HistogramPanelListener - void scopeTypeChanged(ScopeType new_type) override; + void scopeTypeChanged(Options::ScopeType new_type) override; // event handlers void info_toggled (); @@ -286,5 +286,5 @@ private: IdleRegister idle_register; rtengine::HistogramObservable* histogram_observable; - ScopeType histogram_scope_type; + Options::ScopeType histogram_scope_type; }; diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 23d443aea..41605d638 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -29,6 +29,7 @@ using namespace rtengine; +using ScopeType = Options::ScopeType; // // diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 980a56f4f..4417e2373 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -37,8 +37,6 @@ class HistogramArea; -using ScopeType = Options::ScopeType; - struct HistogramAreaIdleHelper { HistogramArea* harea; bool destroyed; @@ -175,7 +173,7 @@ protected: bool valid; int drawMode; DrawModeListener *myDrawModeListener; - ScopeType scopeType; + Options::ScopeType scopeType; int oldwidth, oldheight; /// Intensity of waveform and vectorscope trace. float trace_brightness; @@ -217,7 +215,7 @@ public: const array2D& waveformBlue, const array2D& waveformLuma ); - void updateOptions (bool r, bool g, bool b, bool l, bool c, int mode, ScopeType type, bool pointer); + void updateOptions (bool r, bool g, bool b, bool l, bool c, int mode, Options::ScopeType type, bool pointer); bool updatePending(); void on_realize() override; bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; @@ -241,7 +239,7 @@ private: class HistogramPanelListener { public: - virtual void scopeTypeChanged(ScopeType new_type) = 0; + virtual void scopeTypeChanged(Options::ScopeType new_type) = 0; }; class HistogramPanel final : public Gtk::Grid, public PointerMotionListener, public DrawModeListener, public rtengine::NonCopyable diff --git a/rtgui/options.cc b/rtgui/options.cc index 06726452e..d71fcc57d 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2266,7 +2266,7 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_boolean("GUI", "HistogramBar", histogramBar); keyFile.set_integer("GUI", "HistogramHeight", histogramHeight); keyFile.set_integer("GUI", "HistogramDrawMode", histogramDrawMode); - keyFile.set_integer("GUI", "HistogramScopeType", histogramScopeType); + keyFile.set_integer("GUI", "HistogramScopeType", rtengine::toUnderlying(histogramScopeType)); keyFile.set_boolean("GUI", "HistogramShowScopeButtons", histogramShowScopeButtons); keyFile.set_integer("GUI", "NavigatorRGBUnit", (int)navRGBUnit); keyFile.set_integer("GUI", "NavigatorHSVUnit", (int)navHSVUnit); diff --git a/rtgui/options.h b/rtgui/options.h index 4bc4ccc42..e64c31ad1 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -168,13 +168,22 @@ private: const Glib::ustring& entryName, Glib::ustring& destination); public: - enum class NavigatorUnit { PERCENT, R0_255, R0_1, _COUNT }; + + enum class ScopeType { + NONE = -1, + HISTOGRAM, + HISTOGRAM_RAW, + VECTORSCOPE_HC, + VECTORSCOPE_HS, + WAVEFORM + }; + bool savesParamsAtExit; SaveFormat saveFormat, saveFormatBatch; Glib::ustring savePathTemplate; @@ -306,15 +315,6 @@ public: double sndLngEditProcDoneSecs; // Minimum processing time seconds till the sound is played bool sndEnable; - enum ScopeType - { - HISTOGRAM = 0, - HISTOGRAM_RAW = 1, - VECTORSCOPE_HC = 2, - VECTORSCOPE_HS = 3, - WAVEFORM = 4, - NONE = -1 - }; int histogramPosition; // 0=disabled, 1=left pane, 2=right pane bool histogramRed, histogramGreen, histogramBlue; bool histogramLuma, histogramChroma; From 49937a589fc742da8f61c7195dc842a9f2ce3e08 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 14 Sep 2020 19:32:50 +0200 Subject: [PATCH 094/185] Remove timing code --- rtengine/bayer_bilinear_demosaic.cc | 4 +--- rtengine/dual_demosaic_RT.cc | 4 ---- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/rtengine/bayer_bilinear_demosaic.cc b/rtengine/bayer_bilinear_demosaic.cc index 2fa0812dc..5b3835ce9 100644 --- a/rtengine/bayer_bilinear_demosaic.cc +++ b/rtengine/bayer_bilinear_demosaic.cc @@ -24,14 +24,12 @@ #include "rawimagesource.h" #include "rt_math.h" -#define BENCHMARK -#include "StopWatch.h" using namespace rtengine; void RawImageSource::bayer_bilinear_demosaic(const float* const * blend, const array2D &rawData, array2D &red, array2D &green, array2D &blue) { -BENCHFUN + #ifdef _OPENMP #pragma omp parallel for #endif diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc index 6e90e04d7..558d9095b 100644 --- a/rtengine/dual_demosaic_RT.cc +++ b/rtengine/dual_demosaic_RT.cc @@ -33,9 +33,6 @@ #include "../rtgui/options.h" -#define BENCHMARK -#include "StopWatch.h" - using namespace std; namespace rtengine @@ -43,7 +40,6 @@ namespace rtengine void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams &raw, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, double &contrast, bool autoContrast) { - BENCHFUN if (contrast == 0.0 && !autoContrast) { // contrast == 0.0 means only first demosaicer will be used From 7dcccc223c7d73cf8f4e5b8a8df1bbdfff1ee33d Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 15 Sep 2020 13:19:51 +0200 Subject: [PATCH 095/185] Fix performance issue when using working profile for histogram, #5891 --- rtengine/iplab2rgb.cc | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 0549995dd..af7c454a3 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -172,11 +172,10 @@ Image8* ImProcFunctions::lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, Image8* image = new Image8(cw, ch); Glib::ustring profile; - bool standard_gamma; + cmsHPROFILE oprof = nullptr; if (settings->HistogramWorking && consider_histogram_settings) { profile = icm.workingProfile; - standard_gamma = true; } else { profile = icm.outputProfile; @@ -184,27 +183,15 @@ Image8* ImProcFunctions::lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, profile = "sRGB"; } - standard_gamma = false; + oprof = ICCStore::getInstance()->getProfile(profile); } - cmsHPROFILE oprof = ICCStore::getInstance()->getProfile(profile); - if (oprof) { - cmsHPROFILE oprofG = oprof; - - if (standard_gamma) { - oprofG = ICCStore::makeStdGammaProfile(oprof); - } - - cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; - - if (icm.outputBPC) { - flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; - } + const cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE | (icm.outputBPC ? cmsFLAGS_BLACKPOINTCOMPENSATION : 0); // NOCACHE is important for thread safety lcmsMutex->lock(); cmsHPROFILE LabIProf = cmsCreateLab4Profile(nullptr); - cmsHTRANSFORM hTransform = cmsCreateTransform (LabIProf, TYPE_Lab_DBL, oprofG, TYPE_RGB_FLT, icm.outputIntent, flags); // NOCACHE is important for thread safety + cmsHTRANSFORM hTransform = cmsCreateTransform (LabIProf, TYPE_Lab_DBL, oprof, TYPE_RGB_FLT, icm.outputIntent, flags); cmsCloseProfile(LabIProf); lcmsMutex->unlock(); @@ -245,9 +232,6 @@ Image8* ImProcFunctions::lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, cmsDeleteTransform(hTransform); - if (oprofG != oprof) { - cmsCloseProfile(oprofG); - } } else { const auto xyz_rgb = ICCStore::getInstance()->workingSpaceInverseMatrix(profile); copyAndClamp(lab, image->data, xyz_rgb, multiThread); From a5a44ce9b2a3702dd8b0b52401dfd9b0d85ff93c Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 15 Sep 2020 13:48:47 +0200 Subject: [PATCH 096/185] removes an unused function --- rtengine/iccstore.cc | 96 -------------------------------------------- rtengine/iccstore.h | 1 - 2 files changed, 97 deletions(-) diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index f53ddc893..2f443522c 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -1151,102 +1151,6 @@ std::vector rtengine::ICCStore::getWorkingProfiles() return implementation->getWorkingProfiles(); } -// WARNING: the caller must lock lcmsMutex -cmsHPROFILE rtengine::ICCStore::makeStdGammaProfile(cmsHPROFILE iprof) -{ - // forgive me for the messy code, quick hack to change gamma of an ICC profile to the RT standard gamma - if (!iprof) { - return nullptr; - } - - cmsUInt32Number bytesNeeded = 0; - cmsSaveProfileToMem(iprof, nullptr, &bytesNeeded); - - if (bytesNeeded == 0) { - return nullptr; - } - - uint8_t *data = new uint8_t[bytesNeeded + 1]; - cmsSaveProfileToMem(iprof, data, &bytesNeeded); - const uint8_t *p = &data[128]; // skip 128 byte header - uint32_t tag_count; - memcpy(&tag_count, p, 4); - p += 4; - tag_count = ntohl(tag_count); - - struct icctag { - uint32_t sig; - uint32_t offset; - uint32_t size; - } tags[tag_count]; - - constexpr uint32_t gamma = 0x239; - constexpr int gamma_size = 14; - int data_size = (gamma_size + 3) & ~3; - - for (uint32_t i = 0; i < tag_count; i++) { - memcpy(&tags[i], p, 12); - tags[i].sig = ntohl(tags[i].sig); - tags[i].offset = ntohl(tags[i].offset); - tags[i].size = ntohl(tags[i].size); - p += 12; - - if (tags[i].sig != 0x62545243 && // bTRC - tags[i].sig != 0x67545243 && // gTRC - tags[i].sig != 0x72545243 && // rTRC - tags[i].sig != 0x6B545243) { // kTRC - data_size += (tags[i].size + 3) & ~3; - } - } - - uint32_t sz = 128 + 4 + tag_count * 12 + data_size; - uint8_t *nd = new uint8_t[sz]; - memset(nd, 0, sz); - memcpy(nd, data, 128 + 4); - sz = htonl(sz); - memcpy(nd, &sz, 4); - uint32_t offset = 128 + 4 + tag_count * 12; - uint32_t gamma_offset = 0; - - for (uint32_t i = 0; i < tag_count; i++) { - struct icctag tag; - tag.sig = htonl(tags[i].sig); - - if (tags[i].sig == 0x62545243 || // bTRC - tags[i].sig == 0x67545243 || // gTRC - tags[i].sig == 0x72545243 || // rTRC - tags[i].sig == 0x6B545243) { // kTRC - if (gamma_offset == 0) { - gamma_offset = offset; - uint32_t pcurve[] = { htonl(0x63757276), htonl(0), htonl(/*gamma_size == 12 ? 0U : */1U) }; - memcpy(&nd[offset], pcurve, 12); - - //if (gamma_size == 14) { - uint16_t gm = htons(gamma); - memcpy(&nd[offset + 12], &gm, 2); - //} - - offset += (gamma_size + 3) & ~3; - } - - tag.offset = htonl(gamma_offset); - tag.size = htonl(gamma_size); - } else { - tag.offset = htonl(offset); - tag.size = htonl(tags[i].size); - memcpy(&nd[offset], &data[tags[i].offset], tags[i].size); - offset += (tags[i].size + 3) & ~3; - } - - memcpy(&nd[128 + 4 + i * 12], &tag, 12); - } - - cmsHPROFILE oprof = cmsOpenProfileFromMem(nd, ntohl(sz)); - delete [] nd; - delete [] data; - return oprof; -} - cmsHPROFILE rtengine::ICCStore::createFromMatrix(const double matrix[3][3], bool gamma, const Glib::ustring& name) { diff --git a/rtengine/iccstore.h b/rtengine/iccstore.h index 117124122..fb2331263 100644 --- a/rtengine/iccstore.h +++ b/rtengine/iccstore.h @@ -96,7 +96,6 @@ public: /*static*/ std::vector getWorkingProfiles(); - static cmsHPROFILE makeStdGammaProfile(cmsHPROFILE iprof); static cmsHPROFILE createFromMatrix(const double matrix[3][3], bool gamma = false, const Glib::ustring& name = Glib::ustring()); private: From 79278875da80bc918b113ac2bdf98aa1a4e2c359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 15 Sep 2020 14:56:57 +0200 Subject: [PATCH 097/185] Use `snprintf()` instead of `sprintf()` (#5907) --- rtengine/dcraw.cc | 12 ++++---- rtengine/imagedata.cc | 10 +++---- rtengine/improcfun.cc | 2 +- rtengine/jdatasrc.cc | 4 +-- rtengine/klt/trackFeatures.cc | 20 ++++++------- rtengine/klt/writeFeatures.cc | 4 +-- rtengine/rawimage.cc | 2 +- rtexif/canonattribs.cc | 22 +++++++------- rtexif/nikonattribs.cc | 6 ++-- rtexif/pentaxattribs.cc | 30 +++++++++---------- rtexif/rtexif.cc | 56 ++++++++++++++++++++++------------- rtexif/rtexif.h | 6 ++-- rtexif/sonyminoltaattribs.cc | 14 ++++----- rtexif/stdattribs.cc | 18 +++++------ rtgui/batchqueue.cc | 2 +- rtgui/cropwindow.cc | 4 +-- rtgui/icmpanel.cc | 4 +-- rtgui/main.cc | 2 +- 18 files changed, 117 insertions(+), 101 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index ffd4f89ed..ed2eea212 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -4085,7 +4085,7 @@ void CLASS foveon_interpolate() FORC3 diag[c][i] = LAST(1,1)*LAST(2,2) - LAST(1,2)*LAST(2,1); #undef LAST FORC3 div[c] = diag[c][0]*0.3127 + diag[c][1]*0.329 + diag[c][2]*0.3583; - sprintf (str, "%sRGBNeutral", model2); + snprintf(str, sizeof(str), "%sRGBNeutral", model2); if (foveon_camf_param ("IncludeBlocks", str)) foveon_fixed (div, 3, str); num = 0; @@ -6723,7 +6723,7 @@ int CLASS parse_tiff_ifd (int base) raw_height = height; left_margin = top_margin = filters = flip = 0; } - sprintf (model, "Ixpress %d-Mp", height*width/1000000); + snprintf(model, sizeof(model), "Ixpress %d-Mp", height*width/1000000); load_raw = &CLASS imacon_full_load_raw; if (filters) { if (left_margin & 1) filters = 0x61616161; @@ -7717,7 +7717,7 @@ void CLASS parse_smal (int offset, int fsize) raw_height = height = get2(); raw_width = width = get2(); strcpy (make, "SMaL"); - sprintf (model, "v%d %dx%d", ver, width, height); + snprintf(model, sizeof(model), "v%d %dx%d", ver, width, height); if (ver == 6) load_raw = &CLASS smal_v6_load_raw; if (ver == 9) load_raw = &CLASS smal_v9_load_raw; } @@ -7745,7 +7745,7 @@ void CLASS parse_cine() } fseek (ifp, off_setup+792, SEEK_SET); strcpy (make, "CINE"); - sprintf (model, "%d", get4()); + snprintf(model, sizeof(model), "%d", get4()); fseek (ifp, 12, SEEK_CUR); switch ((i=get4()) & 0xffffff) { case 3: filters = 0x94949494; break; @@ -9058,7 +9058,7 @@ void CLASS adobe_coeff (const char *make, const char *model) char name[130]; int i, j; - sprintf (name, "%s %s", make, model); + snprintf(name, sizeof(name), "%s %s", make, model); // -- RT -------------------------------------------------------------------- @@ -10522,7 +10522,7 @@ bw: colors = 1; load_raw = &CLASS rollei_load_raw; } if (!model[0]) - sprintf (model, "%dx%d", width, height); + snprintf(model, sizeof(model), "%dx%d", width, height); if (filters == UINT_MAX) filters = 0x94949494; if (thumb_offset && !thumb_height) { fseek (ifp, thumb_offset, SEEK_SET); diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 5025b31e5..cedf08ca0 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -1238,7 +1238,7 @@ std::string FramesMetaData::apertureToString(double aperture) { char buffer[256]; - sprintf(buffer, "%0.1f", aperture); + snprintf(buffer, sizeof(buffer), "%0.1f", aperture); return buffer; } @@ -1248,9 +1248,9 @@ std::string FramesMetaData::shutterToString(double shutter) char buffer[256]; if (shutter > 0.0 && shutter <= 0.5) { - sprintf(buffer, "1/%0.0f", 1.0 / shutter); + snprintf(buffer, sizeof(buffer), "1/%0.0f", 1.0 / shutter); } else { - sprintf(buffer, "%0.1f", shutter); + snprintf(buffer, sizeof(buffer), "%0.1f", shutter); } return buffer; @@ -1263,13 +1263,13 @@ std::string FramesMetaData::expcompToString(double expcomp, bool maskZeroexpcomp if (maskZeroexpcomp) { if (expcomp != 0.0) { - sprintf(buffer, "%0.2f", expcomp); + snprintf(buffer, sizeof(buffer), "%0.2f", expcomp); return buffer; } else { return ""; } } else { - sprintf(buffer, "%0.2f", expcomp); + snprintf(buffer, sizeof(buffer), "%0.2f", expcomp); return buffer; } } diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 6051b6b0b..0fd3e954c 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -5218,7 +5218,7 @@ void ImProcFunctions::EPDToneMaplocal(int sp, LabImage *lab, LabImage *tmp1, uns /* Debuggery. Saves L for toying with outside of RT. char nm[64]; - sprintf(nm, "%ux%ufloat.bin", lab->W, lab->H); + snprintf(nm, sizeof(nm), "%ux%ufloat.bin", lab->W, lab->H); FILE *f = fopen(nm, "wb"); fwrite(L, N, sizeof(float), f); fclose(f);*/ diff --git a/rtengine/jdatasrc.cc b/rtengine/jdatasrc.cc index e461b60f5..3a53b80d3 100644 --- a/rtengine/jdatasrc.cc +++ b/rtengine/jdatasrc.cc @@ -373,9 +373,9 @@ format_message (j_common_ptr cinfo, char * buffer) /* Format the message into the passed buffer */ if (isstring) { - sprintf(buffer, msgtext, err->msg_parm.s); + snprintf(buffer, sizeof(buffer), msgtext, err->msg_parm.s); } else - sprintf(buffer, msgtext, + snprintf(buffer, sizeof(buffer), msgtext, err->msg_parm.i[0], err->msg_parm.i[1], err->msg_parm.i[2], err->msg_parm.i[3], err->msg_parm.i[4], err->msg_parm.i[5], diff --git a/rtengine/klt/trackFeatures.cc b/rtengine/klt/trackFeatures.cc index a99225543..8c0cd5ba6 100644 --- a/rtengine/klt/trackFeatures.cc +++ b/rtengine/klt/trackFeatures.cc @@ -1044,7 +1044,7 @@ static int _am_trackFeatureAffine( #ifdef DEBUG_AFFINE_MAPPING aff_diff_win->data = imgdiff; - sprintf(fname, "./debug/kltimg_trans_diff_win%03d.%03d.pgm", glob_index, counter); + snprintf(fname, sizeof(fname), "./debug/kltimg_trans_diff_win%03d.%03d.pgm", glob_index, counter); printf("%s\n", fname); _KLTWriteAbsFloatImageToPGM(aff_diff_win, fname,256.0); printf("iter = %d translation tracker res: %f\n", iteration, _sumAbsFloatWindow(imgdiff, width, height)/(width*height)); @@ -1095,13 +1095,13 @@ static int _am_trackFeatureAffine( counter++; _am_computeAffineMappedImage(img1, x1, y1, 1.0, 0.0 , 0.0, 1.0, width, height, imgdiff); aff_diff_win->data = imgdiff; - sprintf(fname, "./debug/kltimg_aff_diff_win%03d.%03d_1.pgm", glob_index, counter); + snprintf(fname, sizeof(fname), "./debug/kltimg_aff_diff_win%03d.%03d_1.pgm", glob_index, counter); printf("%s\n", fname); _KLTWriteAbsFloatImageToPGM(aff_diff_win, fname,256.0); _am_computeAffineMappedImage(img2, *x2, *y2, *Axx, *Ayx , *Axy, *Ayy, width, height, imgdiff); aff_diff_win->data = imgdiff; - sprintf(fname, "./debug/kltimg_aff_diff_win%03d.%03d_2.pgm", glob_index, counter); + snprintf(fname, sizeof(fname), "./debug/kltimg_aff_diff_win%03d.%03d_2.pgm", glob_index, counter); printf("%s\n", fname); _KLTWriteAbsFloatImageToPGM(aff_diff_win, fname,256.0); #endif @@ -1110,7 +1110,7 @@ static int _am_trackFeatureAffine( width, height, imgdiff); #ifdef DEBUG_AFFINE_MAPPING aff_diff_win->data = imgdiff; - sprintf(fname, "./debug/kltimg_aff_diff_win%03d.%03d_3.pgm", glob_index,counter); + snprintf(fname, sizeof(fname), "./debug/kltimg_aff_diff_win%03d.%03d_3.pgm", glob_index,counter); printf("%s\n", fname); _KLTWriteAbsFloatImageToPGM(aff_diff_win, fname,256.0); @@ -1335,17 +1335,17 @@ void KLTTrackFeatures( if (tc->writeInternalImages) { char fname[80]; for (i = 0 ; i < tc->nPyramidLevels ; i++) { - sprintf(fname, "kltimg_tf_i%d.pgm", i); + snprintf(fname, sizeof(fname), "kltimg_tf_i%d.pgm", i); _KLTWriteFloatImageToPGM(pyramid1->img[i], fname); - sprintf(fname, "kltimg_tf_i%d_gx.pgm", i); + snprintf(fname, sizeof(fname), "kltimg_tf_i%d_gx.pgm", i); _KLTWriteFloatImageToPGM(pyramid1_gradx->img[i], fname); - sprintf(fname, "kltimg_tf_i%d_gy.pgm", i); + snprintf(fname, sizeof(fname), "kltimg_tf_i%d_gy.pgm", i); _KLTWriteFloatImageToPGM(pyramid1_grady->img[i], fname); - sprintf(fname, "kltimg_tf_j%d.pgm", i); + snprintf(fname, sizeof(fname), "kltimg_tf_j%d.pgm", i); _KLTWriteFloatImageToPGM(pyramid2->img[i], fname); - sprintf(fname, "kltimg_tf_j%d_gx.pgm", i); + snprintf(fname, sizeof(fname), "kltimg_tf_j%d_gx.pgm", i); _KLTWriteFloatImageToPGM(pyramid2_gradx->img[i], fname); - sprintf(fname, "kltimg_tf_j%d_gy.pgm", i); + snprintf(fname, sizeof(fname), "kltimg_tf_j%d_gy.pgm", i); _KLTWriteFloatImageToPGM(pyramid2_grady->img[i], fname); } } diff --git a/rtengine/klt/writeFeatures.cc b/rtengine/klt/writeFeatures.cc index 1bfe3f20f..02763135a 100644 --- a/rtengine/klt/writeFeatures.cc +++ b/rtengine/klt/writeFeatures.cc @@ -124,7 +124,7 @@ static FILE* _printSetupTxt( } /* Construct feature format */ - sprintf(format, "(%s,%s)=%%%dd ", fmt, fmt, val_width); + snprintf(format, sizeof(format), "(%s,%s)=%%%dd ", fmt, fmt, val_width); return fp; } @@ -163,7 +163,7 @@ static void _printInteger( int width) { char fmt[80]; - sprintf(fmt, "%%%dd", width); + snprintf(fmt, sizeof(fmt), "%%%dd", width); fprintf(fp, fmt, integer); } diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index e3a747048..49abc0c3d 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -1047,7 +1047,7 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is } char name[strlen(make) + strlen(model) + 32]; - sprintf(name, "%s %s", make, model); + snprintf(name, sizeof(name), "%s %s", make, model); for (size_t i = 0; i < sizeof table / sizeof(table[0]); i++) { if (strcasecmp(name, table[i].prefix) == 0) { diff --git a/rtexif/canonattribs.cc b/rtexif/canonattribs.cc index 529b2314d..57fe6d07e 100644 --- a/rtexif/canonattribs.cc +++ b/rtexif/canonattribs.cc @@ -70,7 +70,7 @@ public: return "undef"; } - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } }; @@ -99,7 +99,7 @@ public: } char buffer[32]; - sprintf (buffer, "%.1fs %s", sec / 10., (sec & 0x4000) ? ",Custom" : ""); + snprintf(buffer, sizeof(buffer), "%.1fs %s", sec / 10., (sec & 0x4000) ? ",Custom" : ""); return buffer; } }; @@ -542,7 +542,7 @@ public: } char buffer[32]; - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } }; @@ -1175,7 +1175,7 @@ public: } char buffer[32]; - sprintf (buffer, "%.2fmm", val * 25.4 / 1000); + snprintf(buffer, sizeof(buffer), "%.2fmm", val * 25.4 / 1000); return buffer; } }; @@ -1188,7 +1188,7 @@ public: { char buffer[32]; double d = pow (2, - t->toInt() / 32.0); - sprintf (buffer, "%.3f", d); + snprintf(buffer, sizeof(buffer), "%.3f", d); return buffer; } }; @@ -1199,7 +1199,7 @@ class CAEVInterpreter : public Interpreter std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%.1f", t->toDouble() / 32.0 ); + snprintf(buffer, sizeof(buffer), "%.1f", t->toDouble() / 32.0 ); return buffer; } }; @@ -1212,7 +1212,7 @@ public: { char buffer[32]; int a = t->toInt(); - sprintf (buffer, "%d", a); + snprintf(buffer, sizeof(buffer), "%d", a); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1354,7 +1354,7 @@ public: } char buffer[32]; - sprintf (buffer, "%.0f", n / 32. ); + snprintf(buffer, sizeof(buffer), "%.0f", n / 32. ); return buffer; } }; @@ -1409,7 +1409,7 @@ public: std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%.2f", t->toDouble() / 100 ); + snprintf(buffer, sizeof(buffer), "%.2f", t->toDouble() / 100 ); return buffer; } }; @@ -1421,7 +1421,7 @@ public: std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%.1f", t->toDouble() / 8 - 6 ); + snprintf(buffer, sizeof(buffer), "%.1f", t->toDouble() / 8 - 6 ); return buffer; } }; @@ -1557,7 +1557,7 @@ public: { unsigned long val = t->toInt (0, LONG); char buffer[32]; - sprintf (buffer, "%ld", ((val & 0xffc0) >> 6) * 10000 + ((val >> 16) & 0xff) + ((val & 0x3f) << 8) ); + snprintf(buffer, sizeof(buffer), "%ld", ((val & 0xffc0) >> 6) * 10000 + ((val >> 16) & 0xff) + ((val & 0x3f) << 8) ); return buffer; } }; diff --git a/rtexif/nikonattribs.cc b/rtexif/nikonattribs.cc index 70213e8b0..0ea476a24 100644 --- a/rtexif/nikonattribs.cc +++ b/rtexif/nikonattribs.cc @@ -35,7 +35,7 @@ public: std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%d", t->toInt (2)); + snprintf(buffer, sizeof(buffer), "%d", t->toInt (2)); return buffer; } }; @@ -49,7 +49,7 @@ public: { char buffer[32]; int a = t->toInt(); - sprintf (buffer, "%d", a); + snprintf(buffer, sizeof(buffer), "%d", a); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -128,7 +128,7 @@ public: default: { char buffer[32]; - sprintf (buffer, "0x%04X", a); + snprintf(buffer, sizeof(buffer), "0x%04X", a); return buffer; } } diff --git a/rtexif/pentaxattribs.cc b/rtexif/pentaxattribs.cc index d6b9a9c84..f534d549a 100644 --- a/rtexif/pentaxattribs.cc +++ b/rtexif/pentaxattribs.cc @@ -422,7 +422,7 @@ public: return "undef"; } - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } }; @@ -626,7 +626,7 @@ public: return s.str(); } else { char buffer[1024]; - t->toString (buffer); + t->toString (buffer, sizeof(buffer)); return std::string (buffer); } } @@ -1341,7 +1341,7 @@ public: } char buffer[32]; - sprintf (buffer, "%d", a ); + snprintf(buffer, sizeof(buffer), "%d", a ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1369,7 +1369,7 @@ public: if (a > 1.) { char buffer[32]; - sprintf (buffer, "%.2f", a / 100. ); + snprintf(buffer, sizeof(buffer), "%.2f", a / 100. ); return buffer; } else { return "n/a"; @@ -1399,7 +1399,7 @@ public: if (b > 1.0) { char buffer[32]; - sprintf (buffer, "%.2f", b ); + snprintf(buffer, sizeof(buffer), "%.2f", b ); return buffer; } else { return "n/a"; @@ -1428,7 +1428,7 @@ public: int a = t->toInt (0, BYTE); char buffer[32]; double v = 100.*exp (double (a - 32) * log (2.) / 8.); - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1456,7 +1456,7 @@ public: return "undef"; } - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } else { return "n/a"; @@ -1485,7 +1485,7 @@ public: int a = t->toInt (0, BYTE); char buffer[32]; double v = double (a - 64) / 8.; - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1505,7 +1505,7 @@ public: int a = t->toInt (0, SBYTE); char buffer[32]; double v = double (a) / 8.; - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1525,7 +1525,7 @@ public: int a = t->toInt (0, BYTE); char buffer[32]; double v = exp ((double (a) - 68.) * log (2.) / 16.); - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1545,7 +1545,7 @@ public: int a = t->toInt (0, BYTE); char buffer[32]; double v = 24.*exp (- (double (a) - 32.) * log (2.) / 8.); - sprintf (buffer, "%.6f", v ); + snprintf(buffer, sizeof(buffer), "%.6f", v ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1565,7 +1565,7 @@ public: char buffer[32]; int a = t->toInt (0, BYTE); int mina = a & 0x0F; - sprintf (buffer, "%.1f", double (int (pow (2.0, double (mina + 10) / 4.0) + 0.2))); + snprintf(buffer, sizeof(buffer), "%.1f", double (int (pow (2.0, double (mina + 10) / 4.0) + 0.2))); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1585,7 +1585,7 @@ public: char buffer[32]; int a = t->toInt (0, BYTE); int maxa = (a & 0xF0) >> 4; - sprintf (buffer, "%.1f", double (int (pow (2.0, double (maxa) / 4.0) + 0.2)) ); + snprintf(buffer, sizeof(buffer), "%.1f", double (int (pow (2.0, double (maxa) / 4.0) + 0.2)) ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1702,7 +1702,7 @@ public: { char buffer[32]; int b = t->toInt (0, BYTE) & 0x1F; - sprintf (buffer, "%.0f", pow (2., b / 16. + 4) ); + snprintf(buffer, sizeof(buffer), "%.0f", pow (2., b / 16. + 4) ); return buffer; } }; @@ -1788,7 +1788,7 @@ public: return r->second; } else { char buffer[1024]; - t->toString (buffer); + t->toString (buffer, sizeof(buffer)); return std::string (buffer); } } diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index f32a9feb1..b3d31b950 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -1017,13 +1017,13 @@ Tag::Tag (TagDirectory* p, FILE* f, int base) Tag* tmake = parent->getRoot()->getTag ("Make"); if (tmake) { - tmake->toString (make); + tmake->toString (make, sizeof(make)); } Tag* tmodel = parent->getRoot()->getTag ("Model"); if (tmodel) { - tmodel->toString (model); + tmodel->toString (model, sizeof(model)); } if (!strncmp (make, "SONY", 4)) { @@ -1677,8 +1677,11 @@ void Tag::toRational (int& num, int& denom, int ofs) const } } -void Tag::toString (char* buffer, int ofs) const +void Tag::toString (char* buffer, std::size_t size, int ofs) const { + if (!buffer || !size) { + return; + } if (type == UNDEFINED && !directory) { bool isstring = true; @@ -1690,67 +1693,80 @@ void Tag::toString (char* buffer, int ofs) const } if (isstring) { - int j = 0; + if (size < 3) { + return; + } + + std::size_t j = 0; for (i = 0; i + ofs < count && i < 64 && value[i + ofs]; i++) { if (value[i + ofs] == '<' || value[i + ofs] == '>') { buffer[j++] = '\\'; + if (j > size - 2) { + break; + } } buffer[j++] = value[i + ofs]; + if (j > size - 2) { + break; + } } buffer[j++] = 0; return; } } else if (type == ASCII) { - sprintf (buffer, "%.64s", value + ofs); + snprintf(buffer, size, "%.64s", value + ofs); return; } size_t maxcount = rtengine::min(count, 10); - strcpy (buffer, ""); + buffer[0] = 0; for (ssize_t i = 0; i < rtengine::min(maxcount, valuesize - ofs); i++) { - if (i > 0) { + std::size_t len = strlen(buffer); + + if (i > 0 && size - len > 2) { strcat (buffer, ", "); + len += 2; } - char* b = buffer + strlen (buffer); + char* b = buffer + len; switch (type) { case UNDEFINED: case BYTE: - sprintf (b, "%d", value[i + ofs]); + snprintf(b, size - len, "%d", value[i + ofs]); break; case SSHORT: - sprintf (b, "%d", toInt (2 * i + ofs)); + snprintf(b, size - len, "%d", toInt (2 * i + ofs)); break; case SHORT: - sprintf (b, "%u", toInt (2 * i + ofs)); + snprintf(b, size - len, "%u", toInt (2 * i + ofs)); break; case SLONG: - sprintf (b, "%d", toInt (4 * i + ofs)); + snprintf(b, size - len, "%d", toInt (4 * i + ofs)); break; case LONG: - sprintf (b, "%u", toInt (4 * i + ofs)); + snprintf(b, size - len, "%u", toInt (4 * i + ofs)); break; case SRATIONAL: - sprintf (b, "%d/%d", (int)sget4 (value + 8 * i + ofs, getOrder()), (int)sget4 (value + 8 * i + ofs + 4, getOrder())); + snprintf(b, size - len, "%d/%d", (int)sget4 (value + 8 * i + ofs, getOrder()), (int)sget4 (value + 8 * i + ofs + 4, getOrder())); break; case RATIONAL: - sprintf (b, "%u/%u", (uint32_t)sget4 (value + 8 * i + ofs, getOrder()), (uint32_t)sget4 (value + 8 * i + ofs + 4, getOrder())); + snprintf(b, size - len, "%u/%u", (uint32_t)sget4 (value + 8 * i + ofs, getOrder()), (uint32_t)sget4 (value + 8 * i + ofs + 4, getOrder())); break; case FLOAT: - sprintf (b, "%g", toDouble (8 * i + ofs)); + snprintf(b, size - len, "%g", toDouble (8 * i + ofs)); break; default: @@ -1758,7 +1774,7 @@ void Tag::toString (char* buffer, int ofs) const } } - if (count > maxcount) { + if (count > maxcount && size - strlen(buffer) > 3) { strcat (buffer, "..."); } } @@ -1771,7 +1787,7 @@ std::string Tag::nameToString (int i) if (attrib) { strncpy (buffer, attrib->name, 1024); } else { - sprintf (buffer, "0x%x", tag); + snprintf(buffer, sizeof(buffer), "0x%x", tag); } if (i > 0) { @@ -1788,7 +1804,7 @@ std::string Tag::valueToString () const return attrib->interpreter->toString (this); } else { char buffer[1024]; - toString (buffer); + toString (buffer, sizeof(buffer)); return buffer; } } @@ -2763,7 +2779,7 @@ parse_leafdata (TagDirectory* root, ByteOrder order) &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) == 6) { char tstr[64]; - sprintf (tstr, "%04d:%02d:%02d %02d:%02d:%02d", tm.tm_year, tm.tm_mon, + snprintf(tstr, sizeof(tstr), "%04d:%02d:%02d %02d:%02d:%02d", tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); t->initString (tstr); exif->getDirectory()->addTagFront (t); diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 5084f70de..dd89b70ce 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -304,7 +304,7 @@ public: double toDouble (int ofs = 0) const; double* toDoubleArray (int ofs = 0) const; void toRational (int& num, int& denom, int ofs = 0) const; - void toString (char* buffer, int ofs = 0) const; + void toString (char* buffer, std::size_t size, int ofs = 0) const; void fromString (const char* v, int size = -1); void setInt (int v, int ofs = 0, TagType astype = LONG); int getDistanceFrom (const TagDirectory *root); @@ -392,7 +392,7 @@ public: virtual std::string toString (const Tag* t) const { char buffer[1024]; - t->toString (buffer); + t->toString (buffer, sizeof(buffer)); std::string s (buffer); std::string::size_type p1 = s.find_first_not_of (' '); @@ -526,7 +526,7 @@ public: return r->second; } else { char buffer[1024]; - t->toString(buffer); + t->toString(buffer, sizeof(buffer)); return buffer; } } diff --git a/rtexif/sonyminoltaattribs.cc b/rtexif/sonyminoltaattribs.cc index 5eb5c9ec1..95aea1252 100644 --- a/rtexif/sonyminoltaattribs.cc +++ b/rtexif/sonyminoltaattribs.cc @@ -1979,7 +1979,7 @@ public: if (a > 0) { char buffer[32]; - sprintf (buffer, "%.4f", a); + snprintf(buffer, sizeof(buffer), "%.4f", a); return buffer; } else { return "n/a"; @@ -2039,7 +2039,7 @@ public: if (a) { char buffer[32]; - sprintf (buffer, "%.1f", a / 100. ); + snprintf(buffer, sizeof(buffer), "%.1f", a / 100. ); return buffer; } else { return "n/a"; @@ -2099,7 +2099,7 @@ public: if (a) { char buffer[32]; - sprintf (buffer, "%d", a ); + snprintf(buffer, sizeof(buffer), "%d", a ); return buffer; } else { return "Auto"; @@ -2138,7 +2138,7 @@ public: { double a = t->toDouble(); char buffer[32]; - sprintf (buffer, "%.2f", a ); + snprintf(buffer, sizeof(buffer), "%.2f", a ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -2158,7 +2158,7 @@ public: std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%d", t->getValue()[0] - 20); + snprintf(buffer, sizeof(buffer), "%d", t->getValue()[0] - 20); return buffer; } int toInt (const Tag* t, int ofs, TagType astype) override @@ -2197,7 +2197,7 @@ public: std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%d", t->getValue()[0] & 0x7f); + snprintf(buffer, sizeof(buffer), "%d", t->getValue()[0] & 0x7f); return buffer; } int toInt (const Tag* t, int ofs, TagType astype) override @@ -2253,7 +2253,7 @@ public: std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%d", t->toInt()); + snprintf(buffer, sizeof(buffer), "%d", t->toInt()); return buffer; } int toInt (const Tag* t, int ofs, TagType astype) override diff --git a/rtexif/stdattribs.cc b/rtexif/stdattribs.cc index be7a28a5c..e6e3bb35b 100644 --- a/rtexif/stdattribs.cc +++ b/rtexif/stdattribs.cc @@ -334,7 +334,7 @@ public: return "undef"; } - sprintf (buffer, "%0.1f", v); + snprintf(buffer, sizeof(buffer), "%0.1f", v); return buffer; } }; @@ -353,7 +353,7 @@ public: return "undef"; } - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } }; @@ -372,7 +372,7 @@ public: return "undef"; } - sprintf (buffer, "%+0.2f", v ); + snprintf(buffer, sizeof(buffer), "%+0.2f", v ); return buffer; } }; @@ -388,9 +388,9 @@ public: double d = pow (2.0, -t->toDouble()); if (d > 0.0 && d <= 0.5) { - sprintf (buffer, "1/%.0f", 1.0 / d); + snprintf(buffer, sizeof(buffer), "1/%.0f", 1.0 / d); } else { - sprintf (buffer, "%.1f", d); + snprintf(buffer, sizeof(buffer), "%.1f", d); } return buffer; @@ -408,9 +408,9 @@ public: double d = t->toDouble(); if (d > 0.0 && d <= 0.5) { - sprintf (buffer, "1/%.0f", 1.0 / d); + snprintf(buffer, sizeof(buffer), "1/%.0f", 1.0 / d); } else { - sprintf (buffer, "%.1f", d); + snprintf(buffer, sizeof(buffer), "%.1f", d); } return buffer; @@ -431,7 +431,7 @@ public: return "undef"; } - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } }; @@ -637,7 +637,7 @@ public: int lastSegmentWidth = t->toInt(4, SHORT); char buffer[32]; - sprintf (buffer, "%d %d %d", segmentNumber, segmentWidth, lastSegmentWidth); + snprintf(buffer, sizeof(buffer), "%d %d %d", segmentNumber, segmentWidth, lastSegmentWidth); return buffer; } }; diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 3b6bb73ed..fc1fc855e 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -390,7 +390,7 @@ Glib::ustring BatchQueue::getTempFilenameForParams( const Glib::ustring &filenam timeval tv; gettimeofday(&tv, nullptr); char mseconds[11]; - sprintf(mseconds, "%d", (int)(tv.tv_usec / 1000)); + snprintf(mseconds, sizeof(mseconds), "%d", (int)(tv.tv_usec / 1000)); time_t rawtime; struct tm *timeinfo; char stringTimestamp [80]; diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index d87876cec..b6559b66f 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -125,13 +125,13 @@ void CropWindow::initZoomSteps() char lbl[64]; for (int s = 100; s >= 11; --s) { float z = 10.f / s; - sprintf(lbl, "% 2d%%", int(z * 100)); + snprintf(lbl, sizeof(lbl), "% 2d%%", int(z * 100)); bool is_major = (s == s/10 * 10); zoomSteps.push_back(ZoomStep(lbl, z, s, is_major)); } zoom11index = zoomSteps.size(); for (int s = 1; s <= 8; ++s) { - sprintf(lbl, "%d00%%", s); + snprintf(lbl, sizeof(lbl), "%d00%%", s); zoomSteps.push_back(ZoomStep(lbl, s, s * 1000, true)); } zoomSteps.push_back(ZoomStep("1600%", 16, 16000, true)); diff --git a/rtgui/icmpanel.cc b/rtgui/icmpanel.cc index 920924c6c..69cd21115 100644 --- a/rtgui/icmpanel.cc +++ b/rtgui/icmpanel.cc @@ -424,8 +424,8 @@ void ICMPanel::updateDCP(int dcpIlluminant, Glib::ustring dcp_name) if (illuminants.will_interpolate) { if (dcpTemperatures[0] != illuminants.temperature_1 || dcpTemperatures[1] != illuminants.temperature_2) { char tempstr1[64], tempstr2[64]; - sprintf(tempstr1, "%.0fK", illuminants.temperature_1); - sprintf(tempstr2, "%.0fK", illuminants.temperature_2); + snprintf(tempstr1, sizeof(tempstr1), "%.0fK", illuminants.temperature_1); + snprintf(tempstr2, sizeof(tempstr2), "%.0fK", illuminants.temperature_2); int curr_active = dcpIll->get_active_row_number(); dcpIll->remove_all(); dcpIll->append(M("TP_ICM_DCPILLUMINANT_INTERPOLATED")); diff --git a/rtgui/main.cc b/rtgui/main.cc index 7bb4afdc9..9f623a6df 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -460,7 +460,7 @@ int main (int argc, char **argv) SetConsoleCtrlHandler ( NULL, true ); // Set title of console char consoletitle[128]; - sprintf (consoletitle, "RawTherapee %s Console", RTVERSION); + snprintf(consoletitle, sizeof(consoletitle), "RawTherapee %s Console", RTVERSION); SetConsoleTitle (consoletitle); // increase size of screen buffer COORD c; From 4d931ed9f4b55acef03afe837aaab34ce3c1d2ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 15 Sep 2020 17:12:03 +0200 Subject: [PATCH 098/185] Fix some sizes --- rtengine/jdatasrc.cc | 4 ++-- rtengine/klt/writeFeatures.cc | 9 +++++---- rtengine/rawimage.cc | 6 ++++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/rtengine/jdatasrc.cc b/rtengine/jdatasrc.cc index 3a53b80d3..a5008b00f 100644 --- a/rtengine/jdatasrc.cc +++ b/rtengine/jdatasrc.cc @@ -373,9 +373,9 @@ format_message (j_common_ptr cinfo, char * buffer) /* Format the message into the passed buffer */ if (isstring) { - snprintf(buffer, sizeof(buffer), msgtext, err->msg_parm.s); + snprintf(buffer, JMSG_LENGTH_MAX, msgtext, err->msg_parm.s); } else - snprintf(buffer, sizeof(buffer), msgtext, + snprintf(buffer, JMSG_LENGTH_MAX, msgtext, err->msg_parm.i[0], err->msg_parm.i[1], err->msg_parm.i[2], err->msg_parm.i[3], err->msg_parm.i[4], err->msg_parm.i[5], diff --git a/rtengine/klt/writeFeatures.cc b/rtengine/klt/writeFeatures.cc index 02763135a..d3bf6f3d4 100644 --- a/rtengine/klt/writeFeatures.cc +++ b/rtengine/klt/writeFeatures.cc @@ -97,6 +97,7 @@ static FILE* _printSetupTxt( const char *fname, /* Input: filename, or NULL for stderr */ const char *fmt, /* Input: format (e.g., %5.1f or %3d) */ char *format, /* Output: format (e.g., (%5.1f,%5.1f)=%3d) */ + std::size_t format_size, char *type) /* Output: either 'f' or 'd', based on input format */ { FILE *fp; @@ -124,7 +125,7 @@ static FILE* _printSetupTxt( } /* Construct feature format */ - snprintf(format, sizeof(format), "(%s,%s)=%%%dd ", fmt, fmt, val_width); + snprintf(format, format_size, "(%s,%s)=%%%dd ", fmt, fmt, val_width); return fp; } @@ -358,7 +359,7 @@ void KLTWriteFeatureList( } if (fmt != nullptr) { /* text file or stderr */ - fp = _printSetupTxt(fname, fmt, format, &type); + fp = _printSetupTxt(fname, fmt, format, sizeof(format), &type); _printHeader(fp, format, FEATURE_LIST, 0, fl->nFeatures); for (i = 0 ; i < fl->nFeatures ; i++) { @@ -396,7 +397,7 @@ void KLTWriteFeatureHistory( } if (fmt != nullptr) { /* text file or stderr */ - fp = _printSetupTxt(fname, fmt, format, &type); + fp = _printSetupTxt(fname, fmt, format, sizeof(format), &type); _printHeader(fp, format, FEATURE_HISTORY, fh->nFrames, 0); for (i = 0 ; i < fh->nFrames ; i++) { @@ -435,7 +436,7 @@ void KLTWriteFeatureTable( } if (fmt != nullptr) { /* text file or stderr */ - fp = _printSetupTxt(fname, fmt, format, &type); + fp = _printSetupTxt(fname, fmt, format, sizeof(format), &type); _printHeader(fp, format, FEATURE_TABLE, ft->nFrames, ft->nFeatures); for (j = 0 ; j < ft->nFeatures ; j++) { diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index 49abc0c3d..2354f343a 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -1046,8 +1046,10 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is } } - char name[strlen(make) + strlen(model) + 32]; - snprintf(name, sizeof(name), "%s %s", make, model); + const std::size_t name_size = strlen(make) + strlen(model) + 32; + + char name[name_size]; + snprintf(name, name_size, "%s %s", make, model); for (size_t i = 0; i < sizeof table / sizeof(table[0]); i++) { if (strcasecmp(name, table[i].prefix) == 0) { From 6e2d9e8ab25570048f68440c2e9e7f3238b88bea Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 16 Sep 2020 19:35:43 +0200 Subject: [PATCH 099/185] Local adjustments - Change labels tooltips - fixed bug curve HH --- rtdata/languages/default | 7242 ++++++++++++++++++++++++++++++++++++++ rtengine/iplocallab.cc | 2 +- 2 files changed, 7243 insertions(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index b4dade718..b65591eaf 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1083,6 +1083,7248 @@ HISTORY_MSG_838;Local - Vib gradient strength H HISTORY_MSG_839;Local - Software complexity HISTORY_MSG_840;Local - CL Curve HISTORY_MSG_841;Local - LC curve +HISTORY_MSG_842;Local - Contrast Threshold Blur Mask +HISTORY_MSG_843;Local - Radius blur mask +HISTORY_MSG_844;Local - Color Mask fftw +HISTORY_MSG_845;Local - log encoding +HISTORY_MSG_846;Local - Encoding auto +HISTORY_MSG_847;Local - Source Gray +HISTORY_MSG_848;Local - Source Gray auto +HISTORY_MSG_849;Local - Auto Grayon +HISTORY_MSG_850;Local - Black Ev +HISTORY_MSG_851;Local - White Ev +HISTORY_MSG_852;Local - Target Gray +HISTORY_MSG_853;Local - Local contrast +HISTORY_MSG_854;Local - Scope encoding log +HISTORY_MSG_855;Local - Entire image +HISTORY_MSG_856;Local - Base log +HISTORY_MSG_857;Local - Contrast Blur Residual +HISTORY_MSG_858;Local - Contrast Luminance only +HISTORY_MSG_859;Local - Contrast Maximum Blur levels +HISTORY_MSG_860;Local - Contrast Curve Blur levels +HISTORY_MSG_861;Local - Contrast Curve Contrast levels +HISTORY_MSG_862;Local - Contrast Sigma luminance +HISTORY_MSG_863;Local - Contrast Merge Original +HISTORY_MSG_864;Local - Directional sigma +HISTORY_MSG_865;Local - Directional delta +HISTORY_MSG_866;Local - Contrast Curve Compression +HISTORY_MSG_867;Local - Contrast Amount residual +HISTORY_MSG_868;Local - balance ΔE C-H +HISTORY_MSG_869;Local - denoise curve luminance +HISTORY_MSG_870;Local - LC mask curve LC(H) +HISTORY_MSG_871;Local - LC mask curve C(C) +HISTORY_MSG_872;Local - LC mask curve L(L) +HISTORY_MSG_873;Local - LC mask enable +HISTORY_MSG_875;Local - LC mask blend +HISTORY_MSG_876;Local - LC mask radius +HISTORY_MSG_877;Local - LC mask chroma +HISTORY_MSG_878;Local - LC mask curve contrast +HISTORY_MSG_879;Local - LC Chroma levels +HISTORY_MSG_880;Local - LC Chroma blur levels +HISTORY_MSG_881;Local - Contrast Offset Luminance +HISTORY_MSG_882;Local - Contrast Blur +HISTORY_MSG_883;Local - Contrast By Level +HISTORY_MSG_884;Local - Contrast Dynamic Range Laplacian +HISTORY_MSG_885;Local - Contrast Dynamic Range Wavelet +HISTORY_MSG_886;Local - Contrast Wavelet Curve Compression +HISTORY_MSG_887;Local - Contrast Wavelet Compression Residual +HISTORY_MSG_888;Local - Contrast Wavelet Balance threshold +HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +HISTORY_MSG_891;Local - Contrast Wavelet Graduated +HISTORY_MSG_892;Local - Log Encoding Graduated Strength +HISTORY_MSG_893;Local - Log Encoding Graduated angle +HISTORY_MSG_894;Local - Color Preview dE +HISTORY_MSG_897;Local - Contrast Wavelet ES strength +HISTORY_MSG_898;Local - Contrast Wavelet ES radius +HISTORY_MSG_899;Local - Contrast Wavelet ES detail +HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +HISTORY_MSG_904;Local - Contrast Wavelet ES first level +HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +HISTORY_MSG_909;Local - Contrast Wavelet ES show +HISTORY_MSG_910;Local - Wavelet Edge performance +HISTORY_MSG_911;Local - Blur Chroma Luma +HISTORY_MSG_912;Local - Blur Guide filter strength +HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +HISTORY_MSG_916;Local - Residual wavelet shadows +HISTORY_MSG_917;Local - Residual wavelet shadows threshold +HISTORY_MSG_918;Local - Residual wavelet highlights +HISTORY_MSG_919;Local - Residual wavelet highlights threshold +HISTORY_MSG_920;Local - Wavelet sigma LC +HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +HISTORY_MSG_922;Local - changes In Black and White +HISTORY_MSG_923;Local - Tool complexity mode +HISTORY_MSG_924;Local - Tool complexity mode +HISTORY_MSG_925;Local - Scope color tools +HISTORY_MSG_926;Local - Show mask type +HISTORY_MSG_927;Local - Shadow mask +HISTORY_MSG_928;Local - Common color mask +HISTORY_MSG_929;Local - Mask common scope +HISTORY_MSG_930;Local - Mask Common blend luma +HISTORY_MSG_931;Local - Mask Common enable +HISTORY_MSG_932;Local - Mask Common radius soft +HISTORY_MSG_933;Local - Mask Common laplacian +HISTORY_MSG_934;Local - Mask Common chroma +HISTORY_MSG_935;Local - Mask Common gamma +HISTORY_MSG_936;Local - Mask Common slope +HISTORY_MSG_937;Local - Mask Common curve C(C) +HISTORY_MSG_938;Local - Mask Common curve L(L) +HISTORY_MSG_939;Local - Mask Common curve LC(H) +HISTORY_MSG_940;Local - Mask Common structure as tool +HISTORY_MSG_941;Local - Mask Common structure strength +HISTORY_MSG_942;Local - Mask Common H(H) curve +HISTORY_MSG_943;Local - Mask Common FFT +HISTORY_MSG_944;Local - Mask Common Blur radius +HISTORY_MSG_945;Local - Mask Common contrast threshold +HISTORY_MSG_946;Local - Mask Common shadows +HISTORY_MSG_947;Local - Mask Common Contrast curve +HISTORY_MSG_948;Local - Mask Common Wavelet curve +HISTORY_MSG_949;Local - Mask Common Threshold levels +HISTORY_MSG_950;Local - Mask Common GF strength +HISTORY_MSG_951;Local - Mask Common GF angle +HISTORY_MSG_952;Local - Mask Common soft radius +HISTORY_MSG_953;Local - Mask Common blend chroma +HISTORY_MSG_954;Local - Show-hide tools +HISTORY_MSG_955;Local - Enable Spot +HISTORY_MSG_956;Local - CH Curve +HISTORY_MSG_957;Local - GF local contrast threshold +HISTORY_MSG_958;Local - GF Local contrast Hue equalizer +HISTORY_MSG_959;Local - GF Local contrast levels +HISTORY_MSG_960;Local - GF Local contrast threshold high +HISTORY_MSG_961;Local - Denoise mode +HISTORY_MSG_962;Local - Equalizer hue +HISTORY_MSG_964;Local - Threshold mask denoise +HISTORY_MSG_966;Local - denoise use mask +HISTORY_MSG_967;Local - Spot settings show hide +HISTORY_MSG_BLSHAPE;Blur by level +HISTORY_MSG_BLURCWAV;Blur chroma +HISTORY_MSG_BLURWAV;Blur luminance +HISTORY_MSG_BLUWAV;Attenuation response +HISTORY_MSG_CAT02PRESET;Cat02 automatic preset +HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region blur mask +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +HISTORY_MSG_COMPLEX;Wavelet complexity +HISTORY_MSG_COMPLEXRETI;Retinex complexity +HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +HISTORY_MSG_EDGEFFECT;Edge Attenuation response +HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +HISTORY_MSG_FILMNEGATIVE_FILMBASE;Film base color +HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values +HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method +HISTORY_MSG_ILLUM;Illuminant +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +HISTORY_MSG_METADATA_MODE;Metadata copy mode +HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations +HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +HISTORY_MSG_PERSP_METHOD;Perspective - Method +HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode +HISTORY_MSG_PROTAB;Protection +HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +HISTORY_MSG_RANGEAB;Range ab +HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +HISTORY_MSG_RAW_BORDER;Raw border +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +HISTORY_MSG_SIGMACOL;Chroma Attenuation response +HISTORY_MSG_SIGMADIR;Dir Attenuation response +HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +HISTORY_MSG_SIGMATON;Toning Attenuation response +HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +HISTORY_MSG_THRESWAV;Balance threshold +HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +HISTORY_MSG_TRANS_Method;Geometry - Method +HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +HISTORY_MSG_WAVBALLUM;Equalizer luminance +HISTORY_MSG_WAVBL;Blur levels +HISTORY_MSG_WAVCHROMCO;Coarse chroma +HISTORY_MSG_WAVCHROMFI;Fine chroma +HISTORY_MSG_WAVCLARI;Clarity +HISTORY_MSG_WAVDENLH;Level 5 +HISTORY_MSG_WAVDENOISE;Local contrast +HISTORY_MSG_WAVDENOISEH;High level Local contrast +HISTORY_MSG_WAVDENMET;Local equalizer +HISTORY_MSG_WAVDETEND;Details soft +HISTORY_MSG_WAVEDGS;Edge stopping +HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +HISTORY_MSG_WAVHUE;Equalizer hue +HISTORY_MSG_WAVLEVDEN;High level local contrast +HISTORY_MSG_WAVLEVSIGM;Radius +HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +HISTORY_MSG_WAVLOWTHR;Threshold low contrast +HISTORY_MSG_WAVMERGEC;Merge C +HISTORY_MSG_WAVMERGEL;Merge L +HISTORY_MSG_WAVMIXMET;Reference local contrast +HISTORY_MSG_WAVOFFSET;Offset +HISTORY_MSG_WAVOLDSH;Old algorithm +HISTORY_MSG_WAVQUAMET;Denoise mode +HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +HISTORY_MSG_WAVSCALE;Scale +HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +HISTORY_MSG_WAVSIGMA;Attenuation response +HISTORY_MSG_WAVSIGM;Sigma +HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +HISTORY_MSG_WAVSOFTRADEND;Soft radius final +HISTORY_MSG_WAVSLIMET;Method +HISTORY_MSG_WAVTHRDEN;Threshold local contrast +HISTORY_MSG_WAVTHREND;Threshold local contrast +HISTORY_MSG_WAVSTREND;Strength soft +HISTORY_MSG_WAVUSHAMET;Clarity method +HISTORY_NEWSNAPSHOT;Add +HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +HISTORY_SNAPSHOT;Snapshot +HISTORY_SNAPSHOTS;Snapshots +ICCPROFCREATOR_COPYRIGHT;Copyright: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +ICCPROFCREATOR_CUSTOM;Custom +ICCPROFCREATOR_DESCRIPTION;Description: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +ICCPROFCREATOR_GAMMA;Gamma +ICCPROFCREATOR_ICCVERSION;ICC version: +ICCPROFCREATOR_ILL;Illuminant: +ICCPROFCREATOR_ILL_41;D41 +ICCPROFCREATOR_ILL_50;D50 +ICCPROFCREATOR_ILL_55;D55 +ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_65;D65 +ICCPROFCREATOR_ILL_80;D80 +ICCPROFCREATOR_ILL_DEF;Default +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +ICCPROFCREATOR_PRIMARIES;Primaries: +ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +ICCPROFCREATOR_PRIM_BEST;BestRGB +ICCPROFCREATOR_PRIM_BETA;BetaRGB +ICCPROFCREATOR_PRIM_BLUX;Blue X +ICCPROFCREATOR_PRIM_BLUY;Blue Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_GREX;Green X +ICCPROFCREATOR_PRIM_GREY;Green Y +ICCPROFCREATOR_PRIM_PROPH;Prophoto +ICCPROFCREATOR_PRIM_REC2020;Rec2020 +ICCPROFCREATOR_PRIM_REDX;Red X +ICCPROFCREATOR_PRIM_REDY;Red Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +ICCPROFCREATOR_PRIM_WIDEG;Widegamut +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +ICCPROFCREATOR_SLOPE;Slope +ICCPROFCREATOR_TRC_PRESET;Tone response curve: +IPTCPANEL_CATEGORY;Category +IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. +IPTCPANEL_CITY;City +IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. +IPTCPANEL_COPYHINT;Copy IPTC settings to clipboard. +IPTCPANEL_COPYRIGHT;Copyright notice +IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as ©2008 Jane Doe. +IPTCPANEL_COUNTRY;Country +IPTCPANEL_COUNTRYHINT;Enter the name of the country pictured in this image. +IPTCPANEL_CREATOR;Creator +IPTCPANEL_CREATORHINT;Enter the name of the person that created this image. +IPTCPANEL_CREATORJOBTITLE;Creator's job title +IPTCPANEL_CREATORJOBTITLEHINT;Enter the Job Title of the person listed in the Creator field. +IPTCPANEL_CREDIT;Credit line +IPTCPANEL_CREDITHINT;Enter who should be credited when this image is published. +IPTCPANEL_DATECREATED;Date created +IPTCPANEL_DATECREATEDHINT;Enter the Date the image was taken. +IPTCPANEL_DESCRIPTION;Description +IPTCPANEL_DESCRIPTIONHINT;Enter a "caption" describing the who, what, and why of what is happening in this image, this might include names of people, and/or their role in the action that is taking place within the image. +IPTCPANEL_DESCRIPTIONWRITER;Description writer +IPTCPANEL_DESCRIPTIONWRITERHINT;Enter the name of the person involved in writing, editing or correcting the description of the image. +IPTCPANEL_EMBEDDED;Embedded +IPTCPANEL_EMBEDDEDHINT;Reset to IPTC data embedded in the image file. +IPTCPANEL_HEADLINE;Headline +IPTCPANEL_HEADLINEHINT;Enter a brief publishable synopsis or summary of the contents of the image. +IPTCPANEL_INSTRUCTIONS;Instructions +IPTCPANEL_INSTRUCTIONSHINT;Enter information about embargoes, or other restrictions not covered by the Copyright field. +IPTCPANEL_KEYWORDS;Keywords +IPTCPANEL_KEYWORDSHINT;Enter any number of keywords, terms or phrases used to express the subject matter in the image. +IPTCPANEL_PASTEHINT;Paste IPTC settings from clipboard. +IPTCPANEL_PROVINCE;Province or state +IPTCPANEL_PROVINCEHINT;Enter the name of the province or state pictured in this image. +IPTCPANEL_RESET;Reset +IPTCPANEL_RESETHINT;Reset to profile default. +IPTCPANEL_SOURCE;Source +IPTCPANEL_SOURCEHINT;Enter or edit the name of a person or party who has a role in the content supply chain, such as a person or entity from whom you received this image from. +IPTCPANEL_SUPPCATEGORIES;Supplemental categories +IPTCPANEL_SUPPCATEGORIESHINT;Further refines the subject of the image. +IPTCPANEL_TITLE;Title +IPTCPANEL_TITLEHINT;Enter a short verbal and human readable name for the image, this may be the file name. +IPTCPANEL_TRANSREFERENCE;Job ID +IPTCPANEL_TRANSREFERENCEHINT;Enter a number or identifier needed for workflow control or tracking. +MAIN_BUTTON_FULLSCREEN;Fullscreen +MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator +MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 +MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 +MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). +MAIN_BUTTON_PREFERENCES;Preferences +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b +MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s +MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e +MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m +MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen +MAIN_FRAME_EDITOR;Editor +MAIN_FRAME_EDITOR_TOOLTIP;Editor.\nShortcut: Ctrl-F4 +MAIN_FRAME_FILEBROWSER;File Browser +MAIN_FRAME_FILEBROWSER_TOOLTIP;File browser.\nShortcut: Ctrl-F2 +MAIN_FRAME_PLACES;Places +MAIN_FRAME_PLACES_ADD;Add +MAIN_FRAME_PLACES_DEL;Remove +MAIN_FRAME_QUEUE;Queue +MAIN_FRAME_QUEUE_TOOLTIP;Processing queue.\nShortcut: Ctrl-F3 +MAIN_FRAME_RECENT;Recent Folders +MAIN_MSG_ALREADYEXISTS;File already exists. +MAIN_MSG_CANNOTLOAD;Cannot load image +MAIN_MSG_CANNOTSAVE;File saving error +MAIN_MSG_CANNOTSTARTEDITOR;Cannot start editor. +MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Please set the correct path in Preferences. +MAIN_MSG_EMPTYFILENAME;Filename unspecified! +MAIN_MSG_IMAGEUNPROCESSED;This command requires all selected images to be queue-processed first. +MAIN_MSG_NAVIGATOR;Navigator +MAIN_MSG_OPERATIONCANCELLED;Operation cancelled +MAIN_MSG_PATHDOESNTEXIST;The path\n\n%1\n\ndoes not exist. Please set a correct path in Preferences. +MAIN_MSG_QOVERWRITE;Do you want to overwrite it? +MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! +MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. +MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +MAIN_TAB_ADVANCED;Advanced +MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a +MAIN_TAB_COLOR;Color +MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c +MAIN_TAB_DETAIL;Detail +MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d +MAIN_TAB_DEVELOP; Batch Edit +MAIN_TAB_EXIF;Exif +MAIN_TAB_EXPORT; Fast Export +MAIN_TAB_EXPOSURE;Exposure +MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +MAIN_TAB_FAVORITES;Favorites +MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u +MAIN_TAB_FILTER; Filter +MAIN_TAB_INSPECT; Inspect +MAIN_TAB_IPTC;IPTC +MAIN_TAB_LOCALLAB;Local +MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o +MAIN_TAB_METADATA;Metadata +MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m +MAIN_TAB_RAW;Raw +MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r +MAIN_TAB_TRANSFORM;Transform +MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t +MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: theme-based\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: black\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: white\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 +MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool. +MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: l +MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: > +MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: < +MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +MAIN_TOOLTIP_PREVIEWG;Preview the green channel.\nShortcut: g +MAIN_TOOLTIP_PREVIEWL;Preview the luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B +MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. +MAIN_TOOLTIP_QINFO;Quick info on the image.\nShortcut: i +MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l +MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l +MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l +MAIN_TOOLTIP_THRESHOLD;Threshold +MAIN_TOOLTIP_TOGGLE;Toggle the Before/After view.\nShortcut: Shift-b +MONITOR_PROFILE_SYSTEM;System default +NAVIGATOR_B;B: +NAVIGATOR_G;G: +NAVIGATOR_H;H: +NAVIGATOR_LAB_A;a*: +NAVIGATOR_LAB_B;b*: +NAVIGATOR_LAB_L;L*: +NAVIGATOR_NA; -- +NAVIGATOR_R;R: +NAVIGATOR_S;S: +NAVIGATOR_V;V: +NAVIGATOR_XY_FULL;Width: %1, Height: %2 +NAVIGATOR_XY_NA;x: --, y: -- +OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +PARTIALPASTE_ADVANCEDGROUP;Advanced Settings +PARTIALPASTE_BASICGROUP;Basic Settings +PARTIALPASTE_CACORRECTION;Chromatic aberration correction +PARTIALPASTE_CHANNELMIXER;Channel mixer +PARTIALPASTE_CHANNELMIXERBW;Black-and-white +PARTIALPASTE_COARSETRANS;Coarse rotation/flipping +PARTIALPASTE_COLORAPP;CIECAM02 +PARTIALPASTE_COLORGROUP;Color Related Settings +PARTIALPASTE_COLORTONING;Color toning +PARTIALPASTE_COMMONTRANSFORMPARAMS;Auto-fill +PARTIALPASTE_COMPOSITIONGROUP;Composition Settings +PARTIALPASTE_CROP;Crop +PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection +PARTIALPASTE_DARKFRAMEFILE;Dark-frame file +PARTIALPASTE_DEFRINGE;Defringe +PARTIALPASTE_DEHAZE;Haze removal +PARTIALPASTE_DETAILGROUP;Detail Settings +PARTIALPASTE_DIALOGLABEL;Partial paste processing profile +PARTIALPASTE_DIRPYRDENOISE;Noise reduction +PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels +PARTIALPASTE_DISTORTION;Distortion correction +PARTIALPASTE_EPD;Tone mapping +PARTIALPASTE_EQUALIZER;Wavelet levels +PARTIALPASTE_EVERYTHING;Everything +PARTIALPASTE_EXIFCHANGES;Exif +PARTIALPASTE_EXPOSURE;Exposure +PARTIALPASTE_FILMNEGATIVE;Film Negative +PARTIALPASTE_FILMSIMULATION;Film simulation +PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field auto-selection +PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field blur radius +PARTIALPASTE_FLATFIELDBLURTYPE;Flat-field blur type +PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control +PARTIALPASTE_FLATFIELDFILE;Flat-field file +PARTIALPASTE_GRADIENT;Graduated filter +PARTIALPASTE_HSVEQUALIZER;HSV equalizer +PARTIALPASTE_ICMSETTINGS;Color management settings +PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction +PARTIALPASTE_IPTCINFO;IPTC +PARTIALPASTE_LABCURVE;L*a*b* adjustments +PARTIALPASTE_LENSGROUP;Lens Related Settings +PARTIALPASTE_LENSPROFILE;Profiled lens correction +PARTIALPASTE_LOCALCONTRAST;Local contrast +PARTIALPASTE_LOCALLAB;Local Adjustments +PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +PARTIALPASTE_LOCGROUP;Local +PARTIALPASTE_METADATA;Metadata mode +PARTIALPASTE_METAGROUP;Metadata settings +PARTIALPASTE_PCVIGNETTE;Vignette filter +PARTIALPASTE_PERSPECTIVE;Perspective +PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter +PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration +PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter +PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +PARTIALPASTE_PREPROCWB;Preprocess White Balance +PARTIALPASTE_PRSHARPENING;Post-resize sharpening +PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift +PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue +PARTIALPASTE_RAWEXPOS_BLACK;Black levels +PARTIALPASTE_RAWEXPOS_LINEAR;White point correction +PARTIALPASTE_RAWGROUP;Raw Settings +PARTIALPASTE_RAW_BORDER;Raw border +PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement +PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations +PARTIALPASTE_RAW_DMETHOD;Demosaic method +PARTIALPASTE_RAW_FALSECOLOR;False color suppression +PARTIALPASTE_RAW_IMAGENUM;Sub-image +PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps +PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift +PARTIALPASTE_RESIZE;Resize +PARTIALPASTE_RETINEX;Retinex +PARTIALPASTE_RGBCURVES;RGB curves +PARTIALPASTE_ROTATION;Rotation +PARTIALPASTE_SHADOWSHIGHLIGHTS;Shadows/highlights +PARTIALPASTE_SHARPENEDGE;Edges +PARTIALPASTE_SHARPENING;Sharpening (USM/RL) +PARTIALPASTE_SHARPENMICRO;Microcontrast +PARTIALPASTE_SOFTLIGHT;Soft light +PARTIALPASTE_TM_FATTAL;Dynamic range compression +PARTIALPASTE_VIBRANCE;Vibrance +PARTIALPASTE_VIGNETTING;Vignetting correction +PARTIALPASTE_WHITEBALANCE;White balance +PREFERENCES_ADD;Add +PREFERENCES_APPEARANCE;Appearance +PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +PREFERENCES_APPEARANCE_MAINFONT;Main font +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode +PREFERENCES_APPEARANCE_THEME;Theme +PREFERENCES_APPLNEXTSTARTUP;restart required +PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile +PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit +PREFERENCES_BATCH_PROCESSING;Batch Processing +PREFERENCES_BEHADDALL;All to 'Add' +PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. +PREFERENCES_BEHAVIOR;Behavior +PREFERENCES_BEHSETALL;All to 'Set' +PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. +PREFERENCES_CACHECLEAR;Clear +PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. +PREFERENCES_CACHEMAXENTRIES;Maximum number of cache entries +PREFERENCES_CACHEOPTS;Cache Options +PREFERENCES_CACHETHUMBHEIGHT;Maximum thumbnail height +PREFERENCES_CHUNKSIZES;Tiles per thread +PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaic +PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA correction +PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic +PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic +PREFERENCES_CHUNKSIZE_RGB;RGB processing +PREFERENCES_CLIPPINGIND;Clipping Indication +PREFERENCES_CLUTSCACHE;HaldCLUT Cache +PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs +PREFERENCES_CLUTSDIR;HaldCLUT directory +PREFERENCES_CMMBPC;Black point compensation +PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +PREFERENCES_COMPLEXITY_EXP;Advanced +PREFERENCES_COMPLEXITY_NORM;Standard +PREFERENCES_COMPLEXITY_SIMP;Basic +PREFERENCES_CROP;Crop Editing +PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop +PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +PREFERENCES_CROP_GUIDES_FRAME;Frame +PREFERENCES_CROP_GUIDES_FULL;Original +PREFERENCES_CROP_GUIDES_NONE;None +PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons +PREFERENCES_CURVEBBOXPOS_ABOVE;Above +PREFERENCES_CURVEBBOXPOS_BELOW;Below +PREFERENCES_CURVEBBOXPOS_LEFT;Left +PREFERENCES_CURVEBBOXPOS_RIGHT;Right +PREFERENCES_CUSTPROFBUILD;Custom Processing Profile Builder +PREFERENCES_CUSTPROFBUILDHINT;Executable (or script) file called when a new initial processing profile should be generated for an image.\n\nThe path of the communication file (*.ini style, a.k.a. "Keyfile") is added as a command line parameter. It contains various parameters required for the scripts and image Exif to allow a rules-based processing profile generation.\n\nWARNING: You are responsible for using double quotes where necessary if you're using paths containing spaces. +PREFERENCES_CUSTPROFBUILDKEYFORMAT;Keys format +PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name +PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID +PREFERENCES_CUSTPROFBUILDPATH;Executable path +PREFERENCES_DARKFRAMEFOUND;Found +PREFERENCES_DARKFRAMESHOTS;shots +PREFERENCES_DARKFRAMETEMPLATES;templates +PREFERENCES_DATEFORMAT;Date format +PREFERENCES_DATEFORMATHINT;You can use the following formatting strings:\n%y - year\n%m - month\n%d - day\n\nFor example, the ISO 8601 standard dictates the date format as follows:\n%y-%m-%d +PREFERENCES_DIRDARKFRAMES;Dark-frames directory +PREFERENCES_DIRECTORIES;Directories +PREFERENCES_DIRHOME;Home directory +PREFERENCES_DIRLAST;Last visited directory +PREFERENCES_DIROTHER;Other +PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... +PREFERENCES_DIRSOFTWARE;Installation directory +PREFERENCES_EDITORCMDLINE;Custom command line +PREFERENCES_EDITORLAYOUT;Editor layout +PREFERENCES_EXTERNALEDITOR;External Editor +PREFERENCES_FBROWSEROPTS;File Browser / Thumbnail Options +PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser +PREFERENCES_FLATFIELDFOUND;Found +PREFERENCES_FLATFIELDSDIR;Flat-fields directory +PREFERENCES_FLATFIELDSHOTS;shots +PREFERENCES_FLATFIELDTEMPLATES;templates +PREFERENCES_FORIMAGE;For non-raw photos +PREFERENCES_FORRAW;For raw photos +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser. +PREFERENCES_GIMPPATH;GIMP installation directory +PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogram in left panel +PREFERENCES_HISTOGRAM_TOOLTIP;If enabled, the working profile is used for rendering the main histogram and the Navigator panel, otherwise the gamma-corrected output profile is used. +PREFERENCES_HLTHRESHOLD;Threshold for clipped highlights +PREFERENCES_ICCDIR;Directory containing color profiles +PREFERENCES_IMPROCPARAMS;Default Processing Profile +PREFERENCES_INSPECT_LABEL;Inspect +PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Maximum number of cached images +PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Set the maximum number of images stored in cache when hovering over them in the File Browser; systems with little RAM (2GB) should keep this value set to 1 or 2. +PREFERENCES_INTENT_ABSOLUTE;Absolute Colorimetric +PREFERENCES_INTENT_PERCEPTUAL;Perceptual +PREFERENCES_INTENT_RELATIVE;Relative Colorimetric +PREFERENCES_INTENT_SATURATION;Saturation +PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited +PREFERENCES_LANG;Language +PREFERENCES_LANGAUTODETECT;Use system language +PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders +PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" +PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" +PREFERENCES_MENUGROUPLABEL;Group "Color label" +PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing profile operations" +PREFERENCES_MENUGROUPRANK;Group "Rank" +PREFERENCES_MENUOPTIONS;Context Menu Options +PREFERENCES_MONINTENT;Default rendering intent +PREFERENCES_MONITOR;Monitor +PREFERENCES_MONPROFILE;Default color profile +PREFERENCES_MONPROFILE_WARNOSX;Due to MacOS limitations, only sRGB is supported. +PREFERENCES_MULTITAB;Multiple Editor Tabs Mode +PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode +PREFERENCES_NAVIGATIONFRAME;Navigation +PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser +PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel +PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files +PREFERENCES_PANFACTORLABEL;Pan rate amplification +PREFERENCES_PARSEDEXT;Parsed Extensions +PREFERENCES_PARSEDEXTADD;Add extension +PREFERENCES_PARSEDEXTADDHINT;Add entered extension to the list. +PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list. +PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. +PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +PREFERENCES_PERFORMANCE_MEASURE;Measure +PREFERENCES_PERFORMANCE_MEASURE_HINT;Logs processing times in console +PREFERENCES_PERFORMANCE_THREADS;Threads +PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) +PREFERENCES_PREVDEMO;Preview Demosaic Method +PREFERENCES_PREVDEMO_FAST;Fast +PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: +PREFERENCES_PREVDEMO_SIDECAR;As in PP3 +PREFERENCES_PRINTER;Printer (Soft-Proofing) +PREFERENCES_PROFILEHANDLING;Processing Profile Handling +PREFERENCES_PROFILELOADPR;Processing profile loading priority +PREFERENCES_PROFILEPRCACHE;Profile in cache +PREFERENCES_PROFILEPRFILE;Profile next to the input file +PREFERENCES_PROFILESAVEBOTH;Save processing profile both to the cache and next to the input file +PREFERENCES_PROFILESAVECACHE;Save processing profile to the cache +PREFERENCES_PROFILESAVEINPUT;Save processing profile next to the input file +PREFERENCES_PROFILESAVELOCATION;Processing profile saving location +PREFERENCES_PROFILE_NONE;None +PREFERENCES_PROPERTY;Property +PREFERENCES_PRTINTENT;Rendering intent +PREFERENCES_PRTPROFILE;Color profile +PREFERENCES_PSPATH;Adobe Photoshop installation directory +PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset +PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". +PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +PREFERENCES_SELECTLANG;Select language +PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. +PREFERENCES_SET;Set +PREFERENCES_SHOWBASICEXIF;Show basic Exif info +PREFERENCES_SHOWDATETIME;Show date and time +PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation +PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar +PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows +PREFERENCES_SINGLETAB;Single Editor Tab Mode +PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs +PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. +PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done +PREFERENCES_SND_QUEUEDONE;Queue processing done +PREFERENCES_SND_THRESHOLDSECS;After seconds +PREFERENCES_STARTUPIMDIR;Image Directory at Startup +PREFERENCES_TAB_BROWSER;File Browser +PREFERENCES_TAB_COLORMGR;Color Management +PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules +PREFERENCES_TAB_GENERAL;General +PREFERENCES_TAB_IMPROC;Image Processing +PREFERENCES_TAB_PERFORMANCE;Performance +PREFERENCES_TAB_SOUND;Sounds +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise +PREFERENCES_TP_LABEL;Tool panel: +PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar +PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles +PREFERENCES_WORKFLOW;Layout +PROFILEPANEL_COPYPPASTE;Parameters to copy +PROFILEPANEL_GLOBALPROFILES;Bundled profiles +PROFILEPANEL_LABEL;Processing Profiles +PROFILEPANEL_LOADDLGLABEL;Load Processing Parameters... +PROFILEPANEL_LOADPPASTE;Parameters to load +PROFILEPANEL_MODE_TIP;Processing profile fill mode.\n\nButton pressed: partial profiles will be converted to full profiles; the missing values will be replaced with hard-coded defaults.\n\nButton released: profiles will be applied as they are, altering only those values which they contain. +PROFILEPANEL_MYPROFILES;My profiles +PROFILEPANEL_PASTEPPASTE;Parameters to paste +PROFILEPANEL_PCUSTOM;Custom +PROFILEPANEL_PDYNAMIC;Dynamic +PROFILEPANEL_PFILE;From file +PROFILEPANEL_PINTERNAL;Neutral +PROFILEPANEL_PLASTSAVED;Last Saved +PROFILEPANEL_SAVEDLGLABEL;Save Processing Parameters... +PROFILEPANEL_SAVEPPASTE;Parameters to save +PROFILEPANEL_TOOLTIPCOPY;Copy current processing profile to clipboard.\nCtrl-click to select the parameters to copy. +PROFILEPANEL_TOOLTIPLOAD;Load a profile from file.\nCtrl-click to select the parameters to load. +PROFILEPANEL_TOOLTIPPASTE;Paste profile from clipboard.\nCtrl-click to select the parameters to paste. +PROFILEPANEL_TOOLTIPSAVE;Save current profile.\nCtrl-click to select the parameters to save. +PROGRESSBAR_DECODING;Decoding... +PROGRESSBAR_GREENEQUIL;Green equilibration... +PROGRESSBAR_HLREC;Highlight reconstruction... +PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... +PROGRESSBAR_LINEDENOISE;Line noise filter... +PROGRESSBAR_LOADING;Loading image... +PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... +PROGRESSBAR_LOADJPEG;Loading JPEG file... +PROGRESSBAR_LOADPNG;Loading PNG file... +PROGRESSBAR_LOADTIFF;Loading TIFF file... +PROGRESSBAR_NOIMAGES;No images found +PROGRESSBAR_PROCESSING;Processing image... +PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved +PROGRESSBAR_RAWCACORR;Raw CA correction... +PROGRESSBAR_READY;Ready +PROGRESSBAR_SAVEJPEG;Saving JPEG file... +PROGRESSBAR_SAVEPNG;Saving PNG file... +PROGRESSBAR_SAVETIFF;Saving TIFF file... +PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added +PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +QINFO_FRAMECOUNT;%2 frames +QINFO_HDR;HDR / %2 frame(s) +QINFO_ISO;ISO +QINFO_NOEXIF;Exif data not available. +QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +QUEUE_AUTOSTART;Auto-start +QUEUE_AUTOSTART_TOOLTIP;Start processing automatically when a new job arrives. +QUEUE_DESTFILENAME;Path and file name +QUEUE_FORMAT_TITLE;File Format +QUEUE_LOCATION_FOLDER;Save to folder +QUEUE_LOCATION_TEMPLATE;Use template +QUEUE_LOCATION_TEMPLATE_TOOLTIP;Specify the output location based on the source photo's location, rank, trash status or position in the queue.\n\nUsing the following pathname as an example:\n/home/tom/photos/2010-10-31/photo1.raw\nthe meaning of the formatting strings follows:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = photo1\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\n%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used.\n\n%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'.\n\nIf you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p2/converted/%d1/%f +QUEUE_LOCATION_TITLE;Output Location +QUEUE_STARTSTOP_TOOLTIP;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s +SAMPLEFORMAT_0;Unknown data format +SAMPLEFORMAT_1;8-bit unsigned +SAMPLEFORMAT_2;16-bit unsigned +SAMPLEFORMAT_4;24-bit LogLuv +SAMPLEFORMAT_8;32-bit LogLuv +SAMPLEFORMAT_16;16-bit floating-point +SAMPLEFORMAT_32;24-bit floating-point +SAMPLEFORMAT_64;32-bit floating-point +SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists +SAVEDLG_FILEFORMAT;File format +SAVEDLG_FILEFORMAT_FLOAT; floating-point +SAVEDLG_FORCEFORMATOPTS;Force saving options +SAVEDLG_JPEGQUAL;JPEG quality +SAVEDLG_PUTTOQUEUE;Put into processing queue +SAVEDLG_PUTTOQUEUEHEAD;Put to the head of the processing queue +SAVEDLG_PUTTOQUEUETAIL;Put to the end of the processing queue +SAVEDLG_SAVEIMMEDIATELY;Save immediately +SAVEDLG_SAVESPP;Save processing parameters with image +SAVEDLG_SUBSAMP;Subsampling +SAVEDLG_SUBSAMP_1;Best compression +SAVEDLG_SUBSAMP_2;Balanced +SAVEDLG_SUBSAMP_3;Best quality +SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. +SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF +SAVEDLG_WARNFILENAME;File will be named +SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. +SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. +THRESHOLDSELECTOR_B;Bottom +THRESHOLDSELECTOR_BL;Bottom-left +THRESHOLDSELECTOR_BR;Bottom-right +THRESHOLDSELECTOR_HINT;Hold the Shift key to move individual control points. +THRESHOLDSELECTOR_T;Top +THRESHOLDSELECTOR_TL;Top-left +THRESHOLDSELECTOR_TR;Top-right +TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. +TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop using Shift+mouse drag. +TOOLBAR_TOOLTIP_HAND;Hand tool.\nShortcut: h +TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image preview. Angle of rotation will be shown next to the guide line. Center of rotation is the geometrical center of the image. +TOOLBAR_TOOLTIP_WB;Spot white balance.\nShortcut: w +TP_BWMIX_ALGO;Algorithm OYCPM +TP_BWMIX_ALGO_LI;Linear +TP_BWMIX_ALGO_SP;Special effects +TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. +TP_BWMIX_AUTOCH;Auto +TP_BWMIX_CC_ENABLED;Adjust complementary color +TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. +TP_BWMIX_CHANNEL;Luminance equalizer +TP_BWMIX_CURVEEDITOR1;'Before' curve +TP_BWMIX_CURVEEDITOR2;'After' curve +TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Tone curve, after B&W conversion, at the end of treatment. +TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Tone curve, just before B&W conversion.\nMay take into account the color components. +TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H).\nPay attention to extreme values as they may cause artifacts. +TP_BWMIX_FILTER;Color Filter +TP_BWMIX_FILTER_BLUE;Blue +TP_BWMIX_FILTER_BLUEGREEN;Blue-Green +TP_BWMIX_FILTER_GREEN;Green +TP_BWMIX_FILTER_GREENYELLOW;Green-Yellow +TP_BWMIX_FILTER_NONE;None +TP_BWMIX_FILTER_PURPLE;Purple +TP_BWMIX_FILTER_RED;Red +TP_BWMIX_FILTER_REDYELLOW;Red-Yellow +TP_BWMIX_FILTER_TOOLTIP;The color filter simulates shots taken with a colored filter placed in front of the lens. Colored filters reduce the transmission of specific color ranges and therefore affect their lightness. E.g. a red filter darkens blue skies. +TP_BWMIX_FILTER_YELLOW;Yellow +TP_BWMIX_GAMMA;Gamma Correction +TP_BWMIX_GAM_TOOLTIP;Correct gamma for each RGB channel. +TP_BWMIX_LABEL;Black-and-White +TP_BWMIX_MET;Method +TP_BWMIX_MET_CHANMIX;Channel Mixer +TP_BWMIX_MET_DESAT;Desaturation +TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer +TP_BWMIX_MIXC;Channel Mixer +TP_BWMIX_NEUTRAL;Reset +TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% +TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. +TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. +TP_BWMIX_SETTING;Presets +TP_BWMIX_SETTING_TOOLTIP;Different presets (film, landscape, etc.) or manual Channel Mixer settings. +TP_BWMIX_SET_HIGHCONTAST;High contrast +TP_BWMIX_SET_HIGHSENSIT;High Sensitivity +TP_BWMIX_SET_HYPERPANCHRO;Hyper Panchromatic +TP_BWMIX_SET_INFRARED;Infrared +TP_BWMIX_SET_LANDSCAPE;Landscape +TP_BWMIX_SET_LOWSENSIT;Low Sensitivity +TP_BWMIX_SET_LUMINANCE;Luminance +TP_BWMIX_SET_NORMCONTAST;Normal Contrast +TP_BWMIX_SET_ORTHOCHRO;Orthochromatic +TP_BWMIX_SET_PANCHRO;Panchromatic +TP_BWMIX_SET_PORTRAIT;Portrait +TP_BWMIX_SET_RGBABS;Absolute RGB +TP_BWMIX_SET_RGBREL;Relative RGB +TP_BWMIX_SET_ROYGCBPMABS;Absolute ROYGCBPM +TP_BWMIX_SET_ROYGCBPMREL;Relative ROYGCBPM +TP_BWMIX_TCMODE_FILMLIKE;B&W Film-like +TP_BWMIX_TCMODE_SATANDVALBLENDING;B&W Saturation and Value Blending +TP_BWMIX_TCMODE_STANDARD;B&W Standard +TP_BWMIX_TCMODE_WEIGHTEDSTD;B&W Weighted Standard +TP_BWMIX_VAL;L +TP_CACORRECTION_BLUE;Blue +TP_CACORRECTION_LABEL;Chromatic Aberration Correction +TP_CACORRECTION_RED;Red +TP_CBDL_AFT;After Black-and-White +TP_CBDL_BEF;Before Black-and-White +TP_CBDL_METHOD;Process located +TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. +TP_CHMIXER_BLUE;Blue channel +TP_CHMIXER_GREEN;Green channel +TP_CHMIXER_LABEL;Channel Mixer +TP_CHMIXER_RED;Red channel +TP_COARSETRAF_TOOLTIP_HFLIP;Flip horizontally. +TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Editor Tabs Mode,\nAlt-[ - Single Editor Tab Mode. +TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode. +TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically. +TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance +TP_COLORAPP_ALGO;Algorithm +TP_COLORAPP_ALGO_ALL;All +TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) +TP_COLORAPP_ALGO_JS;Lightness + Saturation (JS) +TP_COLORAPP_ALGO_QM;Brightness + Colorfulness (QM) +TP_COLORAPP_ALGO_TOOLTIP;Lets you choose between parameter subsets or all parameters. +TP_COLORAPP_BADPIXSL;Hot/bad pixel filter +TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. +TP_COLORAPP_BRIGHT;Brightness (Q) +TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. +TP_COLORAPP_CHROMA;Chroma (C) +TP_COLORAPP_CHROMA_M;Colorfulness (M) +TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. +TP_COLORAPP_CHROMA_S;Saturation (S) +TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. +TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 differs from L*a*b* and RGB chroma. +TP_COLORAPP_CIECAT_DEGREE;CAT02 adaptation +TP_COLORAPP_CONTRAST;Contrast (J) +TP_COLORAPP_CONTRAST_Q;Contrast (Q) +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Differs from L*a*b* and RGB contrast. +TP_COLORAPP_CONTRAST_TOOLTIP;Differs from L*a*b* and RGB contrast. +TP_COLORAPP_CURVEEDITOR1;Tone curve 1 +TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of J or Q after CIECAM02.\n\nJ and Q are not shown in the main histogram panel.\n\nFor final output refer to the main histogram panel. +TP_COLORAPP_CURVEEDITOR2;Tone curve 2 +TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Same usage as with the second exposure tone curve. +TP_COLORAPP_CURVEEDITOR3;Color curve +TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. +TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves +TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. +TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] +TP_COLORAPP_GAMUT;Gamut control (L*a*b*) +TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. +TP_COLORAPP_HUE;Hue (h) +TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. +TP_COLORAPP_IL41;D41 +TP_COLORAPP_IL50;D50 +TP_COLORAPP_IL55;D55 +TP_COLORAPP_IL60;D60 +TP_COLORAPP_IL65;D65 +TP_COLORAPP_IL75;D75 +TP_COLORAPP_ILA;Incandescent StdA 2856K +TP_COLORAPP_ILFREE;Free +TP_COLORAPP_ILLUM;Illuminant +TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and lattitude. +TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 +TP_COLORAPP_LABEL_CAM02;Image Adjustments +TP_COLORAPP_LABEL_SCENE;Scene Conditions +TP_COLORAPP_LABEL_VIEWING;Viewing Conditions +TP_COLORAPP_LIGHT;Lightness (J) +TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) +TP_COLORAPP_MODEL;WP Model +TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. +TP_COLORAPP_NEUTRAL;Reset +TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values +TP_COLORAPP_PRESETCAT02;Preset cat02 automatic +TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou can change illuminant shooting conditions.\nYou must change Cat02 adaptation Viewing conditions if need.\nYou can change Temperature and Tint Viewing conditions if need, and other settings if need. +TP_COLORAPP_RSTPRO;Red & skin-tones protection +TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. +TP_COLORAPP_SURROUND;Surround +TP_COLORAPP_SURROUND_AVER;Average +TP_COLORAPP_SURROUND_DARK;Dark +TP_COLORAPP_SURROUND_DIM;Dim +TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) +TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. +TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness +TP_COLORAPP_TCMODE_CHROMA;Chroma +TP_COLORAPP_TCMODE_COLORF;Colorfulness +TP_COLORAPP_TCMODE_LABEL1;Curve mode 1 +TP_COLORAPP_TCMODE_LABEL2;Curve mode 2 +TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode +TP_COLORAPP_TCMODE_LIGHTNESS;Lightness +TP_COLORAPP_TCMODE_SATUR;Saturation +TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TEMPOUT_TOOLTIP;Disable to change temperature and tint +TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 +TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). +TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] +TP_COLORAPP_WBRT;WB [RT] + [output] +TP_COLORTONING_AB;o C/L +TP_COLORTONING_AUTOSAT;Automatic +TP_COLORTONING_BALANCE;Balance +TP_COLORTONING_BY;o C/L +TP_COLORTONING_CHROMAC;Opacity +TP_COLORTONING_COLOR;Color +TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Chroma opacity as a function of luminance oC=f(L) +TP_COLORTONING_HIGHLIGHT;Highlights +TP_COLORTONING_HUE;Hue +TP_COLORTONING_LAB;L*a*b* blending +TP_COLORTONING_LABEL;Color Toning +TP_COLORTONING_LABGRID;L*a*b* color correction grid +TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +TP_COLORTONING_LABREGIONS;Color correction regions +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHANNEL;Channel +TP_COLORTONING_LABREGION_CHANNEL_ALL;All +TP_COLORTONING_LABREGION_CHANNEL_B;Blue +TP_COLORTONING_LABREGION_CHANNEL_G;Green +TP_COLORTONING_LABREGION_CHANNEL_R;Red +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;H +TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Correction +TP_COLORTONING_LABREGION_MASK;Mask +TP_COLORTONING_LABREGION_MASKBLUR;Blur Mask +TP_COLORTONING_LABREGION_OFFSET;Offset +TP_COLORTONING_LABREGION_POWER;Power +TP_COLORTONING_LABREGION_SATURATION;Saturation +TP_COLORTONING_LABREGION_SHOWMASK;Show mask +TP_COLORTONING_LABREGION_SLOPE;Slope +TP_COLORTONING_LUMA;Luminance +TP_COLORTONING_LUMAMODE;Preserve luminance +TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. +TP_COLORTONING_METHOD;Method +TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* blending", "RGB sliders" and "RGB curves" use interpolated color blending.\n"Color balance (Shadows/Midtones/Highlights)" and "Saturation 2 colors" use direct colors.\n\nThe Black-and-White tool can be enabled when using any color toning method, which allows for color toning. +TP_COLORTONING_MIDTONES;Midtones +TP_COLORTONING_NEUTRAL;Reset sliders +TP_COLORTONING_NEUTRAL_TIP;Reset all values (Shadows, Midtones, Highlights) to default. +TP_COLORTONING_OPACITY;Opacity +TP_COLORTONING_RGBCURVES;RGB - Curves +TP_COLORTONING_RGBSLIDERS;RGB - Sliders +TP_COLORTONING_SA;Saturation Protection +TP_COLORTONING_SATURATEDOPACITY;Strength +TP_COLORTONING_SATURATIONTHRESHOLD;Threshold +TP_COLORTONING_SHADOWS;Shadows +TP_COLORTONING_SPLITCO;Shadows/Midtones/Highlights +TP_COLORTONING_SPLITCOCO;Color Balance Shadows/Midtones/Highlights +TP_COLORTONING_SPLITLR;Saturation 2 colors +TP_COLORTONING_STR;Strength +TP_COLORTONING_STRENGTH;Strength +TP_COLORTONING_TWO2;Special chroma '2 colors' +TP_COLORTONING_TWOALL;Special chroma +TP_COLORTONING_TWOBY;Special a* and b* +TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. +TP_COLORTONING_TWOSTD;Standard chroma +TP_CROP_FIXRATIO;Lock ratio +TP_CROP_GTDIAGONALS;Rule of Diagonals +TP_CROP_GTEPASSPORT;Biometric Passport +TP_CROP_GTFRAME;Frame +TP_CROP_GTGRID;Grid +TP_CROP_GTHARMMEANS;Harmonic Means +TP_CROP_GTNONE;None +TP_CROP_GTRULETHIRDS;Rule of Thirds +TP_CROP_GTTRIANGLE1;Golden Triangles 1 +TP_CROP_GTTRIANGLE2;Golden Triangles 2 +TP_CROP_GUIDETYPE;Guide type: +TP_CROP_H;Height +TP_CROP_LABEL;Crop +TP_CROP_PPI;PPI +TP_CROP_RESETCROP;Reset +TP_CROP_SELECTCROP;Select +TP_CROP_W;Width +TP_CROP_X;Left +TP_CROP_Y;Top +TP_DARKFRAME_AUTOSELECT;Auto-selection +TP_DARKFRAME_LABEL;Dark-Frame +TP_DEFRINGE_LABEL;Defringe +TP_DEFRINGE_RADIUS;Radius +TP_DEFRINGE_THRESHOLD;Threshold +TP_DEHAZE_DEPTH;Depth +TP_DEHAZE_LABEL;Haze Removal +TP_DEHAZE_LUMINANCE;Luminance only +TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map +TP_DEHAZE_STRENGTH;Strength +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green +TP_DIRPYRDENOISE_LABEL;Noise Reduction +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +TP_DIRPYRDENOISE_MAIN_MODE;Mode +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 +TP_DIRPYREQUALIZER_ALGO;Skin Color Range +TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. +TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts +TP_DIRPYREQUALIZER_HUESKIN;Skin hue +TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;This pyramid is for the upper part, so far as the algorithm at its maximum efficiency.\nTo the lower part, the transition zones.\nIf you need to move the area significantly to the left or right - or if there are artifacts: the white balance is incorrect\nYou can slightly reduce the zone to prevent the rest of the image is affected. +TP_DIRPYREQUALIZER_LABEL;Contrast by Detail Levels +TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast - +TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast + +TP_DIRPYREQUALIZER_LUMAFINEST;Finest +TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +TP_DIRPYREQUALIZER_SKIN;Skin targetting/protection +TP_DIRPYREQUALIZER_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. +TP_DIRPYREQUALIZER_THRESHOLD;Threshold +TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colors (hue, chroma, luma) and the rest of the image. +TP_DISTORTION_AMOUNT;Amount +TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. +TP_DISTORTION_LABEL;Distortion Correction +TP_EPD_EDGESTOPPING;Edge stopping +TP_EPD_GAMMA;Gamma +TP_EPD_LABEL;Tone Mapping +TP_EPD_REWEIGHTINGITERATES;Reweighting iterates +TP_EPD_SCALE;Scale +TP_EPD_STRENGTH;Strength +TP_EXPOSURE_AUTOLEVELS;Auto Levels +TP_EXPOSURE_AUTOLEVELS_TIP;Toggles execution of Auto Levels to automatically set Exposure slider values based on an image analysis.\nEnables Highlight Reconstruction if necessary. +TP_EXPOSURE_BLACKLEVEL;Black +TP_EXPOSURE_BRIGHTNESS;Lightness +TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors +TP_EXPOSURE_CLIP;Clip % +TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. +TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight compression +TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold +TP_EXPOSURE_COMPRSHADOWS;Shadow compression +TP_EXPOSURE_CONTRAST;Contrast +TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 +TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 +TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +TP_EXPOSURE_EXPCOMP;Exposure compensation +TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. +TP_EXPOSURE_LABEL;Exposure +TP_EXPOSURE_SATURATION;Saturation +TP_EXPOSURE_TCMODE_FILMLIKE;Film-like +TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 +TP_EXPOSURE_TCMODE_LABEL2;Curve mode 2 +TP_EXPOSURE_TCMODE_LUMINANCE;Luminance +TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual +TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Saturation and Value Blending +TP_EXPOSURE_TCMODE_STANDARD;Standard +TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard +TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points +TP_EXPOS_WHITEPOINT_LABEL;Raw White Points +TP_FILMNEGATIVE_BLUE;Blue ratio +TP_FILMNEGATIVE_FILMBASE_PICK;Pick film base color +TP_FILMNEGATIVE_FILMBASE_TOOLTIP;Pick a spot of unexposed film (eg. the border between frames), to get the actual film base color values, and save them in the processing profile.\nThis makes it easy to get a more consistent color balance when batch-processing multiple pictures from the same roll.\nAlso use this when the converted image is extremely dark, bright, or color-unbalanced. +TP_FILMNEGATIVE_FILMBASE_VALUES;Film base RGB: +TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) +TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +TP_FILMNEGATIVE_LABEL;Film Negative +TP_FILMNEGATIVE_PICK;Pick neutral spots +TP_FILMNEGATIVE_RED;Red ratio +TP_FILMSIMULATION_LABEL;Film Simulation +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? +TP_FILMSIMULATION_STRENGTH;Strength +TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences +TP_FLATFIELD_AUTOSELECT;Auto-selection +TP_FLATFIELD_BLURRADIUS;Blur radius +TP_FLATFIELD_BLURTYPE;Blur type +TP_FLATFIELD_BT_AREA;Area +TP_FLATFIELD_BT_HORIZONTAL;Horizontal +TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal +TP_FLATFIELD_BT_VERTICAL;Vertical +TP_FLATFIELD_CLIPCONTROL;Clip control +TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. +TP_FLATFIELD_LABEL;Flat-Field +TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. +TP_GRADIENT_CENTER;Center +TP_GRADIENT_CENTER_X;Center X +TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values). +TP_GRADIENT_CENTER_Y;Center Y +TP_GRADIENT_CENTER_Y_TOOLTIP;Shift gradient up (negative values) or down (positive values). +TP_GRADIENT_DEGREE;Angle +TP_GRADIENT_DEGREE_TOOLTIP;Rotation angle in degrees. +TP_GRADIENT_FEATHER;Feather +TP_GRADIENT_FEATHER_TOOLTIP;Gradient width in percent of the image diagonal. +TP_GRADIENT_LABEL;Graduated Filter +TP_GRADIENT_STRENGTH;Strength +TP_GRADIENT_STRENGTH_TOOLTIP;Filter strength in stops. +TP_HLREC_BLEND;Blend +TP_HLREC_CIELAB;CIELab Blending +TP_HLREC_COLOR;Color Propagation +TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels. +TP_HLREC_LABEL;Highlight reconstruction +TP_HLREC_LUMINANCE;Luminance Recovery +TP_HLREC_METHOD;Method: +TP_HSVEQUALIZER_CHANNEL;Channel +TP_HSVEQUALIZER_HUE;H +TP_HSVEQUALIZER_LABEL;HSV Equalizer +TP_HSVEQUALIZER_SAT;S +TP_HSVEQUALIZER_VAL;V +TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure +TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. +TP_ICM_APPLYHUESATMAP;Base table +TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only available if the selected DCP has one. +TP_ICM_APPLYLOOKTABLE;Look table +TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only available if the selected DCP has one. +TP_ICM_BPC;Black Point Compensation +TP_ICM_DCPILLUMINANT;Illuminant +TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolated +TP_ICM_DCPILLUMINANT_TOOLTIP;Select which embedded DCP illuminant to employ. Default is "interpolated" which is a mix between the two based on white balance. The setting is only available if a dual-illuminant DCP with interpolation support is selected. +TP_ICM_INPUTCAMERA;Camera standard +TP_ICM_INPUTCAMERAICC;Auto-matched camera profile +TP_ICM_INPUTCAMERAICC_TOOLTIP;Use RawTherapee's camera-specific DCP or ICC input color profiles. These profiles are more precise than simpler matrix ones. They are not available for all cameras. These profiles are stored in the /iccprofiles/input and /dcpprofiles folders and are automatically retrieved based on a file name matching to the exact model name of the camera. +TP_ICM_INPUTCAMERA_TOOLTIP;Use a simple color matrix from dcraw, an enhanced RawTherapee version (whichever is available based on camera model) or one embedded in the DNG. +TP_ICM_INPUTCUSTOM;Custom +TP_ICM_INPUTCUSTOM_TOOLTIP;Select your own DCP/ICC color profile file for the camera. +TP_ICM_INPUTDLGLABEL;Select Input DCP/ICC Profile... +TP_ICM_INPUTEMBEDDED;Use embedded, if possible +TP_ICM_INPUTEMBEDDED_TOOLTIP;Use color profile embedded in non-raw files. +TP_ICM_INPUTNONE;No profile +TP_ICM_INPUTNONE_TOOLTIP;Use no input color profile at all.\nUse only in special cases. +TP_ICM_INPUTPROFILE;Input Profile +TP_ICM_LABEL;Color Management +TP_ICM_NOICM;No ICM: sRGB Output +TP_ICM_OUTPUTPROFILE;Output Profile +TP_ICM_PROFILEINTENT;Rendering Intent +TP_ICM_SAVEREFERENCE;Save Reference Image +TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance +TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. +TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. +TP_ICM_TONECURVE;Tone curve +TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +TP_ICM_WORKINGPROFILE;Working Profile +TP_ICM_WORKING_TRC;Tone response curve: +TP_ICM_WORKING_TRC_CUSTOM;Custom +TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_NONE;None +TP_ICM_WORKING_TRC_SLOPE;Slope +TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction +TP_IMPULSEDENOISE_THRESH;Threshold +TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction. +TP_LABCURVE_BRIGHTNESS;Lightness +TP_LABCURVE_CHROMATICITY;Chromaticity +TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100. +TP_LABCURVE_CONTRAST;Contrast +TP_LABCURVE_CURVEEDITOR;Luminance Curve +TP_LABCURVE_CURVEEDITOR_A_RANGE1;Green Saturated +TP_LABCURVE_CURVEEDITOR_A_RANGE2;Green Pastel +TP_LABCURVE_CURVEEDITOR_A_RANGE3;Red Pastel +TP_LABCURVE_CURVEEDITOR_A_RANGE4;Red Saturated +TP_LABCURVE_CURVEEDITOR_B_RANGE1;Blue Saturated +TP_LABCURVE_CURVEEDITOR_B_RANGE2;Blue Pastel +TP_LABCURVE_CURVEEDITOR_B_RANGE3;Yellow Pastel +TP_LABCURVE_CURVEEDITOR_B_RANGE4;Yellow Saturated +TP_LABCURVE_CURVEEDITOR_CC;CC +TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutral +TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Dull +TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel +TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturated +TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Chromaticity according to chromaticity C=f(C) +TP_LABCURVE_CURVEEDITOR_CH;CH +TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Chromaticity according to hue C=f(H) +TP_LABCURVE_CURVEEDITOR_CL;CL +TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Chromaticity according to luminance C=f(L) +TP_LABCURVE_CURVEEDITOR_HH;HH +TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Hue according to hue H=f(H) +TP_LABCURVE_CURVEEDITOR_LC;LC +TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminance according to chromaticity L=f(C) +TP_LABCURVE_CURVEEDITOR_LH;LH +TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H) +TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminance according to luminance L=f(L) +TP_LABCURVE_LABEL;L*a*b* Adjustments +TP_LABCURVE_LCREDSK;Restrict LC to red and skin-tones +TP_LABCURVE_LCREDSK_TIP;If enabled, the LC Curve affects only red and skin-tones.\nIf disabled, it applies to all tones. +TP_LABCURVE_RSTPROTECTION;Red and skin-tones protection +TP_LABCURVE_RSTPRO_TOOLTIP;Works on the Chromaticity slider and the CC curve. +TP_LENSGEOM_AUTOCROP;Auto-Crop +TP_LENSGEOM_FILL;Auto-fill +TP_LENSGEOM_LABEL;Lens / Geometry +TP_LENSGEOM_LIN;Linear +TP_LENSGEOM_LOG;Logarithmic +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected +TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +TP_LENSPROFILE_LABEL;Profiled Lens Correction +TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +TP_LENSPROFILE_MODE_HEADER;Lens Profile +TP_LENSPROFILE_USE_CA;Chromatic aberration +TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion +TP_LENSPROFILE_USE_HEADER;Correct +TP_LENSPROFILE_USE_VIGNETTING;Vignetting +TP_LOCALCONTRAST_AMOUNT;Amount +TP_LOCALCONTRAST_DARKNESS;Darkness level +TP_LOCALCONTRAST_LABEL;Local Contrast +TP_LOCALCONTRAST_LIGHTNESS;Lightness level +TP_LOCALCONTRAST_RADIUS;Radius +TP_LOCALLAB_ACTIV;Luminance only +TP_LOCALLAB_ACTIVSPOT;Enable Spot +TP_LOCALLAB_ADJ;Equalizer Blue-yellow Red-green +TP_LOCALLAB_ALL;All rubrics +TP_LOCALLAB_AMOUNT;Amount +TP_LOCALLAB_ARTIF;Shape detection +//TP_LOCALLAB_ARTIF_TOOLTIP;Threshold deltaE-scope increase the range of scope-deltaE - high values are for very wide gamut images.\nIncrease deltaE decay improve shape detection, but can reduce the scope of detection. +TP_LOCALLAB_ARTIF_TOOLTIP;ΔE-scope threshold increases the range of deltaE scope. High values are for very wide gamut images.\nIncreasing deltaE decay can improve shape detection, but can also reduce the scope. +TP_LOCALLAB_AUTOGRAY;Automatic +TP_LOCALLAB_AVOID;Avoid color shift +TP_LOCALLAB_BALAN;ab-L balance (ΔE) +TP_LOCALLAB_BALANEXP;Laplacian balance +TP_LOCALLAB_BALANH;C-H balance (ΔE) +//TP_LOCALLAB_BALAN_TOOLTIP;Change algorithm ΔE parameter.\nMore or less ab-L, more or less C - H.\nNot for Denoise +TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less ab-L, or more or less C - H.\nNot for Denoise +TP_LOCALLAB_BASELOG;Logarithm base +TP_LOCALLAB_BILATERAL;Bilateral filter +TP_LOCALLAB_BLACK_EV;Black Ev +TP_LOCALLAB_BLCO;Chrominance only +TP_LOCALLAB_BLENDMASKCOL;Blend +TP_LOCALLAB_BLENDMASKMASK;Add / subtract luminance mask +TP_LOCALLAB_BLENDMASKMASKAB;Add / subtract chrominance mask +TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image +TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image +TP_LOCALLAB_BLGUID;Guided Filter +TP_LOCALLAB_BLINV;Inverse +TP_LOCALLAB_BLLC;Luminance & Chrominance +TP_LOCALLAB_BLLO;Luminance only +TP_LOCALLAB_BLMED;Median +TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - direct blur and noise with all settings.\nInverse blur and noise with all settings. Be careful some results may be curious +TP_LOCALLAB_BLNOI_EXP;Blur & Noise +TP_LOCALLAB_BLNORM;Normal +TP_LOCALLAB_BLSYM;Symmetric +TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n*Blur the background by a RT-spot fully covering the image (high values for scope and transition) - normal or inverse.\n*Isolate the foreground by one or more excluding RT-spot with the tools you want (increse scope).\n\nThis module can be used in additional noise reduction,including "median" and "Guided filter" +TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +TP_LOCALLAB_BLURCBDL;Blur levels 0-1-2-3-4 +TP_LOCALLAB_BLURCOL;Radius +TP_LOCALLAB_BLURDE;Blur shape detection +TP_LOCALLAB_BLURLC;Luminance Only +TP_LOCALLAB_BLURLEVELFRA;Blur Levels +TP_LOCALLAB_BLURMASK_TOOLTIP;Generate a blur mask, take into account the structure with the contrast threshold Blur Mask slider. +TP_LOCALLAB_BLURRESIDFRA;Blur Residual +TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise - 1 +TP_LOCALLAB_BLWH;All changes forced in Black-and-White +//TP_LOCALLAB_BLWH_TOOLTIP;Force color change composante "a" and "b" to zero.\nUsefull when the user chooses black and white processes, or film. +TP_LOCALLAB_BLWH_TOOLTIP;Force color components "a" and "b" to zero.\nUseful for black and white processing, or film simulation. +TP_LOCALLAB_BUTTON_ADD;Add +TP_LOCALLAB_BUTTON_DEL;Delete +TP_LOCALLAB_BUTTON_DUPL;Duplicate +TP_LOCALLAB_BUTTON_REN;Rename +TP_LOCALLAB_BUTTON_VIS;Show/Hide +TP_LOCALLAB_CBDL;Contrast by detail levels +TP_LOCALLAB_CBDLCLARI_TOOLTIP;Takes the midtones and enhance them. +TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Acts as a wavelet tools.\nThe first level (0) acts on 2x2 details.\nThe last level (5) acts on 64x64 details. +TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevent the sharpening of noise +TP_LOCALLAB_CBDL_TOOLNAME;CBDL - 2 +TP_LOCALLAB_CENTER_X;Center X +TP_LOCALLAB_CENTER_Y;Center Y +TP_LOCALLAB_CH;Curves CL - LC +TP_LOCALLAB_CHROMA;Chrominance +TP_LOCALLAB_CHROMABLU;Chroma levels +TP_LOCALLAB_CHROMABLU_TOOLTIP;Acts as an amplifier-reducer action compare to settings of luma.\nUnder 1 reduce, above 1 amplifie +TP_LOCALLAB_CHROMACBDL;Chroma +TP_LOCALLAB_CHROMACB_TOOLTIP;Acts as an amplifier-reducer action compare to sliders of luminance.\nUnder 100 reduce, above 100 amplifie +TP_LOCALLAB_CHROMALEV;Chroma levels +TP_LOCALLAB_CHROMASKCOL;Chroma +TP_LOCALLAB_CHROMASK_TOOLTIP;You can use this slider to desaturated background (inverse mask - curve near 0).\nAlso to attenuate or enhance the action of a mask on the chroma +TP_LOCALLAB_CHRRT;Chroma +TP_LOCALLAB_CIRCRADIUS;Spot size +TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for treating foliage.\nHigh values may be useful for treating skin +TP_LOCALLAB_CLARICRES;Merge chroma +TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask - Blend & Soft images +TP_LOCALLAB_CLARILRES;Merge luma +TP_LOCALLAB_CLARISOFT;Soft radius +TP_LOCALLAB_CLARISOFT_TOOLTIP;Enabled for Clarity and Sharp mask if Merge Luma different from zero.\n\nEnabled for all wavelets pyramid modules.\nDisabled if Soft radius = 0 +TP_LOCALLAB_CLARITYML;Clarity +TP_LOCALLAB_CLARI_TOOLTIP;Under or equal level wavelet 4, 'Sharp mask' is enabled.\nAbove level wavelet 5 'Clarity' is enabled.\nUsefull if you use 'Level dynamic Range Compression' +TP_LOCALLAB_CLIPTM;Clip restored data (gain) +TP_LOCALLAB_COFR;Color & Light +TP_LOCALLAB_COLORDE;ΔE preview color - intensity +//TP_LOCALLAB_COLORDEPREV_TOOLTIP;Button Preview ΔE needs that only one tool is enabled (expander).\nTo be able to have an Preview ΔE with several enable tools use Mask and modifications - Preview ΔE +TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in "Add tool to current spot" menu\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE +//TP_LOCALLAB_COLORDE_TOOLTIP;Show preview selection ΔE in blue if negative and in green if positive.\n\nMask and modifications (show modifications without mask): show real modifications if positive, show enhanced modifications (only luminance) with blue and yellow if negative. +TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color-preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modifications without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +TP_LOCALLAB_COLORSCOPE;Scope (color tools) +//TP_LOCALLAB_COLORSCOPE_TOOLTIP;Use a common Scope for Color and light, Shadows highlight, Vibrance.\nOthers tools have their specific scope. +TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows & Highlights, Vibrance.\nOther tools have their own scope controls. +TP_LOCALLAB_COLOR_TOOLNAME;Color & Light - 11 +TP_LOCALLAB_COL_NAME;Name +TP_LOCALLAB_COL_VIS;Status +TP_LOCALLAB_COMPFRA;Directional Contrast +TP_LOCALLAB_COMPFRAME_TOOLTIP;Allows special effects. You can reduce artifacts with 'Clarity & Sharp mask - Blend & Soft Images".\nUses a lot of resources +TP_LOCALLAB_COMPLEX_METHOD;Software Complexity +TP_LOCALLAB_COMPLEX_TOOLTIP; Allow user to select Local adjustments rubrics. +TP_LOCALLAB_COMPREFRA;Wavelet level tone-mapping +TP_LOCALLAB_COMPRESS_TOOLTIP;Use if necessary the module 'Clarity & Sharp mask and Blend & Soft Images' by adjusting 'Soft radius' to reduce artifacts. +TP_LOCALLAB_CONTCOL;Contrast threshold +TP_LOCALLAB_CONTFRA;Contrast by Level +TP_LOCALLAB_CONTRAST;Contrast +TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Main mask contrast control. +TP_LOCALLAB_CONTRESID;Contrast +TP_LOCALLAB_CONTTHR;Contrast Threshold +TP_LOCALLAB_CONTWFRA;Local contrast +TP_LOCALLAB_CSTHRESHOLD;Ψ Wavelets Levels +TP_LOCALLAB_CSTHRESHOLDBLUR;Ψ Wavelet level selection +TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance "Super" +TP_LOCALLAB_CURVCURR;Normal +TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nIt is recommended (not required) to position the top of the curves on the gray transition line which represents the references (chroma, luma, hue). +TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nThe gray transition line which represents the references (chroma, luma, hue).\nYou can choose or not to position the top of the curves on this transition. +TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To be active, you must enable combobox 'Curve type' +TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light +TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) has the same algorithm than slider lightness.\n'Super' the curve L=f(L) has an new improved algorithm, which can leeds in some cases to artifacts. +TP_LOCALLAB_CURVENCONTRAST;Super+Contrast threshold (experimental) +TP_LOCALLAB_CURVENH;Super +TP_LOCALLAB_CURVENHSU;Combined HueChroma (experimental) +TP_LOCALLAB_CURVENSOB2;Combined HueChroma + Contrast threshold (experimental) +TP_LOCALLAB_CURVNONE;Disable curves +TP_LOCALLAB_DARKRETI;Darkness +TP_LOCALLAB_DEHAFRA;Dehaze +TP_LOCALLAB_DEHAZ;Strength +TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values adds haze +TP_LOCALLAB_DELTAD;Delta balance +TP_LOCALLAB_DELTAEC;ΔE Image Mask +TP_LOCALLAB_DENOIS;Ψ Denoise +TP_LOCALLAB_DENOIS;Ψ Denoise +TP_LOCALLAB_DENOI_EXP;Denoise +TP_LOCALLAB_DENOI1_EXP;Denoise using local contrast mask +TP_LOCALLAB_DENOI_TOOLTIP;This module can be used alone (at the end of process), or in complement of main denoise (at the beginning).\nScope allows to differentiate the action according to the color (deltaE).\nYou can complete the action with "median" or "Guided Filter" (Smooth Blur...).\nYou can complete the action with "Blur levels" "Wavelet pyramid" +TP_LOCALLAB_DEPTH;Depth +TP_LOCALLAB_DETAIL;Local contrast +TP_LOCALLAB_DETAILSH;Details +TP_LOCALLAB_DETAILTHR;Luminance & Chroma detail threshold (DCT ƒ) +TP_LOCALLAB_DUPLSPOTNAME;Copy +TP_LOCALLAB_EDGFRA;Edge Sharpness +TP_LOCALLAB_EDGSHOW;Show all tolls +TP_LOCALLAB_ELI;Ellipse +TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +TP_LOCALLAB_ENABLE_MASK;Enable mask +TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled Mask uses Restored Datas after Transmission Map instead of Original datas +TP_LOCALLAB_ENH;Enhanced +TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +TP_LOCALLAB_EPSBL;Detail +TP_LOCALLAB_EQUIL;Normalize Luminance +TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance in such a way that the mean and the variance of the output image is identical to that of the original. +TP_LOCALLAB_ESTOP;Edge stopping +TP_LOCALLAB_EV_DUPL;Copy of +TP_LOCALLAB_EV_NVIS;Hide +TP_LOCALLAB_EV_NVIS_ALL;Hide all +TP_LOCALLAB_EV_VIS;Show +TP_LOCALLAB_EV_VIS_ALL;Show all +TP_LOCALLAB_EXCLUF;Excluding +TP_LOCALLAB_EXCLUF_TOOLTIP;Can be used to exclude this part of datas - move Scope to extend color.\n You can apply all settings to this RT-spot. +TP_LOCALLAB_EXCLUTYPE;Spot method +//TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot use recursive data.\n\nExcluding spot reinitialize data to origin.\nCan be used to totally or partially cancel a previous action or to perform a inverse mode +TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in inverted mode +TP_LOCALLAB_EXECLU;Excluding spot +TP_LOCALLAB_EXNORM;Normal spot +//TP_LOCALLAB_EXPCBDL_TOOLTIP;In the case of contaminated sensor (type "grease"), and when the area is important or for a series of small defects.\n\na) Put the selection spot on a pronounced default (adapting its size if necessary), use a large spot enough to allow wavelet; b) choose a wide selection area to cover most of the area affected by the defects; c) Select a transition value (low) and transition decay (high value); d) act on levels 2, 3, 4 or 5 or lower by reducing the contrast (values below 100) and by acting on the chroma slider if necessary. e)possibly act on "scope" to reduce the extent of the action.\n\nYou can also complete with Blur levels and Gaussian blur (Smooth Blur and noise) +TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens. +TP_LOCALLAB_EXPCHROMA;Chroma compensation +TP_LOCALLAB_EXPCHROMA_TOOLTIP;Only in association with exposure compensation and PDE Ipol.\nAvoids desaturation of colors +//TP_LOCALLAB_EXPCOLOR_TOOLTIP;In the case of small defects.\n\nRed-eyes : red-centered circular selector, spot delimiters close to the eye, weak scope, "lightness" -100, "chrominance" -100.\n\nSpotIR :Circular selector centered on the defect, spot delimiters close to the default - reduce "chrominance", possibly act on "scope" to reduce the extent of the action.\n\nDust - grease (small) :Circular selector centered on the defect (adapt the size of the spot), spot delimiters not too close to the defect to allow an inconspicuous transition. a) "Transition" (low values) and "Transition weak" (high values); b) act on "lightness" and possibly on "chrominance" or "Color correction grid - direct" to approach the rendering of the polluted zone to that of the healthy zone; c) act moderately on "scope" to modulate the desired action.\n\nYou can also complete with Gaussian blur (Smooth Blur and noise) +TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +TP_LOCALLAB_EXPCOMPINV;Exposure compensation +TP_LOCALLAB_EXPCOMP_TOOLTIP;For portrait or images with low color gradient, you can change "Shape detection" in "settings":\n\nIncrease 'Threshold ΔE scope'\nReduce 'ΔE decay'\nIncrease 'Balance ΔE ab-L' +TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation of wavelet levels.\nHowever there are some differences: more tools and closer to the details.\nEx: Tone mapping for wavelet levels. +TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small(< 32x32 pixels).\nUse low transition values and high decay transition values and scope to simulate small RT-spot and deal wth defects.\nUse if necessary the module 'Clarity & Sharp mask and Blend images' by adjusting 'Soft radius' to reduce artifacts. +TP_LOCALLAB_EXPCURV;Curves +TP_LOCALLAB_EXPGRAD;Graduated Filter +TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Balances the action between the original image and the Laplace transform. +TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Apply a gamma before and after Laplace transform +TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Add linear exposure component before application Laplace transform +TP_LOCALLAB_EXPLAP_TOOLTIP;The more you act on this threshold slider, the greater the action of reducing contrast. +TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows various possibilities to blend image (as layers in Photoshop (c)) : difference, multiply, soft light, overlay...with opacity...\nOriginal Image : merge current RT-spot with Original.\nPrevious spot : merge current Rt-spot with previous - if there is only one spot previous = original.\nBackground : merge current RT-spot with a color and luminance background (less possibilties) +TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : use an algorithm similar as main Exposure but in L*a*b* and taking account of deltaE.\n\nContrast attenuator : use another algorithm also with deltaE and with Poisson equation to solve Laplacian in Fourier space.\nContrast attenuator, Dynamic range compression and Standard can be combined.\nFFTW Fourier Transform is optimized in size to reduce processing time.\nReduce artifacts and noise. +TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Apply a median before Laplace transform to prevent artifacts (noise).\nYou can also use "Denoise" tool. +TP_LOCALLAB_EXPOSE;Dynamic Range Compr. & Exposure +//TP_LOCALLAB_EXPOSURE_TOOLTIP;In some cases (strong shadows ..) you can use others modules "Shadows Highlights", "Tone equalizer", "TRC", "Log Encoding"... +TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high decay transition values and scope to simulate small RT-spot. +TP_LOCALLAB_EXPTOOL;Exposure tools +TP_LOCALLAB_EXPTRC;Tone Response Curve - TRC +TP_LOCALLAB_EXP_TOOLNAME;Contrast Attenuator/Dynamic Range Compression & Exposure- 10 +TP_LOCALLAB_FATAMOUNT;Amount +TP_LOCALLAB_FATANCHOR;Anchor +TP_LOCALLAB_FATANCHORA;Offset +TP_LOCALLAB_FATDETAIL;Detail +TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal - use Fattal Tone mapping algorithm. +TP_LOCALLAB_FATLEVEL;Sigma +TP_LOCALLAB_FATRES;Amount Residual Image +TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +//TP_LOCALLAB_FEATH_TOOLTIP;Gradient width in percent of the Spot diagonal\nUsed by all Graduated filter in all tools.\nNo action if Graduated Filter are not used. +TP_LOCALLAB_FEATH_TOOLTIP;Gradient width in percent of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn’t been activated. +TP_LOCALLAB_FEATVALUE;Feather gradient (Graduated Filters) +TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +TP_LOCALLAB_FFTW2;ƒ - Use Fast Fourier Transform (TIF, JPG,..) +TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +//TP_LOCALLAB_FULLIMAGE;Calculate DarkEv - WhiteEv - Value on the entire image +TP_LOCALLAB_FULLIMAGE;Calculate dark-Ev/white-Ev value on the entire image +TP_LOCALLAB_GAM;Gamma +TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +TP_LOCALLAB_GAMM;Gamma +TP_LOCALLAB_GAMMASKCOL;Gamma +TP_LOCALLAB_GAMSH;Gamma +TP_LOCALLAB_GRADANG;Gradient angle +TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees : -180 0 +180 +TP_LOCALLAB_GRADFRA;Graduated Filter Mask +TP_LOCALLAB_GRADGEN_TOOLTIP;Graduated filter is supplied with Color and Light & merge file, Exposure & mask, Shadows Highlight, Vibrance, Log Encoding.\n\nVibrance, Color and Light & merge file, are provided with GF luminance, chrominance, Hue.\nFeather is located in settings. +TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +TP_LOCALLAB_GRADSTR;Gradient strength +TP_LOCALLAB_GRADSTRAB_TOOLTIP;Filter chroma strength +TP_LOCALLAB_GRADSTRCHRO;Chrominance gradient strength +TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Filter Hue strength +TP_LOCALLAB_GRADSTRLUM;Luminance gradient strength +TP_LOCALLAB_GRADSTR_TOOLTIP;Filter strength in stops +TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +TP_LOCALLAB_GRALWFRA;Graduated Filter Local contrast +TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use small spot and adapt transition and transition decay\nOnly mode NORMAL and eventually Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE) +TP_LOCALLAB_GRIDONE;Color Toning +TP_LOCALLAB_GRIDTWO;Direct +TP_LOCALLAB_GUIDBL;Soft radius +TP_LOCALLAB_GUIDFILTER;Guided filter radius +TP_LOCALLAB_GUIDFILTER_TOOLTIP;Adapt this values according to images - can reduce or increase artifacts. +TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +TP_LOCALLAB_HIGHMASKCOL;Highlights +TP_LOCALLAB_HLH;Curves H +TP_LOCALLAB_IND;Independent (mouse) +TP_LOCALLAB_INDSL;Independent (mouse + sliders) +TP_LOCALLAB_INVERS;Inverse +TP_LOCALLAB_INVERS_TOOLTIP;If selected (inverse) less possibilities.\n\nAlternative\nFirst Spot:\n full image - delimiter outside preview\n Shape RT-spot area : rectangle. Transition 100\n\nSecond spot : Excluding spot +TP_LOCALLAB_ISOGR;Coarseness (ISO) +TP_LOCALLAB_LABBLURM;Blur Mask +TP_LOCALLAB_LABEL;Local Adjustments +TP_LOCALLAB_LABGRID;Color correction grid +TP_LOCALLAB_LABGRIDMERG;Background +TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +TP_LOCALLAB_LABSTRUM;Structure Mask +TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +TP_LOCALLAB_LAPLACEXP;Laplacian threshold +TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using Radius and Laplace Threshold (advanced) simultaneously.\nLaplacian threshold reduce contrast, artifacts, smooth result. +TP_LOCALLAB_LAP_MASK_TOOLTIP;Solve PDE for all Laplacian masks.\nIf enabled Laplacian threshold mask reduce artifacts and smooth result.\nIf disabled linear response. +TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated.\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\n +TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets - 7 +TP_LOCALLAB_LCTHR;Guided threshold by details levels +TP_LOCALLAB_LEVELBLUR;Maximum Blur levels +TP_LOCALLAB_LEVELLOCCONTRAST_TOOLTIP;On the abscissa local contrast (near concept luminance). On the ordinate, amplification or reduction local contrast. +TP_LOCALLAB_LEVELHIGH;Radius 57 +TP_LOCALLAB_LEVELLOW;Radius 14 +TP_LOCALLAB_LEVELWAV;Ψ Wavelets Levels +TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4 +TP_LOCALLAB_LEVFRA;Levels +TP_LOCALLAB_LIGHTNESS;Lightness +TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 force luminance to zero +TP_LOCALLAB_LIGHTRETI;Lightness +TP_LOCALLAB_LIMDEN;Interaction levels 57 on level 14 +TP_LOCALLAB_LINEAR;Linearity +TP_LOCALLAB_LIST_NAME;Add tool to current spot... +TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard & Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing +TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Give priority to action on midtones and high lights and by choosing the concerned wavelet levels +TP_LOCALLAB_LMASK_LL_TOOLTIP;Give priority to action on midtones and high lights +TP_LOCALLAB_LOCCONT;Unsharp Mask +TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pyramid 1: +TP_LOCALLAB_LOC_CONTRASTPYR2;Ψ Pyramid 2: +TP_LOCALLAB_LOC_CONTRASTPYR2LAB;Contrast by Level - Tone Mapping - Dir.Contrast +TP_LOCALLAB_LOC_CONTRASTPYRLAB;Graduated Filter - Edge Sharpness - Blur +TP_LOCALLAB_LOC_RESIDPYR;Residual Image (Main) +TP_LOCALLAB_LOG;Log Encoding +TP_LOCALLAB_LOGAUTO;Automatic +TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will bring an evaluation of dynamic range and Source Gray point (if "Automatic" Source gray enabled).\nTo be able to touch up the automatic values, press the button again +TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm, the shadows are darker, the highlights are brighter.\nValues greater than 2 change the action of the algorithm, the shadows are grayer the highlights are more washed out +TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of Dynamic Range - Black Ev and White Ev +TP_LOCALLAB_LOGENCOD_TOOLTIP;Allows Tone Mapping with Logarithm encoding (ACES).\nUsefull for underexposed pictures, or with high dynamic range.\n\nTwo steps in the process : 1) Calculate Dynamic Range 2) User adaptation +TP_LOCALLAB_LOGFRA;Source Gray Point +TP_LOCALLAB_LOGFRAME_TOOLTIP;Calculate or use Exposure levels of the image early in the process:\n Black Ev, White Ev and Source Gray point.\n Take into account main exposure compensation. +TP_LOCALLAB_LOGLIN;Logarithm mode +TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estimated gray point value of the image, early in the process +TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can change this value to adapt it to your taste. +TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 +TP_LOCALLAB_LUM;Curves LL - CC +TP_LOCALLAB_LUMADARKEST;Darkest +TP_LOCALLAB_LUMASK;Background color for luminance and color masks +//TP_LOCALLAB_LUMASK_TOOLTIP;Adjust the gray and the color of the mask background in Show Mask (Mask and modifications) +TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications) +TP_LOCALLAB_LUMAWHITESEST;Whiteest +TP_LOCALLAB_LUMFRA;L*a*b* standard +TP_LOCALLAB_LUMONLY;Luminance only +TP_LOCALLAB_MASKCOM;Common Color Mask +TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +//These masks works as all tools, they take into account scope color.\nThey are different from others masks which complete a tool (Color and Light, Exposure...) +TP_LOCALLAB_MASFRAME;Mask and Merge +//TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and curves contrast , levels contrasts, and blur mask, structure(if enabled tool) are used.\nDisabled in Inverse +TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the deltaE image to avoid modifying the selection area when the following sliders are used: gamma mask, slope mask, chroma mask and curve contrast , level contrasts, and blur mask, structure (if tool enabled ) .\nDisabled when Inverse mode is used +TP_LOCALLAB_MASK;Mask +TP_LOCALLAB_MASK2;Contrast curve +TP_LOCALLAB_MASKCOL;Mask Curves +TP_LOCALLAB_MASKH;Hue curve +TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a single tool, this requires activating another tool (but without using the tool : sliders to 0,...) where is the mask you want to activate.\n\nYou can also duplicate the RT-spot and place it right next to each other,variations of references allow fine work on images. +TP_LOCALLAB_MASKLCTHR;Threshold luminance mask +TP_LOCALLAB_THRESMASKHIGH;Highlights +TP_LOCALLAB_THRESMASKLOW;Shadows + +TP_LOCALLAB_MED;Medium +TP_LOCALLAB_MEDIAN;Median Low +TP_LOCALLAB_MEDNONE;None +TP_LOCALLAB_MERCOL;Color +TP_LOCALLAB_MERDCOL;Merge background (ΔE) +TP_LOCALLAB_MERELE;Lighten only +TP_LOCALLAB_MERFIV;Addition +TP_LOCALLAB_MERFOR;Color Dodge +TP_LOCALLAB_MERFOU;Multiply +TP_LOCALLAB_MERGE1COLFRA;Merge with Original or Previous or Background +TP_LOCALLAB_MERGECOLFRA;Mask: LCH & Structure +TP_LOCALLAB_MERGEFIV;Previous Spot(Mask 7) + Mask LCH +TP_LOCALLAB_MERGEFOU;Previous Spot(Mask 7) +TP_LOCALLAB_MERGEMER_TOOLTIP;Take into account ΔE to merge files (equivalent of scope for this use) +TP_LOCALLAB_MERGENONE;None +TP_LOCALLAB_MERGEONE;Short Curves 'L' Mask +TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity merge % current Spot with original or previous Spot.\nContrast threshold : adjust result in function of Original contrast +TP_LOCALLAB_MERGETHR;Original(Mask 7) + Mask LCH +TP_LOCALLAB_MERGETWO;Original(Mask 7) +TP_LOCALLAB_MERGETYPE;Merge image and mask +TP_LOCALLAB_MERGETYPE_TOOLTIP;None, use all mask in LCH mode.\nShort curves 'L' mask, use a short circuit for mask 2, 3, 4, 6, 7.\nOriginal mask 8, blend current image with original +TP_LOCALLAB_MERHEI;Overlay +TP_LOCALLAB_MERHUE;Hue +TP_LOCALLAB_MERLUCOL;Luminance +TP_LOCALLAB_MERLUM;Luminosity +TP_LOCALLAB_MERNIN;Screen +TP_LOCALLAB_MERONE;Normal +TP_LOCALLAB_MERSAT;Saturation +TP_LOCALLAB_MERSEV;Soft Light (legacy) +TP_LOCALLAB_MERSEV0;Soft Light Illusion +TP_LOCALLAB_MERSEV1;Soft Light W3C +TP_LOCALLAB_MERSEV2;Hard Light +TP_LOCALLAB_MERSIX;Divide +TP_LOCALLAB_MERTEN;Darken only +TP_LOCALLAB_MERTHI;Color Burn +TP_LOCALLAB_MERTHR;Difference +TP_LOCALLAB_MERTWE;Exclusion +TP_LOCALLAB_MERTWO;Subtract +TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 (Clip - Offset) +TP_LOCALLAB_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible.\nYou can act on Clip Restored datas and Offset to normalize.\n\nRestored image with no mixture. +TP_LOCALLAB_MODE_EXPERT;Advanced +TP_LOCALLAB_MODE_NORMAL;Standard +TP_LOCALLAB_MODE_SIMPLE;Basic +TP_LOCALLAB_MRFIV;Background +TP_LOCALLAB_MRFOU;Previous Spot +TP_LOCALLAB_MRONE;None +TP_LOCALLAB_MRTHR;Original Image +TP_LOCALLAB_MRTWO;Short Curves 'L' Mask +TP_LOCALLAB_MULTIPL_TOOLTIP;Allows the retouching of tones over a very wide range : -18EV +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts light tones up to 4EV +TP_LOCALLAB_NEIGH;Radius +TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02 +TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery (DCT ƒ) +TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +TP_LOCALLAB_NOISEDETAIL_TOOLTIP;Disabled if slider = 100 +TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +TP_LOCALLAB_NOISELUMDETAIL;Luminance detail recovery (DCT ƒ) +TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +TP_LOCALLAB_NOISEMETH;Denoise +TP_LOCALLAB_NONENOISE;None +TP_LOCALLAB_OFFS;Offset +TP_LOCALLAB_OFFSETWAV;Offset +TP_LOCALLAB_OPACOL;Opacity +TP_LOCALLAB_ORIGLC;Merge only with original image +TP_LOCALLAB_ORRETILAP_TOOLTIP;Acts on a second Laplacian threshold, to take into account ΔE to differentiate the action especially with the background (different from Scope) +TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced +TP_LOCALLAB_PASTELS2;Vibrance +TP_LOCALLAB_PDE;Contrast Attenuator/Dynamic Range compression +TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL - personal algorithm adapted from IPOL to Rawtherapee: lead to very different results and needs differents settings that Standard (negative black, gamma < 1,...)\nMay be usefull for low exposure or high dynamic range.\n +TP_LOCALLAB_PREVIEW;Preview ΔE +TP_LOCALLAB_PREVHIDE;Hide additional settings +TP_LOCALLAB_PREVSHOW;Show additional settings +TP_LOCALLAB_PROXI;ΔE decay +TP_LOCALLAB_QUALCURV_METHOD;Curve type +TP_LOCALLAB_QUAL_METHOD;Global quality +TP_LOCALLAB_RADIUS;Radius +TP_LOCALLAB_RADIUS_TOOLTIP;Above Radius 30 Use Fast Fourier Transform +TP_LOCALLAB_RADMASKCOL;Smooth radius +TP_LOCALLAB_RECT;Rectangle +TP_LOCALLAB_RECURS;Recursive references +TP_LOCALLAB_RECURS_TOOLTIP;Recalculate references for hue, luma, chroma after each module and after each RT-spot.\nAlso useful for working with masks. +TP_LOCALLAB_REFLABEL;Ref. (0..1) Chroma=%1 Luma=%2 Hue=%3 +TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +TP_LOCALLAB_RESETSHOW;Reset All Show Modifications +TP_LOCALLAB_RESID;Residual Image +TP_LOCALLAB_RESIDBLUR;Blur Residual Image +TP_LOCALLAB_RESIDCHRO;Residual image Chroma +TP_LOCALLAB_RESIDCOMP;Compress residual image +TP_LOCALLAB_RESIDCONT;Residual image Contrast +TP_LOCALLAB_RESIDHI;Highlights +TP_LOCALLAB_RESIDHITHR;Highlights threshold +TP_LOCALLAB_RESIDSHA;Shadows +TP_LOCALLAB_RESIDSHATHR;Shadows threshold +TP_LOCALLAB_RETI;Dehaze - Retinex +TP_LOCALLAB_RETIFRA;Retinex +TP_LOCALLAB_RETIM;Original Retinex +TP_LOCALLAB_RETITOOLFRA;Retinex Tools +TP_LOCALLAB_RETI_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated\nThe treatment time depends on the value of scale (be carefull to high values).\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\nOptimization not used in Preview +TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Have no effect when the value "Lightness = 1" or "Darkness =2" is chosen.\nIn other cases, the last step of "Multiple scale Retinex" is applied an algorithm close to "local contrast", these 2 cursors, associated with "Strength" will allow to play upstream on the local contrast. +TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Play on internal parameters to optimize response.\nLook at the "restored datas" indicators "near" min=0 and max=32768 (log mode), but others values are possible. +TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm allows differenciation for haze or normal.\nLogarithm brings more contrast but will generate more halo. +TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;Adapt these values according to images - if misty images and depending on whether you want to act on the front or the background +TP_LOCALLAB_RETI_SCALE_TOOLTIP;If scale=1, retinex behaves like local contrast with many more possibilities.\nThe greater the scale, the more intense the recursive action, the longer the calculation times +TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex - 9 +TP_LOCALLAB_REWEI;Reweighting iterates +TP_LOCALLAB_RGB;RGB Tone Curve +TP_LOCALLAB_ROW_NVIS;Not visible +TP_LOCALLAB_ROW_VIS;Visible +TP_LOCALLAB_SATUR;Saturation +TP_LOCALLAB_SAVREST;Save - Restore Current Image +TP_LOCALLAB_SCALEGR;Scale +TP_LOCALLAB_SCALERETI;Scale +TP_LOCALLAB_SCALTM;Scale +TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +//TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if Mask DeltaE Image is enabled.\nLow values avoid retouching selected area +TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if DeltaE Image Mask is enabled.\nLow values avoid retouching selected area +TP_LOCALLAB_SENSI;Scope +TP_LOCALLAB_SENSIBN;Scope +TP_LOCALLAB_SENSICB;Scope +TP_LOCALLAB_SENSIDEN;Scope +TP_LOCALLAB_SENSIEXCLU;Scope +TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust color to include in exclusion! +TP_LOCALLAB_SENSIH;Scope +TP_LOCALLAB_SENSIH_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors. +TP_LOCALLAB_SENSILOG;Scope +TP_LOCALLAB_SENSIS;Scope +TP_LOCALLAB_SENSIS_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm. +TP_LOCALLAB_SENSI_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm. +TP_LOCALLAB_SENSIMASK_TOOLTIP;Adjust scope of action for this common mask tool.\nActs on the gap between the original image and the mask.\nThe references (luma, chroma, hue) are those of the center of the RT-spot\n\nYou can also act on deltaE internal to the mask with 'Scope Mask deltaE image' in 'Settings' +TP_LOCALLAB_SETTINGS;Settings +TP_LOCALLAB_SH1;Shadows Highlights +TP_LOCALLAB_SH2;Equalizer +TP_LOCALLAB_SHADEX;Shadows +TP_LOCALLAB_SHADEXCOMP;Shadows compression & tonal width +TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone equalizer +TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows & highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +//Can be used instead - or in complement - of exposure module in difficult cases.\nThe use of Denoise may be necessary : lightening the shadows.\n\nCan be used as graduated filter (increase Scope) +TP_LOCALLAB_SHAMASKCOL;Shadows +TP_LOCALLAB_SHAPETYPE;RT-spot shape +TP_LOCALLAB_SHAPE_TOOLTIP;Elipse is normal mode.\nRectangle can be used in some cases, for example to work in full image in conjonction with delimiters outside preview, transition = 100.\n\nPolygone - Beziers are waiting for GUI... +TP_LOCALLAB_SHARAMOUNT;Amount +TP_LOCALLAB_SHARBLUR;Blur radius +TP_LOCALLAB_SHARDAMPING;Damping +TP_LOCALLAB_SHARFRAME;Modifications +TP_LOCALLAB_SHARITER;Iterations +TP_LOCALLAB_SHARP;Sharpening +TP_LOCALLAB_SHARP_TOOLNAME;Sharpening - 8 +TP_LOCALLAB_SHARRADIUS;Radius +TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7 +TP_LOCALLAB_SHOWC;Mask and modifications +TP_LOCALLAB_SHOWC1;Merge file +TP_LOCALLAB_SHOWCB;Mask and modifications +TP_LOCALLAB_SHOWDCT;Show process Fourier ƒ +TP_LOCALLAB_SHOWE;Mask and modifications +TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +TP_LOCALLAB_SHOWLC;Mask and modifications +TP_LOCALLAB_SHOWMASK;Show mask +TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Display mask modifications.\nBeware, you can only view one tool mask at the same time.\nShow modified image: Shows the modified image including any adjustments and masks\n\nNote: Use Mask is before algorihtm shape detection. +TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Show process Fourier:\nShows the different stages of the process.\nLaplace - builds the second derivative according to the threshold (first step).\nFourier -shows the transformed Laplacian with DCT.\nPoisson - show solution of Poisson DCE.\nNormalize - show result without normalization luminance. +TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +TP_LOCALLAB_SHOWMASKTYP2;Denoise +TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Mask and modifications can be chosen.\nBlur and noise : in this case it is not used for 'denoise'.\nDenoise : in this case it is not used for 'blur and noise'.\n\nBlur and noise + denoise : mask is shared, be carefull to 'show modifications' and 'scope' +TP_LOCALLAB_SHOWMNONE;Show modified image +TP_LOCALLAB_SHOWMODIF;Show modifications without mask +TP_LOCALLAB_SHOWMODIFMASK;Show modifications with mask +TP_LOCALLAB_SHOWNORMAL;Normalize luminance (no) +TP_LOCALLAB_SHOWPLUS;Mask and modifications - Blur/Grain & Denoise +TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +TP_LOCALLAB_SHOWR;Mask and modifications +TP_LOCALLAB_SHOWREF;Preview ΔE +TP_LOCALLAB_SHOWS;Mask and modifications +TP_LOCALLAB_SHOWSTRUC;Show spot structure (advanced) +TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(advanced) +TP_LOCALLAB_SHOWT;Mask and modifications +TP_LOCALLAB_SHOWVI;Mask and modifications +TP_LOCALLAB_SHRESFRA;Shadows/Highlights +TP_LOCALLAB_SHTRC_TOOLTIP;Modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones +TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer - 5 +TP_LOCALLAB_SIGMAWAV;Attenuation response +TP_LOCALLAB_SIM;Simple +TP_LOCALLAB_SLOMASKCOL;Slope +TP_LOCALLAB_SLOSH;Slope +TP_LOCALLAB_SOFT;Soft Light - Original Retinex +TP_LOCALLAB_SOFTM;Soft Light +//TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Original Retinex is very different from others Retinex method.\nIts acts on grey and balance luminance.\nIt is an emulation of "Dodge" and "Burn" +TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +TP_LOCALLAB_SOFTRETI_TOOLTIP;Take into account deltaE to improve Transmission map +TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 +TP_LOCALLAB_SOURCE_GRAY;Value +TP_LOCALLAB_SPECCASE;Specific cases +TP_LOCALLAB_SPECIAL;Special use of RGB curves +TP_LOCALLAB_SPECIAL_TOOLTIP;Only for this RGB curve, disabled (or reduce effects) of Scope, mask...for example, if you want to have a negative effect. +TP_LOCALLAB_SPOTNAME;New Spot +TP_LOCALLAB_STD;Standard +TP_LOCALLAB_STR;Strength +TP_LOCALLAB_STRBL;Strength +TP_LOCALLAB_STREN;Compression Strength +TP_LOCALLAB_STRENG;Strength +TP_LOCALLAB_STRENGR;Strength +TP_LOCALLAB_STRENGTH;Noise +TP_LOCALLAB_STRGRID;Strength +TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\nif Strength Retinex >= 0.1 Dehaze is in luminance mode. +TP_LOCALLAB_STRUC;Structure +TP_LOCALLAB_STRUCCOL;Structure +TP_LOCALLAB_STRUCCOL1;Spot structure +TP_LOCALLAB_STRUCT_TOOLTIP;Use Sobel algorithm to take into account structure in shape detection.\nyou can have a preview by activating "mask and modifications - Show structure spot".\n\nCan be used in conjunction with masks (advanced) structure, blur, wavelet to improve edge detection.\n\nNeeds maskless adjustments to be activated (lightness, exposure...) +TP_LOCALLAB_STRUMASKCOL;Structure mask strength +TP_LOCALLAB_STRUMASK_TOOLTIP;Generate a structure mask with difference between surface areas and reliefs.\nIf structure mask as tool is enabled, this mask is used in addition to the other tools (gamma, slope, contrast curve ...) +TP_LOCALLAB_STYPE;Shape method +TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +TP_LOCALLAB_SYM;Symmetrical (mouse) +TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +TP_LOCALLAB_TARGET_GRAY;Target gray point +TP_LOCALLAB_THRES;Threshold structure +TP_LOCALLAB_THRESDELTAE;ΔE-scope threshold +TP_LOCALLAB_THRESRETI;Threshold +TP_LOCALLAB_THRESWAV;Balance threshold +TP_LOCALLAB_TLABEL;TM Data Min=%1 Max=%2 Mean=%3 Sigma=%4 (Threshold) +TP_LOCALLAB_TLABEL2;TM Effective Tm=%1 TM=%2 +TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize +TP_LOCALLAB_TM;Tone Mapping - Texture +TP_LOCALLAB_TM_MASK;Use transmission map +TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This parameter affects sensitivity to edges.\n The greater it is the more likely an illumination change is to be considered an "edge".\n If set to zero tone mapping will have an effect similar to unsharp masking. +TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Gamma moves the action of tone-mapping to shadows or highlights. +TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main menu tool must be de-activated if this tool is used. +//Tone Mapping - main menu must be disabled +TP_LOCALLAB_TONEMASCALE_TOOLTIP;This control gives meaning to the difference between "local" and "global" contrast.\nThe greater it is the larger a detail needs to be in order to be boosted +TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 +TP_LOCALLAB_TOOLCOL;Structure mask as tool +TP_LOCALLAB_TOOLMASK;Mask Tools +TP_LOCALLAB_THREND;Local contrast threshold +TP_LOCALLAB_THRENDSIG;Local contrast threshold High levels +TP_LOCALLAB_THRENDLEV;Levels +TP_LOCALLAB_THRESLOW;Guided threshold 14 +TP_LOCALLAB_THRESHIGH;Guided threshold 57 +TP_LOCALLAB_TRANSIT;Transition Gradient +TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Changes the transition of the abscissa to that of the ordinate +TP_LOCALLAB_TRANSITVALUE;Transition value +TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +//TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay : change smoothness process - 1 linear - 2 parabolic - 3 cubic - ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelet, Color & Light) +TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light) +TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas, as a percentage of the "radius" +TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.\nYou can act on this curve to change Transmission and reduce the artifacts +TP_LOCALLAB_USEMASK;Use mask +TP_LOCALLAB_VART;Variance (contrast) +TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +TP_LOCALLAB_VIBRA_TOOLTIP;Adjust vibrance (essentially the same as the global adjustment).\nCarry out the equivalent of a white-balance adjustment using a CIECAM algorithm. +TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool - 3 +TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 +TP_LOCALLAB_BLUR_TOOLNAME;Smooth Blur/Grain & Denoise - 1 +TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 +TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex - 9 +TP_LOCALLAB_SHARP_TOOLNAME;Sharpening - 8 +TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelet - 7 +TP_LOCALLAB_CBDL_TOOLNAME;CBDL - 2 +TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 +TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask - 13 +TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +TP_LOCALLAB_WAMASKCOL;Ψ Mask Wavelet level +TP_LOCALLAB_WARM;Warm - Cool & Color artifacts +TP_LOCALLAB_WARM_TOOLTIP;This slider use Ciecam algorithm and acts as White Balance, it can warm or cool the area selected.\nIt can also in some cases reduce color artifacts. +TP_LOCALLAB_WASDEN_TOOLTIP;Denoise luminance for the 4 first levels (fine).\nThe right limit of the curve correspond to coarse : level 4 and beyond (6) +TP_LOCALLAB_WAV;Level local contrast +TP_LOCALLAB_WAVBLUR_TOOLTIP;Performs a blur for each level of decomposition, as well as the residual image. +TP_LOCALLAB_WAVCOMP;Compression by Level +TP_LOCALLAB_WAVCOMPRE;(un)Compression by Level +TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Achieve a Tone-mapping or reduction local contrast by level.\nOn abscissa levels +TP_LOCALLAB_WAVCOMP_TOOLTIP;Achive local contrast in function of the direction wavelet decomposition : horizontal, vertical, diagonal +TP_LOCALLAB_WAVCON;Contrast by Level +TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels : on abscissa levels. +TP_LOCALLAB_WAVDEN;Luminance denoise by level (1 2 3 4 .. 6) +TP_LOCALLAB_WAVE;Ψ Wavelet +TP_LOCALLAB_WAVEDG;Local contrast +TP_LOCALLAB_WAVEEDG_TOOLTIP;Achieves a sharpness taking into account the notion of edges wavelet.\nRequires that at least the first 4 levels are usable +TP_LOCALLAB_WAVGRAD_TOOLTIP;Graduated filter for Local contrast "luminance" +TP_LOCALLAB_WAVHIGH;Ψ Wavelet high +TP_LOCALLAB_WAVLEV;Blur by Level +TP_LOCALLAB_WAVLOW;Ψ Wavelet low +TP_LOCALLAB_WAVMASK;Ψ Local contrast (by wavelet level) +TP_LOCALLAB_WAVMASK_TOOLTIP;Allows fine work on mask levels contrasts (structure) +TP_LOCALLAB_WAVMED;Ψ Wavelet normal +TP_LOCALLAB_WEDIANHI;Median Hi +TP_LOCALLAB_WHITE_EV;White Ev +TP_LOCAL_HEIGHT;Bottom +TP_LOCAL_HEIGHT_T;Top +TP_LOCAL_WIDTH;Right +TP_LOCAL_WIDTH_L;Left +TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\n +TP_METADATA_EDIT;Apply modifications +TP_METADATA_MODE;Metadata copy mode +TP_METADATA_STRIP;Strip all metadata +TP_METADATA_TUNNEL;Copy unchanged +TP_NEUTRAL;Reset +TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. +TP_PCVIGNETTE_FEATHER;Feather +TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. +TP_PCVIGNETTE_LABEL;Vignette Filter +TP_PCVIGNETTE_ROUNDNESS;Roundness +TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. +TP_PCVIGNETTE_STRENGTH;Strength +TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). +TP_PDSHARPENING_LABEL;Capture Sharpening +TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +TP_PERSPECTIVE_CAMERA_FRAME;Correction +TP_PERSPECTIVE_CAMERA_PITCH;Vertical +TP_PERSPECTIVE_CAMERA_ROLL;Rotation +TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +TP_PERSPECTIVE_CAMERA_YAW;Horizontal +TP_PERSPECTIVE_HORIZONTAL;Horizontal +TP_PERSPECTIVE_LABEL;Perspective +TP_PERSPECTIVE_METHOD;Method +TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +TP_PERSPECTIVE_METHOD_SIMPLE;Simple +TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +TP_PERSPECTIVE_RECOVERY_FRAME;Recovery +TP_PERSPECTIVE_VERTICAL;Vertical +TP_PFCURVE_CURVEEDITOR_CH;Hue +TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. +TP_PREPROCESS_DEADPIXFILT;Dead pixel filter +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. +TP_PREPROCESS_GREENEQUIL;Green equilibration +TP_PREPROCESS_HOTPIXFILT;Hot pixel filter +TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. +TP_PREPROCESS_LABEL;Preprocessing +TP_PREPROCESS_LINEDENOISE;Line noise filter +TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +TP_PREPROCESS_NO_FOUND;None found +TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +TP_PREPROCWB_LABEL;Preprocess White Balance +TP_PREPROCWB_MODE;Mode +TP_PREPROCWB_MODE_AUTO;Auto +TP_PREPROCWB_MODE_CAMERA;Camera +TP_PRSHARPENING_LABEL;Post-Resize Sharpening +TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. +TP_RAWCACORR_AUTO;Auto-correction +TP_RAWCACORR_AUTOIT;Iterations +TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift +TP_RAWCACORR_CABLUE;Blue +TP_RAWCACORR_CARED;Red +TP_RAWCACORR_LABEL;Chromatic Aberration Correction +TP_RAWEXPOS_BLACK_0;Green 1 (lead) +TP_RAWEXPOS_BLACK_1;Red +TP_RAWEXPOS_BLACK_2;Blue +TP_RAWEXPOS_BLACK_3;Green 2 +TP_RAWEXPOS_BLACK_BLUE;Blue +TP_RAWEXPOS_BLACK_GREEN;Green +TP_RAWEXPOS_BLACK_RED;Red +TP_RAWEXPOS_LINEAR;White-point correction +TP_RAWEXPOS_RGB;Red, Green, Blue +TP_RAWEXPOS_TWOGREEN;Link greens +TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +TP_RAW_2PASS;1-pass+fast +TP_RAW_3PASSBEST;3-pass (Markesteijn) +TP_RAW_4PASS;3-pass+fast +TP_RAW_AHD;AHD +TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear +TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;Border +TP_RAW_DCB;DCB +TP_RAW_DCBENHANCE;DCB enhancement +TP_RAW_DCBITERATIONS;Number of DCB iterations +TP_RAW_DCBBILINEAR;DCB+Bilinear +TP_RAW_DCBVNG4;DCB+VNG4 +TP_RAW_DMETHOD;Method +TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... +TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... +TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold +TP_RAW_EAHD;EAHD +TP_RAW_FALSECOLOR;False color suppression steps +TP_RAW_FAST;Fast +TP_RAW_HD;Threshold +TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear. +TP_RAW_HPHD;HPHD +TP_RAW_IGV;IGV +TP_RAW_IMAGENUM;Sub-image +TP_RAW_IMAGENUM_SN;SN mode +TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +TP_RAW_LABEL;Demosaicing +TP_RAW_LMMSE;LMMSE +TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps +TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (steps 5-6) to reduce artifacts and improve the signal-to-noise ratio. +TP_RAW_MONO;Mono +TP_RAW_NONE;None (Shows sensor pattern) +TP_RAW_PIXELSHIFT;Pixel Shift +TP_RAW_PIXELSHIFTBLUR;Blur motion mask +TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +TP_RAW_PIXELSHIFTEPERISO;Sensitivity +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. +TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equalize per channel +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Enabled: Equalize the RGB channels individually.\nDisabled: Use same equalization factor for all channels. +TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. +TP_RAW_PIXELSHIFTGREEN;Check green channel for motion +TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask +TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts +TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. +TP_RAW_PIXELSHIFTMM_AUTO;Automatic +TP_RAW_PIXELSHIFTMM_CUSTOM;Custom +TP_RAW_PIXELSHIFTMM_OFF;Off +TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction +TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion +TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. +TP_RAW_PIXELSHIFTSIGMA;Blur radius +TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. +TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions +TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. +TP_RAW_RCD;RCD +TP_RAW_RCDBILINEAR;RCD+Bilinear +TP_RAW_RCDVNG4;RCD+VNG4 +TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix +TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.\n+fast gives less artifacts in flat areas +TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix +TP_RAW_VNG4;VNG4 +TP_RAW_XTRANS;X-Trans +TP_RAW_XTRANSFAST;Fast X-Trans +TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling +TP_RESIZE_APPLIESTO;Applies to: +TP_RESIZE_CROPPEDAREA;Cropped Area +TP_RESIZE_FITBOX;Bounding Box +TP_RESIZE_FULLIMAGE;Full Image +TP_RESIZE_H;Height: +TP_RESIZE_HEIGHT;Height +TP_RESIZE_LABEL;Resize +TP_RESIZE_LANCZOS;Lanczos +TP_RESIZE_METHOD;Method: +TP_RESIZE_NEAREST;Nearest +TP_RESIZE_SCALE;Scale +TP_RESIZE_SPECIFY;Specify: +TP_RESIZE_W;Width: +TP_RESIZE_WIDTH;Width +TP_RETINEX_CONTEDIT_HSL;HSL histogram +TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +TP_RETINEX_CONTEDIT_LH;Hue +TP_RETINEX_CONTEDIT_MAP;Equalizer +TP_RETINEX_CURVEEDITOR_CD;L=f(L) +TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts. +TP_RETINEX_CURVEEDITOR_LH;Strength=f(H) +TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. +TP_RETINEX_CURVEEDITOR_MAP;L=f(L) +TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +TP_RETINEX_EQUAL;Equalizer +TP_RETINEX_FREEGAMMA;Free gamma +TP_RETINEX_GAIN;Gain +TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +TP_RETINEX_GAINTRANSMISSION;Gain transmission +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +TP_RETINEX_GAMMA;Gamma +TP_RETINEX_GAMMA_FREE;Free +TP_RETINEX_GAMMA_HIGH;High +TP_RETINEX_GAMMA_LOW;Low +TP_RETINEX_GAMMA_MID;Middle +TP_RETINEX_GAMMA_NONE;None +TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.). +TP_RETINEX_GRAD;Transmission gradient +TP_RETINEX_GRADS;Strength gradient +TP_RETINEX_GRADS_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Strength is reduced when iterations increase, and conversely. +TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Variance and Threshold are reduced when iterations increase, and conversely. +TP_RETINEX_HIGH;High +TP_RETINEX_HIGHLIG;Highlight +TP_RETINEX_HIGHLIGHT;Highlight threshold +TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool. +TP_RETINEX_HSLSPACE_LIN;HSL-Linear +TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic +TP_RETINEX_ITER;Iterations (Tone-mapping) +TP_RETINEX_ITERF;Tone mapping +TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. +TP_RETINEX_LABEL;Retinex +TP_RETINEX_LABEL_MASK;Mask +TP_RETINEX_LABSPACE;L*a*b* +TP_RETINEX_LOW;Low +TP_RETINEX_MAP;Method +TP_RETINEX_MAP_GAUS;Gaussian mask +TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) +TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) +TP_RETINEX_MAP_METHOD_TOOLTIP;Use the mask generated by the Gaussian function above (Radius, Method) to reduce halos and artifacts.\n\nCurve only: apply a diagonal contrast curve on the mask.\nBeware of artifacts!\n\nGaussian mask: generate and use a Gaussian blur of the original mask.\nQuick.\n\nSharp mask: generate and use a wavelet on the original mask.\nSlow. +TP_RETINEX_MAP_NONE;None +TP_RETINEX_MEDIAN;Transmission median filter +TP_RETINEX_METHOD;Method +TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\nHighlights = Remove magenta in highlights. +TP_RETINEX_MLABEL;Restored data Min=%1 Max=%2 +TP_RETINEX_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible\nRestored image with no mixture. +TP_RETINEX_NEIGHBOR;Radius +TP_RETINEX_NEUTRAL;Reset +TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. +TP_RETINEX_OFFSET;Offset (brightness) +TP_RETINEX_SCALES;Gaussian gradient +TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. +TP_RETINEX_SETTINGS;Settings +TP_RETINEX_SKAL;Scale +TP_RETINEX_SLOPE;Free gamma slope +TP_RETINEX_STRENGTH;Strength +TP_RETINEX_THRESHOLD;Threshold +TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss. +TP_RETINEX_TLABEL;TM Data Min=%1 Max=%2 Mean=%3 Sigma=%4 +TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 +TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map. +TP_RETINEX_TRANF;Transmission +TP_RETINEX_TRANSMISSION;Transmission map +TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. +TP_RETINEX_UNIFORM;Uniform +TP_RETINEX_VARIANCE;Contrast +TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts. +TP_RETINEX_VIEW;Process +TP_RETINEX_VIEW_MASK;Mask +TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Normal display.\nMask - Displays the mask.\nUnsharp mask - Displays the image with a high radius unsharp mask.\nTransmission - Auto/Fixed - Displays the file transmission-map, before any action on contrast and brightness.\n\nAttention: the mask does not correspond to reality, but is amplified to make it more visible. +TP_RETINEX_VIEW_NONE;Standard +TP_RETINEX_VIEW_TRAN;Transmission - Auto +TP_RETINEX_VIEW_TRAN2;Transmission - Fixed +TP_RETINEX_VIEW_UNSHARP;Unsharp mask +TP_RGBCURVES_BLUE;B +TP_RGBCURVES_CHANNEL;Channel +TP_RGBCURVES_GREEN;G +TP_RGBCURVES_LABEL;RGB Curves +TP_RGBCURVES_LUMAMODE;Luminosity mode +TP_RGBCURVES_LUMAMODE_TOOLTIP;Luminosity mode allows to vary the contribution of R, G and B channels to the luminosity of the image, without altering image color. +TP_RGBCURVES_RED;R +TP_ROTATE_DEGREE;Degree +TP_ROTATE_LABEL;Rotate +TP_ROTATE_SELECTLINE;Select Straight Line +TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter +TP_SHADOWSHLIGHTS_HIGHLIGHTS;Highlights +TP_SHADOWSHLIGHTS_HLTONALW;Highlights tonal width +TP_SHADOWSHLIGHTS_LABEL;Shadows/Highlights +TP_SHADOWSHLIGHTS_RADIUS;Radius +TP_SHADOWSHLIGHTS_SHADOWS;Shadows +TP_SHADOWSHLIGHTS_SHTONALW;Shadows tonal width +TP_SHARPENEDGE_AMOUNT;Quantity +TP_SHARPENEDGE_LABEL;Edges +TP_SHARPENEDGE_PASSES;Iterations +TP_SHARPENEDGE_THREE;Luminance only +TP_SHARPENING_AMOUNT;Amount +TP_SHARPENING_BLUR;Blur radius +TP_SHARPENING_CONTRAST;Contrast threshold +TP_SHARPENING_EDRADIUS;Radius +TP_SHARPENING_EDTOLERANCE;Edge tolerance +TP_SHARPENING_HALOCONTROL;Halo control +TP_SHARPENING_HCAMOUNT;Amount +TP_SHARPENING_ITERCHECK;Auto limit iterations +TP_SHARPENING_LABEL;Sharpening +TP_SHARPENING_METHOD;Method +TP_SHARPENING_ONLYEDGES;Sharpen only edges +TP_SHARPENING_RADIUS;Radius +TP_SHARPENING_RADIUS_BOOST;Corner radius boost +TP_SHARPENING_RLD;RL Deconvolution +TP_SHARPENING_RLD_AMOUNT;Amount +TP_SHARPENING_RLD_DAMPING;Damping +TP_SHARPENING_RLD_ITERATIONS;Iterations +TP_SHARPENING_THRESHOLD;Threshold +TP_SHARPENING_USM;Unsharp Mask +TP_SHARPENMICRO_AMOUNT;Quantity +TP_SHARPENMICRO_CONTRAST;Contrast threshold +TP_SHARPENMICRO_LABEL;Microcontrast +TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 +TP_SHARPENMICRO_UNIFORMITY;Uniformity +TP_SOFTLIGHT_LABEL;Soft Light +TP_SOFTLIGHT_STRENGTH;Strength +TP_TM_FATTAL_AMOUNT;Amount +TP_TM_FATTAL_ANCHOR;Anchor +TP_TM_FATTAL_LABEL;Dynamic Range Compression +TP_TM_FATTAL_THRESHOLD;Detail +TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift +TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH +TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Red +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Red/Yellow +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Yellow +TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H) +TP_VIBRANCE_LABEL;Vibrance +TP_VIBRANCE_PASTELS;Pastel tones +TP_VIBRANCE_PASTSATTOG;Link pastel and saturated tones +TP_VIBRANCE_PROTECTSKINS;Protect skin-tones +TP_VIBRANCE_PSTHRESHOLD;Pastel/saturated tones threshold +TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Saturation threshold +TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;The vertical axis represents pastel tones at the bottom and saturated tones at the top.\nThe horizontal axis represents the saturation range. +TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Pastel/saturated transition's weighting +TP_VIBRANCE_SATURATED;Saturated Tones +TP_VIGNETTING_AMOUNT;Amount +TP_VIGNETTING_CENTER;Center +TP_VIGNETTING_CENTER_X;Center X +TP_VIGNETTING_CENTER_Y;Center Y +TP_VIGNETTING_LABEL;Vignetting Correction +TP_VIGNETTING_RADIUS;Radius +TP_VIGNETTING_STRENGTH;Strength +TP_WAVELET_1;Level 1 +TP_WAVELET_2;Level 2 +TP_WAVELET_3;Level 3 +TP_WAVELET_4;Level 4 +TP_WAVELET_5;Level 5 +TP_WAVELET_6;Level 6 +TP_WAVELET_7;Level 7 +TP_WAVELET_8;Level 8 +TP_WAVELET_9;Level 9 +TP_WAVELET_APPLYTO;Apply to +TP_WAVELET_AVOID;Avoid color shift +TP_WAVELET_B0;Black +TP_WAVELET_B1;Gray +TP_WAVELET_B2;Residual +TP_WAVELET_BACKGROUND;Background +TP_WAVELET_BACUR;Curve +TP_WAVELET_BALANCE;Contrast balance d/v-h +TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified. +TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the vertical, horizontal and diagonal wavelet directions: .\nActivating contrast, chroma or residual tone mapping amplifies the effect due to balance +TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. +TP_WAVELET_BALCHROM;Denoise equalizer Blue-Yellow Red-Green +TP_WAVELET_BALLUM;Denoise equalizer White-Black +TP_WAVELET_BANONE;None +TP_WAVELET_BASLI;Slider +TP_WAVELET_BATYPE;Contrast balance method +TP_WAVELET_BL;Blur levels +TP_WAVELET_BLCURVE;Blur by levels +TP_WAVELET_BLURFRAME;Blur +TP_WAVELET_BLUWAV;Attenuation response +TP_WAVELET_CBENAB;Toning and Color balance +TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance +TP_WAVELET_CCURVE;Local contrast +TP_WAVELET_CH1;Whole chroma range +TP_WAVELET_CH2;Saturated/pastel +TP_WAVELET_CH3;Link contrast levels +TP_WAVELET_CHCU;Curve +TP_WAVELET_CHR;Chroma-contrast link strength +TP_WAVELET_CHRO;Saturated/pastel threshold +TP_WAVELET_CHROFRAME;Denoise chrominance +TP_WAVELET_CHROMAFRAME;Chroma +TP_WAVELET_CHROMCO;Coarse chroma +TP_WAVELET_CHROMFI;Fine Chroma +TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored. +TP_WAVELET_CHRWAV;Blur chroma +TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" +TP_WAVELET_CHSL;Sliders +TP_WAVELET_CHTYPE;Chrominance method +TP_WAVELET_CLA;Clarity +TP_WAVELET_CLARI;Sharp-mask and Clarity +TP_WAVELET_COLORT;Opacity red-green +TP_WAVELET_COMPCONT;Contrast +TP_WAVELET_COMPGAMMA;Compression gamma +TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram. +TP_WAVELET_COMPLEXLAB;Complexity +TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations +TP_WAVELET_COMPNORMAL;Standard +TP_WAVELET_COMPEXPERT;Advanced +TP_WAVELET_COMPTM;Tone mapping +TP_WAVELET_CONTEDIT;'After' contrast curve +TP_WAVELET_CONTFRAME;Contrast - Compression +TP_WAVELET_CONTR;Gamut +TP_WAVELET_CONTRA;Contrast +TP_WAVELET_CONTRASTEDIT;Finer - Coarser levels +TP_WAVELET_CONTRAST_MINUS;Contrast - +TP_WAVELET_CONTRAST_PLUS;Contrast + +TP_WAVELET_CONTRA_TOOLTIP;Changes the residual image contrast. +TP_WAVELET_CTYPE;Chrominance control +TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300% +TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000). +TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue) +TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero. +TP_WAVELET_CURVEEDITOR_CL;L +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. +TP_WAVELET_CURVEEDITOR_HH;HH +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. +TP_WAVELET_DALL;All directions +TP_WAVELET_DAUB;Edge performance +TP_WAVELET_DAUB2;D2 - low +TP_WAVELET_DAUB4;D4 - standard +TP_WAVELET_DAUB6;D6 - standard plus +TP_WAVELET_DAUB10;D10 - medium +TP_WAVELET_DAUB14;D14 - high +TP_WAVELET_DAUBLOCAL;Wavelet Edge performance +TP_WAVELET_DAUB_TOOLTIP;Changes Daubechies coefficients:\nD4 = Standard,\nD14 = Often best performance, 10% more time-intensive.\n\nAffects edge detection as well as the general quality of the first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. +TP_WAVELET_DENOISE;Guide curve based on Local contrast +TP_WAVELET_DENOISEGUID;Guided threshold based on hue +TP_WAVELET_DENOISEH;High levels Curve Local contrast +TP_WAVELET_DENOISEHUE;Denoise equalizer Hue +TP_WAVELET_DENCONTRAST;Local contrast Equalizer +TP_WAVELET_DENEQUAL;1 2 3 4 Equal +TP_WAVELET_DEN14PLUS;1 4 High +TP_WAVELET_DEN14LOW;1 4 Low +TP_WAVELET_DEN12PLUS;1 2 High +TP_WAVELET_DEN12LOW;1 2 Low +TP_WAVELET_DEN5THR;Guided threshold +//TP_WAVELET_DENH;Low levels (1234)- Finest details +//TP_WAVELET_DENLH;Guided threshold by detail levels 1-4 +//TP_WAVELET_DENL;High levels - Coarsest details +TP_WAVELET_DENH;Threshold +TP_WAVELET_DENLH;Guided threshold by detail levels 1-4 +TP_WAVELET_DENL;Correction structure +TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained +TP_WAVELET_DENMIX_TOOLTIP;Balances the action of the guide taking into account the original image and the denoised image +TP_WAVELET_DENQUA;Mode +TP_WAVELET_DENSLILAB;Method +TP_WAVELET_DENSLI;Slider +TP_WAVELET_DENCURV;Curve +TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide +TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color +TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter +TP_WAVELET_DETEND;Details +TP_WAVELET_DIRFRAME;Directional contrast +TP_WAVELET_DONE;Vertical +TP_WAVELET_DTHR;Diagonal +TP_WAVELET_DTWO;Horizontal +TP_WAVELET_EDCU;Curve +TP_WAVELET_EDEFFECT;Attenuation response +TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment +TP_WAVELET_EDGCONT;Local contrast +TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+std. dev. and maxima. +TP_WAVELET_EDGE;Edge Sharpness +TP_WAVELET_EDGEAMPLI;Base amplification +TP_WAVELET_EDGEDETECT;Gradient sensitivity +TP_WAVELET_EDGEDETECTTHR;Threshold low (noise) +TP_WAVELET_EDGEDETECTTHR2;Edge enhancement +TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge +TP_WAVELET_EDGEDETECT_TOOLTIP;Moving the slider to the right increases edge sensitivity. This affects local contrast, edge settings and noise. +TP_WAVELET_EDGESENSI;Edge sensitivity +TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. +TP_WAVELET_EDGTHRESH;Detail +TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +TP_WAVELET_EDRAD;Radius +TP_WAVELET_EDRAD_TOOLTIP;This adjustment controls the local enhancement. A value of zero still has an effect +TP_WAVELET_EDSL;Threshold sliders +TP_WAVELET_EDTYPE;Local contrast method +TP_WAVELET_EDVAL;Strength +TP_WAVELET_FINAL;Final Touchup +TP_WAVELET_FINCFRAME;Final local contrast +TP_WAVELET_FINCOAR_TOOLTIP;The left (positive) part of the curve acts on the finer levels (increase).\nThe 2 points on the abscissa represent the respective action limits of finer and coarser levels 5 and 6 (default).\nThe right (negative) part of the curve acts on the coarser levels (increase).\nAvoid moving the left part of the curve with negative values. Avoid moving the right part of the curve with positives values +TP_WAVELET_FINEST;Finest +TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter +TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +TP_WAVELET_HIGHLIGHT;Finer levels luminance range +TP_WAVELET_HS1;Whole luminance range +TP_WAVELET_HS2;Selective luminance range +TP_WAVELET_HUESKIN;Skin hue +TP_WAVELET_HUESKIN_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. +TP_WAVELET_HUESKY;Hue range +TP_WAVELET_HUESKY_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. +TP_WAVELET_ITER;Delta balance levels +TP_WAVELET_ITER_TOOLTIP;Left: increase low levels and reduce high levels,\nRight: reduce low levels and increase high levels. +TP_WAVELET_LABEL;Wavelet Levels +TP_WAVELET_LARGEST;Coarsest +TP_WAVELET_LEVCH;Chroma +TP_WAVELET_LEVDEN;Level 5-6 denoise +TP_WAVELET_LEVDIR_ALL;All levels, in all directions +TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level +TP_WAVELET_LEVDIR_ONE;One level +TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level +TP_WAVELET_LEVELS;Wavelet levels +TP_WAVELET_LEVELLOW;Radius 1-4 +TP_WAVELET_LEVELHIGH;Radius 5-6 +TP_WAVELET_LEVELSIGM;Radius +TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. +TP_WAVELET_LEVF;Contrast +TP_WAVELET_LEVLABEL;Preview maximum possible levels = %1 +TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold +TP_WAVELET_LEVONE;Level 2 +TP_WAVELET_LEVTHRE;Level 4 +TP_WAVELET_LEVTWO;Level 3 +TP_WAVELET_LEVZERO;Level 1 +TP_WAVELET_LIMDEN;Interaction levels 56 on levels 14 +TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength +TP_WAVELET_LIPST;Enhanced algoritm +TP_WAVELET_LOWLIGHT;Coarser levels luminance range +TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise +TP_WAVELET_MEDGREINF;First level +TP_WAVELET_MEDI;Reduce artifacts in blue sky +TP_WAVELET_MEDILEV;Edge detection +TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine. +TP_WAVELET_MERGEC;Merge chroma +TP_WAVELET_MERGEL;Merge luma +TP_WAVELET_NEUTRAL;Neutral +TP_WAVELET_MIXCONTRAST;Reference local contrast +TP_WAVELET_MIXDENOISE;Denoise +TP_WAVELET_MIXNOISE;Noise +TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +TP_WAVELET_NOIS;Denoise +TP_WAVELET_NOISE;Denoise and Refine +TP_WAVELET_NOISE_TOOLTIP;If level 4 luminance denoise superior to 50, mode Agressive is used.\nIf chrominance coarse superior to 20, mode Agressive is used. +TP_WAVELET_NPHIGH;High +TP_WAVELET_NPLOW;Low +TP_WAVELET_NPNONE;None +TP_WAVELET_NPTYPE;Neighboring pixels +TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced. +TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +TP_WAVELET_OLDSH;Algorithm using negatives values +TP_WAVELET_OPACITY;Opacity blue-yellow +TP_WAVELET_OPACITYW;Contrast balance d/v-h curve +TP_WAVELET_OPACITYWL;Local contrast +TP_WAVELET_OPACITYWL_TOOLTIP;Modify the final local contrast at the end of the wavelet treatment.\n\nThe left side represents the smallest local contrast, progressing to the largest local contrast on the right. +TP_WAVELET_PASTEL;Pastel chroma +TP_WAVELET_PROC;Process +TP_WAVELET_PROTAB;Protection +TP_WAVELET_QUAAGRES;Agressive +TP_WAVELET_QUACONSER;Conservative +TP_WAVELET_RADIUS;Radius shadows - highlight +TP_WAVELET_RANGEAB;Range a and b % +TP_WAVELET_RE1;Reinforced +TP_WAVELET_RE2;Unchanged +TP_WAVELET_RE3;Reduced +TP_WAVELET_RESBLUR;Blur luminance +TP_WAVELET_RESBLURC;Blur chroma +TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500% +TP_WAVELET_RESCHRO;Strength +TP_WAVELET_RESCON;Shadows +TP_WAVELET_RESCONH;Highlights +TP_WAVELET_RESID;Residual Image +TP_WAVELET_SAT;Saturated chroma +TP_WAVELET_SETTINGS;Wavelet Settings +TP_WAVELET_SHA;Sharp mask +TP_WAVELET_SHFRAME;Shadows/Highlights +TP_WAVELET_SHOWMASK;Show wavelet 'mask' +TP_WAVELET_SIGMA;Attenuation response +TP_WAVELET_SIGM;Radius +TP_WAVELET_SIGMAFIN;Attenuation response +TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values +TP_WAVELET_SKIN;Skin targetting/protection +TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. +TP_WAVELET_SKY;Hue targetting/protection +TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. +TP_WAVELET_SOFTRAD;Soft radius +TP_WAVELET_STREN;Refine +TP_WAVELET_STREND;Strength +TP_WAVELET_STRENGTH;Strength +TP_WAVELET_SUPE;Extra +TP_WAVELET_THR;Shadows threshold +TP_WAVELET_THREND;Local contrast threshold +TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained +//TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped denoise curve based on local contrast.\nReduces noise in uniform areas and preserves image structure +TP_WAVELET_THRESHOLD;Finer levels +TP_WAVELET_THRESHOLD2;Coarser levels +TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of ‘wavelet levels’ will be affected by the Shadow luminance range. +TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. +TP_WAVELET_THRESWAV;Balance threshold +TP_WAVELET_THRH;Highlights threshold +TP_WAVELET_TILESBIG;Tiles +TP_WAVELET_TILESFULL;Full image +TP_WAVELET_TILESIZE;Tiling method +TP_WAVELET_TILESLIT;Little tiles +TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements. +TP_WAVELET_TMEDGS;Edge stopping +TP_WAVELET_TMSCALE;Scale +TP_WAVELET_TMSTRENGTH;Compression strength +TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. +TP_WAVELET_TMTYPE;Compression method +TP_WAVELET_TON;Toning +TP_WAVELET_TONFRAME;Excluded colors +TP_WAVELET_USH;None +TP_WAVELET_USHARP;Clarity method +TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment +TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +TP_WAVELET_WAVLOWTHR;Low contrast threshold +TP_WAVELET_WAVOFFSET;Offset +TP_WBALANCE_AUTO;Auto +TP_WBALANCE_AUTOITCGREEN;Temperature correlation +TP_WBALANCE_AUTOOLD;RGB grey +TP_WBALANCE_AUTO_HEADER;Automatic +TP_WBALANCE_CAMERA;Camera +TP_WBALANCE_CLOUDY;Cloudy +TP_WBALANCE_CUSTOM;Custom +TP_WBALANCE_DAYLIGHT;Daylight (sunny) +TP_WBALANCE_EQBLUERED;Blue/Red equalizer +TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behavior of "white balance" by modulating the blue/red balance.\nThis can be useful when shooting conditions:\na) are far from the standard illuminant (e.g. underwater),\nb) are far from conditions where calibrations were performed,\nc) where the matrices or ICC profiles are unsuitable. +TP_WBALANCE_FLASH55;Leica +TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus +TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta +TP_WBALANCE_FLASH_HEADER;Flash +TP_WBALANCE_FLUO1;F1 - Daylight +TP_WBALANCE_FLUO2;F2 - Cool White +TP_WBALANCE_FLUO3;F3 - White +TP_WBALANCE_FLUO4;F4 - Warm White +TP_WBALANCE_FLUO5;F5 - Daylight +TP_WBALANCE_FLUO6;F6 - Lite White +TP_WBALANCE_FLUO7;F7 - D65 Daylight Simulator +TP_WBALANCE_FLUO8;F8 - D50 / Sylvania F40 Design +TP_WBALANCE_FLUO9;F9 - Cool White Deluxe +TP_WBALANCE_FLUO10;F10 - Philips TL85 +TP_WBALANCE_FLUO11;F11 - Philips TL84 +TP_WBALANCE_FLUO12;F12 - Philips TL83 +TP_WBALANCE_FLUO_HEADER;Fluorescent +TP_WBALANCE_GREEN;Tint +TP_WBALANCE_GTI;GTI +TP_WBALANCE_HMI;HMI +TP_WBALANCE_JUDGEIII;JudgeIII +TP_WBALANCE_LABEL;White Balance +TP_WBALANCE_LAMP_HEADER;Lamp +TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 +TP_WBALANCE_LED_HEADER;LED +TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +TP_WBALANCE_METHOD;Method +TP_WBALANCE_PICKER;Pick +TP_WBALANCE_SHADE;Shade +TP_WBALANCE_SIZE;Size: +TP_WBALANCE_SOLUX35;Solux 3500K +TP_WBALANCE_SOLUX41;Solux 4100K +TP_WBALANCE_SOLUX47;Solux 4700K (vendor) +TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) +TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. +TP_WBALANCE_STUDLABEL;Correlation factor: %1 +TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. +TP_WBALANCE_TEMPBIAS;AWB temperature bias +TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". +TP_WBALANCE_TEMPERATURE;Temperature +TP_WBALANCE_TUNGSTEN;Tungsten +TP_WBALANCE_WATER1;UnderWater 1 +TP_WBALANCE_WATER2;UnderWater 2 +TP_WBALANCE_WATER_HEADER;UnderWater +ZOOMPANEL_100;(100%) +ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window +ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z +ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f +ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + +ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - + +#00 default translation file +#01 Developers should add translations to this file and then run the 'generateTranslationDiffs' Bash script to update other locales. +#02 Translators please append a comment here with the current date and your name(s) as used in the RawTherapee forum or GitHub page, e.g.: +#03 2525-12-24 Zager and Evans + +ABOUT_TAB_BUILD;Version +ABOUT_TAB_CREDITS;Credits +ABOUT_TAB_LICENSE;License +ABOUT_TAB_RELEASENOTES;Release Notes +ABOUT_TAB_SPLASH;Splash +ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. +BATCH_PROCESSING;Batch Processing +CURVEEDITOR_AXIS_IN;I: +CURVEEDITOR_AXIS_LEFT_TAN;LT: +CURVEEDITOR_AXIS_OUT;O: +CURVEEDITOR_AXIS_RIGHT_TAN;RT: +CURVEEDITOR_CATMULLROM;Flexible +CURVEEDITOR_CURVE;Curve +CURVEEDITOR_CURVES;Curves +CURVEEDITOR_CUSTOM;Standard +CURVEEDITOR_DARKS;Darks +CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node. +CURVEEDITOR_HIGHLIGHTS;Highlights +CURVEEDITOR_LIGHTS;Lights +CURVEEDITOR_LINEAR;Linear +CURVEEDITOR_LOADDLGLABEL;Load curve +CURVEEDITOR_MINMAXCPOINTS;Equalizer +CURVEEDITOR_NURBS;Control cage +CURVEEDITOR_PARAMETRIC;Parametric +CURVEEDITOR_SAVEDLGLABEL;Save curve... +CURVEEDITOR_SHADOWS;Shadows +CURVEEDITOR_TOOLTIPCOPY;Copy current curve to clipboard. +CURVEEDITOR_TOOLTIPLINEAR;Reset curve to linear. +CURVEEDITOR_TOOLTIPLOAD;Load a curve from file. +CURVEEDITOR_TOOLTIPPASTE;Paste curve from clipboard. +CURVEEDITOR_TOOLTIPSAVE;Save current curve. +CURVEEDITOR_TYPE;Type: +DIRBROWSER_FOLDERS;Folders +DONT_SHOW_AGAIN;Don't show this message again. +DYNPROFILEEDITOR_DELETE;Delete +DYNPROFILEEDITOR_EDIT;Edit +DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule +DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +DYNPROFILEEDITOR_IMGTYPE_ANY;Any +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +DYNPROFILEEDITOR_IMGTYPE_STD;Standard +DYNPROFILEEDITOR_MOVE_DOWN;Move Down +DYNPROFILEEDITOR_MOVE_UP;Move Up +DYNPROFILEEDITOR_NEW;New +DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule +DYNPROFILEEDITOR_PROFILE;Processing Profile +EDITWINDOW_TITLE;Image Edit +EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. +EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. +EXIFFILTER_APERTURE;Aperture +EXIFFILTER_CAMERA;Camera +EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) +EXIFFILTER_FILETYPE;File type +EXIFFILTER_FOCALLEN;Focal length +EXIFFILTER_IMAGETYPE;Image type +EXIFFILTER_ISO;ISO +EXIFFILTER_LENS;Lens +EXIFFILTER_METADATAFILTER;Enable metadata filters +EXIFFILTER_SHUTTER;Shutter +EXIFPANEL_ADDEDIT;Add/Edit +EXIFPANEL_ADDEDITHINT;Add new tag or edit tag. +EXIFPANEL_ADDTAGDLG_ENTERVALUE;Enter value +EXIFPANEL_ADDTAGDLG_SELECTTAG;Select tag +EXIFPANEL_ADDTAGDLG_TITLE;Add/Edit Tag +EXIFPANEL_KEEP;Keep +EXIFPANEL_KEEPHINT;Keep the selected tags when writing output file. +EXIFPANEL_REMOVE;Remove +EXIFPANEL_REMOVEHINT;Remove the selected tags when writing output file. +EXIFPANEL_RESET;Reset +EXIFPANEL_RESETALL;Reset All +EXIFPANEL_RESETALLHINT;Reset all tags to their original values. +EXIFPANEL_RESETHINT;Reset the selected tags to their original values. +EXIFPANEL_SHOWALL;Show all +EXIFPANEL_SUBDIRECTORY;Subdirectory +EXPORT_BYPASS;Processing steps to bypass +EXPORT_BYPASS_ALL;Select / Unselect All +EXPORT_BYPASS_DEFRINGE;Bypass Defringe +EXPORT_BYPASS_DIRPYRDENOISE;Bypass Noise Reduction +EXPORT_BYPASS_DIRPYREQUALIZER;Bypass Contrast by Detail Levels +EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels +EXPORT_BYPASS_RAW_CA;Bypass [raw] Chromatic Aberration Correction +EXPORT_BYPASS_RAW_CCSTEPS;Bypass [raw] False Color Suppression +EXPORT_BYPASS_RAW_DCB_ENHANCE;Bypass [raw] DCB Enhancement Steps +EXPORT_BYPASS_RAW_DCB_ITERATIONS;Bypass [raw] DCB Iterations +EXPORT_BYPASS_RAW_DF;Bypass [raw] Dark-Frame +EXPORT_BYPASS_RAW_FF;Bypass [raw] Flat-Field +EXPORT_BYPASS_RAW_GREENTHRESH;Bypass [raw] Green Equilibration +EXPORT_BYPASS_RAW_LINENOISE;Bypass [raw] Line Noise Filter +EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Bypass [raw] LMMSE Enhancement Steps +EXPORT_BYPASS_SHARPENEDGE;Bypass Edge Sharpening +EXPORT_BYPASS_SHARPENING;Bypass Sharpening +EXPORT_BYPASS_SHARPENMICRO;Bypass Microcontrast +EXPORT_FASTEXPORTOPTIONS;Fast Export Options +EXPORT_INSTRUCTIONS;Fast Export options provide overrides to bypass time and resource consuming development settings and to run queue processing using the fast export settings instead. This method is recommended for quicker generation of lower resolution images when speed is a priority or when resized output is desired for one or many images without making modifications to their saved development parameters. +EXPORT_MAXHEIGHT;Maximum height: +EXPORT_MAXWIDTH;Maximum width: +EXPORT_PIPELINE;Processing pipeline +EXPORT_PUTTOQUEUEFAST; Put to queue for fast export +EXPORT_RAW_DMETHOD;Demosaic method +EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) +EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. +EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) +EXTPROGTARGET_1;raw +EXTPROGTARGET_2;queue-processed +FILEBROWSER_APPLYPROFILE;Apply +FILEBROWSER_APPLYPROFILE_PARTIAL;Apply - partial +FILEBROWSER_AUTODARKFRAME;Auto dark-frame +FILEBROWSER_AUTOFLATFIELD;Auto flat-field +FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory +FILEBROWSER_CACHE;Cache +FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles +FILEBROWSER_CLEARPROFILE;Clear +FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple +FILEBROWSER_COPYPROFILE;Copy +FILEBROWSER_CURRENT_NAME;Current name: +FILEBROWSER_DARKFRAME;Dark-frame +FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +FILEBROWSER_DELETEDIALOG_HEADER;File delete confirmation: +FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +FILEBROWSER_EMPTYTRASH;Empty trash +FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +FILEBROWSER_EXTPROGMENU;Open with +FILEBROWSER_FLATFIELD;Flat-Field +FILEBROWSER_MOVETODARKFDIR;Move to dark-frames directory +FILEBROWSER_MOVETOFLATFIELDDIR;Move to flat-fields directory +FILEBROWSER_NEW_NAME;New name: +FILEBROWSER_OPENDEFAULTVIEWER;Windows default viewer (queue-processed) +FILEBROWSER_PARTIALPASTEPROFILE;Paste - partial +FILEBROWSER_PASTEPROFILE;Paste +FILEBROWSER_POPUPCANCELJOB;Cancel job +FILEBROWSER_POPUPCOLORLABEL;Color label +FILEBROWSER_POPUPCOLORLABEL0;Label: None +FILEBROWSER_POPUPCOLORLABEL1;Label: Red +FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow +FILEBROWSER_POPUPCOLORLABEL3;Label: Green +FILEBROWSER_POPUPCOLORLABEL4;Label: Blue +FILEBROWSER_POPUPCOLORLABEL5;Label: Purple +FILEBROWSER_POPUPCOPYTO;Copy to... +FILEBROWSER_POPUPFILEOPERATIONS;File operations +FILEBROWSER_POPUPMOVEEND;Move to end of queue +FILEBROWSER_POPUPMOVEHEAD;Move to head of queue +FILEBROWSER_POPUPMOVETO;Move to... +FILEBROWSER_POPUPOPEN;Open +FILEBROWSER_POPUPOPENINEDITOR;Open in Editor +FILEBROWSER_POPUPPROCESS;Put to queue +FILEBROWSER_POPUPPROCESSFAST;Put to queue (Fast export) +FILEBROWSER_POPUPPROFILEOPERATIONS;Processing profile operations +FILEBROWSER_POPUPRANK;Rank +FILEBROWSER_POPUPRANK0;Unrank +FILEBROWSER_POPUPRANK1;Rank 1 * +FILEBROWSER_POPUPRANK2;Rank 2 ** +FILEBROWSER_POPUPRANK3;Rank 3 *** +FILEBROWSER_POPUPRANK4;Rank 4 **** +FILEBROWSER_POPUPRANK5;Rank 5 ***** +FILEBROWSER_POPUPREMOVE;Delete permanently +FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version +FILEBROWSER_POPUPRENAME;Rename +FILEBROWSER_POPUPSELECTALL;Select all +FILEBROWSER_POPUPTRASH;Move to trash +FILEBROWSER_POPUPUNRANK;Unrank +FILEBROWSER_POPUPUNTRASH;Remove from trash +FILEBROWSER_QUERYBUTTONHINT;Clear the Find query +FILEBROWSER_QUERYHINT;Type filenames to search for. Supports partial filenames. Separate the search terms using commas, e.g.\n1001,1004,1199\n\nExclude search terms by prefixing them with !=\ne.g.\n!=1001,1004,1199\n\nShortcuts:\nCtrl-f - focus the Find box,\nEnter - search,\nEsc - clear the Find box,\nShift-Esc - defocus the Find box. +FILEBROWSER_QUERYLABEL; Find: +FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nShortcut: Shift-1 +FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nShortcut: Shift-2 +FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nShortcut: Shift-3 +FILEBROWSER_RANK4_TOOLTIP;Rank 4 *\nShortcut: Shift-4 +FILEBROWSER_RANK5_TOOLTIP;Rank 5 *\nShortcut: Shift-5 +FILEBROWSER_RENAMEDLGLABEL;Rename file +FILEBROWSER_RESETDEFAULTPROFILE;Reset to default +FILEBROWSER_SELECTDARKFRAME;Select dark-frame... +FILEBROWSER_SELECTFLATFIELD;Select flat-field... +FILEBROWSER_SHOWCOLORLABEL1HINT;Show images labeled Red.\nShortcut: Alt-1 +FILEBROWSER_SHOWCOLORLABEL2HINT;Show images labeled Yellow.\nShortcut: Alt-2 +FILEBROWSER_SHOWCOLORLABEL3HINT;Show images labeled Green.\nShortcut: Alt-3 +FILEBROWSER_SHOWCOLORLABEL4HINT;Show images labeled Blue.\nShortcut: Alt-4 +FILEBROWSER_SHOWCOLORLABEL5HINT;Show images labeled Purple.\nShortcut: Alt-5 +FILEBROWSER_SHOWDIRHINT;Clear all filters.\nShortcut: d +FILEBROWSER_SHOWEDITEDHINT;Show edited images.\nShortcut: 7 +FILEBROWSER_SHOWEDITEDNOTHINT;Show not edited images.\nShortcut: 6 +FILEBROWSER_SHOWEXIFINFO;Show Exif info.\n\nShortcuts:\ni - Multiple Editor Tabs Mode,\nAlt-i - Single Editor Tab Mode. +FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. +FILEBROWSER_SHOWRANK1HINT;Show images ranked as 1-star.\nShortcut: 1 +FILEBROWSER_SHOWRANK2HINT;Show images ranked as 2-star.\nShortcut: 2 +FILEBROWSER_SHOWRANK3HINT;Show images ranked as 3-star.\nShortcut: 3 +FILEBROWSER_SHOWRANK4HINT;Show images ranked as 4-star.\nShortcut: 4 +FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5-star.\nShortcut: 5 +FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 +FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 +FILEBROWSER_SHOWTRASHHINT;Show contents of trash.\nShortcut: Ctrl-t +FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 +FILEBROWSER_SHOWUNRANKHINT;Show unranked images.\nShortcut: 0 +FILEBROWSER_THUMBSIZE;Thumbnail size +FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 +FILEBROWSER_ZOOMINHINT;Increase thumbnail size.\n\nShortcuts:\n+ - Multiple Editor Tabs Mode,\nAlt-+ - Single Editor Tab Mode. +FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size.\n\nShortcuts:\n- - Multiple Editor Tabs Mode,\nAlt-- - Single Editor Tab Mode. +FILECHOOSER_FILTER_ANY;All files +FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) +FILECHOOSER_FILTER_CURVE;Curve files +FILECHOOSER_FILTER_LCP;Lens correction profiles +FILECHOOSER_FILTER_PP;Processing profiles +FILECHOOSER_FILTER_SAME;Same format as current photo +FILECHOOSER_FILTER_TIFF;TIFF files +GENERAL_ABOUT;About +GENERAL_AFTER;After +GENERAL_APPLY;Apply +GENERAL_ASIMAGE;As Image +GENERAL_AUTO;Automatic +GENERAL_BEFORE;Before +GENERAL_CANCEL;Cancel +GENERAL_CLOSE;Close +GENERAL_CURRENT;Current +GENERAL_DISABLE;Disable +GENERAL_DISABLED;Disabled +GENERAL_ENABLE;Enable +GENERAL_ENABLED;Enabled +GENERAL_FILE;File +GENERAL_HELP;Help +GENERAL_LANDSCAPE;Landscape +GENERAL_NA;n/a +GENERAL_NO;No +GENERAL_NONE;None +GENERAL_OK;OK +GENERAL_OPEN;Open +GENERAL_PORTRAIT;Portrait +GENERAL_RESET;Reset +GENERAL_SAVE;Save +GENERAL_SAVE_AS;Save as... +GENERAL_SLIDER;Slider +GENERAL_UNCHANGED;(Unchanged) +GENERAL_WARNING;Warning +GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. +HISTOGRAM_TOOLTIP_B;Show/Hide blue histogram. +HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. +HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. +HISTOGRAM_TOOLTIP_G;Show/Hide green histogram. +HISTOGRAM_TOOLTIP_L;Show/Hide CIELab luminance histogram. +HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. +HISTOGRAM_TOOLTIP_R;Show/Hide red histogram. +HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. +HISTORY_CHANGED;Changed +HISTORY_CUSTOMCURVE;Custom curve +HISTORY_FROMCLIPBOARD;From clipboard +HISTORY_LABEL;History +HISTORY_MSG_1;Photo loaded +HISTORY_MSG_2;PP3 loaded +HISTORY_MSG_3;PP3 changed +HISTORY_MSG_4;History browsing +HISTORY_MSG_5;Exposure - Lightness +HISTORY_MSG_6;Exposure - Contrast +HISTORY_MSG_7;Exposure - Black +HISTORY_MSG_8;Exposure - Compensation +HISTORY_MSG_9;Exposure - Highlight compression +HISTORY_MSG_10;Exposure - Shadow compression +HISTORY_MSG_11;Exposure - Tone curve 1 +HISTORY_MSG_12;Exposure - Auto levels +HISTORY_MSG_13;Exposure - Clip +HISTORY_MSG_14;L*a*b* - Lightness +HISTORY_MSG_15;L*a*b* - Contrast +HISTORY_MSG_16;- +HISTORY_MSG_17;- +HISTORY_MSG_18;- +HISTORY_MSG_19;L*a*b* - L* curve +HISTORY_MSG_20;Sharpening +HISTORY_MSG_21;USM - Radius +HISTORY_MSG_22;USM - Amount +HISTORY_MSG_23;USM - Threshold +HISTORY_MSG_24;USM - Sharpen only edges +HISTORY_MSG_25;USM - Edge detection radius +HISTORY_MSG_26;USM - Edge tolerance +HISTORY_MSG_27;USM - Halo control +HISTORY_MSG_28;USM - Halo control amount +HISTORY_MSG_29;Sharpening - Method +HISTORY_MSG_30;RLD - Radius +HISTORY_MSG_31;RLD - Amount +HISTORY_MSG_32;RLD - Damping +HISTORY_MSG_33;RLD - Iterations +HISTORY_MSG_34;Lens Correction - Distortion +HISTORY_MSG_35;Lens Correction - Vignetting +HISTORY_MSG_36;Lens Correction - CA +HISTORY_MSG_37;Exposure - Auto levels +HISTORY_MSG_38;White Balance - Method +HISTORY_MSG_39;WB - Temperature +HISTORY_MSG_40;WB - Tint +HISTORY_MSG_41;Exposure - Tone curve 1 mode +HISTORY_MSG_42;Exposure - Tone curve 2 +HISTORY_MSG_43;Exposure - Tone curve 2 mode +HISTORY_MSG_44;Lum. denoising radius +HISTORY_MSG_45;Lum. denoising edge tolerance +HISTORY_MSG_46;Color denoising +HISTORY_MSG_47;Blend ICC highlights with matrix +HISTORY_MSG_48;DCP - Tone curve +HISTORY_MSG_49;DCP illuminant +HISTORY_MSG_50;Shadows/Highlights +HISTORY_MSG_51;S/H - Highlights +HISTORY_MSG_52;S/H - Shadows +HISTORY_MSG_53;S/H - Highlights tonal width +HISTORY_MSG_54;S/H - Shadows tonal width +HISTORY_MSG_55;S/H - Local contrast +HISTORY_MSG_56;S/H - Radius +HISTORY_MSG_57;Coarse rotation +HISTORY_MSG_58;Horizontal flipping +HISTORY_MSG_59;Vertical flipping +HISTORY_MSG_60;Rotation +HISTORY_MSG_61;Auto-fill +HISTORY_MSG_62;Distortion correction +HISTORY_MSG_63;Snapshot selected +HISTORY_MSG_64;Crop +HISTORY_MSG_65;CA correction +HISTORY_MSG_66;Exposure - Highlight reconstruction +HISTORY_MSG_67;Exposure - HLR amount +HISTORY_MSG_68;Exposure - HLR method +HISTORY_MSG_69;Working color space +HISTORY_MSG_70;Output color space +HISTORY_MSG_71;Input color space +HISTORY_MSG_72;VC - Amount +HISTORY_MSG_73;Channel Mixer +HISTORY_MSG_74;Resize - Scale +HISTORY_MSG_75;Resize - Method +HISTORY_MSG_76;Exif metadata +HISTORY_MSG_77;IPTC metadata +HISTORY_MSG_78;- +HISTORY_MSG_79;Resize - Width +HISTORY_MSG_80;Resize - Height +HISTORY_MSG_81;Resize +HISTORY_MSG_82;Profile changed +HISTORY_MSG_83;S/H - Sharp mask +HISTORY_MSG_84;Perspective correction +HISTORY_MSG_85;Lens Correction - LCP file +HISTORY_MSG_86;RGB Curves - Luminosity mode +HISTORY_MSG_87;Impulse Noise Reduction +HISTORY_MSG_88;Impulse NR threshold +HISTORY_MSG_89;Noise Reduction +HISTORY_MSG_90;NR - Luminance +HISTORY_MSG_91;NR - Chrominance master +HISTORY_MSG_92;NR - Gamma +HISTORY_MSG_93;CbDL - Value +HISTORY_MSG_94;Contrast by Detail Levels +HISTORY_MSG_95;L*a*b* - Chromaticity +HISTORY_MSG_96;L*a*b* - a* curve +HISTORY_MSG_97;L*a*b* - b* curve +HISTORY_MSG_98;Demosaicing method +HISTORY_MSG_99;Hot pixel filter +HISTORY_MSG_100;Exposure - Saturation +HISTORY_MSG_101;HSV - Hue +HISTORY_MSG_102;HSV - Saturation +HISTORY_MSG_103;HSV - Value +HISTORY_MSG_104;HSV Equalizer +HISTORY_MSG_105;Defringe +HISTORY_MSG_106;Defringe - Radius +HISTORY_MSG_107;Defringe - Threshold +HISTORY_MSG_108;Exposure - HLC threshold +HISTORY_MSG_109;Resize - Bounding box +HISTORY_MSG_110;Resize - Applies to +HISTORY_MSG_111;L*a*b* - Avoid color shift +HISTORY_MSG_112;--unused-- +HISTORY_MSG_113;L*a*b* - Red/skin prot. +HISTORY_MSG_114;DCB iterations +HISTORY_MSG_115;False color suppression +HISTORY_MSG_116;DCB enhancement +HISTORY_MSG_117;Raw CA correction - Red +HISTORY_MSG_118;Raw CA correction - Blue +HISTORY_MSG_119;Line noise filter +HISTORY_MSG_120;Green equilibration +HISTORY_MSG_121;Raw CA Correction - Auto +HISTORY_MSG_122;Dark-Frame - Auto-selection +HISTORY_MSG_123;Dark-Frame - File +HISTORY_MSG_124;White point correction +HISTORY_MSG_126;Flat-Field - File +HISTORY_MSG_127;Flat-Field - Auto-selection +HISTORY_MSG_128;Flat-Field - Blur radius +HISTORY_MSG_129;Flat-Field - Blur type +HISTORY_MSG_130;Auto distortion correction +HISTORY_MSG_131;NR - Luma +HISTORY_MSG_132;NR - Chroma +HISTORY_MSG_133;Output gamma +HISTORY_MSG_134;Free gamma +HISTORY_MSG_135;Free gamma +HISTORY_MSG_136;Free gamma slope +HISTORY_MSG_137;Black level - Green 1 +HISTORY_MSG_138;Black level - Red +HISTORY_MSG_139;Black level - Blue +HISTORY_MSG_140;Black level - Green 2 +HISTORY_MSG_141;Black level - Link greens +HISTORY_MSG_142;ES - Iterations +HISTORY_MSG_143;ES - Quantity +HISTORY_MSG_144;Microcontrast - Quantity +HISTORY_MSG_145;Microcontrast - Uniformity +HISTORY_MSG_146;Edge sharpening +HISTORY_MSG_147;ES - Luminance only +HISTORY_MSG_148;Microcontrast +HISTORY_MSG_149;Microcontrast - 3×3 matrix +HISTORY_MSG_150;Post-demosaic artifact/noise red. +HISTORY_MSG_151;Vibrance +HISTORY_MSG_152;Vib - Pastel tones +HISTORY_MSG_153;Vib - Saturated tones +HISTORY_MSG_154;Vib - Protect skin-tones +HISTORY_MSG_155;Vib - Avoid color shift +HISTORY_MSG_156;Vib - Link pastel/saturated +HISTORY_MSG_157;Vib - P/S threshold +HISTORY_MSG_158;TM - Strength +HISTORY_MSG_159;TM - Edge stopping +HISTORY_MSG_160;TM - Scale +HISTORY_MSG_161;TM - Reweighting iterates +HISTORY_MSG_162;Tone Mapping +HISTORY_MSG_163;RGB Curves - Red +HISTORY_MSG_164;RGB Curves - Green +HISTORY_MSG_165;RGB Curves - Blue +HISTORY_MSG_166;Exposure - Reset +HISTORY_MSG_167;Demosaicing method +HISTORY_MSG_168;L*a*b* - CC curve +HISTORY_MSG_169;L*a*b* - CH curve +HISTORY_MSG_170;Vibrance - HH curve +HISTORY_MSG_171;L*a*b* - LC curve +HISTORY_MSG_172;L*a*b* - Restrict LC +HISTORY_MSG_173;NR - Detail recovery +HISTORY_MSG_174;CIECAM02 +HISTORY_MSG_175;CAM02 - CAT02 adaptation +HISTORY_MSG_176;CAM02 - Viewing surround +HISTORY_MSG_177;CAM02 - Scene luminosity +HISTORY_MSG_178;CAM02 - Viewing luminosity +HISTORY_MSG_179;CAM02 - White-point model +HISTORY_MSG_180;CAM02 - Lightness (J) +HISTORY_MSG_181;CAM02 - Chroma (C) +HISTORY_MSG_182;CAM02 - Automatic CAT02 +HISTORY_MSG_183;CAM02 - Contrast (J) +HISTORY_MSG_184;CAM02 - Scene surround +HISTORY_MSG_185;CAM02 - Gamut control +HISTORY_MSG_186;CAM02 - Algorithm +HISTORY_MSG_187;CAM02 - Red/skin prot. +HISTORY_MSG_188;CAM02 - Brightness (Q) +HISTORY_MSG_189;CAM02 - Contrast (Q) +HISTORY_MSG_190;CAM02 - Saturation (S) +HISTORY_MSG_191;CAM02 - Colorfulness (M) +HISTORY_MSG_192;CAM02 - Hue (h) +HISTORY_MSG_193;CAM02 - Tone curve 1 +HISTORY_MSG_194;CAM02 - Tone curve 2 +HISTORY_MSG_195;CAM02 - Tone curve 1 +HISTORY_MSG_196;CAM02 - Tone curve 2 +HISTORY_MSG_197;CAM02 - Color curve +HISTORY_MSG_198;CAM02 - Color curve +HISTORY_MSG_199;CAM02 - Output histograms +HISTORY_MSG_200;CAM02 - Tone mapping +HISTORY_MSG_201;NR - Chrominance - R&G +HISTORY_MSG_202;NR - Chrominance - B&Y +HISTORY_MSG_203;NR - Color space +HISTORY_MSG_204;LMMSE enhancement steps +HISTORY_MSG_205;CAM02 - Hot/bad pixel filter +HISTORY_MSG_206;CAT02 - Auto scene luminosity +HISTORY_MSG_207;Defringe - Hue curve +HISTORY_MSG_208;WB - B/R equalizer +HISTORY_MSG_210;GF - Angle +HISTORY_MSG_211;Graduated Filter +HISTORY_MSG_212;VF - Strength +HISTORY_MSG_213;Vignette Filter +HISTORY_MSG_214;Black-and-White +HISTORY_MSG_215;B&W - CM - Red +HISTORY_MSG_216;B&W - CM - Green +HISTORY_MSG_217;B&W - CM - Blue +HISTORY_MSG_218;B&W - Gamma - Red +HISTORY_MSG_219;B&W - Gamma - Green +HISTORY_MSG_220;B&W - Gamma - Blue +HISTORY_MSG_221;B&W - Color filter +HISTORY_MSG_222;B&W - Presets +HISTORY_MSG_223;B&W - CM - Orange +HISTORY_MSG_224;B&W - CM - Yellow +HISTORY_MSG_225;B&W - CM - Cyan +HISTORY_MSG_226;B&W - CM - Magenta +HISTORY_MSG_227;B&W - CM - Purple +HISTORY_MSG_228;B&W - Luminance equalizer +HISTORY_MSG_229;B&W - Luminance equalizer +HISTORY_MSG_230;B&W - Mode +HISTORY_MSG_231;B&W - 'Before' curve +HISTORY_MSG_232;B&W - 'Before' curve type +HISTORY_MSG_233;B&W - 'After' curve +HISTORY_MSG_234;B&W - 'After' curve type +HISTORY_MSG_235;B&W - CM - Auto +HISTORY_MSG_236;--unused-- +HISTORY_MSG_237;B&W - CM +HISTORY_MSG_238;GF - Feather +HISTORY_MSG_239;GF - Strength +HISTORY_MSG_240;GF - Center +HISTORY_MSG_241;VF - Feather +HISTORY_MSG_242;VF - Roundness +HISTORY_MSG_243;VC - Radius +HISTORY_MSG_244;VC - Strength +HISTORY_MSG_245;VC - Center +HISTORY_MSG_246;L*a*b* - CL curve +HISTORY_MSG_247;L*a*b* - LH curve +HISTORY_MSG_248;L*a*b* - HH curve +HISTORY_MSG_249;CbDL - Threshold +HISTORY_MSG_250;NR - Enhanced +HISTORY_MSG_251;B&W - Algorithm +HISTORY_MSG_252;CbDL - Skin tar/prot +HISTORY_MSG_253;CbDL - Reduce artifacts +HISTORY_MSG_254;CbDL - Skin hue +HISTORY_MSG_255;NR - Median filter +HISTORY_MSG_256;NR - Median - Type +HISTORY_MSG_257;Color Toning +HISTORY_MSG_258;CT - Color curve +HISTORY_MSG_259;CT - Opacity curve +HISTORY_MSG_260;CT - a*[b*] opacity +HISTORY_MSG_261;CT - Method +HISTORY_MSG_262;CT - b* opacity +HISTORY_MSG_263;CT - Shadows - Red +HISTORY_MSG_264;CT - Shadows - Green +HISTORY_MSG_265;CT - Shadows - Blue +HISTORY_MSG_266;CT - Mid - Red +HISTORY_MSG_267;CT - Mid - Green +HISTORY_MSG_268;CT - Mid - Blue +HISTORY_MSG_269;CT - High - Red +HISTORY_MSG_270;CT - High - Green +HISTORY_MSG_271;CT - High - Blue +HISTORY_MSG_272;CT - Balance +HISTORY_MSG_273;CT - Color Balance SMH +HISTORY_MSG_274;CT - Sat. Shadows +HISTORY_MSG_275;CT - Sat. Highlights +HISTORY_MSG_276;CT - Opacity +HISTORY_MSG_277;--unused-- +HISTORY_MSG_278;CT - Preserve luminance +HISTORY_MSG_279;CT - Shadows +HISTORY_MSG_280;CT - Highlights +HISTORY_MSG_281;CT - Sat. strength +HISTORY_MSG_282;CT - Sat. threshold +HISTORY_MSG_283;CT - Strength +HISTORY_MSG_284;CT - Auto sat. protection +HISTORY_MSG_285;NR - Median - Method +HISTORY_MSG_286;NR - Median - Type +HISTORY_MSG_287;NR - Median - Iterations +HISTORY_MSG_288;Flat-Field - Clip control +HISTORY_MSG_289;Flat-Field - Clip control - Auto +HISTORY_MSG_290;Black Level - Red +HISTORY_MSG_291;Black Level - Green +HISTORY_MSG_292;Black Level - Blue +HISTORY_MSG_293;Film Simulation +HISTORY_MSG_294;Film Simulation - Strength +HISTORY_MSG_295;Film Simulation - Film +HISTORY_MSG_296;NR - Luminance curve +HISTORY_MSG_297;NR - Mode +HISTORY_MSG_298;Dead pixel filter +HISTORY_MSG_299;NR - Chrominance curve +HISTORY_MSG_300;- +HISTORY_MSG_301;NR - Luma control +HISTORY_MSG_302;NR - Chroma method +HISTORY_MSG_303;NR - Chroma method +HISTORY_MSG_304;W - Contrast levels +HISTORY_MSG_305;Wavelet Levels +HISTORY_MSG_306;W - Process +HISTORY_MSG_307;W - Process +HISTORY_MSG_308;W - Process direction +HISTORY_MSG_309;W - ES - Detail +HISTORY_MSG_310;W - Residual - Sky tar/prot +HISTORY_MSG_311;W - Wavelet levels +HISTORY_MSG_312;W - Residual - Shadows threshold +HISTORY_MSG_313;W - Chroma - Sat/past +HISTORY_MSG_314;W - Gamut - Reduce artifacts +HISTORY_MSG_315;W - Residual - Contrast +HISTORY_MSG_316;W - Gamut - Skin tar/prot +HISTORY_MSG_317;W - Gamut - Skin hue +HISTORY_MSG_318;W - Contrast - Finer levels +HISTORY_MSG_319;W - Contrast - Finer range +HISTORY_MSG_320;W - Contrast - Coarser range +HISTORY_MSG_321;W - Contrast - Coarser levels +HISTORY_MSG_322;W - Gamut - Avoid color shift +HISTORY_MSG_323;W - ES - Local contrast +HISTORY_MSG_324;W - Chroma - Pastel +HISTORY_MSG_325;W - Chroma - Saturated +HISTORY_MSG_326;W - Chroma - Method +HISTORY_MSG_327;W - Contrast - Apply to +HISTORY_MSG_328;W - Chroma - Link strength +HISTORY_MSG_329;W - Toning - Opacity RG +HISTORY_MSG_330;W - Toning - Opacity BY +HISTORY_MSG_331;W - Contrast levels - Extra +HISTORY_MSG_332;W - Tiling method +HISTORY_MSG_333;W - Residual - Shadows +HISTORY_MSG_334;W - Residual - Chroma +HISTORY_MSG_335;W - Residual - Highlights +HISTORY_MSG_336;W - Residual - Highlights threshold +HISTORY_MSG_337;W - Residual - Sky hue +HISTORY_MSG_338;W - ES - Radius +HISTORY_MSG_339;W - ES - Strength +HISTORY_MSG_340;W - Strength +HISTORY_MSG_341;W - Edge performance +HISTORY_MSG_342;W - ES - First level +HISTORY_MSG_343;W - Chroma levels +HISTORY_MSG_344;W - Meth chroma sl/cur +HISTORY_MSG_345;W - ES - Local contrast +HISTORY_MSG_346;W - ES - Local contrast method +HISTORY_MSG_347;W - Denoise - Level 1 +HISTORY_MSG_348;W - Denoise - Level 2 +HISTORY_MSG_349;W - Denoise - Level 3 +HISTORY_MSG_350;W - ES - Edge detection +HISTORY_MSG_351;W - Residual - HH curve +HISTORY_MSG_352;W - Background +HISTORY_MSG_353;W - ES - Gradient sensitivity +HISTORY_MSG_354;W - ES - Enhanced +HISTORY_MSG_355;W - ES - Threshold low +HISTORY_MSG_356;W - ES - Threshold high +HISTORY_MSG_357;W - Denoise - Link with ES +HISTORY_MSG_358;W - Gamut - CH +HISTORY_MSG_359;Hot/Dead - Threshold +HISTORY_MSG_360;TM - Gamma +HISTORY_MSG_361;W - Final - Chroma balance +HISTORY_MSG_362;W - Residual - Compression method +HISTORY_MSG_363;W - Residual - Compression strength +HISTORY_MSG_364;W - Final - Contrast balance +HISTORY_MSG_365;W - Final - Delta balance +HISTORY_MSG_366;W - Residual - Compression gamma +HISTORY_MSG_367;W - Final - 'After' contrast curve +HISTORY_MSG_368;W - Final - Contrast balance +HISTORY_MSG_369;W - Final - Balance method +HISTORY_MSG_370;W - Final - Local contrast curve +HISTORY_MSG_371;Post-Resize Sharpening +HISTORY_MSG_372;PRS USM - Radius +HISTORY_MSG_373;PRS USM - Amount +HISTORY_MSG_374;PRS USM - Threshold +HISTORY_MSG_375;PRS USM - Sharpen only edges +HISTORY_MSG_376;PRS USM - Edge detection radius +HISTORY_MSG_377;PRS USM - Edge tolerance +HISTORY_MSG_378;PRS USM - Halo control +HISTORY_MSG_379;PRS USM - Halo control amount +HISTORY_MSG_380;PRS - Method +HISTORY_MSG_381;PRS RLD - Radius +HISTORY_MSG_382;PRS RLD - Amount +HISTORY_MSG_383;PRS RLD - Damping +HISTORY_MSG_384;PRS RLD - Iterations +HISTORY_MSG_385;W - Residual - Color balance +HISTORY_MSG_386;W - Residual - CB green high +HISTORY_MSG_387;W - Residual - CB blue high +HISTORY_MSG_388;W - Residual - CB green mid +HISTORY_MSG_389;W - Residual - CB blue mid +HISTORY_MSG_390;W - Residual - CB green low +HISTORY_MSG_391;W - Residual - CB blue low +HISTORY_MSG_392;W - Residual - Color balance +HISTORY_MSG_393;DCP - Look table +HISTORY_MSG_394;DCP - Baseline exposure +HISTORY_MSG_395;DCP - Base table +HISTORY_MSG_396;W - Contrast sub-tool +HISTORY_MSG_397;W - Chroma sub-tool +HISTORY_MSG_398;W - ES sub-tool +HISTORY_MSG_399;W - Residual sub-tool +HISTORY_MSG_400;W - Final sub-tool +HISTORY_MSG_401;W - Toning sub-tool +HISTORY_MSG_402;W - Denoise sub-tool +HISTORY_MSG_403;W - ES - Edge sensitivity +HISTORY_MSG_404;W - ES - Base amplification +HISTORY_MSG_405;W - Denoise - Level 4 +HISTORY_MSG_406;W - ES - Neighboring pixels +HISTORY_MSG_407;Retinex - Method +HISTORY_MSG_408;Retinex - Radius +HISTORY_MSG_409;Retinex - Contrast +HISTORY_MSG_410;Retinex - Offset +HISTORY_MSG_411;Retinex - Strength +HISTORY_MSG_412;Retinex - Gaussian gradient +HISTORY_MSG_413;Retinex - Contrast +HISTORY_MSG_414;Retinex - Histogram - Lab +HISTORY_MSG_415;Retinex - Transmission +HISTORY_MSG_416;Retinex +HISTORY_MSG_417;Retinex - Transmission median +HISTORY_MSG_418;Retinex - Threshold +HISTORY_MSG_419;Retinex - Color space +HISTORY_MSG_420;Retinex - Histogram - HSL +HISTORY_MSG_421;Retinex - Gamma +HISTORY_MSG_422;Retinex - Gamma +HISTORY_MSG_423;Retinex - Gamma slope +HISTORY_MSG_424;Retinex - HL threshold +HISTORY_MSG_425;Retinex - Log base +HISTORY_MSG_426;Retinex - Hue equalizer +HISTORY_MSG_427;Output rendering intent +HISTORY_MSG_428;Monitor rendering intent +HISTORY_MSG_429;Retinex - Iterations +HISTORY_MSG_430;Retinex - Transmission gradient +HISTORY_MSG_431;Retinex - Strength gradient +HISTORY_MSG_432;Retinex - M - Highlights +HISTORY_MSG_433;Retinex - M - Highlights TW +HISTORY_MSG_434;Retinex - M - Shadows +HISTORY_MSG_435;Retinex - M - Shadows TW +HISTORY_MSG_436;Retinex - M - Radius +HISTORY_MSG_437;Retinex - M - Method +HISTORY_MSG_438;Retinex - M - Equalizer +HISTORY_MSG_439;Retinex - Process +HISTORY_MSG_440;CbDL - Method +HISTORY_MSG_441;Retinex - Gain transmission +HISTORY_MSG_442;Retinex - Scale +HISTORY_MSG_443;Output black point compensation +HISTORY_MSG_444;WB - Temp bias +HISTORY_MSG_445;Raw Sub-Image +HISTORY_MSG_446;EvPixelShiftMotion +HISTORY_MSG_447;EvPixelShiftMotionCorrection +HISTORY_MSG_448;EvPixelShiftStddevFactorGreen +HISTORY_MSG_449;PS ISO adaption +HISTORY_MSG_450;EvPixelShiftNreadIso +HISTORY_MSG_451;EvPixelShiftPrnu +HISTORY_MSG_452;PS Show motion +HISTORY_MSG_453;PS Show mask only +HISTORY_MSG_454;EvPixelShiftAutomatic +HISTORY_MSG_455;EvPixelShiftNonGreenHorizontal +HISTORY_MSG_456;EvPixelShiftNonGreenVertical +HISTORY_MSG_457;PS Check red/blue +HISTORY_MSG_458;EvPixelShiftStddevFactorRed +HISTORY_MSG_459;EvPixelShiftStddevFactorBlue +HISTORY_MSG_460;EvPixelShiftGreenAmaze +HISTORY_MSG_461;EvPixelShiftNonGreenAmaze +HISTORY_MSG_462;PS Check green +HISTORY_MSG_463;EvPixelShiftRedBlueWeight +HISTORY_MSG_464;PS Blur motion mask +HISTORY_MSG_465;PS Blur radius +HISTORY_MSG_466;EvPixelShiftSum +HISTORY_MSG_467;EvPixelShiftExp0 +HISTORY_MSG_468;PS Fill holes +HISTORY_MSG_469;PS Median +HISTORY_MSG_470;EvPixelShiftMedian3 +HISTORY_MSG_471;PS Motion correction +HISTORY_MSG_472;PS Smooth transitions +HISTORY_MSG_473;PS Use lmmse +HISTORY_MSG_474;PS Equalize +HISTORY_MSG_475;PS Equalize channel +HISTORY_MSG_476;CAM02 - Temp out +HISTORY_MSG_477;CAM02 - Green out +HISTORY_MSG_478;CAM02 - Yb out +HISTORY_MSG_479;CAM02 - CAT02 adaptation out +HISTORY_MSG_480;CAM02 - Automatic CAT02 out +HISTORY_MSG_481;CAM02 - Temp scene +HISTORY_MSG_482;CAM02 - Green scene +HISTORY_MSG_483;CAM02 - Yb scene +HISTORY_MSG_484;CAM02 - Auto Yb scene +HISTORY_MSG_485;Lens Correction +HISTORY_MSG_486;Lens Correction - Camera +HISTORY_MSG_487;Lens Correction - Lens +HISTORY_MSG_488;Dynamic Range Compression +HISTORY_MSG_489;DRC - Detail +HISTORY_MSG_490;DRC - Amount +HISTORY_MSG_491;White Balance +HISTORY_MSG_492;RGB Curves +HISTORY_MSG_493;Local Adjustments +HISTORY_MSG_494;Capture Sharpening +HISTORY_MSG_496;Local Spot deleted +HISTORY_MSG_497;Local Spot selected +HISTORY_MSG_498;Local Spot name +HISTORY_MSG_499;Local Spot visibility +HISTORY_MSG_500;Local Spot shape +HISTORY_MSG_501;Local Spot method +HISTORY_MSG_502;Local Spot shape method +HISTORY_MSG_503;Local Spot locX +HISTORY_MSG_504;Local Spot locXL +HISTORY_MSG_505;Local Spot locY +HISTORY_MSG_506;Local Spot locYT +HISTORY_MSG_507;Local Spot center +HISTORY_MSG_508;Local Spot circrad +HISTORY_MSG_509;Local Spot quality method +HISTORY_MSG_510;Local Spot transition +HISTORY_MSG_511;Local Spot thresh +HISTORY_MSG_512;Local Spot ΔE -decay +HISTORY_MSG_513;Local Spot scope +HISTORY_MSG_514;Local Spot structure +HISTORY_MSG_515;Local Adjustments +HISTORY_MSG_516;Local - Color and light +HISTORY_MSG_517;Local - Enable super +HISTORY_MSG_518;Local - Lightness +HISTORY_MSG_519;Local - Contrast +HISTORY_MSG_520;Local - Chrominance +HISTORY_MSG_521;Local - Scope +HISTORY_MSG_522;Local - curve method +HISTORY_MSG_523;Local - LL Curve +HISTORY_MSG_524;Local - CC curve +HISTORY_MSG_525;Local - LH Curve +HISTORY_MSG_526;Local - H curve +HISTORY_MSG_527;Local - Color Inverse +HISTORY_MSG_528;Local - Exposure +HISTORY_MSG_529;Local - Exp Compensation +HISTORY_MSG_530;Local - Exp Hlcompr +HISTORY_MSG_531;Local - Exp hlcomprthresh +HISTORY_MSG_532;Local - Exp black +HISTORY_MSG_533;Local - Exp Shcompr +HISTORY_MSG_534;Local - Warm Cool +HISTORY_MSG_535;Local - Exp Scope +HISTORY_MSG_536;Local - Exp Contrast curve +HISTORY_MSG_537;Local - Vibrance +HISTORY_MSG_538;Local - Vib Saturated +HISTORY_MSG_539;Local - Vib Pastel +HISTORY_MSG_540;Local - Vib Threshold +HISTORY_MSG_541;Local - Vib Protect skin tones +HISTORY_MSG_542;Local - Vib avoid colorshift +HISTORY_MSG_543;Local - Vib link +HISTORY_MSG_544;Local - Vib Scope +HISTORY_MSG_545;Local - Vib H curve +HISTORY_MSG_546;Local - Blur and noise +HISTORY_MSG_547;Local - Radius +HISTORY_MSG_548;Local - Noise +HISTORY_MSG_549;Local - Blur scope +HISTORY_MSG_550;Local - Blur method +HISTORY_MSG_551;Local - Blur Luminance only +HISTORY_MSG_552;Local - Tone mapping +HISTORY_MSG_553;Local - TM compression strength +HISTORY_MSG_554;Local - TM gamma +HISTORY_MSG_555;Local - TM edge stopping +HISTORY_MSG_556;Local - TM scale +HISTORY_MSG_557;Local - TM Reweighting +HISTORY_MSG_558;Local - TM scope +HISTORY_MSG_559;Local - Retinex +HISTORY_MSG_560;Local - Retinex method +HISTORY_MSG_561;Local - Retinex strength +HISTORY_MSG_562;Local - Retinex chroma +HISTORY_MSG_563;Local - Retinex radius +HISTORY_MSG_564;Local - Retinex contrast +HISTORY_MSG_565;Local - scope +HISTORY_MSG_566;Local - Retinex Gain curve +HISTORY_MSG_567;Local - Retinex Inverse +HISTORY_MSG_568;Local - Sharpening +HISTORY_MSG_569;Local - Sh Radius +HISTORY_MSG_570;Local - Sh Amount +HISTORY_MSG_571;Local - Sh Damping +HISTORY_MSG_572;Local - Sh Iterations +HISTORY_MSG_573;Local - Sh Scope +HISTORY_MSG_574;Local - Sh Inverse +HISTORY_MSG_575;Local - CBDL +HISTORY_MSG_576;Local - cbdl mult +HISTORY_MSG_577;Local - cbdl chroma +HISTORY_MSG_578;Local - cbdl threshold +HISTORY_MSG_579;Local - cbdl scope +HISTORY_MSG_580;Local - Denoise +HISTORY_MSG_581;Local - deNoise lum f 1 +HISTORY_MSG_582;Local - deNoise lum c +HISTORY_MSG_583;Local - deNoise lum detail +HISTORY_MSG_584;Local - deNoise equalizer White-Black +HISTORY_MSG_585;Local - deNoise chro f +HISTORY_MSG_586;Local - deNoise chro c +HISTORY_MSG_587;Local - deNoise chro detail +HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +HISTORY_MSG_589;Local - deNoise bilateral +HISTORY_MSG_590;Local - deNoise Scope +HISTORY_MSG_591;Local - Avoid color shift +HISTORY_MSG_592;Local - Sh Contrast +HISTORY_MSG_593;Local - Local contrast +HISTORY_MSG_594;Local - Local contrast radius +HISTORY_MSG_595;Local - Local contrast amount +HISTORY_MSG_596;Local - Local contrast darkness +HISTORY_MSG_597;Local - Local contrast lightness +HISTORY_MSG_598;Local - Local contrast scope +HISTORY_MSG_599;Local - Retinex dehaze +HISTORY_MSG_600;Local - Soft Light enable +HISTORY_MSG_601;Local - Soft Light strength +HISTORY_MSG_602;Local - Soft Light scope +HISTORY_MSG_603;Local - Sh Blur radius +HISTORY_MSG_605;Local - Mask preview choice +HISTORY_MSG_606;Local Spot selected +HISTORY_MSG_607;Local - Color Mask C +HISTORY_MSG_608;Local - Color Mask L +HISTORY_MSG_609;Local - Exp Mask C +HISTORY_MSG_610;Local - Exp Mask L +HISTORY_MSG_611;Local - Color Mask H +HISTORY_MSG_612;Local - Color Structure +HISTORY_MSG_613;Local - Exp Structure +HISTORY_MSG_614;Local - Exp Mask H +HISTORY_MSG_615;Local - Blend color +HISTORY_MSG_616;Local - Blend Exp +HISTORY_MSG_617;Local - Blur Exp +HISTORY_MSG_618;Local - Use Color Mask +HISTORY_MSG_619;Local - Use Exp Mask +HISTORY_MSG_620;Local - Blur col +HISTORY_MSG_621;Local - Exp inverse +HISTORY_MSG_622;Local - Exclude structure +HISTORY_MSG_623;Local - Exp Chroma compensation +HISTORY_MSG_624;Local - Color correction grid +HISTORY_MSG_625;Local - Color correction strength +HISTORY_MSG_626;Local - Color correction Method +HISTORY_MSG_627;Local - Shadow Highlight +HISTORY_MSG_628;Local - SH Highlight +HISTORY_MSG_629;Local - SH H tonalwidth +HISTORY_MSG_630;Local - SH Shadows +HISTORY_MSG_631;Local - SH S tonalwidth +HISTORY_MSG_632;Local - SH radius +HISTORY_MSG_633;Local - SH Scope +HISTORY_MSG_634;Local - radius color +HISTORY_MSG_635;Local - radius Exp +HISTORY_MSG_636;Local - Tool added +HISTORY_MSG_637;Local - SH Mask C +HISTORY_MSG_638;Local - SH Mask L +HISTORY_MSG_639;Local - SH Mask H +HISTORY_MSG_640;Local - SH blend +HISTORY_MSG_641;Local - Use SH mask +HISTORY_MSG_642;Local - radius SH +HISTORY_MSG_643;Local - Blur SH +HISTORY_MSG_644;Local - inverse SH +HISTORY_MSG_645;Local - balance ΔE ab-L +HISTORY_MSG_646;Local - Exp mask chroma +HISTORY_MSG_647;Local - Exp mask gamma +HISTORY_MSG_648;Local - Exp mask slope +HISTORY_MSG_649;Local - Exp soft radius +HISTORY_MSG_650;Local - Color mask chroma +HISTORY_MSG_651;Local - Color mask gamma +HISTORY_MSG_652;Local - Color mask slope +HISTORY_MSG_653;Local - SH mask chroma +HISTORY_MSG_654;Local - SH mask gamma +HISTORY_MSG_655;Local - SH mask slope +HISTORY_MSG_656;Local - Color soft radius +HISTORY_MSG_657;Local - Retinex Reduce artifacts +HISTORY_MSG_658;Local - CBDL soft radius +HISTORY_MSG_659;Local Spot transition-decay +HISTORY_MSG_660;Local - cbdl clarity +HISTORY_MSG_661;Local - cbdl contrast residual +HISTORY_MSG_662;Local - deNoise lum f 0 +HISTORY_MSG_663;Local - deNoise lum f 2 +HISTORY_MSG_664;Local - cbdl Blur +HISTORY_MSG_665;Local - cbdl mask Blend +HISTORY_MSG_666;Local - cbdl mask radius +HISTORY_MSG_667;Local - cbdl mask chroma +HISTORY_MSG_668;Local - cbdl mask gamma +HISTORY_MSG_669;Local - cbdl mask slope +HISTORY_MSG_670;Local - cbdl mask C +HISTORY_MSG_671;Local - cbdl mask L +HISTORY_MSG_672;Local - cbdl mask CL +HISTORY_MSG_673;Local - Use cbdl mask +HISTORY_MSG_674;Local - Tool removed +HISTORY_MSG_675;Local - TM soft radius +HISTORY_MSG_676;Local Spot transition-differentiation +HISTORY_MSG_677;Local - TM amount +HISTORY_MSG_678;Local - TM saturation +HISTORY_MSG_679;Local - Retinex mask C +HISTORY_MSG_680;Local - Retinex mask L +HISTORY_MSG_681;Local - Retinex mask CL +HISTORY_MSG_682;Local - Retinex mask +HISTORY_MSG_683;Local - Retinex mask Blend +HISTORY_MSG_684;Local - Retinex mask radius +HISTORY_MSG_685;Local - Retinex mask chroma +HISTORY_MSG_686;Local - Retinex mask gamma +HISTORY_MSG_687;Local - Retinex mask slope +HISTORY_MSG_688;Local - Tool removed +HISTORY_MSG_689;Local - Retinex mask transmission map +HISTORY_MSG_690;Local - Retinex scale +HISTORY_MSG_691;Local - Retinex darkness +HISTORY_MSG_692;Local - Retinex lightness +HISTORY_MSG_693;Local - Retinex threshold +HISTORY_MSG_694;Local - Retinex Laplacian threshold +HISTORY_MSG_695;Local - Soft method +HISTORY_MSG_696;Local - Retinex Normalize +HISTORY_MSG_697;Local - TM Normalize +HISTORY_MSG_698;Local - Local contrast Fast Fourier +HISTORY_MSG_699;Local - Retinex Fast Fourier +HISTORY_MSG_701;Local - Exp Shadows +HISTORY_MSG_702;Local - Exp Method +HISTORY_MSG_703;Local - Exp Laplacian threshold +HISTORY_MSG_704;Local - Exp PDE balance +HISTORY_MSG_705;Local - Exp linearity +HISTORY_MSG_706;Local - TM mask C +HISTORY_MSG_707;Local - TM mask L +HISTORY_MSG_708;Local - TM mask CL +HISTORY_MSG_709;Local - use TM mask +HISTORY_MSG_710;Local - TM mask Blend +HISTORY_MSG_711;Local - TM mask radius +HISTORY_MSG_712;Local - TM mask chroma +HISTORY_MSG_713;Local - TM mask gamma +HISTORY_MSG_714;Local - TM mask slope +HISTORY_MSG_716;Local - Local method +HISTORY_MSG_717;Local - Local contrast +HISTORY_MSG_718;Local - Local contrast levels +HISTORY_MSG_719;Local - Local contrast residual L +HISTORY_MSG_720;Local - Blur mask C +HISTORY_MSG_721;Local - Blur mask L +HISTORY_MSG_722;Local - Blur mask CL +HISTORY_MSG_723;Local - use Blur mask +HISTORY_MSG_725;Local - Blur mask Blend +HISTORY_MSG_726;Local - Blur mask radius +HISTORY_MSG_727;Local - Blur mask chroma +HISTORY_MSG_728;Local - Blur mask gamma +HISTORY_MSG_729;Local - Blur mask slope +HISTORY_MSG_730;Local - Blur method +HISTORY_MSG_731;Local - median method +HISTORY_MSG_732;Local - median iterations +HISTORY_MSG_733;Local - soft radius +HISTORY_MSG_734;Local - detail +HISTORY_MSG_738;Local - Local contrast Merge L +HISTORY_MSG_739;Local - Local contrast Soft radius +HISTORY_MSG_740;Local - Local contrast Merge C +HISTORY_MSG_741;Local - Local contrast Residual C +HISTORY_MSG_742;Local - Exp Laplacian gamma +HISTORY_MSG_743;Local - Exp Fattal Amount +HISTORY_MSG_744;Local - Exp Fattal Detail +HISTORY_MSG_745;Local - Exp Fattal Offset +HISTORY_MSG_746;Local - Exp Fattal Sigma +HISTORY_MSG_747;Local Spot created +HISTORY_MSG_748;Local - Exp Denoise +HISTORY_MSG_749;Local - Reti Depth +HISTORY_MSG_750;Local - Reti Mode log - lin +HISTORY_MSG_751;Local - Reti Dehaze luminance +HISTORY_MSG_752;Local - Reti Offset +HISTORY_MSG_753;Local - Reti Transmission map +HISTORY_MSG_754;Local - Reti Clip +HISTORY_MSG_755;Local - TM use tm mask +HISTORY_MSG_756;Local - Exp use algo exposure mask +HISTORY_MSG_757;Local - Exp Laplacian mask +HISTORY_MSG_758;Local - Reti Laplacian mask +HISTORY_MSG_759;Local - Exp Laplacian mask +HISTORY_MSG_760;Local - Color Laplacian mask +HISTORY_MSG_761;Local - SH Laplacian mask +HISTORY_MSG_762;Local - cbdl Laplacian mask +HISTORY_MSG_763;Local - Blur Laplacian mask +HISTORY_MSG_764;Local - Solve PDE Laplacian mask +HISTORY_MSG_765;Local - deNoise Detail threshold +HISTORY_MSG_766;Local - Blur Fast Fourier +HISTORY_MSG_767;Local - Grain Iso +HISTORY_MSG_768;Local - Grain Strength +HISTORY_MSG_769;Local - Grain Scale +HISTORY_MSG_770;Local - Color Mask contrast curve +HISTORY_MSG_771;Local - Exp Mask contrast curve +HISTORY_MSG_772;Local - SH Mask contrast curve +HISTORY_MSG_773;Local - TM Mask contrast curve +HISTORY_MSG_774;Local - Reti Mask contrast curve +HISTORY_MSG_775;Local - CBDL Mask contrast curve +HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +HISTORY_MSG_777;Local - Blur Mask local contrast curve +HISTORY_MSG_778;Local - Mask highlights +HISTORY_MSG_779;Local - Color Mask local contrast curve +HISTORY_MSG_780;Local - Color Mask shadows +HISTORY_MSG_781;Local - Contrast Mask Wavelet level +HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +HISTORY_MSG_783;Local - Color Wavelet levels +HISTORY_MSG_784;Local - Mask ΔE +HISTORY_MSG_785;Local - Mask Scope ΔE +HISTORY_MSG_786;Local - SH method +HISTORY_MSG_787;Local - Equalizer multiplier +HISTORY_MSG_788;Local - Equalizer detail +HISTORY_MSG_789;Local - SH mask amount +HISTORY_MSG_790;Local - SH mask anchor +HISTORY_MSG_791;Local - Mask Short L curves +HISTORY_MSG_792;Local - Mask Luminance Background +HISTORY_MSG_793;Local - SH TRC gamma +HISTORY_MSG_794;Local - SH TRC slope +HISTORY_MSG_795;Local - Mask save restore image +HISTORY_MSG_796;Local - Recursive references +HISTORY_MSG_797;Local - Merge Original method +HISTORY_MSG_798;Local - Opacity +HISTORY_MSG_799;Local - Color RGB ToneCurve +HISTORY_MSG_800;Local - Color ToneCurve Method +HISTORY_MSG_801;Local - Color ToneCurve Special +HISTORY_MSG_802;Local - Contrast threshold +HISTORY_MSG_803;Local - Color Merge +HISTORY_MSG_804;Local - Color mask Structure +HISTORY_MSG_805;Local - Blur Noise mask Structure +HISTORY_MSG_806;Local - Color mask Structure as tool +HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +HISTORY_MSG_808;Local - Color mask curve H(H) +HISTORY_MSG_809;Local - Vib mask curve C(C) +HISTORY_MSG_810;Local - Vib mask curve L(L) +HISTORY_MSG_811;Local - Vib mask curve LC(H) +HISTORY_MSG_813;Local - Use Vib mask +HISTORY_MSG_814;Local - Vib mask Blend +HISTORY_MSG_815;Local - Vib mask radius +HISTORY_MSG_816;Local - Vib mask chroma +HISTORY_MSG_817;Local - Vib mask gamma +HISTORY_MSG_818;Local - Vib mask slope +HISTORY_MSG_819;Local - Vib mask laplacian +HISTORY_MSG_820;Local - Vib mask contrast curve +HISTORY_MSG_821;Local - color grid background +HISTORY_MSG_822;Local - color background merge +HISTORY_MSG_823;Local - color background luminance +HISTORY_MSG_824;Local - Exp gradient mask strength +HISTORY_MSG_825;Local - Exp gradient mask angle +HISTORY_MSG_826;Local - Exp gradient strength +HISTORY_MSG_827;Local - Exp gradient angle +HISTORY_MSG_828;Local - SH gradient strength +HISTORY_MSG_829;Local - SH gradient angle +HISTORY_MSG_830;Local - Color gradient strength L +HISTORY_MSG_831;Local - Color gradient angle +HISTORY_MSG_832;Local - Color gradient strength C +HISTORY_MSG_833;Local - Gradient feather +HISTORY_MSG_834;Local - Color gradient strength H +HISTORY_MSG_835;Local - Vib gradient strength L +HISTORY_MSG_836;Local - Vib gradient angle +HISTORY_MSG_837;Local - Vib gradient strength C +HISTORY_MSG_838;Local - Vib gradient strength H +HISTORY_MSG_839;Local - Software complexity +HISTORY_MSG_840;Local - CL Curve +HISTORY_MSG_841;Local - LC curve +HISTORY_MSG_842;Local - Contrast Threshold Blur Mask +HISTORY_MSG_843;Local - Radius blur mask +HISTORY_MSG_844;Local - Color Mask fftw +HISTORY_MSG_845;Local - log encoding +HISTORY_MSG_846;Local - Encoding auto +HISTORY_MSG_847;Local - Source Gray +HISTORY_MSG_848;Local - Source Gray auto +HISTORY_MSG_849;Local - Auto Grayon +HISTORY_MSG_850;Local - Black Ev +HISTORY_MSG_851;Local - White Ev +HISTORY_MSG_852;Local - Target Gray +HISTORY_MSG_853;Local - Local contrast +HISTORY_MSG_854;Local - Scope encoding log +HISTORY_MSG_855;Local - Entire image +HISTORY_MSG_856;Local - Base log +HISTORY_MSG_857;Local - Contrast Blur Residual +HISTORY_MSG_858;Local - Contrast Luminance only +HISTORY_MSG_859;Local - Contrast Maximum Blur levels +HISTORY_MSG_860;Local - Contrast Curve Blur levels +HISTORY_MSG_861;Local - Contrast Curve Contrast levels +HISTORY_MSG_862;Local - Contrast Sigma luminance +HISTORY_MSG_863;Local - Contrast Merge Original +HISTORY_MSG_864;Local - Directional sigma +HISTORY_MSG_865;Local - Directional delta +HISTORY_MSG_866;Local - Contrast Curve Compression +HISTORY_MSG_867;Local - Contrast Amount residual +HISTORY_MSG_868;Local - balance ΔE C-H +HISTORY_MSG_869;Local - denoise curve luminance +HISTORY_MSG_870;Local - LC mask curve LC(H) +HISTORY_MSG_871;Local - LC mask curve C(C) +HISTORY_MSG_872;Local - LC mask curve L(L) +HISTORY_MSG_873;Local - LC mask enable +HISTORY_MSG_875;Local - LC mask blend +HISTORY_MSG_876;Local - LC mask radius +HISTORY_MSG_877;Local - LC mask chroma +HISTORY_MSG_878;Local - LC mask curve contrast +HISTORY_MSG_879;Local - LC Chroma levels +HISTORY_MSG_880;Local - LC Chroma blur levels +HISTORY_MSG_881;Local - Contrast Offset Luminance +HISTORY_MSG_882;Local - Contrast Blur +HISTORY_MSG_883;Local - Contrast By Level +HISTORY_MSG_884;Local - Contrast Dynamic Range Laplacian +HISTORY_MSG_885;Local - Contrast Dynamic Range Wavelet +HISTORY_MSG_886;Local - Contrast Wavelet Curve Compression +HISTORY_MSG_887;Local - Contrast Wavelet Compression Residual +HISTORY_MSG_888;Local - Contrast Wavelet Balance threshold +HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +HISTORY_MSG_891;Local - Contrast Wavelet Graduated +HISTORY_MSG_892;Local - Log Encoding Graduated Strength +HISTORY_MSG_893;Local - Log Encoding Graduated angle +HISTORY_MSG_894;Local - Color Preview dE +HISTORY_MSG_897;Local - Contrast Wavelet ES strength +HISTORY_MSG_898;Local - Contrast Wavelet ES radius +HISTORY_MSG_899;Local - Contrast Wavelet ES detail +HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +HISTORY_MSG_904;Local - Contrast Wavelet ES first level +HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +HISTORY_MSG_909;Local - Contrast Wavelet ES show +HISTORY_MSG_910;Local - Wavelet Edge performance +HISTORY_MSG_911;Local - Blur Chroma Luma +HISTORY_MSG_912;Local - Blur Guide filter strength +HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +HISTORY_MSG_916;Local - Residual wavelet shadows +HISTORY_MSG_917;Local - Residual wavelet shadows threshold +HISTORY_MSG_918;Local - Residual wavelet highlights +HISTORY_MSG_919;Local - Residual wavelet highlights threshold +HISTORY_MSG_920;Local - Wavelet sigma LC +HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +HISTORY_MSG_922;Local - changes In Black and White +HISTORY_MSG_923;Local - Tool complexity mode +HISTORY_MSG_924;Local - Tool complexity mode +HISTORY_MSG_925;Local - Scope color tools +HISTORY_MSG_926;Local - Show mask type +HISTORY_MSG_927;Local - Shadow mask +HISTORY_MSG_928;Local - Common color mask +HISTORY_MSG_929;Local - Mask common scope +HISTORY_MSG_930;Local - Mask Common blend luma +HISTORY_MSG_931;Local - Mask Common enable +HISTORY_MSG_932;Local - Mask Common radius soft +HISTORY_MSG_933;Local - Mask Common laplacian +HISTORY_MSG_934;Local - Mask Common chroma +HISTORY_MSG_935;Local - Mask Common gamma +HISTORY_MSG_936;Local - Mask Common slope +HISTORY_MSG_937;Local - Mask Common curve C(C) +HISTORY_MSG_938;Local - Mask Common curve L(L) +HISTORY_MSG_939;Local - Mask Common curve LC(H) +HISTORY_MSG_940;Local - Mask Common structure as tool +HISTORY_MSG_941;Local - Mask Common structure strength +HISTORY_MSG_942;Local - Mask Common H(H) curve +HISTORY_MSG_943;Local - Mask Common FFT +HISTORY_MSG_944;Local - Mask Common Blur radius +HISTORY_MSG_945;Local - Mask Common contrast threshold +HISTORY_MSG_946;Local - Mask Common shadows +HISTORY_MSG_947;Local - Mask Common Contrast curve +HISTORY_MSG_948;Local - Mask Common Wavelet curve +HISTORY_MSG_949;Local - Mask Common Threshold levels +HISTORY_MSG_950;Local - Mask Common GF strength +HISTORY_MSG_951;Local - Mask Common GF angle +HISTORY_MSG_952;Local - Mask Common soft radius +HISTORY_MSG_953;Local - Mask Common blend chroma +HISTORY_MSG_954;Local - Show-hide tools +HISTORY_MSG_955;Local - Enable Spot +HISTORY_MSG_956;Local - CH Curve +HISTORY_MSG_957;Local - GF local contrast threshold +HISTORY_MSG_958;Local - GF Local contrast Hue equalizer +HISTORY_MSG_959;Local - GF Local contrast levels +HISTORY_MSG_960;Local - GF Local contrast threshold high +HISTORY_MSG_961;Local - Denoise mode +HISTORY_MSG_962;Local - Equalizer hue +HISTORY_MSG_964;Local - Threshold mask denoise +HISTORY_MSG_966;Local - denoise use mask +HISTORY_MSG_967;Local - Spot settings show hide +HISTORY_MSG_BLSHAPE;Blur by level +HISTORY_MSG_BLURCWAV;Blur chroma +HISTORY_MSG_BLURWAV;Blur luminance +HISTORY_MSG_BLUWAV;Attenuation response +HISTORY_MSG_CAT02PRESET;Cat02 automatic preset +HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region blur mask +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +HISTORY_MSG_COMPLEX;Wavelet complexity +HISTORY_MSG_COMPLEXRETI;Retinex complexity +HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +HISTORY_MSG_EDGEFFECT;Edge Attenuation response +HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +HISTORY_MSG_FILMNEGATIVE_FILMBASE;Film base color +HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values +HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method +HISTORY_MSG_ILLUM;Illuminant +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +HISTORY_MSG_METADATA_MODE;Metadata copy mode +HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations +HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold +HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations +HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +HISTORY_MSG_PERSP_METHOD;Perspective - Method +HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode +HISTORY_MSG_PROTAB;Protection +HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +HISTORY_MSG_RANGEAB;Range ab +HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +HISTORY_MSG_RAW_BORDER;Raw border +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +HISTORY_MSG_SIGMACOL;Chroma Attenuation response +HISTORY_MSG_SIGMADIR;Dir Attenuation response +HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +HISTORY_MSG_SIGMATON;Toning Attenuation response +HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +HISTORY_MSG_THRESWAV;Balance threshold +HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +HISTORY_MSG_TRANS_Method;Geometry - Method +HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +HISTORY_MSG_WAVBALLUM;Equalizer luminance +HISTORY_MSG_WAVBL;Blur levels +HISTORY_MSG_WAVCHROMCO;Coarse chroma +HISTORY_MSG_WAVCHROMFI;Fine chroma +HISTORY_MSG_WAVCLARI;Clarity +HISTORY_MSG_WAVDENLH;Level 5 +HISTORY_MSG_WAVDENOISE;Local contrast +HISTORY_MSG_WAVDENOISEH;High level Local contrast +HISTORY_MSG_WAVDENMET;Local equalizer +HISTORY_MSG_WAVDETEND;Details soft +HISTORY_MSG_WAVEDGS;Edge stopping +HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +HISTORY_MSG_WAVHUE;Equalizer hue +HISTORY_MSG_WAVLEVDEN;High level local contrast +HISTORY_MSG_WAVLEVSIGM;Radius +HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +HISTORY_MSG_WAVLOWTHR;Threshold low contrast +HISTORY_MSG_WAVMERGEC;Merge C +HISTORY_MSG_WAVMERGEL;Merge L +HISTORY_MSG_WAVMIXMET;Reference local contrast +HISTORY_MSG_WAVOFFSET;Offset +HISTORY_MSG_WAVOLDSH;Old algorithm +HISTORY_MSG_WAVQUAMET;Denoise mode +HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +HISTORY_MSG_WAVSCALE;Scale +HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +HISTORY_MSG_WAVSIGMA;Attenuation response +HISTORY_MSG_WAVSIGM;Sigma +HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +HISTORY_MSG_WAVSOFTRADEND;Soft radius final +HISTORY_MSG_WAVSLIMET;Method +HISTORY_MSG_WAVTHRDEN;Threshold local contrast +HISTORY_MSG_WAVTHREND;Threshold local contrast +HISTORY_MSG_WAVSTREND;Strength soft +HISTORY_MSG_WAVUSHAMET;Clarity method +HISTORY_NEWSNAPSHOT;Add +HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +HISTORY_SNAPSHOT;Snapshot +HISTORY_SNAPSHOTS;Snapshots +ICCPROFCREATOR_COPYRIGHT;Copyright: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +ICCPROFCREATOR_CUSTOM;Custom +ICCPROFCREATOR_DESCRIPTION;Description: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +ICCPROFCREATOR_GAMMA;Gamma +ICCPROFCREATOR_ICCVERSION;ICC version: +ICCPROFCREATOR_ILL;Illuminant: +ICCPROFCREATOR_ILL_41;D41 +ICCPROFCREATOR_ILL_50;D50 +ICCPROFCREATOR_ILL_55;D55 +ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_65;D65 +ICCPROFCREATOR_ILL_80;D80 +ICCPROFCREATOR_ILL_DEF;Default +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +ICCPROFCREATOR_PRIMARIES;Primaries: +ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +ICCPROFCREATOR_PRIM_BEST;BestRGB +ICCPROFCREATOR_PRIM_BETA;BetaRGB +ICCPROFCREATOR_PRIM_BLUX;Blue X +ICCPROFCREATOR_PRIM_BLUY;Blue Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_GREX;Green X +ICCPROFCREATOR_PRIM_GREY;Green Y +ICCPROFCREATOR_PRIM_PROPH;Prophoto +ICCPROFCREATOR_PRIM_REC2020;Rec2020 +ICCPROFCREATOR_PRIM_REDX;Red X +ICCPROFCREATOR_PRIM_REDY;Red Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +ICCPROFCREATOR_PRIM_WIDEG;Widegamut +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +ICCPROFCREATOR_SLOPE;Slope +ICCPROFCREATOR_TRC_PRESET;Tone response curve: +IPTCPANEL_CATEGORY;Category +IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. +IPTCPANEL_CITY;City +IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. +IPTCPANEL_COPYHINT;Copy IPTC settings to clipboard. +IPTCPANEL_COPYRIGHT;Copyright notice +IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as ©2008 Jane Doe. +IPTCPANEL_COUNTRY;Country +IPTCPANEL_COUNTRYHINT;Enter the name of the country pictured in this image. +IPTCPANEL_CREATOR;Creator +IPTCPANEL_CREATORHINT;Enter the name of the person that created this image. +IPTCPANEL_CREATORJOBTITLE;Creator's job title +IPTCPANEL_CREATORJOBTITLEHINT;Enter the Job Title of the person listed in the Creator field. +IPTCPANEL_CREDIT;Credit line +IPTCPANEL_CREDITHINT;Enter who should be credited when this image is published. +IPTCPANEL_DATECREATED;Date created +IPTCPANEL_DATECREATEDHINT;Enter the Date the image was taken. +IPTCPANEL_DESCRIPTION;Description +IPTCPANEL_DESCRIPTIONHINT;Enter a "caption" describing the who, what, and why of what is happening in this image, this might include names of people, and/or their role in the action that is taking place within the image. +IPTCPANEL_DESCRIPTIONWRITER;Description writer +IPTCPANEL_DESCRIPTIONWRITERHINT;Enter the name of the person involved in writing, editing or correcting the description of the image. +IPTCPANEL_EMBEDDED;Embedded +IPTCPANEL_EMBEDDEDHINT;Reset to IPTC data embedded in the image file. +IPTCPANEL_HEADLINE;Headline +IPTCPANEL_HEADLINEHINT;Enter a brief publishable synopsis or summary of the contents of the image. +IPTCPANEL_INSTRUCTIONS;Instructions +IPTCPANEL_INSTRUCTIONSHINT;Enter information about embargoes, or other restrictions not covered by the Copyright field. +IPTCPANEL_KEYWORDS;Keywords +IPTCPANEL_KEYWORDSHINT;Enter any number of keywords, terms or phrases used to express the subject matter in the image. +IPTCPANEL_PASTEHINT;Paste IPTC settings from clipboard. +IPTCPANEL_PROVINCE;Province or state +IPTCPANEL_PROVINCEHINT;Enter the name of the province or state pictured in this image. +IPTCPANEL_RESET;Reset +IPTCPANEL_RESETHINT;Reset to profile default. +IPTCPANEL_SOURCE;Source +IPTCPANEL_SOURCEHINT;Enter or edit the name of a person or party who has a role in the content supply chain, such as a person or entity from whom you received this image from. +IPTCPANEL_SUPPCATEGORIES;Supplemental categories +IPTCPANEL_SUPPCATEGORIESHINT;Further refines the subject of the image. +IPTCPANEL_TITLE;Title +IPTCPANEL_TITLEHINT;Enter a short verbal and human readable name for the image, this may be the file name. +IPTCPANEL_TRANSREFERENCE;Job ID +IPTCPANEL_TRANSREFERENCEHINT;Enter a number or identifier needed for workflow control or tracking. +MAIN_BUTTON_FULLSCREEN;Fullscreen +MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator +MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 +MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 +MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). +MAIN_BUTTON_PREFERENCES;Preferences +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b +MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s +MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e +MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m +MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen +MAIN_FRAME_EDITOR;Editor +MAIN_FRAME_EDITOR_TOOLTIP;Editor.\nShortcut: Ctrl-F4 +MAIN_FRAME_FILEBROWSER;File Browser +MAIN_FRAME_FILEBROWSER_TOOLTIP;File browser.\nShortcut: Ctrl-F2 +MAIN_FRAME_PLACES;Places +MAIN_FRAME_PLACES_ADD;Add +MAIN_FRAME_PLACES_DEL;Remove +MAIN_FRAME_QUEUE;Queue +MAIN_FRAME_QUEUE_TOOLTIP;Processing queue.\nShortcut: Ctrl-F3 +MAIN_FRAME_RECENT;Recent Folders +MAIN_MSG_ALREADYEXISTS;File already exists. +MAIN_MSG_CANNOTLOAD;Cannot load image +MAIN_MSG_CANNOTSAVE;File saving error +MAIN_MSG_CANNOTSTARTEDITOR;Cannot start editor. +MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Please set the correct path in Preferences. +MAIN_MSG_EMPTYFILENAME;Filename unspecified! +MAIN_MSG_IMAGEUNPROCESSED;This command requires all selected images to be queue-processed first. +MAIN_MSG_NAVIGATOR;Navigator +MAIN_MSG_OPERATIONCANCELLED;Operation cancelled +MAIN_MSG_PATHDOESNTEXIST;The path\n\n%1\n\ndoes not exist. Please set a correct path in Preferences. +MAIN_MSG_QOVERWRITE;Do you want to overwrite it? +MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! +MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. +MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +MAIN_TAB_ADVANCED;Advanced +MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a +MAIN_TAB_COLOR;Color +MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c +MAIN_TAB_DETAIL;Detail +MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d +MAIN_TAB_DEVELOP; Batch Edit +MAIN_TAB_EXIF;Exif +MAIN_TAB_EXPORT; Fast Export +MAIN_TAB_EXPOSURE;Exposure +MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +MAIN_TAB_FAVORITES;Favorites +MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u +MAIN_TAB_FILTER; Filter +MAIN_TAB_INSPECT; Inspect +MAIN_TAB_IPTC;IPTC +MAIN_TAB_LOCALLAB;Local +MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o +MAIN_TAB_METADATA;Metadata +MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m +MAIN_TAB_RAW;Raw +MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r +MAIN_TAB_TRANSFORM;Transform +MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t +MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: theme-based\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: black\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: white\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 +MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool. +MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: l +MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: > +MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: < +MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +MAIN_TOOLTIP_PREVIEWG;Preview the green channel.\nShortcut: g +MAIN_TOOLTIP_PREVIEWL;Preview the luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B +MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. +MAIN_TOOLTIP_QINFO;Quick info on the image.\nShortcut: i +MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l +MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l +MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l +MAIN_TOOLTIP_THRESHOLD;Threshold +MAIN_TOOLTIP_TOGGLE;Toggle the Before/After view.\nShortcut: Shift-b +MONITOR_PROFILE_SYSTEM;System default +NAVIGATOR_B;B: +NAVIGATOR_G;G: +NAVIGATOR_H;H: +NAVIGATOR_LAB_A;a*: +NAVIGATOR_LAB_B;b*: +NAVIGATOR_LAB_L;L*: +NAVIGATOR_NA; -- +NAVIGATOR_R;R: +NAVIGATOR_S;S: +NAVIGATOR_V;V: +NAVIGATOR_XY_FULL;Width: %1, Height: %2 +NAVIGATOR_XY_NA;x: --, y: -- +OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +PARTIALPASTE_ADVANCEDGROUP;Advanced Settings +PARTIALPASTE_BASICGROUP;Basic Settings +PARTIALPASTE_CACORRECTION;Chromatic aberration correction +PARTIALPASTE_CHANNELMIXER;Channel mixer +PARTIALPASTE_CHANNELMIXERBW;Black-and-white +PARTIALPASTE_COARSETRANS;Coarse rotation/flipping +PARTIALPASTE_COLORAPP;CIECAM02 +PARTIALPASTE_COLORGROUP;Color Related Settings +PARTIALPASTE_COLORTONING;Color toning +PARTIALPASTE_COMMONTRANSFORMPARAMS;Auto-fill +PARTIALPASTE_COMPOSITIONGROUP;Composition Settings +PARTIALPASTE_CROP;Crop +PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection +PARTIALPASTE_DARKFRAMEFILE;Dark-frame file +PARTIALPASTE_DEFRINGE;Defringe +PARTIALPASTE_DEHAZE;Haze removal +PARTIALPASTE_DETAILGROUP;Detail Settings +PARTIALPASTE_DIALOGLABEL;Partial paste processing profile +PARTIALPASTE_DIRPYRDENOISE;Noise reduction +PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels +PARTIALPASTE_DISTORTION;Distortion correction +PARTIALPASTE_EPD;Tone mapping +PARTIALPASTE_EQUALIZER;Wavelet levels +PARTIALPASTE_EVERYTHING;Everything +PARTIALPASTE_EXIFCHANGES;Exif +PARTIALPASTE_EXPOSURE;Exposure +PARTIALPASTE_FILMNEGATIVE;Film Negative +PARTIALPASTE_FILMSIMULATION;Film simulation +PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field auto-selection +PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field blur radius +PARTIALPASTE_FLATFIELDBLURTYPE;Flat-field blur type +PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control +PARTIALPASTE_FLATFIELDFILE;Flat-field file +PARTIALPASTE_GRADIENT;Graduated filter +PARTIALPASTE_HSVEQUALIZER;HSV equalizer +PARTIALPASTE_ICMSETTINGS;Color management settings +PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction +PARTIALPASTE_IPTCINFO;IPTC +PARTIALPASTE_LABCURVE;L*a*b* adjustments +PARTIALPASTE_LENSGROUP;Lens Related Settings +PARTIALPASTE_LENSPROFILE;Profiled lens correction +PARTIALPASTE_LOCALCONTRAST;Local contrast +PARTIALPASTE_LOCALLAB;Local Adjustments +PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +PARTIALPASTE_LOCGROUP;Local +PARTIALPASTE_METADATA;Metadata mode +PARTIALPASTE_METAGROUP;Metadata settings +PARTIALPASTE_PCVIGNETTE;Vignette filter +PARTIALPASTE_PERSPECTIVE;Perspective +PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter +PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration +PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter +PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +PARTIALPASTE_PREPROCWB;Preprocess White Balance +PARTIALPASTE_PRSHARPENING;Post-resize sharpening +PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift +PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue +PARTIALPASTE_RAWEXPOS_BLACK;Black levels +PARTIALPASTE_RAWEXPOS_LINEAR;White point correction +PARTIALPASTE_RAWGROUP;Raw Settings +PARTIALPASTE_RAW_BORDER;Raw border +PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement +PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations +PARTIALPASTE_RAW_DMETHOD;Demosaic method +PARTIALPASTE_RAW_FALSECOLOR;False color suppression +PARTIALPASTE_RAW_IMAGENUM;Sub-image +PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps +PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift +PARTIALPASTE_RESIZE;Resize +PARTIALPASTE_RETINEX;Retinex +PARTIALPASTE_RGBCURVES;RGB curves +PARTIALPASTE_ROTATION;Rotation +PARTIALPASTE_SHADOWSHIGHLIGHTS;Shadows/highlights +PARTIALPASTE_SHARPENEDGE;Edges +PARTIALPASTE_SHARPENING;Sharpening (USM/RL) +PARTIALPASTE_SHARPENMICRO;Microcontrast +PARTIALPASTE_SOFTLIGHT;Soft light +PARTIALPASTE_TM_FATTAL;Dynamic range compression +PARTIALPASTE_VIBRANCE;Vibrance +PARTIALPASTE_VIGNETTING;Vignetting correction +PARTIALPASTE_WHITEBALANCE;White balance +PREFERENCES_ADD;Add +PREFERENCES_APPEARANCE;Appearance +PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +PREFERENCES_APPEARANCE_MAINFONT;Main font +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode +PREFERENCES_APPEARANCE_THEME;Theme +PREFERENCES_APPLNEXTSTARTUP;restart required +PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile +PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit +PREFERENCES_BATCH_PROCESSING;Batch Processing +PREFERENCES_BEHADDALL;All to 'Add' +PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. +PREFERENCES_BEHAVIOR;Behavior +PREFERENCES_BEHSETALL;All to 'Set' +PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. +PREFERENCES_CACHECLEAR;Clear +PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. +PREFERENCES_CACHEMAXENTRIES;Maximum number of cache entries +PREFERENCES_CACHEOPTS;Cache Options +PREFERENCES_CACHETHUMBHEIGHT;Maximum thumbnail height +PREFERENCES_CHUNKSIZES;Tiles per thread +PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaic +PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA correction +PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic +PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic +PREFERENCES_CHUNKSIZE_RGB;RGB processing +PREFERENCES_CLIPPINGIND;Clipping Indication +PREFERENCES_CLUTSCACHE;HaldCLUT Cache +PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs +PREFERENCES_CLUTSDIR;HaldCLUT directory +PREFERENCES_CMMBPC;Black point compensation +PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +PREFERENCES_COMPLEXITY_EXP;Advanced +PREFERENCES_COMPLEXITY_NORM;Standard +PREFERENCES_COMPLEXITY_SIMP;Basic +PREFERENCES_CROP;Crop Editing +PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop +PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +PREFERENCES_CROP_GUIDES_FRAME;Frame +PREFERENCES_CROP_GUIDES_FULL;Original +PREFERENCES_CROP_GUIDES_NONE;None +PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons +PREFERENCES_CURVEBBOXPOS_ABOVE;Above +PREFERENCES_CURVEBBOXPOS_BELOW;Below +PREFERENCES_CURVEBBOXPOS_LEFT;Left +PREFERENCES_CURVEBBOXPOS_RIGHT;Right +PREFERENCES_CUSTPROFBUILD;Custom Processing Profile Builder +PREFERENCES_CUSTPROFBUILDHINT;Executable (or script) file called when a new initial processing profile should be generated for an image.\n\nThe path of the communication file (*.ini style, a.k.a. "Keyfile") is added as a command line parameter. It contains various parameters required for the scripts and image Exif to allow a rules-based processing profile generation.\n\nWARNING: You are responsible for using double quotes where necessary if you're using paths containing spaces. +PREFERENCES_CUSTPROFBUILDKEYFORMAT;Keys format +PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name +PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID +PREFERENCES_CUSTPROFBUILDPATH;Executable path +PREFERENCES_DARKFRAMEFOUND;Found +PREFERENCES_DARKFRAMESHOTS;shots +PREFERENCES_DARKFRAMETEMPLATES;templates +PREFERENCES_DATEFORMAT;Date format +PREFERENCES_DATEFORMATHINT;You can use the following formatting strings:\n%y - year\n%m - month\n%d - day\n\nFor example, the ISO 8601 standard dictates the date format as follows:\n%y-%m-%d +PREFERENCES_DIRDARKFRAMES;Dark-frames directory +PREFERENCES_DIRECTORIES;Directories +PREFERENCES_DIRHOME;Home directory +PREFERENCES_DIRLAST;Last visited directory +PREFERENCES_DIROTHER;Other +PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... +PREFERENCES_DIRSOFTWARE;Installation directory +PREFERENCES_EDITORCMDLINE;Custom command line +PREFERENCES_EDITORLAYOUT;Editor layout +PREFERENCES_EXTERNALEDITOR;External Editor +PREFERENCES_FBROWSEROPTS;File Browser / Thumbnail Options +PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser +PREFERENCES_FLATFIELDFOUND;Found +PREFERENCES_FLATFIELDSDIR;Flat-fields directory +PREFERENCES_FLATFIELDSHOTS;shots +PREFERENCES_FLATFIELDTEMPLATES;templates +PREFERENCES_FORIMAGE;For non-raw photos +PREFERENCES_FORRAW;For raw photos +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser. +PREFERENCES_GIMPPATH;GIMP installation directory +PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogram in left panel +PREFERENCES_HISTOGRAM_TOOLTIP;If enabled, the working profile is used for rendering the main histogram and the Navigator panel, otherwise the gamma-corrected output profile is used. +PREFERENCES_HLTHRESHOLD;Threshold for clipped highlights +PREFERENCES_ICCDIR;Directory containing color profiles +PREFERENCES_IMPROCPARAMS;Default Processing Profile +PREFERENCES_INSPECT_LABEL;Inspect +PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Maximum number of cached images +PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Set the maximum number of images stored in cache when hovering over them in the File Browser; systems with little RAM (2GB) should keep this value set to 1 or 2. +PREFERENCES_INTENT_ABSOLUTE;Absolute Colorimetric +PREFERENCES_INTENT_PERCEPTUAL;Perceptual +PREFERENCES_INTENT_RELATIVE;Relative Colorimetric +PREFERENCES_INTENT_SATURATION;Saturation +PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited +PREFERENCES_LANG;Language +PREFERENCES_LANGAUTODETECT;Use system language +PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders +PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" +PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" +PREFERENCES_MENUGROUPLABEL;Group "Color label" +PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing profile operations" +PREFERENCES_MENUGROUPRANK;Group "Rank" +PREFERENCES_MENUOPTIONS;Context Menu Options +PREFERENCES_MONINTENT;Default rendering intent +PREFERENCES_MONITOR;Monitor +PREFERENCES_MONPROFILE;Default color profile +PREFERENCES_MONPROFILE_WARNOSX;Due to MacOS limitations, only sRGB is supported. +PREFERENCES_MULTITAB;Multiple Editor Tabs Mode +PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode +PREFERENCES_NAVIGATIONFRAME;Navigation +PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser +PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel +PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files +PREFERENCES_PANFACTORLABEL;Pan rate amplification +PREFERENCES_PARSEDEXT;Parsed Extensions +PREFERENCES_PARSEDEXTADD;Add extension +PREFERENCES_PARSEDEXTADDHINT;Add entered extension to the list. +PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list. +PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. +PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +PREFERENCES_PERFORMANCE_MEASURE;Measure +PREFERENCES_PERFORMANCE_MEASURE_HINT;Logs processing times in console +PREFERENCES_PERFORMANCE_THREADS;Threads +PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) +PREFERENCES_PREVDEMO;Preview Demosaic Method +PREFERENCES_PREVDEMO_FAST;Fast +PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: +PREFERENCES_PREVDEMO_SIDECAR;As in PP3 +PREFERENCES_PRINTER;Printer (Soft-Proofing) +PREFERENCES_PROFILEHANDLING;Processing Profile Handling +PREFERENCES_PROFILELOADPR;Processing profile loading priority +PREFERENCES_PROFILEPRCACHE;Profile in cache +PREFERENCES_PROFILEPRFILE;Profile next to the input file +PREFERENCES_PROFILESAVEBOTH;Save processing profile both to the cache and next to the input file +PREFERENCES_PROFILESAVECACHE;Save processing profile to the cache +PREFERENCES_PROFILESAVEINPUT;Save processing profile next to the input file +PREFERENCES_PROFILESAVELOCATION;Processing profile saving location +PREFERENCES_PROFILE_NONE;None +PREFERENCES_PROPERTY;Property +PREFERENCES_PRTINTENT;Rendering intent +PREFERENCES_PRTPROFILE;Color profile +PREFERENCES_PSPATH;Adobe Photoshop installation directory +PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset +PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". +PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +PREFERENCES_SELECTLANG;Select language +PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. +PREFERENCES_SET;Set +PREFERENCES_SHOWBASICEXIF;Show basic Exif info +PREFERENCES_SHOWDATETIME;Show date and time +PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation +PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar +PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows +PREFERENCES_SINGLETAB;Single Editor Tab Mode +PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs +PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. +PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done +PREFERENCES_SND_QUEUEDONE;Queue processing done +PREFERENCES_SND_THRESHOLDSECS;After seconds +PREFERENCES_STARTUPIMDIR;Image Directory at Startup +PREFERENCES_TAB_BROWSER;File Browser +PREFERENCES_TAB_COLORMGR;Color Management +PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules +PREFERENCES_TAB_GENERAL;General +PREFERENCES_TAB_IMPROC;Image Processing +PREFERENCES_TAB_PERFORMANCE;Performance +PREFERENCES_TAB_SOUND;Sounds +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise +PREFERENCES_TP_LABEL;Tool panel: +PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar +PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles +PREFERENCES_WORKFLOW;Layout +PROFILEPANEL_COPYPPASTE;Parameters to copy +PROFILEPANEL_GLOBALPROFILES;Bundled profiles +PROFILEPANEL_LABEL;Processing Profiles +PROFILEPANEL_LOADDLGLABEL;Load Processing Parameters... +PROFILEPANEL_LOADPPASTE;Parameters to load +PROFILEPANEL_MODE_TIP;Processing profile fill mode.\n\nButton pressed: partial profiles will be converted to full profiles; the missing values will be replaced with hard-coded defaults.\n\nButton released: profiles will be applied as they are, altering only those values which they contain. +PROFILEPANEL_MYPROFILES;My profiles +PROFILEPANEL_PASTEPPASTE;Parameters to paste +PROFILEPANEL_PCUSTOM;Custom +PROFILEPANEL_PDYNAMIC;Dynamic +PROFILEPANEL_PFILE;From file +PROFILEPANEL_PINTERNAL;Neutral +PROFILEPANEL_PLASTSAVED;Last Saved +PROFILEPANEL_SAVEDLGLABEL;Save Processing Parameters... +PROFILEPANEL_SAVEPPASTE;Parameters to save +PROFILEPANEL_TOOLTIPCOPY;Copy current processing profile to clipboard.\nCtrl-click to select the parameters to copy. +PROFILEPANEL_TOOLTIPLOAD;Load a profile from file.\nCtrl-click to select the parameters to load. +PROFILEPANEL_TOOLTIPPASTE;Paste profile from clipboard.\nCtrl-click to select the parameters to paste. +PROFILEPANEL_TOOLTIPSAVE;Save current profile.\nCtrl-click to select the parameters to save. +PROGRESSBAR_DECODING;Decoding... +PROGRESSBAR_GREENEQUIL;Green equilibration... +PROGRESSBAR_HLREC;Highlight reconstruction... +PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... +PROGRESSBAR_LINEDENOISE;Line noise filter... +PROGRESSBAR_LOADING;Loading image... +PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... +PROGRESSBAR_LOADJPEG;Loading JPEG file... +PROGRESSBAR_LOADPNG;Loading PNG file... +PROGRESSBAR_LOADTIFF;Loading TIFF file... +PROGRESSBAR_NOIMAGES;No images found +PROGRESSBAR_PROCESSING;Processing image... +PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved +PROGRESSBAR_RAWCACORR;Raw CA correction... +PROGRESSBAR_READY;Ready +PROGRESSBAR_SAVEJPEG;Saving JPEG file... +PROGRESSBAR_SAVEPNG;Saving PNG file... +PROGRESSBAR_SAVETIFF;Saving TIFF file... +PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added +PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +QINFO_FRAMECOUNT;%2 frames +QINFO_HDR;HDR / %2 frame(s) +QINFO_ISO;ISO +QINFO_NOEXIF;Exif data not available. +QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +QUEUE_AUTOSTART;Auto-start +QUEUE_AUTOSTART_TOOLTIP;Start processing automatically when a new job arrives. +QUEUE_DESTFILENAME;Path and file name +QUEUE_FORMAT_TITLE;File Format +QUEUE_LOCATION_FOLDER;Save to folder +QUEUE_LOCATION_TEMPLATE;Use template +QUEUE_LOCATION_TEMPLATE_TOOLTIP;Specify the output location based on the source photo's location, rank, trash status or position in the queue.\n\nUsing the following pathname as an example:\n/home/tom/photos/2010-10-31/photo1.raw\nthe meaning of the formatting strings follows:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = photo1\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\n%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used.\n\n%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'.\n\nIf you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p2/converted/%d1/%f +QUEUE_LOCATION_TITLE;Output Location +QUEUE_STARTSTOP_TOOLTIP;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s +SAMPLEFORMAT_0;Unknown data format +SAMPLEFORMAT_1;8-bit unsigned +SAMPLEFORMAT_2;16-bit unsigned +SAMPLEFORMAT_4;24-bit LogLuv +SAMPLEFORMAT_8;32-bit LogLuv +SAMPLEFORMAT_16;16-bit floating-point +SAMPLEFORMAT_32;24-bit floating-point +SAMPLEFORMAT_64;32-bit floating-point +SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists +SAVEDLG_FILEFORMAT;File format +SAVEDLG_FILEFORMAT_FLOAT; floating-point +SAVEDLG_FORCEFORMATOPTS;Force saving options +SAVEDLG_JPEGQUAL;JPEG quality +SAVEDLG_PUTTOQUEUE;Put into processing queue +SAVEDLG_PUTTOQUEUEHEAD;Put to the head of the processing queue +SAVEDLG_PUTTOQUEUETAIL;Put to the end of the processing queue +SAVEDLG_SAVEIMMEDIATELY;Save immediately +SAVEDLG_SAVESPP;Save processing parameters with image +SAVEDLG_SUBSAMP;Subsampling +SAVEDLG_SUBSAMP_1;Best compression +SAVEDLG_SUBSAMP_2;Balanced +SAVEDLG_SUBSAMP_3;Best quality +SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. +SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF +SAVEDLG_WARNFILENAME;File will be named +SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. +SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. +THRESHOLDSELECTOR_B;Bottom +THRESHOLDSELECTOR_BL;Bottom-left +THRESHOLDSELECTOR_BR;Bottom-right +THRESHOLDSELECTOR_HINT;Hold the Shift key to move individual control points. +THRESHOLDSELECTOR_T;Top +THRESHOLDSELECTOR_TL;Top-left +THRESHOLDSELECTOR_TR;Top-right +TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. +TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop using Shift+mouse drag. +TOOLBAR_TOOLTIP_HAND;Hand tool.\nShortcut: h +TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image preview. Angle of rotation will be shown next to the guide line. Center of rotation is the geometrical center of the image. +TOOLBAR_TOOLTIP_WB;Spot white balance.\nShortcut: w +TP_BWMIX_ALGO;Algorithm OYCPM +TP_BWMIX_ALGO_LI;Linear +TP_BWMIX_ALGO_SP;Special effects +TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. +TP_BWMIX_AUTOCH;Auto +TP_BWMIX_CC_ENABLED;Adjust complementary color +TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. +TP_BWMIX_CHANNEL;Luminance equalizer +TP_BWMIX_CURVEEDITOR1;'Before' curve +TP_BWMIX_CURVEEDITOR2;'After' curve +TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Tone curve, after B&W conversion, at the end of treatment. +TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Tone curve, just before B&W conversion.\nMay take into account the color components. +TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H).\nPay attention to extreme values as they may cause artifacts. +TP_BWMIX_FILTER;Color Filter +TP_BWMIX_FILTER_BLUE;Blue +TP_BWMIX_FILTER_BLUEGREEN;Blue-Green +TP_BWMIX_FILTER_GREEN;Green +TP_BWMIX_FILTER_GREENYELLOW;Green-Yellow +TP_BWMIX_FILTER_NONE;None +TP_BWMIX_FILTER_PURPLE;Purple +TP_BWMIX_FILTER_RED;Red +TP_BWMIX_FILTER_REDYELLOW;Red-Yellow +TP_BWMIX_FILTER_TOOLTIP;The color filter simulates shots taken with a colored filter placed in front of the lens. Colored filters reduce the transmission of specific color ranges and therefore affect their lightness. E.g. a red filter darkens blue skies. +TP_BWMIX_FILTER_YELLOW;Yellow +TP_BWMIX_GAMMA;Gamma Correction +TP_BWMIX_GAM_TOOLTIP;Correct gamma for each RGB channel. +TP_BWMIX_LABEL;Black-and-White +TP_BWMIX_MET;Method +TP_BWMIX_MET_CHANMIX;Channel Mixer +TP_BWMIX_MET_DESAT;Desaturation +TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer +TP_BWMIX_MIXC;Channel Mixer +TP_BWMIX_NEUTRAL;Reset +TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% +TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. +TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. +TP_BWMIX_SETTING;Presets +TP_BWMIX_SETTING_TOOLTIP;Different presets (film, landscape, etc.) or manual Channel Mixer settings. +TP_BWMIX_SET_HIGHCONTAST;High contrast +TP_BWMIX_SET_HIGHSENSIT;High Sensitivity +TP_BWMIX_SET_HYPERPANCHRO;Hyper Panchromatic +TP_BWMIX_SET_INFRARED;Infrared +TP_BWMIX_SET_LANDSCAPE;Landscape +TP_BWMIX_SET_LOWSENSIT;Low Sensitivity +TP_BWMIX_SET_LUMINANCE;Luminance +TP_BWMIX_SET_NORMCONTAST;Normal Contrast +TP_BWMIX_SET_ORTHOCHRO;Orthochromatic +TP_BWMIX_SET_PANCHRO;Panchromatic +TP_BWMIX_SET_PORTRAIT;Portrait +TP_BWMIX_SET_RGBABS;Absolute RGB +TP_BWMIX_SET_RGBREL;Relative RGB +TP_BWMIX_SET_ROYGCBPMABS;Absolute ROYGCBPM +TP_BWMIX_SET_ROYGCBPMREL;Relative ROYGCBPM +TP_BWMIX_TCMODE_FILMLIKE;B&W Film-like +TP_BWMIX_TCMODE_SATANDVALBLENDING;B&W Saturation and Value Blending +TP_BWMIX_TCMODE_STANDARD;B&W Standard +TP_BWMIX_TCMODE_WEIGHTEDSTD;B&W Weighted Standard +TP_BWMIX_VAL;L +TP_CACORRECTION_BLUE;Blue +TP_CACORRECTION_LABEL;Chromatic Aberration Correction +TP_CACORRECTION_RED;Red +TP_CBDL_AFT;After Black-and-White +TP_CBDL_BEF;Before Black-and-White +TP_CBDL_METHOD;Process located +TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. +TP_CHMIXER_BLUE;Blue channel +TP_CHMIXER_GREEN;Green channel +TP_CHMIXER_LABEL;Channel Mixer +TP_CHMIXER_RED;Red channel +TP_COARSETRAF_TOOLTIP_HFLIP;Flip horizontally. +TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Editor Tabs Mode,\nAlt-[ - Single Editor Tab Mode. +TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode. +TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically. +TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance +TP_COLORAPP_ALGO;Algorithm +TP_COLORAPP_ALGO_ALL;All +TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) +TP_COLORAPP_ALGO_JS;Lightness + Saturation (JS) +TP_COLORAPP_ALGO_QM;Brightness + Colorfulness (QM) +TP_COLORAPP_ALGO_TOOLTIP;Lets you choose between parameter subsets or all parameters. +TP_COLORAPP_BADPIXSL;Hot/bad pixel filter +TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. +TP_COLORAPP_BRIGHT;Brightness (Q) +TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. +TP_COLORAPP_CHROMA;Chroma (C) +TP_COLORAPP_CHROMA_M;Colorfulness (M) +TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. +TP_COLORAPP_CHROMA_S;Saturation (S) +TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. +TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 differs from L*a*b* and RGB chroma. +TP_COLORAPP_CIECAT_DEGREE;CAT02 adaptation +TP_COLORAPP_CONTRAST;Contrast (J) +TP_COLORAPP_CONTRAST_Q;Contrast (Q) +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Differs from L*a*b* and RGB contrast. +TP_COLORAPP_CONTRAST_TOOLTIP;Differs from L*a*b* and RGB contrast. +TP_COLORAPP_CURVEEDITOR1;Tone curve 1 +TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of J or Q after CIECAM02.\n\nJ and Q are not shown in the main histogram panel.\n\nFor final output refer to the main histogram panel. +TP_COLORAPP_CURVEEDITOR2;Tone curve 2 +TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Same usage as with the second exposure tone curve. +TP_COLORAPP_CURVEEDITOR3;Color curve +TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. +TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves +TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. +TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] +TP_COLORAPP_GAMUT;Gamut control (L*a*b*) +TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. +TP_COLORAPP_HUE;Hue (h) +TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. +TP_COLORAPP_IL41;D41 +TP_COLORAPP_IL50;D50 +TP_COLORAPP_IL55;D55 +TP_COLORAPP_IL60;D60 +TP_COLORAPP_IL65;D65 +TP_COLORAPP_IL75;D75 +TP_COLORAPP_ILA;Incandescent StdA 2856K +TP_COLORAPP_ILFREE;Free +TP_COLORAPP_ILLUM;Illuminant +TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and lattitude. +TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 +TP_COLORAPP_LABEL_CAM02;Image Adjustments +TP_COLORAPP_LABEL_SCENE;Scene Conditions +TP_COLORAPP_LABEL_VIEWING;Viewing Conditions +TP_COLORAPP_LIGHT;Lightness (J) +TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) +TP_COLORAPP_MODEL;WP Model +TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. +TP_COLORAPP_NEUTRAL;Reset +TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values +TP_COLORAPP_PRESETCAT02;Preset cat02 automatic +TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou can change illuminant shooting conditions.\nYou must change Cat02 adaptation Viewing conditions if need.\nYou can change Temperature and Tint Viewing conditions if need, and other settings if need. +TP_COLORAPP_RSTPRO;Red & skin-tones protection +TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. +TP_COLORAPP_SURROUND;Surround +TP_COLORAPP_SURROUND_AVER;Average +TP_COLORAPP_SURROUND_DARK;Dark +TP_COLORAPP_SURROUND_DIM;Dim +TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) +TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. +TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness +TP_COLORAPP_TCMODE_CHROMA;Chroma +TP_COLORAPP_TCMODE_COLORF;Colorfulness +TP_COLORAPP_TCMODE_LABEL1;Curve mode 1 +TP_COLORAPP_TCMODE_LABEL2;Curve mode 2 +TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode +TP_COLORAPP_TCMODE_LIGHTNESS;Lightness +TP_COLORAPP_TCMODE_SATUR;Saturation +TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TEMPOUT_TOOLTIP;Disable to change temperature and tint +TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 +TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). +TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] +TP_COLORAPP_WBRT;WB [RT] + [output] +TP_COLORTONING_AB;o C/L +TP_COLORTONING_AUTOSAT;Automatic +TP_COLORTONING_BALANCE;Balance +TP_COLORTONING_BY;o C/L +TP_COLORTONING_CHROMAC;Opacity +TP_COLORTONING_COLOR;Color +TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Chroma opacity as a function of luminance oC=f(L) +TP_COLORTONING_HIGHLIGHT;Highlights +TP_COLORTONING_HUE;Hue +TP_COLORTONING_LAB;L*a*b* blending +TP_COLORTONING_LABEL;Color Toning +TP_COLORTONING_LABGRID;L*a*b* color correction grid +TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +TP_COLORTONING_LABREGIONS;Color correction regions +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHANNEL;Channel +TP_COLORTONING_LABREGION_CHANNEL_ALL;All +TP_COLORTONING_LABREGION_CHANNEL_B;Blue +TP_COLORTONING_LABREGION_CHANNEL_G;Green +TP_COLORTONING_LABREGION_CHANNEL_R;Red +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;H +TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Correction +TP_COLORTONING_LABREGION_MASK;Mask +TP_COLORTONING_LABREGION_MASKBLUR;Blur Mask +TP_COLORTONING_LABREGION_OFFSET;Offset +TP_COLORTONING_LABREGION_POWER;Power +TP_COLORTONING_LABREGION_SATURATION;Saturation +TP_COLORTONING_LABREGION_SHOWMASK;Show mask +TP_COLORTONING_LABREGION_SLOPE;Slope +TP_COLORTONING_LUMA;Luminance +TP_COLORTONING_LUMAMODE;Preserve luminance +TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. +TP_COLORTONING_METHOD;Method +TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* blending", "RGB sliders" and "RGB curves" use interpolated color blending.\n"Color balance (Shadows/Midtones/Highlights)" and "Saturation 2 colors" use direct colors.\n\nThe Black-and-White tool can be enabled when using any color toning method, which allows for color toning. +TP_COLORTONING_MIDTONES;Midtones +TP_COLORTONING_NEUTRAL;Reset sliders +TP_COLORTONING_NEUTRAL_TIP;Reset all values (Shadows, Midtones, Highlights) to default. +TP_COLORTONING_OPACITY;Opacity +TP_COLORTONING_RGBCURVES;RGB - Curves +TP_COLORTONING_RGBSLIDERS;RGB - Sliders +TP_COLORTONING_SA;Saturation Protection +TP_COLORTONING_SATURATEDOPACITY;Strength +TP_COLORTONING_SATURATIONTHRESHOLD;Threshold +TP_COLORTONING_SHADOWS;Shadows +TP_COLORTONING_SPLITCO;Shadows/Midtones/Highlights +TP_COLORTONING_SPLITCOCO;Color Balance Shadows/Midtones/Highlights +TP_COLORTONING_SPLITLR;Saturation 2 colors +TP_COLORTONING_STR;Strength +TP_COLORTONING_STRENGTH;Strength +TP_COLORTONING_TWO2;Special chroma '2 colors' +TP_COLORTONING_TWOALL;Special chroma +TP_COLORTONING_TWOBY;Special a* and b* +TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. +TP_COLORTONING_TWOSTD;Standard chroma +TP_CROP_FIXRATIO;Lock ratio +TP_CROP_GTDIAGONALS;Rule of Diagonals +TP_CROP_GTEPASSPORT;Biometric Passport +TP_CROP_GTFRAME;Frame +TP_CROP_GTGRID;Grid +TP_CROP_GTHARMMEANS;Harmonic Means +TP_CROP_GTNONE;None +TP_CROP_GTRULETHIRDS;Rule of Thirds +TP_CROP_GTTRIANGLE1;Golden Triangles 1 +TP_CROP_GTTRIANGLE2;Golden Triangles 2 +TP_CROP_GUIDETYPE;Guide type: +TP_CROP_H;Height +TP_CROP_LABEL;Crop +TP_CROP_PPI;PPI +TP_CROP_RESETCROP;Reset +TP_CROP_SELECTCROP;Select +TP_CROP_W;Width +TP_CROP_X;Left +TP_CROP_Y;Top +TP_DARKFRAME_AUTOSELECT;Auto-selection +TP_DARKFRAME_LABEL;Dark-Frame +TP_DEFRINGE_LABEL;Defringe +TP_DEFRINGE_RADIUS;Radius +TP_DEFRINGE_THRESHOLD;Threshold +TP_DEHAZE_DEPTH;Depth +TP_DEHAZE_LABEL;Haze Removal +TP_DEHAZE_LUMINANCE;Luminance only +TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map +TP_DEHAZE_STRENGTH;Strength +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green +TP_DIRPYRDENOISE_LABEL;Noise Reduction +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +TP_DIRPYRDENOISE_MAIN_MODE;Mode +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 +TP_DIRPYREQUALIZER_ALGO;Skin Color Range +TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. +TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts +TP_DIRPYREQUALIZER_HUESKIN;Skin hue +TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;This pyramid is for the upper part, so far as the algorithm at its maximum efficiency.\nTo the lower part, the transition zones.\nIf you need to move the area significantly to the left or right - or if there are artifacts: the white balance is incorrect\nYou can slightly reduce the zone to prevent the rest of the image is affected. +TP_DIRPYREQUALIZER_LABEL;Contrast by Detail Levels +TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest +TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast - +TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast + +TP_DIRPYREQUALIZER_LUMAFINEST;Finest +TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +TP_DIRPYREQUALIZER_SKIN;Skin targetting/protection +TP_DIRPYREQUALIZER_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. +TP_DIRPYREQUALIZER_THRESHOLD;Threshold +TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colors (hue, chroma, luma) and the rest of the image. +TP_DISTORTION_AMOUNT;Amount +TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. +TP_DISTORTION_LABEL;Distortion Correction +TP_EPD_EDGESTOPPING;Edge stopping +TP_EPD_GAMMA;Gamma +TP_EPD_LABEL;Tone Mapping +TP_EPD_REWEIGHTINGITERATES;Reweighting iterates +TP_EPD_SCALE;Scale +TP_EPD_STRENGTH;Strength +TP_EXPOSURE_AUTOLEVELS;Auto Levels +TP_EXPOSURE_AUTOLEVELS_TIP;Toggles execution of Auto Levels to automatically set Exposure slider values based on an image analysis.\nEnables Highlight Reconstruction if necessary. +TP_EXPOSURE_BLACKLEVEL;Black +TP_EXPOSURE_BRIGHTNESS;Lightness +TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors +TP_EXPOSURE_CLIP;Clip % +TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. +TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight compression +TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold +TP_EXPOSURE_COMPRSHADOWS;Shadow compression +TP_EXPOSURE_CONTRAST;Contrast +TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 +TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 +TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +TP_EXPOSURE_EXPCOMP;Exposure compensation +TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. +TP_EXPOSURE_LABEL;Exposure +TP_EXPOSURE_SATURATION;Saturation +TP_EXPOSURE_TCMODE_FILMLIKE;Film-like +TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 +TP_EXPOSURE_TCMODE_LABEL2;Curve mode 2 +TP_EXPOSURE_TCMODE_LUMINANCE;Luminance +TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual +TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Saturation and Value Blending +TP_EXPOSURE_TCMODE_STANDARD;Standard +TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard +TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points +TP_EXPOS_WHITEPOINT_LABEL;Raw White Points +TP_FILMNEGATIVE_BLUE;Blue ratio +TP_FILMNEGATIVE_FILMBASE_PICK;Pick film base color +TP_FILMNEGATIVE_FILMBASE_TOOLTIP;Pick a spot of unexposed film (eg. the border between frames), to get the actual film base color values, and save them in the processing profile.\nThis makes it easy to get a more consistent color balance when batch-processing multiple pictures from the same roll.\nAlso use this when the converted image is extremely dark, bright, or color-unbalanced. +TP_FILMNEGATIVE_FILMBASE_VALUES;Film base RGB: +TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) +TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +TP_FILMNEGATIVE_LABEL;Film Negative +TP_FILMNEGATIVE_PICK;Pick neutral spots +TP_FILMNEGATIVE_RED;Red ratio +TP_FILMSIMULATION_LABEL;Film Simulation +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? +TP_FILMSIMULATION_STRENGTH;Strength +TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences +TP_FLATFIELD_AUTOSELECT;Auto-selection +TP_FLATFIELD_BLURRADIUS;Blur radius +TP_FLATFIELD_BLURTYPE;Blur type +TP_FLATFIELD_BT_AREA;Area +TP_FLATFIELD_BT_HORIZONTAL;Horizontal +TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal +TP_FLATFIELD_BT_VERTICAL;Vertical +TP_FLATFIELD_CLIPCONTROL;Clip control +TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. +TP_FLATFIELD_LABEL;Flat-Field +TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. +TP_GRADIENT_CENTER;Center +TP_GRADIENT_CENTER_X;Center X +TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values). +TP_GRADIENT_CENTER_Y;Center Y +TP_GRADIENT_CENTER_Y_TOOLTIP;Shift gradient up (negative values) or down (positive values). +TP_GRADIENT_DEGREE;Angle +TP_GRADIENT_DEGREE_TOOLTIP;Rotation angle in degrees. +TP_GRADIENT_FEATHER;Feather +TP_GRADIENT_FEATHER_TOOLTIP;Gradient width in percent of the image diagonal. +TP_GRADIENT_LABEL;Graduated Filter +TP_GRADIENT_STRENGTH;Strength +TP_GRADIENT_STRENGTH_TOOLTIP;Filter strength in stops. +TP_HLREC_BLEND;Blend +TP_HLREC_CIELAB;CIELab Blending +TP_HLREC_COLOR;Color Propagation +TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels. +TP_HLREC_LABEL;Highlight reconstruction +TP_HLREC_LUMINANCE;Luminance Recovery +TP_HLREC_METHOD;Method: +TP_HSVEQUALIZER_CHANNEL;Channel +TP_HSVEQUALIZER_HUE;H +TP_HSVEQUALIZER_LABEL;HSV Equalizer +TP_HSVEQUALIZER_SAT;S +TP_HSVEQUALIZER_VAL;V +TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure +TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. +TP_ICM_APPLYHUESATMAP;Base table +TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only available if the selected DCP has one. +TP_ICM_APPLYLOOKTABLE;Look table +TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only available if the selected DCP has one. +TP_ICM_BPC;Black Point Compensation +TP_ICM_DCPILLUMINANT;Illuminant +TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolated +TP_ICM_DCPILLUMINANT_TOOLTIP;Select which embedded DCP illuminant to employ. Default is "interpolated" which is a mix between the two based on white balance. The setting is only available if a dual-illuminant DCP with interpolation support is selected. +TP_ICM_INPUTCAMERA;Camera standard +TP_ICM_INPUTCAMERAICC;Auto-matched camera profile +TP_ICM_INPUTCAMERAICC_TOOLTIP;Use RawTherapee's camera-specific DCP or ICC input color profiles. These profiles are more precise than simpler matrix ones. They are not available for all cameras. These profiles are stored in the /iccprofiles/input and /dcpprofiles folders and are automatically retrieved based on a file name matching to the exact model name of the camera. +TP_ICM_INPUTCAMERA_TOOLTIP;Use a simple color matrix from dcraw, an enhanced RawTherapee version (whichever is available based on camera model) or one embedded in the DNG. +TP_ICM_INPUTCUSTOM;Custom +TP_ICM_INPUTCUSTOM_TOOLTIP;Select your own DCP/ICC color profile file for the camera. +TP_ICM_INPUTDLGLABEL;Select Input DCP/ICC Profile... +TP_ICM_INPUTEMBEDDED;Use embedded, if possible +TP_ICM_INPUTEMBEDDED_TOOLTIP;Use color profile embedded in non-raw files. +TP_ICM_INPUTNONE;No profile +TP_ICM_INPUTNONE_TOOLTIP;Use no input color profile at all.\nUse only in special cases. +TP_ICM_INPUTPROFILE;Input Profile +TP_ICM_LABEL;Color Management +TP_ICM_NOICM;No ICM: sRGB Output +TP_ICM_OUTPUTPROFILE;Output Profile +TP_ICM_PROFILEINTENT;Rendering Intent +TP_ICM_SAVEREFERENCE;Save Reference Image +TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance +TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. +TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. +TP_ICM_TONECURVE;Tone curve +TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +TP_ICM_WORKINGPROFILE;Working Profile +TP_ICM_WORKING_TRC;Tone response curve: +TP_ICM_WORKING_TRC_CUSTOM;Custom +TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_NONE;None +TP_ICM_WORKING_TRC_SLOPE;Slope +TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction +TP_IMPULSEDENOISE_THRESH;Threshold +TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction. +TP_LABCURVE_BRIGHTNESS;Lightness +TP_LABCURVE_CHROMATICITY;Chromaticity +TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100. +TP_LABCURVE_CONTRAST;Contrast +TP_LABCURVE_CURVEEDITOR;Luminance Curve +TP_LABCURVE_CURVEEDITOR_A_RANGE1;Green Saturated +TP_LABCURVE_CURVEEDITOR_A_RANGE2;Green Pastel +TP_LABCURVE_CURVEEDITOR_A_RANGE3;Red Pastel +TP_LABCURVE_CURVEEDITOR_A_RANGE4;Red Saturated +TP_LABCURVE_CURVEEDITOR_B_RANGE1;Blue Saturated +TP_LABCURVE_CURVEEDITOR_B_RANGE2;Blue Pastel +TP_LABCURVE_CURVEEDITOR_B_RANGE3;Yellow Pastel +TP_LABCURVE_CURVEEDITOR_B_RANGE4;Yellow Saturated +TP_LABCURVE_CURVEEDITOR_CC;CC +TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutral +TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Dull +TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel +TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturated +TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Chromaticity according to chromaticity C=f(C) +TP_LABCURVE_CURVEEDITOR_CH;CH +TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Chromaticity according to hue C=f(H) +TP_LABCURVE_CURVEEDITOR_CL;CL +TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Chromaticity according to luminance C=f(L) +TP_LABCURVE_CURVEEDITOR_HH;HH +TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Hue according to hue H=f(H) +TP_LABCURVE_CURVEEDITOR_LC;LC +TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminance according to chromaticity L=f(C) +TP_LABCURVE_CURVEEDITOR_LH;LH +TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H) +TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminance according to luminance L=f(L) +TP_LABCURVE_LABEL;L*a*b* Adjustments +TP_LABCURVE_LCREDSK;Restrict LC to red and skin-tones +TP_LABCURVE_LCREDSK_TIP;If enabled, the LC Curve affects only red and skin-tones.\nIf disabled, it applies to all tones. +TP_LABCURVE_RSTPROTECTION;Red and skin-tones protection +TP_LABCURVE_RSTPRO_TOOLTIP;Works on the Chromaticity slider and the CC curve. +TP_LENSGEOM_AUTOCROP;Auto-Crop +TP_LENSGEOM_FILL;Auto-fill +TP_LENSGEOM_LABEL;Lens / Geometry +TP_LENSGEOM_LIN;Linear +TP_LENSGEOM_LOG;Logarithmic +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected +TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +TP_LENSPROFILE_LABEL;Profiled Lens Correction +TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +TP_LENSPROFILE_MODE_HEADER;Lens Profile +TP_LENSPROFILE_USE_CA;Chromatic aberration +TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion +TP_LENSPROFILE_USE_HEADER;Correct +TP_LENSPROFILE_USE_VIGNETTING;Vignetting +TP_LOCALCONTRAST_AMOUNT;Amount +TP_LOCALCONTRAST_DARKNESS;Darkness level +TP_LOCALCONTRAST_LABEL;Local Contrast +TP_LOCALCONTRAST_LIGHTNESS;Lightness level +TP_LOCALCONTRAST_RADIUS;Radius +TP_LOCALLAB_ACTIV;Luminance only +TP_LOCALLAB_ACTIVSPOT;Enable Spot +TP_LOCALLAB_ADJ;Equalizer Blue-yellow Red-green +TP_LOCALLAB_ALL;All rubrics +TP_LOCALLAB_AMOUNT;Amount +TP_LOCALLAB_ARTIF;Shape detection +//TP_LOCALLAB_ARTIF_TOOLTIP;Threshold deltaE-scope increase the range of scope-deltaE - high values are for very wide gamut images.\nIncrease deltaE decay improve shape detection, but can reduce the scope of detection. +TP_LOCALLAB_ARTIF_TOOLTIP;ΔE-scope threshold increases the range of deltaE scope. High values are for very wide gamut images.\nIncreasing deltaE decay can improve shape detection, but can also reduce the scope. +TP_LOCALLAB_AUTOGRAY;Automatic +TP_LOCALLAB_AVOID;Avoid color shift +TP_LOCALLAB_BALAN;ab-L balance (ΔE) +TP_LOCALLAB_BALANEXP;Laplacian balance +TP_LOCALLAB_BALANH;C-H balance (ΔE) +//TP_LOCALLAB_BALAN_TOOLTIP;Change algorithm ΔE parameter.\nMore or less ab-L, more or less C - H.\nNot for Denoise +TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less ab-L, or more or less C - H.\nNot for Denoise +TP_LOCALLAB_BASELOG;Logarithm base +TP_LOCALLAB_BILATERAL;Bilateral filter +TP_LOCALLAB_BLACK_EV;Black Ev +TP_LOCALLAB_BLCO;Chrominance only +TP_LOCALLAB_BLENDMASKCOL;Blend +TP_LOCALLAB_BLENDMASKMASK;Add / subtract luminance mask +TP_LOCALLAB_BLENDMASKMASKAB;Add / subtract chrominance mask +TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image +TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image +TP_LOCALLAB_BLGUID;Guided Filter +TP_LOCALLAB_BLINV;Inverse +TP_LOCALLAB_BLLC;Luminance & Chrominance +TP_LOCALLAB_BLLO;Luminance only +TP_LOCALLAB_BLMED;Median +TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - direct blur and noise with all settings.\nInverse blur and noise with all settings. Be careful some results may be curious +TP_LOCALLAB_BLNOI_EXP;Blur & Noise +TP_LOCALLAB_BLNORM;Normal +TP_LOCALLAB_BLSYM;Symmetric +TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n*Blur the background by a RT-spot fully covering the image (high values for scope and transition) - normal or inverse.\n*Isolate the foreground by one or more excluding RT-spot with the tools you want (increse scope).\n\nThis module can be used in additional noise reduction,including "median" and "Guided filter" +TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +TP_LOCALLAB_BLURCBDL;Blur levels 0-1-2-3-4 +TP_LOCALLAB_BLURCOL;Radius +TP_LOCALLAB_BLURDE;Blur shape detection +TP_LOCALLAB_BLURLC;Luminance Only +TP_LOCALLAB_BLURLEVELFRA;Blur Levels +TP_LOCALLAB_BLURMASK_TOOLTIP;Generate a blur mask, take into account the structure with the contrast threshold Blur Mask slider. +TP_LOCALLAB_BLURRESIDFRA;Blur Residual +TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise - 1 +TP_LOCALLAB_BLWH;All changes forced in Black-and-White +//TP_LOCALLAB_BLWH_TOOLTIP;Force color change composante "a" and "b" to zero.\nUsefull when the user chooses black and white processes, or film. +TP_LOCALLAB_BLWH_TOOLTIP;Force color components "a" and "b" to zero.\nUseful for black and white processing, or film simulation. +TP_LOCALLAB_BUTTON_ADD;Add +TP_LOCALLAB_BUTTON_DEL;Delete +TP_LOCALLAB_BUTTON_DUPL;Duplicate +TP_LOCALLAB_BUTTON_REN;Rename +TP_LOCALLAB_BUTTON_VIS;Show/Hide +TP_LOCALLAB_CBDL;Contrast by detail levels +TP_LOCALLAB_CBDLCLARI_TOOLTIP;Takes the midtones and enhance them. +TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Acts as a wavelet tools.\nThe first level (0) acts on 2x2 details.\nThe last level (5) acts on 64x64 details. +TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevent the sharpening of noise +TP_LOCALLAB_CBDL_TOOLNAME;CBDL - 2 +TP_LOCALLAB_CENTER_X;Center X +TP_LOCALLAB_CENTER_Y;Center Y +TP_LOCALLAB_CH;Curves CL - LC +TP_LOCALLAB_CHROMA;Chrominance +TP_LOCALLAB_CHROMABLU;Chroma levels +TP_LOCALLAB_CHROMABLU_TOOLTIP;Acts as an amplifier-reducer action compare to settings of luma.\nUnder 1 reduce, above 1 amplifie +TP_LOCALLAB_CHROMACBDL;Chroma +TP_LOCALLAB_CHROMACB_TOOLTIP;Acts as an amplifier-reducer action compare to sliders of luminance.\nUnder 100 reduce, above 100 amplifie +TP_LOCALLAB_CHROMALEV;Chroma levels +TP_LOCALLAB_CHROMASKCOL;Chroma +TP_LOCALLAB_CHROMASK_TOOLTIP;You can use this slider to desaturated background (inverse mask - curve near 0).\nAlso to attenuate or enhance the action of a mask on the chroma +TP_LOCALLAB_CHRRT;Chroma +TP_LOCALLAB_CIRCRADIUS;Spot size +TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for treating foliage.\nHigh values may be useful for treating skin +TP_LOCALLAB_CLARICRES;Merge chroma +TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask - Blend & Soft images +TP_LOCALLAB_CLARILRES;Merge luma +TP_LOCALLAB_CLARISOFT;Soft radius +TP_LOCALLAB_CLARISOFT_TOOLTIP;Enabled for Clarity and Sharp mask if Merge Luma different from zero.\n\nEnabled for all wavelets pyramid modules.\nDisabled if Soft radius = 0 +TP_LOCALLAB_CLARITYML;Clarity +TP_LOCALLAB_CLARI_TOOLTIP;Under or equal level wavelet 4, 'Sharp mask' is enabled.\nAbove level wavelet 5 'Clarity' is enabled.\nUsefull if you use 'Level dynamic Range Compression' +TP_LOCALLAB_CLIPTM;Clip restored data (gain) +TP_LOCALLAB_COFR;Color & Light +TP_LOCALLAB_COLORDE;ΔE preview color - intensity +//TP_LOCALLAB_COLORDEPREV_TOOLTIP;Button Preview ΔE needs that only one tool is enabled (expander).\nTo be able to have an Preview ΔE with several enable tools use Mask and modifications - Preview ΔE +TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in "Add tool to current spot" menu\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE +//TP_LOCALLAB_COLORDE_TOOLTIP;Show preview selection ΔE in blue if negative and in green if positive.\n\nMask and modifications (show modifications without mask): show real modifications if positive, show enhanced modifications (only luminance) with blue and yellow if negative. +TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color-preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modifications without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +TP_LOCALLAB_COLORSCOPE;Scope (color tools) +//TP_LOCALLAB_COLORSCOPE_TOOLTIP;Use a common Scope for Color and light, Shadows highlight, Vibrance.\nOthers tools have their specific scope. +TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows & Highlights, Vibrance.\nOther tools have their own scope controls. +TP_LOCALLAB_COLOR_TOOLNAME;Color & Light - 11 +TP_LOCALLAB_COL_NAME;Name +TP_LOCALLAB_COL_VIS;Status +TP_LOCALLAB_COMPFRA;Directional Contrast +TP_LOCALLAB_COMPFRAME_TOOLTIP;Allows special effects. You can reduce artifacts with 'Clarity & Sharp mask - Blend & Soft Images".\nUses a lot of resources +TP_LOCALLAB_COMPLEX_METHOD;Software Complexity +TP_LOCALLAB_COMPLEX_TOOLTIP; Allow user to select Local adjustments rubrics. +TP_LOCALLAB_COMPREFRA;Wavelet level tone-mapping +TP_LOCALLAB_COMPRESS_TOOLTIP;Use if necessary the module 'Clarity & Sharp mask and Blend & Soft Images' by adjusting 'Soft radius' to reduce artifacts. +TP_LOCALLAB_CONTCOL;Contrast threshold +TP_LOCALLAB_CONTFRA;Contrast by Level +TP_LOCALLAB_CONTRAST;Contrast +TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Main mask contrast control. +TP_LOCALLAB_CONTRESID;Contrast +TP_LOCALLAB_CONTTHR;Contrast Threshold +TP_LOCALLAB_CONTWFRA;Local contrast +TP_LOCALLAB_CSTHRESHOLD;Ψ Wavelets Levels +TP_LOCALLAB_CSTHRESHOLDBLUR;Ψ Wavelet level selection +TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance "Super" +TP_LOCALLAB_CURVCURR;Normal +TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nIt is recommended (not required) to position the top of the curves on the gray transition line which represents the references (chroma, luma, hue). +TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nThe gray transition line which represents the references (chroma, luma, hue).\nYou can choose or not to position the top of the curves on this transition. +TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To be active, you must enable combobox 'Curve type' +TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light +TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) has the same algorithm than slider lightness.\n'Super' the curve L=f(L) has an new improved algorithm, which can leeds in some cases to artifacts. +TP_LOCALLAB_CURVENCONTRAST;Super+Contrast threshold (experimental) +TP_LOCALLAB_CURVENH;Super +TP_LOCALLAB_CURVENHSU;Combined HueChroma (experimental) +TP_LOCALLAB_CURVENSOB2;Combined HueChroma + Contrast threshold (experimental) +TP_LOCALLAB_CURVNONE;Disable curves +TP_LOCALLAB_DARKRETI;Darkness +TP_LOCALLAB_DEHAFRA;Dehaze +TP_LOCALLAB_DEHAZ;Strength +TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values adds haze +TP_LOCALLAB_DELTAD;Delta balance +TP_LOCALLAB_DELTAEC;ΔE Image Mask +TP_LOCALLAB_DENOIS;Ψ Denoise +TP_LOCALLAB_DENOIS;Ψ Denoise +TP_LOCALLAB_DENOI_EXP;Denoise +TP_LOCALLAB_DENOI1_EXP;Denoise using local contrast mask +TP_LOCALLAB_DENOI_TOOLTIP;This module can be used alone (at the end of process), or in complement of main denoise (at the beginning).\nScope allows to differentiate the action according to the color (deltaE).\nYou can complete the action with "median" or "Guided Filter" (Smooth Blur...).\nYou can complete the action with "Blur levels" "Wavelet pyramid" +TP_LOCALLAB_DEPTH;Depth +TP_LOCALLAB_DETAIL;Local contrast +TP_LOCALLAB_DETAILSH;Details +TP_LOCALLAB_DETAILTHR;Luminance & Chroma detail threshold (DCT ƒ) +TP_LOCALLAB_DUPLSPOTNAME;Copy +TP_LOCALLAB_EDGFRA;Edge Sharpness +TP_LOCALLAB_EDGSHOW;Show all tolls +TP_LOCALLAB_ELI;Ellipse +TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +TP_LOCALLAB_ENABLE_MASK;Enable mask +TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled Mask uses Restored Datas after Transmission Map instead of Original datas +TP_LOCALLAB_ENH;Enhanced +TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +TP_LOCALLAB_EPSBL;Detail +TP_LOCALLAB_EQUIL;Normalize Luminance +TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance in such a way that the mean and the variance of the output image is identical to that of the original. +TP_LOCALLAB_ESTOP;Edge stopping +TP_LOCALLAB_EV_DUPL;Copy of +TP_LOCALLAB_EV_NVIS;Hide +TP_LOCALLAB_EV_NVIS_ALL;Hide all +TP_LOCALLAB_EV_VIS;Show +TP_LOCALLAB_EV_VIS_ALL;Show all +TP_LOCALLAB_EXCLUF;Excluding +TP_LOCALLAB_EXCLUF_TOOLTIP;Can be used to exclude this part of datas - move Scope to extend color.\n You can apply all settings to this RT-spot. +TP_LOCALLAB_EXCLUTYPE;Spot method +//TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot use recursive data.\n\nExcluding spot reinitialize data to origin.\nCan be used to totally or partially cancel a previous action or to perform a inverse mode +TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in inverted mode +TP_LOCALLAB_EXECLU;Excluding spot +TP_LOCALLAB_EXNORM;Normal spot +//TP_LOCALLAB_EXPCBDL_TOOLTIP;In the case of contaminated sensor (type "grease"), and when the area is important or for a series of small defects.\n\na) Put the selection spot on a pronounced default (adapting its size if necessary), use a large spot enough to allow wavelet; b) choose a wide selection area to cover most of the area affected by the defects; c) Select a transition value (low) and transition decay (high value); d) act on levels 2, 3, 4 or 5 or lower by reducing the contrast (values below 100) and by acting on the chroma slider if necessary. e)possibly act on "scope" to reduce the extent of the action.\n\nYou can also complete with Blur levels and Gaussian blur (Smooth Blur and noise) +TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens. +TP_LOCALLAB_EXPCHROMA;Chroma compensation +TP_LOCALLAB_EXPCHROMA_TOOLTIP;Only in association with exposure compensation and PDE Ipol.\nAvoids desaturation of colors +//TP_LOCALLAB_EXPCOLOR_TOOLTIP;In the case of small defects.\n\nRed-eyes : red-centered circular selector, spot delimiters close to the eye, weak scope, "lightness" -100, "chrominance" -100.\n\nSpotIR :Circular selector centered on the defect, spot delimiters close to the default - reduce "chrominance", possibly act on "scope" to reduce the extent of the action.\n\nDust - grease (small) :Circular selector centered on the defect (adapt the size of the spot), spot delimiters not too close to the defect to allow an inconspicuous transition. a) "Transition" (low values) and "Transition weak" (high values); b) act on "lightness" and possibly on "chrominance" or "Color correction grid - direct" to approach the rendering of the polluted zone to that of the healthy zone; c) act moderately on "scope" to modulate the desired action.\n\nYou can also complete with Gaussian blur (Smooth Blur and noise) +TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +TP_LOCALLAB_EXPCOMPINV;Exposure compensation +TP_LOCALLAB_EXPCOMP_TOOLTIP;For portrait or images with low color gradient, you can change "Shape detection" in "settings":\n\nIncrease 'Threshold ΔE scope'\nReduce 'ΔE decay'\nIncrease 'Balance ΔE ab-L' +TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation of wavelet levels.\nHowever there are some differences: more tools and closer to the details.\nEx: Tone mapping for wavelet levels. +TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small(< 32x32 pixels).\nUse low transition values and high decay transition values and scope to simulate small RT-spot and deal wth defects.\nUse if necessary the module 'Clarity & Sharp mask and Blend images' by adjusting 'Soft radius' to reduce artifacts. +TP_LOCALLAB_EXPCURV;Curves +TP_LOCALLAB_EXPGRAD;Graduated Filter +TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Balances the action between the original image and the Laplace transform. +TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Apply a gamma before and after Laplace transform +TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Add linear exposure component before application Laplace transform +TP_LOCALLAB_EXPLAP_TOOLTIP;The more you act on this threshold slider, the greater the action of reducing contrast. +TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows various possibilities to blend image (as layers in Photoshop (c)) : difference, multiply, soft light, overlay...with opacity...\nOriginal Image : merge current RT-spot with Original.\nPrevious spot : merge current Rt-spot with previous - if there is only one spot previous = original.\nBackground : merge current RT-spot with a color and luminance background (less possibilties) +TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : use an algorithm similar as main Exposure but in L*a*b* and taking account of deltaE.\n\nContrast attenuator : use another algorithm also with deltaE and with Poisson equation to solve Laplacian in Fourier space.\nContrast attenuator, Dynamic range compression and Standard can be combined.\nFFTW Fourier Transform is optimized in size to reduce processing time.\nReduce artifacts and noise. +TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Apply a median before Laplace transform to prevent artifacts (noise).\nYou can also use "Denoise" tool. +TP_LOCALLAB_EXPOSE;Dynamic Range Compr. & Exposure +//TP_LOCALLAB_EXPOSURE_TOOLTIP;In some cases (strong shadows ..) you can use others modules "Shadows Highlights", "Tone equalizer", "TRC", "Log Encoding"... +TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high decay transition values and scope to simulate small RT-spot. +TP_LOCALLAB_EXPTOOL;Exposure tools +TP_LOCALLAB_EXPTRC;Tone Response Curve - TRC +TP_LOCALLAB_EXP_TOOLNAME;Contrast Attenuator/Dynamic Range Compression & Exposure- 10 +TP_LOCALLAB_FATAMOUNT;Amount +TP_LOCALLAB_FATANCHOR;Anchor +TP_LOCALLAB_FATANCHORA;Offset +TP_LOCALLAB_FATDETAIL;Detail +TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal - use Fattal Tone mapping algorithm. +TP_LOCALLAB_FATLEVEL;Sigma +TP_LOCALLAB_FATRES;Amount Residual Image +TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +//TP_LOCALLAB_FEATH_TOOLTIP;Gradient width in percent of the Spot diagonal\nUsed by all Graduated filter in all tools.\nNo action if Graduated Filter are not used. +TP_LOCALLAB_FEATH_TOOLTIP;Gradient width in percent of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn’t been activated. +TP_LOCALLAB_FEATVALUE;Feather gradient (Graduated Filters) +TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +TP_LOCALLAB_FFTW2;ƒ - Use Fast Fourier Transform (TIF, JPG,..) +TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +//TP_LOCALLAB_FULLIMAGE;Calculate DarkEv - WhiteEv - Value on the entire image +TP_LOCALLAB_FULLIMAGE;Calculate dark-Ev/white-Ev value on the entire image +TP_LOCALLAB_GAM;Gamma +TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +TP_LOCALLAB_GAMM;Gamma +TP_LOCALLAB_GAMMASKCOL;Gamma +TP_LOCALLAB_GAMSH;Gamma +TP_LOCALLAB_GRADANG;Gradient angle +TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees : -180 0 +180 +TP_LOCALLAB_GRADFRA;Graduated Filter Mask +TP_LOCALLAB_GRADGEN_TOOLTIP;Graduated filter is supplied with Color and Light & merge file, Exposure & mask, Shadows Highlight, Vibrance, Log Encoding.\n\nVibrance, Color and Light & merge file, are provided with GF luminance, chrominance, Hue.\nFeather is located in settings. +TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +TP_LOCALLAB_GRADSTR;Gradient strength +TP_LOCALLAB_GRADSTRAB_TOOLTIP;Filter chroma strength +TP_LOCALLAB_GRADSTRCHRO;Chrominance gradient strength +TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Filter Hue strength +TP_LOCALLAB_GRADSTRLUM;Luminance gradient strength +TP_LOCALLAB_GRADSTR_TOOLTIP;Filter strength in stops +TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +TP_LOCALLAB_GRALWFRA;Graduated Filter Local contrast +TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use small spot and adapt transition and transition decay\nOnly mode NORMAL and eventually Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE) +TP_LOCALLAB_GRIDONE;Color Toning +TP_LOCALLAB_GRIDTWO;Direct +TP_LOCALLAB_GUIDBL;Soft radius +TP_LOCALLAB_GUIDFILTER;Guided filter radius +TP_LOCALLAB_GUIDFILTER_TOOLTIP;Adapt this values according to images - can reduce or increase artifacts. +TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +TP_LOCALLAB_HIGHMASKCOL;Highlights +TP_LOCALLAB_HLH;Curves H +TP_LOCALLAB_IND;Independent (mouse) +TP_LOCALLAB_INDSL;Independent (mouse + sliders) +TP_LOCALLAB_INVERS;Inverse +TP_LOCALLAB_INVERS_TOOLTIP;If selected (inverse) less possibilities.\n\nAlternative\nFirst Spot:\n full image - delimiter outside preview\n Shape RT-spot area : rectangle. Transition 100\n\nSecond spot : Excluding spot +TP_LOCALLAB_ISOGR;Coarseness (ISO) +TP_LOCALLAB_LABBLURM;Blur Mask +TP_LOCALLAB_LABEL;Local Adjustments +TP_LOCALLAB_LABGRID;Color correction grid +TP_LOCALLAB_LABGRIDMERG;Background +TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +TP_LOCALLAB_LABSTRUM;Structure Mask +TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +TP_LOCALLAB_LAPLACEXP;Laplacian threshold +TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using Radius and Laplace Threshold (advanced) simultaneously.\nLaplacian threshold reduce contrast, artifacts, smooth result. +TP_LOCALLAB_LAP_MASK_TOOLTIP;Solve PDE for all Laplacian masks.\nIf enabled Laplacian threshold mask reduce artifacts and smooth result.\nIf disabled linear response. +TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated.\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\n +TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets - 7 +TP_LOCALLAB_LCTHR;Guided threshold by details levels +TP_LOCALLAB_LEVELBLUR;Maximum Blur levels +TP_LOCALLAB_LEVELLOCCONTRAST_TOOLTIP;On the abscissa local contrast (near concept luminance). On the ordinate, amplification or reduction local contrast. +TP_LOCALLAB_LEVELHIGH;Radius 57 +TP_LOCALLAB_LEVELLOW;Radius 14 +TP_LOCALLAB_LEVELWAV;Ψ Wavelets Levels +TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4 +TP_LOCALLAB_LEVFRA;Levels +TP_LOCALLAB_LIGHTNESS;Lightness +TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 force luminance to zero +TP_LOCALLAB_LIGHTRETI;Lightness +TP_LOCALLAB_LIMDEN;Interaction levels 57 on level 14 +TP_LOCALLAB_LINEAR;Linearity +TP_LOCALLAB_LIST_NAME;Add tool to current spot... +TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard & Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing +TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Give priority to action on midtones and high lights and by choosing the concerned wavelet levels +TP_LOCALLAB_LMASK_LL_TOOLTIP;Give priority to action on midtones and high lights +TP_LOCALLAB_LOCCONT;Unsharp Mask +TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pyramid 1: +TP_LOCALLAB_LOC_CONTRASTPYR2;Ψ Pyramid 2: +TP_LOCALLAB_LOC_CONTRASTPYR2LAB;Contrast by Level - Tone Mapping - Dir.Contrast +TP_LOCALLAB_LOC_CONTRASTPYRLAB;Graduated Filter - Edge Sharpness - Blur +TP_LOCALLAB_LOC_RESIDPYR;Residual Image (Main) +TP_LOCALLAB_LOG;Log Encoding +TP_LOCALLAB_LOGAUTO;Automatic +TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will bring an evaluation of dynamic range and Source Gray point (if "Automatic" Source gray enabled).\nTo be able to touch up the automatic values, press the button again +TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm, the shadows are darker, the highlights are brighter.\nValues greater than 2 change the action of the algorithm, the shadows are grayer the highlights are more washed out +TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of Dynamic Range - Black Ev and White Ev +TP_LOCALLAB_LOGENCOD_TOOLTIP;Allows Tone Mapping with Logarithm encoding (ACES).\nUsefull for underexposed pictures, or with high dynamic range.\n\nTwo steps in the process : 1) Calculate Dynamic Range 2) User adaptation +TP_LOCALLAB_LOGFRA;Source Gray Point +TP_LOCALLAB_LOGFRAME_TOOLTIP;Calculate or use Exposure levels of the image early in the process:\n Black Ev, White Ev and Source Gray point.\n Take into account main exposure compensation. +TP_LOCALLAB_LOGLIN;Logarithm mode +TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estimated gray point value of the image, early in the process +TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can change this value to adapt it to your taste. +TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 +TP_LOCALLAB_LUM;Curves LL - CC +TP_LOCALLAB_LUMADARKEST;Darkest +TP_LOCALLAB_LUMASK;Background color for luminance and color masks +//TP_LOCALLAB_LUMASK_TOOLTIP;Adjust the gray and the color of the mask background in Show Mask (Mask and modifications) +TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications) +TP_LOCALLAB_LUMAWHITESEST;Whiteest +TP_LOCALLAB_LUMFRA;L*a*b* standard +TP_LOCALLAB_LUMONLY;Luminance only +TP_LOCALLAB_MASKCOM;Common Color Mask +TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +//These masks works as all tools, they take into account scope color.\nThey are different from others masks which complete a tool (Color and Light, Exposure...) +TP_LOCALLAB_MASFRAME;Mask and Merge +//TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and curves contrast , levels contrasts, and blur mask, structure(if enabled tool) are used.\nDisabled in Inverse +TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the deltaE image to avoid modifying the selection area when the following sliders are used: gamma mask, slope mask, chroma mask and curve contrast , level contrasts, and blur mask, structure (if tool enabled ) .\nDisabled when Inverse mode is used +TP_LOCALLAB_MASK;Mask +TP_LOCALLAB_MASK2;Contrast curve +TP_LOCALLAB_MASKCOL;Mask Curves +TP_LOCALLAB_MASKH;Hue curve +TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a single tool, this requires activating another tool (but without using the tool : sliders to 0,...) where is the mask you want to activate.\n\nYou can also duplicate the RT-spot and place it right next to each other,variations of references allow fine work on images. +TP_LOCALLAB_MASKLCTHR;Threshold luminance mask +TP_LOCALLAB_THRESMASKHIGH;Highlights +TP_LOCALLAB_THRESMASKLOW;Shadows + +TP_LOCALLAB_MED;Medium +TP_LOCALLAB_MEDIAN;Median Low +TP_LOCALLAB_MEDNONE;None +TP_LOCALLAB_MERCOL;Color +TP_LOCALLAB_MERDCOL;Merge background (ΔE) +TP_LOCALLAB_MERELE;Lighten only +TP_LOCALLAB_MERFIV;Addition +TP_LOCALLAB_MERFOR;Color Dodge +TP_LOCALLAB_MERFOU;Multiply +TP_LOCALLAB_MERGE1COLFRA;Merge with Original or Previous or Background +TP_LOCALLAB_MERGECOLFRA;Mask: LCH & Structure +TP_LOCALLAB_MERGEFIV;Previous Spot(Mask 7) + Mask LCH +TP_LOCALLAB_MERGEFOU;Previous Spot(Mask 7) +TP_LOCALLAB_MERGEMER_TOOLTIP;Take into account ΔE to merge files (equivalent of scope for this use) +TP_LOCALLAB_MERGENONE;None +TP_LOCALLAB_MERGEONE;Short Curves 'L' Mask +TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity merge % current Spot with original or previous Spot.\nContrast threshold : adjust result in function of Original contrast +TP_LOCALLAB_MERGETHR;Original(Mask 7) + Mask LCH +TP_LOCALLAB_MERGETWO;Original(Mask 7) +TP_LOCALLAB_MERGETYPE;Merge image and mask +TP_LOCALLAB_MERGETYPE_TOOLTIP;None, use all mask in LCH mode.\nShort curves 'L' mask, use a short circuit for mask 2, 3, 4, 6, 7.\nOriginal mask 8, blend current image with original +TP_LOCALLAB_MERHEI;Overlay +TP_LOCALLAB_MERHUE;Hue +TP_LOCALLAB_MERLUCOL;Luminance +TP_LOCALLAB_MERLUM;Luminosity +TP_LOCALLAB_MERNIN;Screen +TP_LOCALLAB_MERONE;Normal +TP_LOCALLAB_MERSAT;Saturation +TP_LOCALLAB_MERSEV;Soft Light (legacy) +TP_LOCALLAB_MERSEV0;Soft Light Illusion +TP_LOCALLAB_MERSEV1;Soft Light W3C +TP_LOCALLAB_MERSEV2;Hard Light +TP_LOCALLAB_MERSIX;Divide +TP_LOCALLAB_MERTEN;Darken only +TP_LOCALLAB_MERTHI;Color Burn +TP_LOCALLAB_MERTHR;Difference +TP_LOCALLAB_MERTWE;Exclusion +TP_LOCALLAB_MERTWO;Subtract +TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 (Clip - Offset) +TP_LOCALLAB_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible.\nYou can act on Clip Restored datas and Offset to normalize.\n\nRestored image with no mixture. +TP_LOCALLAB_MODE_EXPERT;Advanced +TP_LOCALLAB_MODE_NORMAL;Standard +TP_LOCALLAB_MODE_SIMPLE;Basic +TP_LOCALLAB_MRFIV;Background +TP_LOCALLAB_MRFOU;Previous Spot +TP_LOCALLAB_MRONE;None +TP_LOCALLAB_MRTHR;Original Image +TP_LOCALLAB_MRTWO;Short Curves 'L' Mask +TP_LOCALLAB_MULTIPL_TOOLTIP;Allows the retouching of tones over a very wide range : -18EV +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts light tones up to 4EV +TP_LOCALLAB_NEIGH;Radius +TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02 +TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery (DCT ƒ) +TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +TP_LOCALLAB_NOISEDETAIL_TOOLTIP;Disabled if slider = 100 +TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +TP_LOCALLAB_NOISELUMDETAIL;Luminance detail recovery (DCT ƒ) +TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +TP_LOCALLAB_NOISEMETH;Denoise +TP_LOCALLAB_NONENOISE;None +TP_LOCALLAB_OFFS;Offset +TP_LOCALLAB_OFFSETWAV;Offset +TP_LOCALLAB_OPACOL;Opacity +TP_LOCALLAB_ORIGLC;Merge only with original image +TP_LOCALLAB_ORRETILAP_TOOLTIP;Acts on a second Laplacian threshold, to take into account ΔE to differentiate the action especially with the background (different from Scope) +TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced +TP_LOCALLAB_PASTELS2;Vibrance +TP_LOCALLAB_PDE;Contrast Attenuator/Dynamic Range compression +TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL - personal algorithm adapted from IPOL to Rawtherapee: lead to very different results and needs differents settings that Standard (negative black, gamma < 1,...)\nMay be usefull for low exposure or high dynamic range.\n +TP_LOCALLAB_PREVIEW;Preview ΔE +TP_LOCALLAB_PREVHIDE;Hide additional settings +TP_LOCALLAB_PREVSHOW;Show additional settings +TP_LOCALLAB_PROXI;ΔE decay +TP_LOCALLAB_QUALCURV_METHOD;Curve type +TP_LOCALLAB_QUAL_METHOD;Global quality +TP_LOCALLAB_RADIUS;Radius +TP_LOCALLAB_RADIUS_TOOLTIP;Above Radius 30 Use Fast Fourier Transform +TP_LOCALLAB_RADMASKCOL;Smooth radius +TP_LOCALLAB_RECT;Rectangle +TP_LOCALLAB_RECURS;Recursive references +TP_LOCALLAB_RECURS_TOOLTIP;Recalculate references for hue, luma, chroma after each module and after each RT-spot.\nAlso useful for working with masks. +TP_LOCALLAB_REFLABEL;Ref. (0..1) Chroma=%1 Luma=%2 Hue=%3 +TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +TP_LOCALLAB_RESETSHOW;Reset All Show Modifications +TP_LOCALLAB_RESID;Residual Image +TP_LOCALLAB_RESIDBLUR;Blur Residual Image +TP_LOCALLAB_RESIDCHRO;Residual image Chroma +TP_LOCALLAB_RESIDCOMP;Compress residual image +TP_LOCALLAB_RESIDCONT;Residual image Contrast +TP_LOCALLAB_RESIDHI;Highlights +TP_LOCALLAB_RESIDHITHR;Highlights threshold +TP_LOCALLAB_RESIDSHA;Shadows +TP_LOCALLAB_RESIDSHATHR;Shadows threshold +TP_LOCALLAB_RETI;Dehaze - Retinex +TP_LOCALLAB_RETIFRA;Retinex +TP_LOCALLAB_RETIM;Original Retinex +TP_LOCALLAB_RETITOOLFRA;Retinex Tools +TP_LOCALLAB_RETI_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated\nThe treatment time depends on the value of scale (be carefull to high values).\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\nOptimization not used in Preview +TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Have no effect when the value "Lightness = 1" or "Darkness =2" is chosen.\nIn other cases, the last step of "Multiple scale Retinex" is applied an algorithm close to "local contrast", these 2 cursors, associated with "Strength" will allow to play upstream on the local contrast. +TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Play on internal parameters to optimize response.\nLook at the "restored datas" indicators "near" min=0 and max=32768 (log mode), but others values are possible. +TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm allows differenciation for haze or normal.\nLogarithm brings more contrast but will generate more halo. +TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;Adapt these values according to images - if misty images and depending on whether you want to act on the front or the background +TP_LOCALLAB_RETI_SCALE_TOOLTIP;If scale=1, retinex behaves like local contrast with many more possibilities.\nThe greater the scale, the more intense the recursive action, the longer the calculation times +TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex - 9 +TP_LOCALLAB_REWEI;Reweighting iterates +TP_LOCALLAB_RGB;RGB Tone Curve +TP_LOCALLAB_ROW_NVIS;Not visible +TP_LOCALLAB_ROW_VIS;Visible +TP_LOCALLAB_SATUR;Saturation +TP_LOCALLAB_SAVREST;Save - Restore Current Image +TP_LOCALLAB_SCALEGR;Scale +TP_LOCALLAB_SCALERETI;Scale +TP_LOCALLAB_SCALTM;Scale +TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +//TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if Mask DeltaE Image is enabled.\nLow values avoid retouching selected area +TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if DeltaE Image Mask is enabled.\nLow values avoid retouching selected area +TP_LOCALLAB_SENSI;Scope +TP_LOCALLAB_SENSIBN;Scope +TP_LOCALLAB_SENSICB;Scope +TP_LOCALLAB_SENSIDEN;Scope +TP_LOCALLAB_SENSIEXCLU;Scope +TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust color to include in exclusion! +TP_LOCALLAB_SENSIH;Scope +TP_LOCALLAB_SENSIH_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors. +TP_LOCALLAB_SENSILOG;Scope +TP_LOCALLAB_SENSIS;Scope +TP_LOCALLAB_SENSIS_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm. +TP_LOCALLAB_SENSI_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm. +TP_LOCALLAB_SENSIMASK_TOOLTIP;Adjust scope of action for this common mask tool.\nActs on the gap between the original image and the mask.\nThe references (luma, chroma, hue) are those of the center of the RT-spot\n\nYou can also act on deltaE internal to the mask with 'Scope Mask deltaE image' in 'Settings' +TP_LOCALLAB_SETTINGS;Settings +TP_LOCALLAB_SH1;Shadows Highlights +TP_LOCALLAB_SH2;Equalizer +TP_LOCALLAB_SHADEX;Shadows +TP_LOCALLAB_SHADEXCOMP;Shadows compression & tonal width +TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone equalizer +TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows & highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +//Can be used instead - or in complement - of exposure module in difficult cases.\nThe use of Denoise may be necessary : lightening the shadows.\n\nCan be used as graduated filter (increase Scope) +TP_LOCALLAB_SHAMASKCOL;Shadows +TP_LOCALLAB_SHAPETYPE;RT-spot shape +TP_LOCALLAB_SHAPE_TOOLTIP;Elipse is normal mode.\nRectangle can be used in some cases, for example to work in full image in conjonction with delimiters outside preview, transition = 100.\n\nPolygone - Beziers are waiting for GUI... +TP_LOCALLAB_SHARAMOUNT;Amount +TP_LOCALLAB_SHARBLUR;Blur radius +TP_LOCALLAB_SHARDAMPING;Damping +TP_LOCALLAB_SHARFRAME;Modifications +TP_LOCALLAB_SHARITER;Iterations +TP_LOCALLAB_SHARP;Sharpening +TP_LOCALLAB_SHARP_TOOLNAME;Sharpening - 8 +TP_LOCALLAB_SHARRADIUS;Radius +TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7 +TP_LOCALLAB_SHOWC;Mask and modifications +TP_LOCALLAB_SHOWC1;Merge file +TP_LOCALLAB_SHOWCB;Mask and modifications +TP_LOCALLAB_SHOWDCT;Show process Fourier ƒ +TP_LOCALLAB_SHOWE;Mask and modifications +TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +TP_LOCALLAB_SHOWLC;Mask and modifications +TP_LOCALLAB_SHOWMASK;Show mask +TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Display mask modifications.\nBeware, you can only view one tool mask at the same time.\nShow modified image: Shows the modified image including any adjustments and masks\n\nNote: Use Mask is before algorihtm shape detection. +TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Show process Fourier:\nShows the different stages of the process.\nLaplace - builds the second derivative according to the threshold (first step).\nFourier -shows the transformed Laplacian with DCT.\nPoisson - show solution of Poisson DCE.\nNormalize - show result without normalization luminance. +TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +TP_LOCALLAB_SHOWMASKTYP2;Denoise +TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Mask and modifications can be chosen.\nBlur and noise : in this case it is not used for 'denoise'.\nDenoise : in this case it is not used for 'blur and noise'.\n\nBlur and noise + denoise : mask is shared, be carefull to 'show modifications' and 'scope' +TP_LOCALLAB_SHOWMNONE;Show modified image +TP_LOCALLAB_SHOWMODIF;Show modifications without mask +TP_LOCALLAB_SHOWMODIFMASK;Show modifications with mask +TP_LOCALLAB_SHOWNORMAL;Normalize luminance (no) +TP_LOCALLAB_SHOWPLUS;Mask and modifications - Blur/Grain & Denoise +TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +TP_LOCALLAB_SHOWR;Mask and modifications +TP_LOCALLAB_SHOWREF;Preview ΔE +TP_LOCALLAB_SHOWS;Mask and modifications +TP_LOCALLAB_SHOWSTRUC;Show spot structure (advanced) +TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(advanced) +TP_LOCALLAB_SHOWT;Mask and modifications +TP_LOCALLAB_SHOWVI;Mask and modifications +TP_LOCALLAB_SHRESFRA;Shadows/Highlights +TP_LOCALLAB_SHTRC_TOOLTIP;Modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones +TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer - 5 +TP_LOCALLAB_SIGMAWAV;Attenuation response +TP_LOCALLAB_SIM;Simple +TP_LOCALLAB_SLOMASKCOL;Slope +TP_LOCALLAB_SLOSH;Slope +TP_LOCALLAB_SOFT;Soft Light - Original Retinex +TP_LOCALLAB_SOFTM;Soft Light +//TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Original Retinex is very different from others Retinex method.\nIts acts on grey and balance luminance.\nIt is an emulation of "Dodge" and "Burn" +TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +TP_LOCALLAB_SOFTRETI_TOOLTIP;Take into account deltaE to improve Transmission map +TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 +TP_LOCALLAB_SOURCE_GRAY;Value +TP_LOCALLAB_SPECCASE;Specific cases +TP_LOCALLAB_SPECIAL;Special use of RGB curves +TP_LOCALLAB_SPECIAL_TOOLTIP;Only for this RGB curve, disabled (or reduce effects) of Scope, mask...for example, if you want to have a negative effect. +TP_LOCALLAB_SPOTNAME;New Spot +TP_LOCALLAB_STD;Standard +TP_LOCALLAB_STR;Strength +TP_LOCALLAB_STRBL;Strength +TP_LOCALLAB_STREN;Compression Strength +TP_LOCALLAB_STRENG;Strength +TP_LOCALLAB_STRENGR;Strength +TP_LOCALLAB_STRENGTH;Noise +TP_LOCALLAB_STRGRID;Strength +TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\nif Strength Retinex >= 0.1 Dehaze is in luminance mode. +TP_LOCALLAB_STRUC;Structure +TP_LOCALLAB_STRUCCOL;Structure +TP_LOCALLAB_STRUCCOL1;Spot structure +TP_LOCALLAB_STRUCT_TOOLTIP;Use Sobel algorithm to take into account structure in shape detection.\nyou can have a preview by activating "mask and modifications - Show structure spot".\n\nCan be used in conjunction with masks (advanced) structure, blur, wavelet to improve edge detection.\n\nNeeds maskless adjustments to be activated (lightness, exposure...) +TP_LOCALLAB_STRUMASKCOL;Structure mask strength +TP_LOCALLAB_STRUMASK_TOOLTIP;Generate a structure mask with difference between surface areas and reliefs.\nIf structure mask as tool is enabled, this mask is used in addition to the other tools (gamma, slope, contrast curve ...) +TP_LOCALLAB_STYPE;Shape method +TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +TP_LOCALLAB_SYM;Symmetrical (mouse) +TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +TP_LOCALLAB_TARGET_GRAY;Target gray point +TP_LOCALLAB_THRES;Threshold structure +TP_LOCALLAB_THRESDELTAE;ΔE-scope threshold +TP_LOCALLAB_THRESRETI;Threshold +TP_LOCALLAB_THRESWAV;Balance threshold +TP_LOCALLAB_TLABEL;TM Data Min=%1 Max=%2 Mean=%3 Sigma=%4 (Threshold) +TP_LOCALLAB_TLABEL2;TM Effective Tm=%1 TM=%2 +TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize +TP_LOCALLAB_TM;Tone Mapping - Texture +TP_LOCALLAB_TM_MASK;Use transmission map +TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This parameter affects sensitivity to edges.\n The greater it is the more likely an illumination change is to be considered an "edge".\n If set to zero tone mapping will have an effect similar to unsharp masking. +TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Gamma moves the action of tone-mapping to shadows or highlights. +TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main menu tool must be de-activated if this tool is used. +//Tone Mapping - main menu must be disabled +TP_LOCALLAB_TONEMASCALE_TOOLTIP;This control gives meaning to the difference between "local" and "global" contrast.\nThe greater it is the larger a detail needs to be in order to be boosted +TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 +TP_LOCALLAB_TOOLCOL;Structure mask as tool +TP_LOCALLAB_TOOLMASK;Mask Tools +TP_LOCALLAB_THREND;Local contrast threshold +TP_LOCALLAB_THRENDSIG;Local contrast threshold High levels +TP_LOCALLAB_THRENDLEV;Levels +TP_LOCALLAB_THRESLOW;Guided threshold 14 +TP_LOCALLAB_THRESHIGH;Guided threshold 57 +TP_LOCALLAB_TRANSIT;Transition Gradient +TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Changes the transition of the abscissa to that of the ordinate +TP_LOCALLAB_TRANSITVALUE;Transition value +TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +//TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay : change smoothness process - 1 linear - 2 parabolic - 3 cubic - ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelet, Color & Light) +TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light) +TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas, as a percentage of the "radius" +TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.\nYou can act on this curve to change Transmission and reduce the artifacts +TP_LOCALLAB_USEMASK;Use mask +TP_LOCALLAB_VART;Variance (contrast) +TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +TP_LOCALLAB_VIBRA_TOOLTIP;Adjust vibrance (essentially the same as the global adjustment).\nCarry out the equivalent of a white-balance adjustment using a CIECAM algorithm. +TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool - 3 +TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 +TP_LOCALLAB_BLUR_TOOLNAME;Smooth Blur/Grain & Denoise - 1 +TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 +TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex - 9 +TP_LOCALLAB_SHARP_TOOLNAME;Sharpening - 8 +TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelet - 7 +TP_LOCALLAB_CBDL_TOOLNAME;CBDL - 2 +TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 +TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask - 13 +TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +TP_LOCALLAB_WAMASKCOL;Ψ Mask Wavelet level +TP_LOCALLAB_WARM;Warm - Cool & Color artifacts +TP_LOCALLAB_WARM_TOOLTIP;This slider use Ciecam algorithm and acts as White Balance, it can warm or cool the area selected.\nIt can also in some cases reduce color artifacts. +TP_LOCALLAB_WASDEN_TOOLTIP;Denoise luminance for the 4 first levels (fine).\nThe right limit of the curve correspond to coarse : level 4 and beyond (6) +TP_LOCALLAB_WAV;Level local contrast +TP_LOCALLAB_WAVBLUR_TOOLTIP;Performs a blur for each level of decomposition, as well as the residual image. +TP_LOCALLAB_WAVCOMP;Compression by Level +TP_LOCALLAB_WAVCOMPRE;(un)Compression by Level +TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Achieve a Tone-mapping or reduction local contrast by level.\nOn abscissa levels +TP_LOCALLAB_WAVCOMP_TOOLTIP;Achive local contrast in function of the direction wavelet decomposition : horizontal, vertical, diagonal +TP_LOCALLAB_WAVCON;Contrast by Level +TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels : on abscissa levels. +TP_LOCALLAB_WAVDEN;Luminance denoise by level (1 2 3 4 .. 6) +TP_LOCALLAB_WAVE;Ψ Wavelet +TP_LOCALLAB_WAVEDG;Local contrast +TP_LOCALLAB_WAVEEDG_TOOLTIP;Achieves a sharpness taking into account the notion of edges wavelet.\nRequires that at least the first 4 levels are usable +TP_LOCALLAB_WAVGRAD_TOOLTIP;Graduated filter for Local contrast "luminance" +TP_LOCALLAB_WAVHIGH;Ψ Wavelet high +TP_LOCALLAB_WAVLEV;Blur by Level +TP_LOCALLAB_WAVLOW;Ψ Wavelet low +TP_LOCALLAB_WAVMASK;Ψ Local contrast (by wavelet level) +TP_LOCALLAB_WAVMASK_TOOLTIP;Allows fine work on mask levels contrasts (structure) +TP_LOCALLAB_WAVMED;Ψ Wavelet normal +TP_LOCALLAB_WEDIANHI;Median Hi +TP_LOCALLAB_WHITE_EV;White Ev +TP_LOCAL_HEIGHT;Bottom +TP_LOCAL_HEIGHT_T;Top +TP_LOCAL_WIDTH;Right +TP_LOCAL_WIDTH_L;Left +TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\n +TP_METADATA_EDIT;Apply modifications +TP_METADATA_MODE;Metadata copy mode +TP_METADATA_STRIP;Strip all metadata +TP_METADATA_TUNNEL;Copy unchanged +TP_NEUTRAL;Reset +TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. +TP_PCVIGNETTE_FEATHER;Feather +TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. +TP_PCVIGNETTE_LABEL;Vignette Filter +TP_PCVIGNETTE_ROUNDNESS;Roundness +TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. +TP_PCVIGNETTE_STRENGTH;Strength +TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). +TP_PDSHARPENING_LABEL;Capture Sharpening +TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +TP_PERSPECTIVE_CAMERA_FRAME;Correction +TP_PERSPECTIVE_CAMERA_PITCH;Vertical +TP_PERSPECTIVE_CAMERA_ROLL;Rotation +TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +TP_PERSPECTIVE_CAMERA_YAW;Horizontal +TP_PERSPECTIVE_HORIZONTAL;Horizontal +TP_PERSPECTIVE_LABEL;Perspective +TP_PERSPECTIVE_METHOD;Method +TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +TP_PERSPECTIVE_METHOD_SIMPLE;Simple +TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +TP_PERSPECTIVE_RECOVERY_FRAME;Recovery +TP_PERSPECTIVE_VERTICAL;Vertical +TP_PFCURVE_CURVEEDITOR_CH;Hue +TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. +TP_PREPROCESS_DEADPIXFILT;Dead pixel filter +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. +TP_PREPROCESS_GREENEQUIL;Green equilibration +TP_PREPROCESS_HOTPIXFILT;Hot pixel filter +TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. +TP_PREPROCESS_LABEL;Preprocessing +TP_PREPROCESS_LINEDENOISE;Line noise filter +TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +TP_PREPROCESS_NO_FOUND;None found +TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +TP_PREPROCWB_LABEL;Preprocess White Balance +TP_PREPROCWB_MODE;Mode +TP_PREPROCWB_MODE_AUTO;Auto +TP_PREPROCWB_MODE_CAMERA;Camera +TP_PRSHARPENING_LABEL;Post-Resize Sharpening +TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. +TP_RAWCACORR_AUTO;Auto-correction +TP_RAWCACORR_AUTOIT;Iterations +TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift +TP_RAWCACORR_CABLUE;Blue +TP_RAWCACORR_CARED;Red +TP_RAWCACORR_LABEL;Chromatic Aberration Correction +TP_RAWEXPOS_BLACK_0;Green 1 (lead) +TP_RAWEXPOS_BLACK_1;Red +TP_RAWEXPOS_BLACK_2;Blue +TP_RAWEXPOS_BLACK_3;Green 2 +TP_RAWEXPOS_BLACK_BLUE;Blue +TP_RAWEXPOS_BLACK_GREEN;Green +TP_RAWEXPOS_BLACK_RED;Red +TP_RAWEXPOS_LINEAR;White-point correction +TP_RAWEXPOS_RGB;Red, Green, Blue +TP_RAWEXPOS_TWOGREEN;Link greens +TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +TP_RAW_2PASS;1-pass+fast +TP_RAW_3PASSBEST;3-pass (Markesteijn) +TP_RAW_4PASS;3-pass+fast +TP_RAW_AHD;AHD +TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear +TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;Border +TP_RAW_DCB;DCB +TP_RAW_DCBENHANCE;DCB enhancement +TP_RAW_DCBITERATIONS;Number of DCB iterations +TP_RAW_DCBBILINEAR;DCB+Bilinear +TP_RAW_DCBVNG4;DCB+VNG4 +TP_RAW_DMETHOD;Method +TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... +TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... +TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold +TP_RAW_EAHD;EAHD +TP_RAW_FALSECOLOR;False color suppression steps +TP_RAW_FAST;Fast +TP_RAW_HD;Threshold +TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear. +TP_RAW_HPHD;HPHD +TP_RAW_IGV;IGV +TP_RAW_IMAGENUM;Sub-image +TP_RAW_IMAGENUM_SN;SN mode +TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +TP_RAW_LABEL;Demosaicing +TP_RAW_LMMSE;LMMSE +TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps +TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (steps 5-6) to reduce artifacts and improve the signal-to-noise ratio. +TP_RAW_MONO;Mono +TP_RAW_NONE;None (Shows sensor pattern) +TP_RAW_PIXELSHIFT;Pixel Shift +TP_RAW_PIXELSHIFTBLUR;Blur motion mask +TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +TP_RAW_PIXELSHIFTEPERISO;Sensitivity +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. +TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equalize per channel +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Enabled: Equalize the RGB channels individually.\nDisabled: Use same equalization factor for all channels. +TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. +TP_RAW_PIXELSHIFTGREEN;Check green channel for motion +TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask +TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts +TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. +TP_RAW_PIXELSHIFTMM_AUTO;Automatic +TP_RAW_PIXELSHIFTMM_CUSTOM;Custom +TP_RAW_PIXELSHIFTMM_OFF;Off +TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction +TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion +TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. +TP_RAW_PIXELSHIFTSIGMA;Blur radius +TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. +TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions +TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. +TP_RAW_RCD;RCD +TP_RAW_RCDBILINEAR;RCD+Bilinear +TP_RAW_RCDVNG4;RCD+VNG4 +TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix +TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.\n+fast gives less artifacts in flat areas +TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix +TP_RAW_VNG4;VNG4 +TP_RAW_XTRANS;X-Trans +TP_RAW_XTRANSFAST;Fast X-Trans +TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling +TP_RESIZE_APPLIESTO;Applies to: +TP_RESIZE_CROPPEDAREA;Cropped Area +TP_RESIZE_FITBOX;Bounding Box +TP_RESIZE_FULLIMAGE;Full Image +TP_RESIZE_H;Height: +TP_RESIZE_HEIGHT;Height +TP_RESIZE_LABEL;Resize +TP_RESIZE_LANCZOS;Lanczos +TP_RESIZE_METHOD;Method: +TP_RESIZE_NEAREST;Nearest +TP_RESIZE_SCALE;Scale +TP_RESIZE_SPECIFY;Specify: +TP_RESIZE_W;Width: +TP_RESIZE_WIDTH;Width +TP_RETINEX_CONTEDIT_HSL;HSL histogram +TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +TP_RETINEX_CONTEDIT_LH;Hue +TP_RETINEX_CONTEDIT_MAP;Equalizer +TP_RETINEX_CURVEEDITOR_CD;L=f(L) +TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts. +TP_RETINEX_CURVEEDITOR_LH;Strength=f(H) +TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. +TP_RETINEX_CURVEEDITOR_MAP;L=f(L) +TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +TP_RETINEX_EQUAL;Equalizer +TP_RETINEX_FREEGAMMA;Free gamma +TP_RETINEX_GAIN;Gain +TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +TP_RETINEX_GAINTRANSMISSION;Gain transmission +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +TP_RETINEX_GAMMA;Gamma +TP_RETINEX_GAMMA_FREE;Free +TP_RETINEX_GAMMA_HIGH;High +TP_RETINEX_GAMMA_LOW;Low +TP_RETINEX_GAMMA_MID;Middle +TP_RETINEX_GAMMA_NONE;None +TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.). +TP_RETINEX_GRAD;Transmission gradient +TP_RETINEX_GRADS;Strength gradient +TP_RETINEX_GRADS_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Strength is reduced when iterations increase, and conversely. +TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Variance and Threshold are reduced when iterations increase, and conversely. +TP_RETINEX_HIGH;High +TP_RETINEX_HIGHLIG;Highlight +TP_RETINEX_HIGHLIGHT;Highlight threshold +TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool. +TP_RETINEX_HSLSPACE_LIN;HSL-Linear +TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic +TP_RETINEX_ITER;Iterations (Tone-mapping) +TP_RETINEX_ITERF;Tone mapping +TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. +TP_RETINEX_LABEL;Retinex +TP_RETINEX_LABEL_MASK;Mask +TP_RETINEX_LABSPACE;L*a*b* +TP_RETINEX_LOW;Low +TP_RETINEX_MAP;Method +TP_RETINEX_MAP_GAUS;Gaussian mask +TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) +TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) +TP_RETINEX_MAP_METHOD_TOOLTIP;Use the mask generated by the Gaussian function above (Radius, Method) to reduce halos and artifacts.\n\nCurve only: apply a diagonal contrast curve on the mask.\nBeware of artifacts!\n\nGaussian mask: generate and use a Gaussian blur of the original mask.\nQuick.\n\nSharp mask: generate and use a wavelet on the original mask.\nSlow. +TP_RETINEX_MAP_NONE;None +TP_RETINEX_MEDIAN;Transmission median filter +TP_RETINEX_METHOD;Method +TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\nHighlights = Remove magenta in highlights. +TP_RETINEX_MLABEL;Restored data Min=%1 Max=%2 +TP_RETINEX_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible\nRestored image with no mixture. +TP_RETINEX_NEIGHBOR;Radius +TP_RETINEX_NEUTRAL;Reset +TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. +TP_RETINEX_OFFSET;Offset (brightness) +TP_RETINEX_SCALES;Gaussian gradient +TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. +TP_RETINEX_SETTINGS;Settings +TP_RETINEX_SKAL;Scale +TP_RETINEX_SLOPE;Free gamma slope +TP_RETINEX_STRENGTH;Strength +TP_RETINEX_THRESHOLD;Threshold +TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss. +TP_RETINEX_TLABEL;TM Data Min=%1 Max=%2 Mean=%3 Sigma=%4 +TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 +TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map. +TP_RETINEX_TRANF;Transmission +TP_RETINEX_TRANSMISSION;Transmission map +TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. +TP_RETINEX_UNIFORM;Uniform +TP_RETINEX_VARIANCE;Contrast +TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts. +TP_RETINEX_VIEW;Process +TP_RETINEX_VIEW_MASK;Mask +TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Normal display.\nMask - Displays the mask.\nUnsharp mask - Displays the image with a high radius unsharp mask.\nTransmission - Auto/Fixed - Displays the file transmission-map, before any action on contrast and brightness.\n\nAttention: the mask does not correspond to reality, but is amplified to make it more visible. +TP_RETINEX_VIEW_NONE;Standard +TP_RETINEX_VIEW_TRAN;Transmission - Auto +TP_RETINEX_VIEW_TRAN2;Transmission - Fixed +TP_RETINEX_VIEW_UNSHARP;Unsharp mask +TP_RGBCURVES_BLUE;B +TP_RGBCURVES_CHANNEL;Channel +TP_RGBCURVES_GREEN;G +TP_RGBCURVES_LABEL;RGB Curves +TP_RGBCURVES_LUMAMODE;Luminosity mode +TP_RGBCURVES_LUMAMODE_TOOLTIP;Luminosity mode allows to vary the contribution of R, G and B channels to the luminosity of the image, without altering image color. +TP_RGBCURVES_RED;R +TP_ROTATE_DEGREE;Degree +TP_ROTATE_LABEL;Rotate +TP_ROTATE_SELECTLINE;Select Straight Line +TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter +TP_SHADOWSHLIGHTS_HIGHLIGHTS;Highlights +TP_SHADOWSHLIGHTS_HLTONALW;Highlights tonal width +TP_SHADOWSHLIGHTS_LABEL;Shadows/Highlights +TP_SHADOWSHLIGHTS_RADIUS;Radius +TP_SHADOWSHLIGHTS_SHADOWS;Shadows +TP_SHADOWSHLIGHTS_SHTONALW;Shadows tonal width +TP_SHARPENEDGE_AMOUNT;Quantity +TP_SHARPENEDGE_LABEL;Edges +TP_SHARPENEDGE_PASSES;Iterations +TP_SHARPENEDGE_THREE;Luminance only +TP_SHARPENING_AMOUNT;Amount +TP_SHARPENING_BLUR;Blur radius +TP_SHARPENING_CONTRAST;Contrast threshold +TP_SHARPENING_EDRADIUS;Radius +TP_SHARPENING_EDTOLERANCE;Edge tolerance +TP_SHARPENING_HALOCONTROL;Halo control +TP_SHARPENING_HCAMOUNT;Amount +TP_SHARPENING_ITERCHECK;Auto limit iterations +TP_SHARPENING_LABEL;Sharpening +TP_SHARPENING_METHOD;Method +TP_SHARPENING_ONLYEDGES;Sharpen only edges +TP_SHARPENING_RADIUS;Radius +TP_SHARPENING_RADIUS_BOOST;Corner radius boost +TP_SHARPENING_RLD;RL Deconvolution +TP_SHARPENING_RLD_AMOUNT;Amount +TP_SHARPENING_RLD_DAMPING;Damping +TP_SHARPENING_RLD_ITERATIONS;Iterations +TP_SHARPENING_THRESHOLD;Threshold +TP_SHARPENING_USM;Unsharp Mask +TP_SHARPENMICRO_AMOUNT;Quantity +TP_SHARPENMICRO_CONTRAST;Contrast threshold +TP_SHARPENMICRO_LABEL;Microcontrast +TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 +TP_SHARPENMICRO_UNIFORMITY;Uniformity +TP_SOFTLIGHT_LABEL;Soft Light +TP_SOFTLIGHT_STRENGTH;Strength +TP_TM_FATTAL_AMOUNT;Amount +TP_TM_FATTAL_ANCHOR;Anchor +TP_TM_FATTAL_LABEL;Dynamic Range Compression +TP_TM_FATTAL_THRESHOLD;Detail +TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift +TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH +TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Red +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Red/Yellow +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Yellow +TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H) +TP_VIBRANCE_LABEL;Vibrance +TP_VIBRANCE_PASTELS;Pastel tones +TP_VIBRANCE_PASTSATTOG;Link pastel and saturated tones +TP_VIBRANCE_PROTECTSKINS;Protect skin-tones +TP_VIBRANCE_PSTHRESHOLD;Pastel/saturated tones threshold +TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Saturation threshold +TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;The vertical axis represents pastel tones at the bottom and saturated tones at the top.\nThe horizontal axis represents the saturation range. +TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Pastel/saturated transition's weighting +TP_VIBRANCE_SATURATED;Saturated Tones +TP_VIGNETTING_AMOUNT;Amount +TP_VIGNETTING_CENTER;Center +TP_VIGNETTING_CENTER_X;Center X +TP_VIGNETTING_CENTER_Y;Center Y +TP_VIGNETTING_LABEL;Vignetting Correction +TP_VIGNETTING_RADIUS;Radius +TP_VIGNETTING_STRENGTH;Strength +TP_WAVELET_1;Level 1 +TP_WAVELET_2;Level 2 +TP_WAVELET_3;Level 3 +TP_WAVELET_4;Level 4 +TP_WAVELET_5;Level 5 +TP_WAVELET_6;Level 6 +TP_WAVELET_7;Level 7 +TP_WAVELET_8;Level 8 +TP_WAVELET_9;Level 9 +TP_WAVELET_APPLYTO;Apply to +TP_WAVELET_AVOID;Avoid color shift +TP_WAVELET_B0;Black +TP_WAVELET_B1;Gray +TP_WAVELET_B2;Residual +TP_WAVELET_BACKGROUND;Background +TP_WAVELET_BACUR;Curve +TP_WAVELET_BALANCE;Contrast balance d/v-h +TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified. +TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the vertical, horizontal and diagonal wavelet directions: .\nActivating contrast, chroma or residual tone mapping amplifies the effect due to balance +TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. +TP_WAVELET_BALCHROM;Denoise equalizer Blue-Yellow Red-Green +TP_WAVELET_BALLUM;Denoise equalizer White-Black +TP_WAVELET_BANONE;None +TP_WAVELET_BASLI;Slider +TP_WAVELET_BATYPE;Contrast balance method +TP_WAVELET_BL;Blur levels +TP_WAVELET_BLCURVE;Blur by levels +TP_WAVELET_BLURFRAME;Blur +TP_WAVELET_BLUWAV;Attenuation response +TP_WAVELET_CBENAB;Toning and Color balance +TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance +TP_WAVELET_CCURVE;Local contrast +TP_WAVELET_CH1;Whole chroma range +TP_WAVELET_CH2;Saturated/pastel +TP_WAVELET_CH3;Link contrast levels +TP_WAVELET_CHCU;Curve +TP_WAVELET_CHR;Chroma-contrast link strength +TP_WAVELET_CHRO;Saturated/pastel threshold +TP_WAVELET_CHROFRAME;Denoise chrominance +TP_WAVELET_CHROMAFRAME;Chroma +TP_WAVELET_CHROMCO;Coarse chroma +TP_WAVELET_CHROMFI;Fine Chroma +TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored. +TP_WAVELET_CHRWAV;Blur chroma +TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" +TP_WAVELET_CHSL;Sliders +TP_WAVELET_CHTYPE;Chrominance method +TP_WAVELET_CLA;Clarity +TP_WAVELET_CLARI;Sharp-mask and Clarity +TP_WAVELET_COLORT;Opacity red-green +TP_WAVELET_COMPCONT;Contrast +TP_WAVELET_COMPGAMMA;Compression gamma +TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram. +TP_WAVELET_COMPLEXLAB;Complexity +TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations +TP_WAVELET_COMPNORMAL;Standard +TP_WAVELET_COMPEXPERT;Advanced +TP_WAVELET_COMPTM;Tone mapping +TP_WAVELET_CONTEDIT;'After' contrast curve +TP_WAVELET_CONTFRAME;Contrast - Compression +TP_WAVELET_CONTR;Gamut +TP_WAVELET_CONTRA;Contrast +TP_WAVELET_CONTRASTEDIT;Finer - Coarser levels +TP_WAVELET_CONTRAST_MINUS;Contrast - +TP_WAVELET_CONTRAST_PLUS;Contrast + +TP_WAVELET_CONTRA_TOOLTIP;Changes the residual image contrast. +TP_WAVELET_CTYPE;Chrominance control +TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300% +TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000). +TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue) +TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero. +TP_WAVELET_CURVEEDITOR_CL;L +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. +TP_WAVELET_CURVEEDITOR_HH;HH +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. +TP_WAVELET_DALL;All directions +TP_WAVELET_DAUB;Edge performance +TP_WAVELET_DAUB2;D2 - low +TP_WAVELET_DAUB4;D4 - standard +TP_WAVELET_DAUB6;D6 - standard plus +TP_WAVELET_DAUB10;D10 - medium +TP_WAVELET_DAUB14;D14 - high +TP_WAVELET_DAUBLOCAL;Wavelet Edge performance +TP_WAVELET_DAUB_TOOLTIP;Changes Daubechies coefficients:\nD4 = Standard,\nD14 = Often best performance, 10% more time-intensive.\n\nAffects edge detection as well as the general quality of the first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. +TP_WAVELET_DENOISE;Guide curve based on Local contrast +TP_WAVELET_DENOISEGUID;Guided threshold based on hue +TP_WAVELET_DENOISEH;High levels Curve Local contrast +TP_WAVELET_DENOISEHUE;Denoise equalizer Hue +TP_WAVELET_DENCONTRAST;Local contrast Equalizer +TP_WAVELET_DENEQUAL;1 2 3 4 Equal +TP_WAVELET_DEN14PLUS;1 4 High +TP_WAVELET_DEN14LOW;1 4 Low +TP_WAVELET_DEN12PLUS;1 2 High +TP_WAVELET_DEN12LOW;1 2 Low +TP_WAVELET_DEN5THR;Guided threshold +//TP_WAVELET_DENH;Low levels (1234)- Finest details +//TP_WAVELET_DENLH;Guided threshold by detail levels 1-4 +//TP_WAVELET_DENL;High levels - Coarsest details +TP_WAVELET_DENH;Threshold +TP_WAVELET_DENLH;Guided threshold by detail levels 1-4 +TP_WAVELET_DENL;Correction structure +TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained +TP_WAVELET_DENMIX_TOOLTIP;Balances the action of the guide taking into account the original image and the denoised image +TP_WAVELET_DENQUA;Mode +TP_WAVELET_DENSLILAB;Method +TP_WAVELET_DENSLI;Slider +TP_WAVELET_DENCURV;Curve +TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide +TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color +TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter +TP_WAVELET_DETEND;Details +TP_WAVELET_DIRFRAME;Directional contrast +TP_WAVELET_DONE;Vertical +TP_WAVELET_DTHR;Diagonal +TP_WAVELET_DTWO;Horizontal +TP_WAVELET_EDCU;Curve +TP_WAVELET_EDEFFECT;Attenuation response +TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment +TP_WAVELET_EDGCONT;Local contrast +TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+std. dev. and maxima. +TP_WAVELET_EDGE;Edge Sharpness +TP_WAVELET_EDGEAMPLI;Base amplification +TP_WAVELET_EDGEDETECT;Gradient sensitivity +TP_WAVELET_EDGEDETECTTHR;Threshold low (noise) +TP_WAVELET_EDGEDETECTTHR2;Edge enhancement +TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge +TP_WAVELET_EDGEDETECT_TOOLTIP;Moving the slider to the right increases edge sensitivity. This affects local contrast, edge settings and noise. +TP_WAVELET_EDGESENSI;Edge sensitivity +TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. +TP_WAVELET_EDGTHRESH;Detail +TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +TP_WAVELET_EDRAD;Radius +TP_WAVELET_EDRAD_TOOLTIP;This adjustment controls the local enhancement. A value of zero still has an effect +TP_WAVELET_EDSL;Threshold sliders +TP_WAVELET_EDTYPE;Local contrast method +TP_WAVELET_EDVAL;Strength +TP_WAVELET_FINAL;Final Touchup +TP_WAVELET_FINCFRAME;Final local contrast +TP_WAVELET_FINCOAR_TOOLTIP;The left (positive) part of the curve acts on the finer levels (increase).\nThe 2 points on the abscissa represent the respective action limits of finer and coarser levels 5 and 6 (default).\nThe right (negative) part of the curve acts on the coarser levels (increase).\nAvoid moving the left part of the curve with negative values. Avoid moving the right part of the curve with positives values +TP_WAVELET_FINEST;Finest +TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter +TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +TP_WAVELET_HIGHLIGHT;Finer levels luminance range +TP_WAVELET_HS1;Whole luminance range +TP_WAVELET_HS2;Selective luminance range +TP_WAVELET_HUESKIN;Skin hue +TP_WAVELET_HUESKIN_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. +TP_WAVELET_HUESKY;Hue range +TP_WAVELET_HUESKY_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. +TP_WAVELET_ITER;Delta balance levels +TP_WAVELET_ITER_TOOLTIP;Left: increase low levels and reduce high levels,\nRight: reduce low levels and increase high levels. +TP_WAVELET_LABEL;Wavelet Levels +TP_WAVELET_LARGEST;Coarsest +TP_WAVELET_LEVCH;Chroma +TP_WAVELET_LEVDEN;Level 5-6 denoise +TP_WAVELET_LEVDIR_ALL;All levels, in all directions +TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level +TP_WAVELET_LEVDIR_ONE;One level +TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level +TP_WAVELET_LEVELS;Wavelet levels +TP_WAVELET_LEVELLOW;Radius 1-4 +TP_WAVELET_LEVELHIGH;Radius 5-6 +TP_WAVELET_LEVELSIGM;Radius +TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. +TP_WAVELET_LEVF;Contrast +TP_WAVELET_LEVLABEL;Preview maximum possible levels = %1 +TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold +TP_WAVELET_LEVONE;Level 2 +TP_WAVELET_LEVTHRE;Level 4 +TP_WAVELET_LEVTWO;Level 3 +TP_WAVELET_LEVZERO;Level 1 +TP_WAVELET_LIMDEN;Interaction levels 56 on levels 14 +TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength +TP_WAVELET_LIPST;Enhanced algoritm +TP_WAVELET_LOWLIGHT;Coarser levels luminance range +TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise +TP_WAVELET_MEDGREINF;First level +TP_WAVELET_MEDI;Reduce artifacts in blue sky +TP_WAVELET_MEDILEV;Edge detection +TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine. +TP_WAVELET_MERGEC;Merge chroma +TP_WAVELET_MERGEL;Merge luma +TP_WAVELET_NEUTRAL;Neutral +TP_WAVELET_MIXCONTRAST;Reference local contrast +TP_WAVELET_MIXDENOISE;Denoise +TP_WAVELET_MIXNOISE;Noise +TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +TP_WAVELET_NOIS;Denoise +TP_WAVELET_NOISE;Denoise and Refine +TP_WAVELET_NOISE_TOOLTIP;If level 4 luminance denoise superior to 50, mode Agressive is used.\nIf chrominance coarse superior to 20, mode Agressive is used. +TP_WAVELET_NPHIGH;High +TP_WAVELET_NPLOW;Low +TP_WAVELET_NPNONE;None +TP_WAVELET_NPTYPE;Neighboring pixels +TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced. +TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +TP_WAVELET_OLDSH;Algorithm using negatives values +TP_WAVELET_OPACITY;Opacity blue-yellow +TP_WAVELET_OPACITYW;Contrast balance d/v-h curve +TP_WAVELET_OPACITYWL;Local contrast +TP_WAVELET_OPACITYWL_TOOLTIP;Modify the final local contrast at the end of the wavelet treatment.\n\nThe left side represents the smallest local contrast, progressing to the largest local contrast on the right. +TP_WAVELET_PASTEL;Pastel chroma +TP_WAVELET_PROC;Process +TP_WAVELET_PROTAB;Protection +TP_WAVELET_QUAAGRES;Agressive +TP_WAVELET_QUACONSER;Conservative +TP_WAVELET_RADIUS;Radius shadows - highlight +TP_WAVELET_RANGEAB;Range a and b % +TP_WAVELET_RE1;Reinforced +TP_WAVELET_RE2;Unchanged +TP_WAVELET_RE3;Reduced +TP_WAVELET_RESBLUR;Blur luminance +TP_WAVELET_RESBLURC;Blur chroma +TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500% +TP_WAVELET_RESCHRO;Strength +TP_WAVELET_RESCON;Shadows +TP_WAVELET_RESCONH;Highlights +TP_WAVELET_RESID;Residual Image +TP_WAVELET_SAT;Saturated chroma +TP_WAVELET_SETTINGS;Wavelet Settings +TP_WAVELET_SHA;Sharp mask +TP_WAVELET_SHFRAME;Shadows/Highlights +TP_WAVELET_SHOWMASK;Show wavelet 'mask' +TP_WAVELET_SIGMA;Attenuation response +TP_WAVELET_SIGM;Radius +TP_WAVELET_SIGMAFIN;Attenuation response +TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values +TP_WAVELET_SKIN;Skin targetting/protection +TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. +TP_WAVELET_SKY;Hue targetting/protection +TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. +TP_WAVELET_SOFTRAD;Soft radius +TP_WAVELET_STREN;Refine +TP_WAVELET_STREND;Strength +TP_WAVELET_STRENGTH;Strength +TP_WAVELET_SUPE;Extra +TP_WAVELET_THR;Shadows threshold +TP_WAVELET_THREND;Local contrast threshold +TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained +//TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped denoise curve based on local contrast.\nReduces noise in uniform areas and preserves image structure +TP_WAVELET_THRESHOLD;Finer levels +TP_WAVELET_THRESHOLD2;Coarser levels +TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of ‘wavelet levels’ will be affected by the Shadow luminance range. +TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. +TP_WAVELET_THRESWAV;Balance threshold +TP_WAVELET_THRH;Highlights threshold +TP_WAVELET_TILESBIG;Tiles +TP_WAVELET_TILESFULL;Full image +TP_WAVELET_TILESIZE;Tiling method +TP_WAVELET_TILESLIT;Little tiles +TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements. +TP_WAVELET_TMEDGS;Edge stopping +TP_WAVELET_TMSCALE;Scale +TP_WAVELET_TMSTRENGTH;Compression strength +TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. +TP_WAVELET_TMTYPE;Compression method +TP_WAVELET_TON;Toning +TP_WAVELET_TONFRAME;Excluded colors +TP_WAVELET_USH;None +TP_WAVELET_USHARP;Clarity method +TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment +TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +TP_WAVELET_WAVLOWTHR;Low contrast threshold +TP_WAVELET_WAVOFFSET;Offset +TP_WBALANCE_AUTO;Auto +TP_WBALANCE_AUTOITCGREEN;Temperature correlation +TP_WBALANCE_AUTOOLD;RGB grey +TP_WBALANCE_AUTO_HEADER;Automatic +TP_WBALANCE_CAMERA;Camera +TP_WBALANCE_CLOUDY;Cloudy +TP_WBALANCE_CUSTOM;Custom +TP_WBALANCE_DAYLIGHT;Daylight (sunny) +TP_WBALANCE_EQBLUERED;Blue/Red equalizer +TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behavior of "white balance" by modulating the blue/red balance.\nThis can be useful when shooting conditions:\na) are far from the standard illuminant (e.g. underwater),\nb) are far from conditions where calibrations were performed,\nc) where the matrices or ICC profiles are unsuitable. +TP_WBALANCE_FLASH55;Leica +TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus +TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta +TP_WBALANCE_FLASH_HEADER;Flash +TP_WBALANCE_FLUO1;F1 - Daylight +TP_WBALANCE_FLUO2;F2 - Cool White +TP_WBALANCE_FLUO3;F3 - White +TP_WBALANCE_FLUO4;F4 - Warm White +TP_WBALANCE_FLUO5;F5 - Daylight +TP_WBALANCE_FLUO6;F6 - Lite White +TP_WBALANCE_FLUO7;F7 - D65 Daylight Simulator +TP_WBALANCE_FLUO8;F8 - D50 / Sylvania F40 Design +TP_WBALANCE_FLUO9;F9 - Cool White Deluxe +TP_WBALANCE_FLUO10;F10 - Philips TL85 +TP_WBALANCE_FLUO11;F11 - Philips TL84 +TP_WBALANCE_FLUO12;F12 - Philips TL83 +TP_WBALANCE_FLUO_HEADER;Fluorescent +TP_WBALANCE_GREEN;Tint +TP_WBALANCE_GTI;GTI +TP_WBALANCE_HMI;HMI +TP_WBALANCE_JUDGEIII;JudgeIII +TP_WBALANCE_LABEL;White Balance +TP_WBALANCE_LAMP_HEADER;Lamp +TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 +TP_WBALANCE_LED_HEADER;LED +TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +TP_WBALANCE_METHOD;Method +TP_WBALANCE_PICKER;Pick +TP_WBALANCE_SHADE;Shade +TP_WBALANCE_SIZE;Size: +TP_WBALANCE_SOLUX35;Solux 3500K +TP_WBALANCE_SOLUX41;Solux 4100K +TP_WBALANCE_SOLUX47;Solux 4700K (vendor) +TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) +TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. +TP_WBALANCE_STUDLABEL;Correlation factor: %1 +TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. +TP_WBALANCE_TEMPBIAS;AWB temperature bias +TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". +TP_WBALANCE_TEMPERATURE;Temperature +TP_WBALANCE_TUNGSTEN;Tungsten +TP_WBALANCE_WATER1;UnderWater 1 +TP_WBALANCE_WATER2;UnderWater 2 +TP_WBALANCE_WATER_HEADER;UnderWater +ZOOMPANEL_100;(100%) +ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window +ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z +ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f +ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + +ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - + +#00 default translation file +#01 Developers should add translations to this file and then run the 'generateTranslationDiffs' Bash script to update other locales. +#02 Translators please append a comment here with the current date and your name(s) as used in the RawTherapee forum or GitHub page, e.g.: +#03 2525-12-24 Zager and Evans + +ABOUT_TAB_BUILD;Version +ABOUT_TAB_CREDITS;Credits +ABOUT_TAB_LICENSE;License +ABOUT_TAB_RELEASENOTES;Release Notes +ABOUT_TAB_SPLASH;Splash +ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. +BATCH_PROCESSING;Batch Processing +CURVEEDITOR_AXIS_IN;I: +CURVEEDITOR_AXIS_LEFT_TAN;LT: +CURVEEDITOR_AXIS_OUT;O: +CURVEEDITOR_AXIS_RIGHT_TAN;RT: +CURVEEDITOR_CATMULLROM;Flexible +CURVEEDITOR_CURVE;Curve +CURVEEDITOR_CURVES;Curves +CURVEEDITOR_CUSTOM;Standard +CURVEEDITOR_DARKS;Darks +CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node. +CURVEEDITOR_HIGHLIGHTS;Highlights +CURVEEDITOR_LIGHTS;Lights +CURVEEDITOR_LINEAR;Linear +CURVEEDITOR_LOADDLGLABEL;Load curve +CURVEEDITOR_MINMAXCPOINTS;Equalizer +CURVEEDITOR_NURBS;Control cage +CURVEEDITOR_PARAMETRIC;Parametric +CURVEEDITOR_SAVEDLGLABEL;Save curve... +CURVEEDITOR_SHADOWS;Shadows +CURVEEDITOR_TOOLTIPCOPY;Copy current curve to clipboard. +CURVEEDITOR_TOOLTIPLINEAR;Reset curve to linear. +CURVEEDITOR_TOOLTIPLOAD;Load a curve from file. +CURVEEDITOR_TOOLTIPPASTE;Paste curve from clipboard. +CURVEEDITOR_TOOLTIPSAVE;Save current curve. +CURVEEDITOR_TYPE;Type: +DIRBROWSER_FOLDERS;Folders +DONT_SHOW_AGAIN;Don't show this message again. +DYNPROFILEEDITOR_DELETE;Delete +DYNPROFILEEDITOR_EDIT;Edit +DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule +DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. +DYNPROFILEEDITOR_IMGTYPE_ANY;Any +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +DYNPROFILEEDITOR_IMGTYPE_STD;Standard +DYNPROFILEEDITOR_MOVE_DOWN;Move Down +DYNPROFILEEDITOR_MOVE_UP;Move Up +DYNPROFILEEDITOR_NEW;New +DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule +DYNPROFILEEDITOR_PROFILE;Processing Profile +EDITWINDOW_TITLE;Image Edit +EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. +EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. +EXIFFILTER_APERTURE;Aperture +EXIFFILTER_CAMERA;Camera +EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) +EXIFFILTER_FILETYPE;File type +EXIFFILTER_FOCALLEN;Focal length +EXIFFILTER_IMAGETYPE;Image type +EXIFFILTER_ISO;ISO +EXIFFILTER_LENS;Lens +EXIFFILTER_METADATAFILTER;Enable metadata filters +EXIFFILTER_SHUTTER;Shutter +EXIFPANEL_ADDEDIT;Add/Edit +EXIFPANEL_ADDEDITHINT;Add new tag or edit tag. +EXIFPANEL_ADDTAGDLG_ENTERVALUE;Enter value +EXIFPANEL_ADDTAGDLG_SELECTTAG;Select tag +EXIFPANEL_ADDTAGDLG_TITLE;Add/Edit Tag +EXIFPANEL_KEEP;Keep +EXIFPANEL_KEEPHINT;Keep the selected tags when writing output file. +EXIFPANEL_REMOVE;Remove +EXIFPANEL_REMOVEHINT;Remove the selected tags when writing output file. +EXIFPANEL_RESET;Reset +EXIFPANEL_RESETALL;Reset All +EXIFPANEL_RESETALLHINT;Reset all tags to their original values. +EXIFPANEL_RESETHINT;Reset the selected tags to their original values. +EXIFPANEL_SHOWALL;Show all +EXIFPANEL_SUBDIRECTORY;Subdirectory +EXPORT_BYPASS;Processing steps to bypass +EXPORT_BYPASS_ALL;Select / Unselect All +EXPORT_BYPASS_DEFRINGE;Bypass Defringe +EXPORT_BYPASS_DIRPYRDENOISE;Bypass Noise Reduction +EXPORT_BYPASS_DIRPYREQUALIZER;Bypass Contrast by Detail Levels +EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels +EXPORT_BYPASS_RAW_CA;Bypass [raw] Chromatic Aberration Correction +EXPORT_BYPASS_RAW_CCSTEPS;Bypass [raw] False Color Suppression +EXPORT_BYPASS_RAW_DCB_ENHANCE;Bypass [raw] DCB Enhancement Steps +EXPORT_BYPASS_RAW_DCB_ITERATIONS;Bypass [raw] DCB Iterations +EXPORT_BYPASS_RAW_DF;Bypass [raw] Dark-Frame +EXPORT_BYPASS_RAW_FF;Bypass [raw] Flat-Field +EXPORT_BYPASS_RAW_GREENTHRESH;Bypass [raw] Green Equilibration +EXPORT_BYPASS_RAW_LINENOISE;Bypass [raw] Line Noise Filter +EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Bypass [raw] LMMSE Enhancement Steps +EXPORT_BYPASS_SHARPENEDGE;Bypass Edge Sharpening +EXPORT_BYPASS_SHARPENING;Bypass Sharpening +EXPORT_BYPASS_SHARPENMICRO;Bypass Microcontrast +EXPORT_FASTEXPORTOPTIONS;Fast Export Options +EXPORT_INSTRUCTIONS;Fast Export options provide overrides to bypass time and resource consuming development settings and to run queue processing using the fast export settings instead. This method is recommended for quicker generation of lower resolution images when speed is a priority or when resized output is desired for one or many images without making modifications to their saved development parameters. +EXPORT_MAXHEIGHT;Maximum height: +EXPORT_MAXWIDTH;Maximum width: +EXPORT_PIPELINE;Processing pipeline +EXPORT_PUTTOQUEUEFAST; Put to queue for fast export +EXPORT_RAW_DMETHOD;Demosaic method +EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) +EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. +EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) +EXTPROGTARGET_1;raw +EXTPROGTARGET_2;queue-processed +FILEBROWSER_APPLYPROFILE;Apply +FILEBROWSER_APPLYPROFILE_PARTIAL;Apply - partial +FILEBROWSER_AUTODARKFRAME;Auto dark-frame +FILEBROWSER_AUTOFLATFIELD;Auto flat-field +FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory +FILEBROWSER_CACHE;Cache +FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles +FILEBROWSER_CLEARPROFILE;Clear +FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple +FILEBROWSER_COPYPROFILE;Copy +FILEBROWSER_CURRENT_NAME;Current name: +FILEBROWSER_DARKFRAME;Dark-frame +FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +FILEBROWSER_DELETEDIALOG_HEADER;File delete confirmation: +FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +FILEBROWSER_EMPTYTRASH;Empty trash +FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +FILEBROWSER_EXTPROGMENU;Open with +FILEBROWSER_FLATFIELD;Flat-Field +FILEBROWSER_MOVETODARKFDIR;Move to dark-frames directory +FILEBROWSER_MOVETOFLATFIELDDIR;Move to flat-fields directory +FILEBROWSER_NEW_NAME;New name: +FILEBROWSER_OPENDEFAULTVIEWER;Windows default viewer (queue-processed) +FILEBROWSER_PARTIALPASTEPROFILE;Paste - partial +FILEBROWSER_PASTEPROFILE;Paste +FILEBROWSER_POPUPCANCELJOB;Cancel job +FILEBROWSER_POPUPCOLORLABEL;Color label +FILEBROWSER_POPUPCOLORLABEL0;Label: None +FILEBROWSER_POPUPCOLORLABEL1;Label: Red +FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow +FILEBROWSER_POPUPCOLORLABEL3;Label: Green +FILEBROWSER_POPUPCOLORLABEL4;Label: Blue +FILEBROWSER_POPUPCOLORLABEL5;Label: Purple +FILEBROWSER_POPUPCOPYTO;Copy to... +FILEBROWSER_POPUPFILEOPERATIONS;File operations +FILEBROWSER_POPUPMOVEEND;Move to end of queue +FILEBROWSER_POPUPMOVEHEAD;Move to head of queue +FILEBROWSER_POPUPMOVETO;Move to... +FILEBROWSER_POPUPOPEN;Open +FILEBROWSER_POPUPOPENINEDITOR;Open in Editor +FILEBROWSER_POPUPPROCESS;Put to queue +FILEBROWSER_POPUPPROCESSFAST;Put to queue (Fast export) +FILEBROWSER_POPUPPROFILEOPERATIONS;Processing profile operations +FILEBROWSER_POPUPRANK;Rank +FILEBROWSER_POPUPRANK0;Unrank +FILEBROWSER_POPUPRANK1;Rank 1 * +FILEBROWSER_POPUPRANK2;Rank 2 ** +FILEBROWSER_POPUPRANK3;Rank 3 *** +FILEBROWSER_POPUPRANK4;Rank 4 **** +FILEBROWSER_POPUPRANK5;Rank 5 ***** +FILEBROWSER_POPUPREMOVE;Delete permanently +FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version +FILEBROWSER_POPUPRENAME;Rename +FILEBROWSER_POPUPSELECTALL;Select all +FILEBROWSER_POPUPTRASH;Move to trash +FILEBROWSER_POPUPUNRANK;Unrank +FILEBROWSER_POPUPUNTRASH;Remove from trash +FILEBROWSER_QUERYBUTTONHINT;Clear the Find query +FILEBROWSER_QUERYHINT;Type filenames to search for. Supports partial filenames. Separate the search terms using commas, e.g.\n1001,1004,1199\n\nExclude search terms by prefixing them with !=\ne.g.\n!=1001,1004,1199\n\nShortcuts:\nCtrl-f - focus the Find box,\nEnter - search,\nEsc - clear the Find box,\nShift-Esc - defocus the Find box. +FILEBROWSER_QUERYLABEL; Find: +FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nShortcut: Shift-1 +FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nShortcut: Shift-2 +FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nShortcut: Shift-3 +FILEBROWSER_RANK4_TOOLTIP;Rank 4 *\nShortcut: Shift-4 +FILEBROWSER_RANK5_TOOLTIP;Rank 5 *\nShortcut: Shift-5 +FILEBROWSER_RENAMEDLGLABEL;Rename file +FILEBROWSER_RESETDEFAULTPROFILE;Reset to default +FILEBROWSER_SELECTDARKFRAME;Select dark-frame... +FILEBROWSER_SELECTFLATFIELD;Select flat-field... +FILEBROWSER_SHOWCOLORLABEL1HINT;Show images labeled Red.\nShortcut: Alt-1 +FILEBROWSER_SHOWCOLORLABEL2HINT;Show images labeled Yellow.\nShortcut: Alt-2 +FILEBROWSER_SHOWCOLORLABEL3HINT;Show images labeled Green.\nShortcut: Alt-3 +FILEBROWSER_SHOWCOLORLABEL4HINT;Show images labeled Blue.\nShortcut: Alt-4 +FILEBROWSER_SHOWCOLORLABEL5HINT;Show images labeled Purple.\nShortcut: Alt-5 +FILEBROWSER_SHOWDIRHINT;Clear all filters.\nShortcut: d +FILEBROWSER_SHOWEDITEDHINT;Show edited images.\nShortcut: 7 +FILEBROWSER_SHOWEDITEDNOTHINT;Show not edited images.\nShortcut: 6 +FILEBROWSER_SHOWEXIFINFO;Show Exif info.\n\nShortcuts:\ni - Multiple Editor Tabs Mode,\nAlt-i - Single Editor Tab Mode. +FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. +FILEBROWSER_SHOWRANK1HINT;Show images ranked as 1-star.\nShortcut: 1 +FILEBROWSER_SHOWRANK2HINT;Show images ranked as 2-star.\nShortcut: 2 +FILEBROWSER_SHOWRANK3HINT;Show images ranked as 3-star.\nShortcut: 3 +FILEBROWSER_SHOWRANK4HINT;Show images ranked as 4-star.\nShortcut: 4 +FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5-star.\nShortcut: 5 +FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 +FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 +FILEBROWSER_SHOWTRASHHINT;Show contents of trash.\nShortcut: Ctrl-t +FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 +FILEBROWSER_SHOWUNRANKHINT;Show unranked images.\nShortcut: 0 +FILEBROWSER_THUMBSIZE;Thumbnail size +FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 +FILEBROWSER_ZOOMINHINT;Increase thumbnail size.\n\nShortcuts:\n+ - Multiple Editor Tabs Mode,\nAlt-+ - Single Editor Tab Mode. +FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size.\n\nShortcuts:\n- - Multiple Editor Tabs Mode,\nAlt-- - Single Editor Tab Mode. +FILECHOOSER_FILTER_ANY;All files +FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) +FILECHOOSER_FILTER_CURVE;Curve files +FILECHOOSER_FILTER_LCP;Lens correction profiles +FILECHOOSER_FILTER_PP;Processing profiles +FILECHOOSER_FILTER_SAME;Same format as current photo +FILECHOOSER_FILTER_TIFF;TIFF files +GENERAL_ABOUT;About +GENERAL_AFTER;After +GENERAL_APPLY;Apply +GENERAL_ASIMAGE;As Image +GENERAL_AUTO;Automatic +GENERAL_BEFORE;Before +GENERAL_CANCEL;Cancel +GENERAL_CLOSE;Close +GENERAL_CURRENT;Current +GENERAL_DISABLE;Disable +GENERAL_DISABLED;Disabled +GENERAL_ENABLE;Enable +GENERAL_ENABLED;Enabled +GENERAL_FILE;File +GENERAL_HELP;Help +GENERAL_LANDSCAPE;Landscape +GENERAL_NA;n/a +GENERAL_NO;No +GENERAL_NONE;None +GENERAL_OK;OK +GENERAL_OPEN;Open +GENERAL_PORTRAIT;Portrait +GENERAL_RESET;Reset +GENERAL_SAVE;Save +GENERAL_SAVE_AS;Save as... +GENERAL_SLIDER;Slider +GENERAL_UNCHANGED;(Unchanged) +GENERAL_WARNING;Warning +GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. +HISTOGRAM_TOOLTIP_B;Show/Hide blue histogram. +HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. +HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. +HISTOGRAM_TOOLTIP_G;Show/Hide green histogram. +HISTOGRAM_TOOLTIP_L;Show/Hide CIELab luminance histogram. +HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. +HISTOGRAM_TOOLTIP_R;Show/Hide red histogram. +HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. +HISTORY_CHANGED;Changed +HISTORY_CUSTOMCURVE;Custom curve +HISTORY_FROMCLIPBOARD;From clipboard +HISTORY_LABEL;History +HISTORY_MSG_1;Photo loaded +HISTORY_MSG_2;PP3 loaded +HISTORY_MSG_3;PP3 changed +HISTORY_MSG_4;History browsing +HISTORY_MSG_5;Exposure - Lightness +HISTORY_MSG_6;Exposure - Contrast +HISTORY_MSG_7;Exposure - Black +HISTORY_MSG_8;Exposure - Compensation +HISTORY_MSG_9;Exposure - Highlight compression +HISTORY_MSG_10;Exposure - Shadow compression +HISTORY_MSG_11;Exposure - Tone curve 1 +HISTORY_MSG_12;Exposure - Auto levels +HISTORY_MSG_13;Exposure - Clip +HISTORY_MSG_14;L*a*b* - Lightness +HISTORY_MSG_15;L*a*b* - Contrast +HISTORY_MSG_16;- +HISTORY_MSG_17;- +HISTORY_MSG_18;- +HISTORY_MSG_19;L*a*b* - L* curve +HISTORY_MSG_20;Sharpening +HISTORY_MSG_21;USM - Radius +HISTORY_MSG_22;USM - Amount +HISTORY_MSG_23;USM - Threshold +HISTORY_MSG_24;USM - Sharpen only edges +HISTORY_MSG_25;USM - Edge detection radius +HISTORY_MSG_26;USM - Edge tolerance +HISTORY_MSG_27;USM - Halo control +HISTORY_MSG_28;USM - Halo control amount +HISTORY_MSG_29;Sharpening - Method +HISTORY_MSG_30;RLD - Radius +HISTORY_MSG_31;RLD - Amount +HISTORY_MSG_32;RLD - Damping +HISTORY_MSG_33;RLD - Iterations +HISTORY_MSG_34;Lens Correction - Distortion +HISTORY_MSG_35;Lens Correction - Vignetting +HISTORY_MSG_36;Lens Correction - CA +HISTORY_MSG_37;Exposure - Auto levels +HISTORY_MSG_38;White Balance - Method +HISTORY_MSG_39;WB - Temperature +HISTORY_MSG_40;WB - Tint +HISTORY_MSG_41;Exposure - Tone curve 1 mode +HISTORY_MSG_42;Exposure - Tone curve 2 +HISTORY_MSG_43;Exposure - Tone curve 2 mode +HISTORY_MSG_44;Lum. denoising radius +HISTORY_MSG_45;Lum. denoising edge tolerance +HISTORY_MSG_46;Color denoising +HISTORY_MSG_47;Blend ICC highlights with matrix +HISTORY_MSG_48;DCP - Tone curve +HISTORY_MSG_49;DCP illuminant +HISTORY_MSG_50;Shadows/Highlights +HISTORY_MSG_51;S/H - Highlights +HISTORY_MSG_52;S/H - Shadows +HISTORY_MSG_53;S/H - Highlights tonal width +HISTORY_MSG_54;S/H - Shadows tonal width +HISTORY_MSG_55;S/H - Local contrast +HISTORY_MSG_56;S/H - Radius +HISTORY_MSG_57;Coarse rotation +HISTORY_MSG_58;Horizontal flipping +HISTORY_MSG_59;Vertical flipping +HISTORY_MSG_60;Rotation +HISTORY_MSG_61;Auto-fill +HISTORY_MSG_62;Distortion correction +HISTORY_MSG_63;Snapshot selected +HISTORY_MSG_64;Crop +HISTORY_MSG_65;CA correction +HISTORY_MSG_66;Exposure - Highlight reconstruction +HISTORY_MSG_67;Exposure - HLR amount +HISTORY_MSG_68;Exposure - HLR method +HISTORY_MSG_69;Working color space +HISTORY_MSG_70;Output color space +HISTORY_MSG_71;Input color space +HISTORY_MSG_72;VC - Amount +HISTORY_MSG_73;Channel Mixer +HISTORY_MSG_74;Resize - Scale +HISTORY_MSG_75;Resize - Method +HISTORY_MSG_76;Exif metadata +HISTORY_MSG_77;IPTC metadata +HISTORY_MSG_78;- +HISTORY_MSG_79;Resize - Width +HISTORY_MSG_80;Resize - Height +HISTORY_MSG_81;Resize +HISTORY_MSG_82;Profile changed +HISTORY_MSG_83;S/H - Sharp mask +HISTORY_MSG_84;Perspective correction +HISTORY_MSG_85;Lens Correction - LCP file +HISTORY_MSG_86;RGB Curves - Luminosity mode +HISTORY_MSG_87;Impulse Noise Reduction +HISTORY_MSG_88;Impulse NR threshold +HISTORY_MSG_89;Noise Reduction +HISTORY_MSG_90;NR - Luminance +HISTORY_MSG_91;NR - Chrominance master +HISTORY_MSG_92;NR - Gamma +HISTORY_MSG_93;CbDL - Value +HISTORY_MSG_94;Contrast by Detail Levels +HISTORY_MSG_95;L*a*b* - Chromaticity +HISTORY_MSG_96;L*a*b* - a* curve +HISTORY_MSG_97;L*a*b* - b* curve +HISTORY_MSG_98;Demosaicing method +HISTORY_MSG_99;Hot pixel filter +HISTORY_MSG_100;Exposure - Saturation +HISTORY_MSG_101;HSV - Hue +HISTORY_MSG_102;HSV - Saturation +HISTORY_MSG_103;HSV - Value +HISTORY_MSG_104;HSV Equalizer +HISTORY_MSG_105;Defringe +HISTORY_MSG_106;Defringe - Radius +HISTORY_MSG_107;Defringe - Threshold +HISTORY_MSG_108;Exposure - HLC threshold +HISTORY_MSG_109;Resize - Bounding box +HISTORY_MSG_110;Resize - Applies to +HISTORY_MSG_111;L*a*b* - Avoid color shift +HISTORY_MSG_112;--unused-- +HISTORY_MSG_113;L*a*b* - Red/skin prot. +HISTORY_MSG_114;DCB iterations +HISTORY_MSG_115;False color suppression +HISTORY_MSG_116;DCB enhancement +HISTORY_MSG_117;Raw CA correction - Red +HISTORY_MSG_118;Raw CA correction - Blue +HISTORY_MSG_119;Line noise filter +HISTORY_MSG_120;Green equilibration +HISTORY_MSG_121;Raw CA Correction - Auto +HISTORY_MSG_122;Dark-Frame - Auto-selection +HISTORY_MSG_123;Dark-Frame - File +HISTORY_MSG_124;White point correction +HISTORY_MSG_126;Flat-Field - File +HISTORY_MSG_127;Flat-Field - Auto-selection +HISTORY_MSG_128;Flat-Field - Blur radius +HISTORY_MSG_129;Flat-Field - Blur type +HISTORY_MSG_130;Auto distortion correction +HISTORY_MSG_131;NR - Luma +HISTORY_MSG_132;NR - Chroma +HISTORY_MSG_133;Output gamma +HISTORY_MSG_134;Free gamma +HISTORY_MSG_135;Free gamma +HISTORY_MSG_136;Free gamma slope +HISTORY_MSG_137;Black level - Green 1 +HISTORY_MSG_138;Black level - Red +HISTORY_MSG_139;Black level - Blue +HISTORY_MSG_140;Black level - Green 2 +HISTORY_MSG_141;Black level - Link greens +HISTORY_MSG_142;ES - Iterations +HISTORY_MSG_143;ES - Quantity +HISTORY_MSG_144;Microcontrast - Quantity +HISTORY_MSG_145;Microcontrast - Uniformity +HISTORY_MSG_146;Edge sharpening +HISTORY_MSG_147;ES - Luminance only +HISTORY_MSG_148;Microcontrast +HISTORY_MSG_149;Microcontrast - 3×3 matrix +HISTORY_MSG_150;Post-demosaic artifact/noise red. +HISTORY_MSG_151;Vibrance +HISTORY_MSG_152;Vib - Pastel tones +HISTORY_MSG_153;Vib - Saturated tones +HISTORY_MSG_154;Vib - Protect skin-tones +HISTORY_MSG_155;Vib - Avoid color shift +HISTORY_MSG_156;Vib - Link pastel/saturated +HISTORY_MSG_157;Vib - P/S threshold +HISTORY_MSG_158;TM - Strength +HISTORY_MSG_159;TM - Edge stopping +HISTORY_MSG_160;TM - Scale +HISTORY_MSG_161;TM - Reweighting iterates +HISTORY_MSG_162;Tone Mapping +HISTORY_MSG_163;RGB Curves - Red +HISTORY_MSG_164;RGB Curves - Green +HISTORY_MSG_165;RGB Curves - Blue +HISTORY_MSG_166;Exposure - Reset +HISTORY_MSG_167;Demosaicing method +HISTORY_MSG_168;L*a*b* - CC curve +HISTORY_MSG_169;L*a*b* - CH curve +HISTORY_MSG_170;Vibrance - HH curve +HISTORY_MSG_171;L*a*b* - LC curve +HISTORY_MSG_172;L*a*b* - Restrict LC +HISTORY_MSG_173;NR - Detail recovery +HISTORY_MSG_174;CIECAM02 +HISTORY_MSG_175;CAM02 - CAT02 adaptation +HISTORY_MSG_176;CAM02 - Viewing surround +HISTORY_MSG_177;CAM02 - Scene luminosity +HISTORY_MSG_178;CAM02 - Viewing luminosity +HISTORY_MSG_179;CAM02 - White-point model +HISTORY_MSG_180;CAM02 - Lightness (J) +HISTORY_MSG_181;CAM02 - Chroma (C) +HISTORY_MSG_182;CAM02 - Automatic CAT02 +HISTORY_MSG_183;CAM02 - Contrast (J) +HISTORY_MSG_184;CAM02 - Scene surround +HISTORY_MSG_185;CAM02 - Gamut control +HISTORY_MSG_186;CAM02 - Algorithm +HISTORY_MSG_187;CAM02 - Red/skin prot. +HISTORY_MSG_188;CAM02 - Brightness (Q) +HISTORY_MSG_189;CAM02 - Contrast (Q) +HISTORY_MSG_190;CAM02 - Saturation (S) +HISTORY_MSG_191;CAM02 - Colorfulness (M) +HISTORY_MSG_192;CAM02 - Hue (h) +HISTORY_MSG_193;CAM02 - Tone curve 1 +HISTORY_MSG_194;CAM02 - Tone curve 2 +HISTORY_MSG_195;CAM02 - Tone curve 1 +HISTORY_MSG_196;CAM02 - Tone curve 2 +HISTORY_MSG_197;CAM02 - Color curve +HISTORY_MSG_198;CAM02 - Color curve +HISTORY_MSG_199;CAM02 - Output histograms +HISTORY_MSG_200;CAM02 - Tone mapping +HISTORY_MSG_201;NR - Chrominance - R&G +HISTORY_MSG_202;NR - Chrominance - B&Y +HISTORY_MSG_203;NR - Color space +HISTORY_MSG_204;LMMSE enhancement steps +HISTORY_MSG_205;CAM02 - Hot/bad pixel filter +HISTORY_MSG_206;CAT02 - Auto scene luminosity +HISTORY_MSG_207;Defringe - Hue curve +HISTORY_MSG_208;WB - B/R equalizer +HISTORY_MSG_210;GF - Angle +HISTORY_MSG_211;Graduated Filter +HISTORY_MSG_212;VF - Strength +HISTORY_MSG_213;Vignette Filter +HISTORY_MSG_214;Black-and-White +HISTORY_MSG_215;B&W - CM - Red +HISTORY_MSG_216;B&W - CM - Green +HISTORY_MSG_217;B&W - CM - Blue +HISTORY_MSG_218;B&W - Gamma - Red +HISTORY_MSG_219;B&W - Gamma - Green +HISTORY_MSG_220;B&W - Gamma - Blue +HISTORY_MSG_221;B&W - Color filter +HISTORY_MSG_222;B&W - Presets +HISTORY_MSG_223;B&W - CM - Orange +HISTORY_MSG_224;B&W - CM - Yellow +HISTORY_MSG_225;B&W - CM - Cyan +HISTORY_MSG_226;B&W - CM - Magenta +HISTORY_MSG_227;B&W - CM - Purple +HISTORY_MSG_228;B&W - Luminance equalizer +HISTORY_MSG_229;B&W - Luminance equalizer +HISTORY_MSG_230;B&W - Mode +HISTORY_MSG_231;B&W - 'Before' curve +HISTORY_MSG_232;B&W - 'Before' curve type +HISTORY_MSG_233;B&W - 'After' curve +HISTORY_MSG_234;B&W - 'After' curve type +HISTORY_MSG_235;B&W - CM - Auto +HISTORY_MSG_236;--unused-- +HISTORY_MSG_237;B&W - CM +HISTORY_MSG_238;GF - Feather +HISTORY_MSG_239;GF - Strength +HISTORY_MSG_240;GF - Center +HISTORY_MSG_241;VF - Feather +HISTORY_MSG_242;VF - Roundness +HISTORY_MSG_243;VC - Radius +HISTORY_MSG_244;VC - Strength +HISTORY_MSG_245;VC - Center +HISTORY_MSG_246;L*a*b* - CL curve +HISTORY_MSG_247;L*a*b* - LH curve +HISTORY_MSG_248;L*a*b* - HH curve +HISTORY_MSG_249;CbDL - Threshold +HISTORY_MSG_250;NR - Enhanced +HISTORY_MSG_251;B&W - Algorithm +HISTORY_MSG_252;CbDL - Skin tar/prot +HISTORY_MSG_253;CbDL - Reduce artifacts +HISTORY_MSG_254;CbDL - Skin hue +HISTORY_MSG_255;NR - Median filter +HISTORY_MSG_256;NR - Median - Type +HISTORY_MSG_257;Color Toning +HISTORY_MSG_258;CT - Color curve +HISTORY_MSG_259;CT - Opacity curve +HISTORY_MSG_260;CT - a*[b*] opacity +HISTORY_MSG_261;CT - Method +HISTORY_MSG_262;CT - b* opacity +HISTORY_MSG_263;CT - Shadows - Red +HISTORY_MSG_264;CT - Shadows - Green +HISTORY_MSG_265;CT - Shadows - Blue +HISTORY_MSG_266;CT - Mid - Red +HISTORY_MSG_267;CT - Mid - Green +HISTORY_MSG_268;CT - Mid - Blue +HISTORY_MSG_269;CT - High - Red +HISTORY_MSG_270;CT - High - Green +HISTORY_MSG_271;CT - High - Blue +HISTORY_MSG_272;CT - Balance +HISTORY_MSG_273;CT - Color Balance SMH +HISTORY_MSG_274;CT - Sat. Shadows +HISTORY_MSG_275;CT - Sat. Highlights +HISTORY_MSG_276;CT - Opacity +HISTORY_MSG_277;--unused-- +HISTORY_MSG_278;CT - Preserve luminance +HISTORY_MSG_279;CT - Shadows +HISTORY_MSG_280;CT - Highlights +HISTORY_MSG_281;CT - Sat. strength +HISTORY_MSG_282;CT - Sat. threshold +HISTORY_MSG_283;CT - Strength +HISTORY_MSG_284;CT - Auto sat. protection +HISTORY_MSG_285;NR - Median - Method +HISTORY_MSG_286;NR - Median - Type +HISTORY_MSG_287;NR - Median - Iterations +HISTORY_MSG_288;Flat-Field - Clip control +HISTORY_MSG_289;Flat-Field - Clip control - Auto +HISTORY_MSG_290;Black Level - Red +HISTORY_MSG_291;Black Level - Green +HISTORY_MSG_292;Black Level - Blue +HISTORY_MSG_293;Film Simulation +HISTORY_MSG_294;Film Simulation - Strength +HISTORY_MSG_295;Film Simulation - Film +HISTORY_MSG_296;NR - Luminance curve +HISTORY_MSG_297;NR - Mode +HISTORY_MSG_298;Dead pixel filter +HISTORY_MSG_299;NR - Chrominance curve +HISTORY_MSG_300;- +HISTORY_MSG_301;NR - Luma control +HISTORY_MSG_302;NR - Chroma method +HISTORY_MSG_303;NR - Chroma method +HISTORY_MSG_304;W - Contrast levels +HISTORY_MSG_305;Wavelet Levels +HISTORY_MSG_306;W - Process +HISTORY_MSG_307;W - Process +HISTORY_MSG_308;W - Process direction +HISTORY_MSG_309;W - ES - Detail +HISTORY_MSG_310;W - Residual - Sky tar/prot +HISTORY_MSG_311;W - Wavelet levels +HISTORY_MSG_312;W - Residual - Shadows threshold +HISTORY_MSG_313;W - Chroma - Sat/past +HISTORY_MSG_314;W - Gamut - Reduce artifacts +HISTORY_MSG_315;W - Residual - Contrast +HISTORY_MSG_316;W - Gamut - Skin tar/prot +HISTORY_MSG_317;W - Gamut - Skin hue +HISTORY_MSG_318;W - Contrast - Finer levels +HISTORY_MSG_319;W - Contrast - Finer range +HISTORY_MSG_320;W - Contrast - Coarser range +HISTORY_MSG_321;W - Contrast - Coarser levels +HISTORY_MSG_322;W - Gamut - Avoid color shift +HISTORY_MSG_323;W - ES - Local contrast +HISTORY_MSG_324;W - Chroma - Pastel +HISTORY_MSG_325;W - Chroma - Saturated +HISTORY_MSG_326;W - Chroma - Method +HISTORY_MSG_327;W - Contrast - Apply to +HISTORY_MSG_328;W - Chroma - Link strength +HISTORY_MSG_329;W - Toning - Opacity RG +HISTORY_MSG_330;W - Toning - Opacity BY +HISTORY_MSG_331;W - Contrast levels - Extra +HISTORY_MSG_332;W - Tiling method +HISTORY_MSG_333;W - Residual - Shadows +HISTORY_MSG_334;W - Residual - Chroma +HISTORY_MSG_335;W - Residual - Highlights +HISTORY_MSG_336;W - Residual - Highlights threshold +HISTORY_MSG_337;W - Residual - Sky hue +HISTORY_MSG_338;W - ES - Radius +HISTORY_MSG_339;W - ES - Strength +HISTORY_MSG_340;W - Strength +HISTORY_MSG_341;W - Edge performance +HISTORY_MSG_342;W - ES - First level +HISTORY_MSG_343;W - Chroma levels +HISTORY_MSG_344;W - Meth chroma sl/cur +HISTORY_MSG_345;W - ES - Local contrast +HISTORY_MSG_346;W - ES - Local contrast method +HISTORY_MSG_347;W - Denoise - Level 1 +HISTORY_MSG_348;W - Denoise - Level 2 +HISTORY_MSG_349;W - Denoise - Level 3 +HISTORY_MSG_350;W - ES - Edge detection +HISTORY_MSG_351;W - Residual - HH curve +HISTORY_MSG_352;W - Background +HISTORY_MSG_353;W - ES - Gradient sensitivity +HISTORY_MSG_354;W - ES - Enhanced +HISTORY_MSG_355;W - ES - Threshold low +HISTORY_MSG_356;W - ES - Threshold high +HISTORY_MSG_357;W - Denoise - Link with ES +HISTORY_MSG_358;W - Gamut - CH +HISTORY_MSG_359;Hot/Dead - Threshold +HISTORY_MSG_360;TM - Gamma +HISTORY_MSG_361;W - Final - Chroma balance +HISTORY_MSG_362;W - Residual - Compression method +HISTORY_MSG_363;W - Residual - Compression strength +HISTORY_MSG_364;W - Final - Contrast balance +HISTORY_MSG_365;W - Final - Delta balance +HISTORY_MSG_366;W - Residual - Compression gamma +HISTORY_MSG_367;W - Final - 'After' contrast curve +HISTORY_MSG_368;W - Final - Contrast balance +HISTORY_MSG_369;W - Final - Balance method +HISTORY_MSG_370;W - Final - Local contrast curve +HISTORY_MSG_371;Post-Resize Sharpening +HISTORY_MSG_372;PRS USM - Radius +HISTORY_MSG_373;PRS USM - Amount +HISTORY_MSG_374;PRS USM - Threshold +HISTORY_MSG_375;PRS USM - Sharpen only edges +HISTORY_MSG_376;PRS USM - Edge detection radius +HISTORY_MSG_377;PRS USM - Edge tolerance +HISTORY_MSG_378;PRS USM - Halo control +HISTORY_MSG_379;PRS USM - Halo control amount +HISTORY_MSG_380;PRS - Method +HISTORY_MSG_381;PRS RLD - Radius +HISTORY_MSG_382;PRS RLD - Amount +HISTORY_MSG_383;PRS RLD - Damping +HISTORY_MSG_384;PRS RLD - Iterations +HISTORY_MSG_385;W - Residual - Color balance +HISTORY_MSG_386;W - Residual - CB green high +HISTORY_MSG_387;W - Residual - CB blue high +HISTORY_MSG_388;W - Residual - CB green mid +HISTORY_MSG_389;W - Residual - CB blue mid +HISTORY_MSG_390;W - Residual - CB green low +HISTORY_MSG_391;W - Residual - CB blue low +HISTORY_MSG_392;W - Residual - Color balance +HISTORY_MSG_393;DCP - Look table +HISTORY_MSG_394;DCP - Baseline exposure +HISTORY_MSG_395;DCP - Base table +HISTORY_MSG_396;W - Contrast sub-tool +HISTORY_MSG_397;W - Chroma sub-tool +HISTORY_MSG_398;W - ES sub-tool +HISTORY_MSG_399;W - Residual sub-tool +HISTORY_MSG_400;W - Final sub-tool +HISTORY_MSG_401;W - Toning sub-tool +HISTORY_MSG_402;W - Denoise sub-tool +HISTORY_MSG_403;W - ES - Edge sensitivity +HISTORY_MSG_404;W - ES - Base amplification +HISTORY_MSG_405;W - Denoise - Level 4 +HISTORY_MSG_406;W - ES - Neighboring pixels +HISTORY_MSG_407;Retinex - Method +HISTORY_MSG_408;Retinex - Radius +HISTORY_MSG_409;Retinex - Contrast +HISTORY_MSG_410;Retinex - Offset +HISTORY_MSG_411;Retinex - Strength +HISTORY_MSG_412;Retinex - Gaussian gradient +HISTORY_MSG_413;Retinex - Contrast +HISTORY_MSG_414;Retinex - Histogram - Lab +HISTORY_MSG_415;Retinex - Transmission +HISTORY_MSG_416;Retinex +HISTORY_MSG_417;Retinex - Transmission median +HISTORY_MSG_418;Retinex - Threshold +HISTORY_MSG_419;Retinex - Color space +HISTORY_MSG_420;Retinex - Histogram - HSL +HISTORY_MSG_421;Retinex - Gamma +HISTORY_MSG_422;Retinex - Gamma +HISTORY_MSG_423;Retinex - Gamma slope +HISTORY_MSG_424;Retinex - HL threshold +HISTORY_MSG_425;Retinex - Log base +HISTORY_MSG_426;Retinex - Hue equalizer +HISTORY_MSG_427;Output rendering intent +HISTORY_MSG_428;Monitor rendering intent +HISTORY_MSG_429;Retinex - Iterations +HISTORY_MSG_430;Retinex - Transmission gradient +HISTORY_MSG_431;Retinex - Strength gradient +HISTORY_MSG_432;Retinex - M - Highlights +HISTORY_MSG_433;Retinex - M - Highlights TW +HISTORY_MSG_434;Retinex - M - Shadows +HISTORY_MSG_435;Retinex - M - Shadows TW +HISTORY_MSG_436;Retinex - M - Radius +HISTORY_MSG_437;Retinex - M - Method +HISTORY_MSG_438;Retinex - M - Equalizer +HISTORY_MSG_439;Retinex - Process +HISTORY_MSG_440;CbDL - Method +HISTORY_MSG_441;Retinex - Gain transmission +HISTORY_MSG_442;Retinex - Scale +HISTORY_MSG_443;Output black point compensation +HISTORY_MSG_444;WB - Temp bias +HISTORY_MSG_445;Raw Sub-Image +HISTORY_MSG_446;EvPixelShiftMotion +HISTORY_MSG_447;EvPixelShiftMotionCorrection +HISTORY_MSG_448;EvPixelShiftStddevFactorGreen +HISTORY_MSG_449;PS ISO adaption +HISTORY_MSG_450;EvPixelShiftNreadIso +HISTORY_MSG_451;EvPixelShiftPrnu +HISTORY_MSG_452;PS Show motion +HISTORY_MSG_453;PS Show mask only +HISTORY_MSG_454;EvPixelShiftAutomatic +HISTORY_MSG_455;EvPixelShiftNonGreenHorizontal +HISTORY_MSG_456;EvPixelShiftNonGreenVertical +HISTORY_MSG_457;PS Check red/blue +HISTORY_MSG_458;EvPixelShiftStddevFactorRed +HISTORY_MSG_459;EvPixelShiftStddevFactorBlue +HISTORY_MSG_460;EvPixelShiftGreenAmaze +HISTORY_MSG_461;EvPixelShiftNonGreenAmaze +HISTORY_MSG_462;PS Check green +HISTORY_MSG_463;EvPixelShiftRedBlueWeight +HISTORY_MSG_464;PS Blur motion mask +HISTORY_MSG_465;PS Blur radius +HISTORY_MSG_466;EvPixelShiftSum +HISTORY_MSG_467;EvPixelShiftExp0 +HISTORY_MSG_468;PS Fill holes +HISTORY_MSG_469;PS Median +HISTORY_MSG_470;EvPixelShiftMedian3 +HISTORY_MSG_471;PS Motion correction +HISTORY_MSG_472;PS Smooth transitions +HISTORY_MSG_473;PS Use lmmse +HISTORY_MSG_474;PS Equalize +HISTORY_MSG_475;PS Equalize channel +HISTORY_MSG_476;CAM02 - Temp out +HISTORY_MSG_477;CAM02 - Green out +HISTORY_MSG_478;CAM02 - Yb out +HISTORY_MSG_479;CAM02 - CAT02 adaptation out +HISTORY_MSG_480;CAM02 - Automatic CAT02 out +HISTORY_MSG_481;CAM02 - Temp scene +HISTORY_MSG_482;CAM02 - Green scene +HISTORY_MSG_483;CAM02 - Yb scene +HISTORY_MSG_484;CAM02 - Auto Yb scene +HISTORY_MSG_485;Lens Correction +HISTORY_MSG_486;Lens Correction - Camera +HISTORY_MSG_487;Lens Correction - Lens +HISTORY_MSG_488;Dynamic Range Compression +HISTORY_MSG_489;DRC - Detail +HISTORY_MSG_490;DRC - Amount +HISTORY_MSG_491;White Balance +HISTORY_MSG_492;RGB Curves +HISTORY_MSG_493;Local Adjustments +HISTORY_MSG_494;Capture Sharpening +HISTORY_MSG_496;Local Spot deleted +HISTORY_MSG_497;Local Spot selected +HISTORY_MSG_498;Local Spot name +HISTORY_MSG_499;Local Spot visibility +HISTORY_MSG_500;Local Spot shape +HISTORY_MSG_501;Local Spot method +HISTORY_MSG_502;Local Spot shape method +HISTORY_MSG_503;Local Spot locX +HISTORY_MSG_504;Local Spot locXL +HISTORY_MSG_505;Local Spot locY +HISTORY_MSG_506;Local Spot locYT +HISTORY_MSG_507;Local Spot center +HISTORY_MSG_508;Local Spot circrad +HISTORY_MSG_509;Local Spot quality method +HISTORY_MSG_510;Local Spot transition +HISTORY_MSG_511;Local Spot thresh +HISTORY_MSG_512;Local Spot ΔE -decay +HISTORY_MSG_513;Local Spot scope +HISTORY_MSG_514;Local Spot structure +HISTORY_MSG_515;Local Adjustments +HISTORY_MSG_516;Local - Color and light +HISTORY_MSG_517;Local - Enable super +HISTORY_MSG_518;Local - Lightness +HISTORY_MSG_519;Local - Contrast +HISTORY_MSG_520;Local - Chrominance +HISTORY_MSG_521;Local - Scope +HISTORY_MSG_522;Local - curve method +HISTORY_MSG_523;Local - LL Curve +HISTORY_MSG_524;Local - CC curve +HISTORY_MSG_525;Local - LH Curve +HISTORY_MSG_526;Local - H curve +HISTORY_MSG_527;Local - Color Inverse +HISTORY_MSG_528;Local - Exposure +HISTORY_MSG_529;Local - Exp Compensation +HISTORY_MSG_530;Local - Exp Hlcompr +HISTORY_MSG_531;Local - Exp hlcomprthresh +HISTORY_MSG_532;Local - Exp black +HISTORY_MSG_533;Local - Exp Shcompr +HISTORY_MSG_534;Local - Warm Cool +HISTORY_MSG_535;Local - Exp Scope +HISTORY_MSG_536;Local - Exp Contrast curve +HISTORY_MSG_537;Local - Vibrance +HISTORY_MSG_538;Local - Vib Saturated +HISTORY_MSG_539;Local - Vib Pastel +HISTORY_MSG_540;Local - Vib Threshold +HISTORY_MSG_541;Local - Vib Protect skin tones +HISTORY_MSG_542;Local - Vib avoid colorshift +HISTORY_MSG_543;Local - Vib link +HISTORY_MSG_544;Local - Vib Scope +HISTORY_MSG_545;Local - Vib H curve +HISTORY_MSG_546;Local - Blur and noise +HISTORY_MSG_547;Local - Radius +HISTORY_MSG_548;Local - Noise +HISTORY_MSG_549;Local - Blur scope +HISTORY_MSG_550;Local - Blur method +HISTORY_MSG_551;Local - Blur Luminance only +HISTORY_MSG_552;Local - Tone mapping +HISTORY_MSG_553;Local - TM compression strength +HISTORY_MSG_554;Local - TM gamma +HISTORY_MSG_555;Local - TM edge stopping +HISTORY_MSG_556;Local - TM scale +HISTORY_MSG_557;Local - TM Reweighting +HISTORY_MSG_558;Local - TM scope +HISTORY_MSG_559;Local - Retinex +HISTORY_MSG_560;Local - Retinex method +HISTORY_MSG_561;Local - Retinex strength +HISTORY_MSG_562;Local - Retinex chroma +HISTORY_MSG_563;Local - Retinex radius +HISTORY_MSG_564;Local - Retinex contrast +HISTORY_MSG_565;Local - scope +HISTORY_MSG_566;Local - Retinex Gain curve +HISTORY_MSG_567;Local - Retinex Inverse +HISTORY_MSG_568;Local - Sharpening +HISTORY_MSG_569;Local - Sh Radius +HISTORY_MSG_570;Local - Sh Amount +HISTORY_MSG_571;Local - Sh Damping +HISTORY_MSG_572;Local - Sh Iterations +HISTORY_MSG_573;Local - Sh Scope +HISTORY_MSG_574;Local - Sh Inverse +HISTORY_MSG_575;Local - CBDL +HISTORY_MSG_576;Local - cbdl mult +HISTORY_MSG_577;Local - cbdl chroma +HISTORY_MSG_578;Local - cbdl threshold +HISTORY_MSG_579;Local - cbdl scope +HISTORY_MSG_580;Local - Denoise +HISTORY_MSG_581;Local - deNoise lum f 1 +HISTORY_MSG_582;Local - deNoise lum c +HISTORY_MSG_583;Local - deNoise lum detail +HISTORY_MSG_584;Local - deNoise equalizer White-Black +HISTORY_MSG_585;Local - deNoise chro f +HISTORY_MSG_586;Local - deNoise chro c +HISTORY_MSG_587;Local - deNoise chro detail +HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +HISTORY_MSG_589;Local - deNoise bilateral +HISTORY_MSG_590;Local - deNoise Scope +HISTORY_MSG_591;Local - Avoid color shift +HISTORY_MSG_592;Local - Sh Contrast +HISTORY_MSG_593;Local - Local contrast +HISTORY_MSG_594;Local - Local contrast radius +HISTORY_MSG_595;Local - Local contrast amount +HISTORY_MSG_596;Local - Local contrast darkness +HISTORY_MSG_597;Local - Local contrast lightness +HISTORY_MSG_598;Local - Local contrast scope +HISTORY_MSG_599;Local - Retinex dehaze +HISTORY_MSG_600;Local - Soft Light enable +HISTORY_MSG_601;Local - Soft Light strength +HISTORY_MSG_602;Local - Soft Light scope +HISTORY_MSG_603;Local - Sh Blur radius +HISTORY_MSG_605;Local - Mask preview choice +HISTORY_MSG_606;Local Spot selected +HISTORY_MSG_607;Local - Color Mask C +HISTORY_MSG_608;Local - Color Mask L +HISTORY_MSG_609;Local - Exp Mask C +HISTORY_MSG_610;Local - Exp Mask L +HISTORY_MSG_611;Local - Color Mask H +HISTORY_MSG_612;Local - Color Structure +HISTORY_MSG_613;Local - Exp Structure +HISTORY_MSG_614;Local - Exp Mask H +HISTORY_MSG_615;Local - Blend color +HISTORY_MSG_616;Local - Blend Exp +HISTORY_MSG_617;Local - Blur Exp +HISTORY_MSG_618;Local - Use Color Mask +HISTORY_MSG_619;Local - Use Exp Mask +HISTORY_MSG_620;Local - Blur col +HISTORY_MSG_621;Local - Exp inverse +HISTORY_MSG_622;Local - Exclude structure +HISTORY_MSG_623;Local - Exp Chroma compensation +HISTORY_MSG_624;Local - Color correction grid +HISTORY_MSG_625;Local - Color correction strength +HISTORY_MSG_626;Local - Color correction Method +HISTORY_MSG_627;Local - Shadow Highlight +HISTORY_MSG_628;Local - SH Highlight +HISTORY_MSG_629;Local - SH H tonalwidth +HISTORY_MSG_630;Local - SH Shadows +HISTORY_MSG_631;Local - SH S tonalwidth +HISTORY_MSG_632;Local - SH radius +HISTORY_MSG_633;Local - SH Scope +HISTORY_MSG_634;Local - radius color +HISTORY_MSG_635;Local - radius Exp +HISTORY_MSG_636;Local - Tool added +HISTORY_MSG_637;Local - SH Mask C +HISTORY_MSG_638;Local - SH Mask L +HISTORY_MSG_639;Local - SH Mask H +HISTORY_MSG_640;Local - SH blend +HISTORY_MSG_641;Local - Use SH mask +HISTORY_MSG_642;Local - radius SH +HISTORY_MSG_643;Local - Blur SH +HISTORY_MSG_644;Local - inverse SH +HISTORY_MSG_645;Local - balance ΔE ab-L +HISTORY_MSG_646;Local - Exp mask chroma +HISTORY_MSG_647;Local - Exp mask gamma +HISTORY_MSG_648;Local - Exp mask slope +HISTORY_MSG_649;Local - Exp soft radius +HISTORY_MSG_650;Local - Color mask chroma +HISTORY_MSG_651;Local - Color mask gamma +HISTORY_MSG_652;Local - Color mask slope +HISTORY_MSG_653;Local - SH mask chroma +HISTORY_MSG_654;Local - SH mask gamma +HISTORY_MSG_655;Local - SH mask slope +HISTORY_MSG_656;Local - Color soft radius +HISTORY_MSG_657;Local - Retinex Reduce artifacts +HISTORY_MSG_658;Local - CBDL soft radius +HISTORY_MSG_659;Local Spot transition-decay +HISTORY_MSG_660;Local - cbdl clarity +HISTORY_MSG_661;Local - cbdl contrast residual +HISTORY_MSG_662;Local - deNoise lum f 0 +HISTORY_MSG_663;Local - deNoise lum f 2 +HISTORY_MSG_664;Local - cbdl Blur +HISTORY_MSG_665;Local - cbdl mask Blend +HISTORY_MSG_666;Local - cbdl mask radius +HISTORY_MSG_667;Local - cbdl mask chroma +HISTORY_MSG_668;Local - cbdl mask gamma +HISTORY_MSG_669;Local - cbdl mask slope +HISTORY_MSG_670;Local - cbdl mask C +HISTORY_MSG_671;Local - cbdl mask L +HISTORY_MSG_672;Local - cbdl mask CL +HISTORY_MSG_673;Local - Use cbdl mask +HISTORY_MSG_674;Local - Tool removed +HISTORY_MSG_675;Local - TM soft radius +HISTORY_MSG_676;Local Spot transition-differentiation +HISTORY_MSG_677;Local - TM amount +HISTORY_MSG_678;Local - TM saturation +HISTORY_MSG_679;Local - Retinex mask C +HISTORY_MSG_680;Local - Retinex mask L +HISTORY_MSG_681;Local - Retinex mask CL +HISTORY_MSG_682;Local - Retinex mask +HISTORY_MSG_683;Local - Retinex mask Blend +HISTORY_MSG_684;Local - Retinex mask radius +HISTORY_MSG_685;Local - Retinex mask chroma +HISTORY_MSG_686;Local - Retinex mask gamma +HISTORY_MSG_687;Local - Retinex mask slope +HISTORY_MSG_688;Local - Tool removed +HISTORY_MSG_689;Local - Retinex mask transmission map +HISTORY_MSG_690;Local - Retinex scale +HISTORY_MSG_691;Local - Retinex darkness +HISTORY_MSG_692;Local - Retinex lightness +HISTORY_MSG_693;Local - Retinex threshold +HISTORY_MSG_694;Local - Retinex Laplacian threshold +HISTORY_MSG_695;Local - Soft method +HISTORY_MSG_696;Local - Retinex Normalize +HISTORY_MSG_697;Local - TM Normalize +HISTORY_MSG_698;Local - Local contrast Fast Fourier +HISTORY_MSG_699;Local - Retinex Fast Fourier +HISTORY_MSG_701;Local - Exp Shadows +HISTORY_MSG_702;Local - Exp Method +HISTORY_MSG_703;Local - Exp Laplacian threshold +HISTORY_MSG_704;Local - Exp PDE balance +HISTORY_MSG_705;Local - Exp linearity +HISTORY_MSG_706;Local - TM mask C +HISTORY_MSG_707;Local - TM mask L +HISTORY_MSG_708;Local - TM mask CL +HISTORY_MSG_709;Local - use TM mask +HISTORY_MSG_710;Local - TM mask Blend +HISTORY_MSG_711;Local - TM mask radius +HISTORY_MSG_712;Local - TM mask chroma +HISTORY_MSG_713;Local - TM mask gamma +HISTORY_MSG_714;Local - TM mask slope +HISTORY_MSG_716;Local - Local method +HISTORY_MSG_717;Local - Local contrast +HISTORY_MSG_718;Local - Local contrast levels +HISTORY_MSG_719;Local - Local contrast residual L +HISTORY_MSG_720;Local - Blur mask C +HISTORY_MSG_721;Local - Blur mask L +HISTORY_MSG_722;Local - Blur mask CL +HISTORY_MSG_723;Local - use Blur mask +HISTORY_MSG_725;Local - Blur mask Blend +HISTORY_MSG_726;Local - Blur mask radius +HISTORY_MSG_727;Local - Blur mask chroma +HISTORY_MSG_728;Local - Blur mask gamma +HISTORY_MSG_729;Local - Blur mask slope +HISTORY_MSG_730;Local - Blur method +HISTORY_MSG_731;Local - median method +HISTORY_MSG_732;Local - median iterations +HISTORY_MSG_733;Local - soft radius +HISTORY_MSG_734;Local - detail +HISTORY_MSG_738;Local - Local contrast Merge L +HISTORY_MSG_739;Local - Local contrast Soft radius +HISTORY_MSG_740;Local - Local contrast Merge C +HISTORY_MSG_741;Local - Local contrast Residual C +HISTORY_MSG_742;Local - Exp Laplacian gamma +HISTORY_MSG_743;Local - Exp Fattal Amount +HISTORY_MSG_744;Local - Exp Fattal Detail +HISTORY_MSG_745;Local - Exp Fattal Offset +HISTORY_MSG_746;Local - Exp Fattal Sigma +HISTORY_MSG_747;Local Spot created +HISTORY_MSG_748;Local - Exp Denoise +HISTORY_MSG_749;Local - Reti Depth +HISTORY_MSG_750;Local - Reti Mode log - lin +HISTORY_MSG_751;Local - Reti Dehaze luminance +HISTORY_MSG_752;Local - Reti Offset +HISTORY_MSG_753;Local - Reti Transmission map +HISTORY_MSG_754;Local - Reti Clip +HISTORY_MSG_755;Local - TM use tm mask +HISTORY_MSG_756;Local - Exp use algo exposure mask +HISTORY_MSG_757;Local - Exp Laplacian mask +HISTORY_MSG_758;Local - Reti Laplacian mask +HISTORY_MSG_759;Local - Exp Laplacian mask +HISTORY_MSG_760;Local - Color Laplacian mask +HISTORY_MSG_761;Local - SH Laplacian mask +HISTORY_MSG_762;Local - cbdl Laplacian mask +HISTORY_MSG_763;Local - Blur Laplacian mask +HISTORY_MSG_764;Local - Solve PDE Laplacian mask +HISTORY_MSG_765;Local - deNoise Detail threshold +HISTORY_MSG_766;Local - Blur Fast Fourier +HISTORY_MSG_767;Local - Grain Iso +HISTORY_MSG_768;Local - Grain Strength +HISTORY_MSG_769;Local - Grain Scale +HISTORY_MSG_770;Local - Color Mask contrast curve +HISTORY_MSG_771;Local - Exp Mask contrast curve +HISTORY_MSG_772;Local - SH Mask contrast curve +HISTORY_MSG_773;Local - TM Mask contrast curve +HISTORY_MSG_774;Local - Reti Mask contrast curve +HISTORY_MSG_775;Local - CBDL Mask contrast curve +HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +HISTORY_MSG_777;Local - Blur Mask local contrast curve +HISTORY_MSG_778;Local - Mask highlights +HISTORY_MSG_779;Local - Color Mask local contrast curve +HISTORY_MSG_780;Local - Color Mask shadows +HISTORY_MSG_781;Local - Contrast Mask Wavelet level +HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +HISTORY_MSG_783;Local - Color Wavelet levels +HISTORY_MSG_784;Local - Mask ΔE +HISTORY_MSG_785;Local - Mask Scope ΔE +HISTORY_MSG_786;Local - SH method +HISTORY_MSG_787;Local - Equalizer multiplier +HISTORY_MSG_788;Local - Equalizer detail +HISTORY_MSG_789;Local - SH mask amount +HISTORY_MSG_790;Local - SH mask anchor +HISTORY_MSG_791;Local - Mask Short L curves +HISTORY_MSG_792;Local - Mask Luminance Background +HISTORY_MSG_793;Local - SH TRC gamma +HISTORY_MSG_794;Local - SH TRC slope +HISTORY_MSG_795;Local - Mask save restore image +HISTORY_MSG_796;Local - Recursive references +HISTORY_MSG_797;Local - Merge Original method +HISTORY_MSG_798;Local - Opacity +HISTORY_MSG_799;Local - Color RGB ToneCurve +HISTORY_MSG_800;Local - Color ToneCurve Method +HISTORY_MSG_801;Local - Color ToneCurve Special +HISTORY_MSG_802;Local - Contrast threshold +HISTORY_MSG_803;Local - Color Merge +HISTORY_MSG_804;Local - Color mask Structure +HISTORY_MSG_805;Local - Blur Noise mask Structure +HISTORY_MSG_806;Local - Color mask Structure as tool +HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +HISTORY_MSG_808;Local - Color mask curve H(H) +HISTORY_MSG_809;Local - Vib mask curve C(C) +HISTORY_MSG_810;Local - Vib mask curve L(L) +HISTORY_MSG_811;Local - Vib mask curve LC(H) +HISTORY_MSG_813;Local - Use Vib mask +HISTORY_MSG_814;Local - Vib mask Blend +HISTORY_MSG_815;Local - Vib mask radius +HISTORY_MSG_816;Local - Vib mask chroma +HISTORY_MSG_817;Local - Vib mask gamma +HISTORY_MSG_818;Local - Vib mask slope +HISTORY_MSG_819;Local - Vib mask laplacian +HISTORY_MSG_820;Local - Vib mask contrast curve +HISTORY_MSG_821;Local - color grid background +HISTORY_MSG_822;Local - color background merge +HISTORY_MSG_823;Local - color background luminance +HISTORY_MSG_824;Local - Exp gradient mask strength +HISTORY_MSG_825;Local - Exp gradient mask angle +HISTORY_MSG_826;Local - Exp gradient strength +HISTORY_MSG_827;Local - Exp gradient angle +HISTORY_MSG_828;Local - SH gradient strength +HISTORY_MSG_829;Local - SH gradient angle +HISTORY_MSG_830;Local - Color gradient strength L +HISTORY_MSG_831;Local - Color gradient angle +HISTORY_MSG_832;Local - Color gradient strength C +HISTORY_MSG_833;Local - Gradient feather +HISTORY_MSG_834;Local - Color gradient strength H +HISTORY_MSG_835;Local - Vib gradient strength L +HISTORY_MSG_836;Local - Vib gradient angle +HISTORY_MSG_837;Local - Vib gradient strength C +HISTORY_MSG_838;Local - Vib gradient strength H +HISTORY_MSG_839;Local - Software complexity +HISTORY_MSG_840;Local - CL Curve +HISTORY_MSG_841;Local - LC curve HISTORY_MSG_842;Local - Contrast Threshold Mask blur HISTORY_MSG_843;Local - Radius Mask blur HISTORY_MSG_844;Local - Color Mask fftw diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 0e016089e..6d73ead94 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -13407,7 +13407,7 @@ void ImProcFunctions::Lab_Local( if (lochhCurve && HHcurve && lp.qualcurvemet != 0 && !ctoning) { // H=f(H) const float chromat = std::sqrt(SQR(bufcolcalca) + SQR(bufcolcalcb)); const float hhforcurv = xatan2f(bufcolcalcb, bufcolcalca); - const float valparam = float ((lochhCurve[500.f * Color::huelab_to_huehsv2(hhforcurv)] - 0.5f)); //get H=f(H) + const float valparam = 2.f * float ((lochhCurve[500.f * Color::huelab_to_huehsv2(hhforcurv)] - 0.5f)) + static_cast(hhforcurv); float2 sincosval = xsincosf(valparam); bufcolcalca = chromat * sincosval.y; bufcolcalcb = chromat * sincosval.x; From 8252ce934a852e8fb35054a01d50f469dafc3802 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 17 Sep 2020 09:22:37 +0200 Subject: [PATCH 100/185] From banch localdenois - fixed bug exlablocal - bad behavior GUI common mask --- rtengine/iplocallab.cc | 9 ++++---- rtgui/locallabtools2.cc | 49 ++++++++++++++++++++++++----------------- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 6d73ead94..b70ddee6e 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -2421,7 +2421,7 @@ void ImProcFunctions::exlabLocal(local_params& lp, int bfh, int bfw, int bfhr, i } const bool exec = (lp.expmet == 1 && linear > 0.f && lp.laplacexp > 0.1f); - if(!exec) {//for standard exposure + if(exec) {//for standard exposure const float cexp_scale = std::pow(2.f, lp.expcomp); const float ccomp = (rtengine::max(0.f, lp.expcomp) + 1.f) * lp.hlcomp / 100.f; const float cshoulder = ((maxran / rtengine::max(1.0f, cexp_scale)) * (lp.hlcompthr / 200.f)) + 0.1f; @@ -11293,7 +11293,7 @@ void ImProcFunctions::Lab_Local( } // soft light and retinex_pde - if (lp.strng > 0.f && call <= 3 && lp.sfena) { + if (lp.strng > 1.f && call <= 3 && lp.sfena) { int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); @@ -12755,8 +12755,9 @@ void ImProcFunctions::Lab_Local( } else { - - ImProcFunctions::exlabLocal(lp, bfh, bfw, bfhr, bfwr, bufexporig.get(), bufexpfin.get(), hltonecurveloc, shtonecurveloc, tonecurveloc, hueref, lumaref, chromaref); + if (lp.expcomp != 0.f) { + ImProcFunctions::exlabLocal(lp, bfh, bfw, bfhr, bfwr, bufexporig.get(), bufexpfin.get(), hltonecurveloc, shtonecurveloc, tonecurveloc, hueref, lumaref, chromaref); + } } //gradient diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index a025d5791..fd67f181f 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -5549,9 +5549,9 @@ void LocallabMask::convertParamToSimple() disableListener(); // Set hidden specific GUI widgets in Simple mode to default spot values - radmask->setValue(defSpot.radmask); - chromask->setValue(defSpot.chromask); - Lmask_shape->setCurve(defSpot.Lmask_curve); + gammask->setValue(defSpot.gammask); + slopmask->setValue(defSpot.slopmask); + //Lmask_shape->setCurve(defSpot.Lmask_curve); // Enable all listeners enableListener(); @@ -5562,21 +5562,29 @@ void LocallabMask::updateGUIToMode(const modeType new_type) switch (new_type) { case Simple: // Expert and Normal mode widgets are hidden in Simple mode - softradiusmask->hide(); + softradiusmask->show(); + toolmaskFrame->show(); struFrame->hide(); blurFrame->hide(); - toolmaskFrame->hide(); + gammask->hide(); + slopmask->hide(); + shadmask->hide(); + lapmask->hide(); + mask_HCurveEditorG->hide(); + mask2CurveEditorGwav->hide(); + csThresholdmask->hide(); + gradFramemask->hide(); break; case Normal: // Expert mode widgets are hidden in Normal mode - softradiusmask->hide(); + softradiusmask->show(); struFrame->hide(); blurFrame->hide(); lapmask->hide(); - gammask->hide(); - slopmask->hide(); + gammask->show(); + slopmask->show(); shadmask->hide(); mask_HCurveEditorG->hide(); mask2CurveEditorGwav->hide(); @@ -5589,19 +5597,20 @@ void LocallabMask::updateGUIToMode(const modeType new_type) case Expert: // Show widgets hidden in Normal and Simple mode - softradiusmask->hide(); - struFrame->hide(); - blurFrame->hide(); - toolmaskFrame->hide(); - lapmask->hide(); - gammask->hide(); - slopmask->hide(); - shadmask->hide(); - mask_HCurveEditorG->hide(); - mask2CurveEditorGwav->hide(); - csThresholdmask->hide(); - gradFramemask->hide(); + softradiusmask->show(); + struFrame->show(); + blurFrame->show(); + toolmaskFrame->show(); + lapmask->show(); + gammask->show(); + slopmask->show(); + shadmask->show(); + mask_HCurveEditorG->show(); + mask2CurveEditorGwav->show(); + csThresholdmask->show(); + gradFramemask->show(); } + } void LocallabMask::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer) From 2b62eaa784090df94323af67596de7b2d7981847 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 17 Sep 2020 14:12:59 +0200 Subject: [PATCH 101/185] Simplified CS radius calculation --- rtengine/capturesharpening.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index de9b0a4ee..83c44aa18 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -643,7 +643,7 @@ float calcRadiusBayer(const float * const *rawData, int W, int H, float lowerLim } } } - return std::sqrt((1.f / (std::log(1.f / maxRatio) / 2.f)) / -2.f); + return std::sqrt(1.f / std::log(maxRatio)); } float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLimit, float upperLimit, unsigned int starty, unsigned int startx) @@ -734,7 +734,7 @@ float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLi } } } - return std::sqrt((1.f / (std::log(1.f / maxRatio) / 2.f)) / -2.f); + return std::sqrt(1.f / std::log(maxRatio)); } bool checkForStop(float** tmpIThr, float** iterCheck, int fullTileSize, int border) From 2a64c2a34cd0449945a8b7e37647db19af04657a Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 18 Sep 2020 21:59:35 +0200 Subject: [PATCH 102/185] Clean language default --- rtdata/languages/default | 7242 -------------------------------------- 1 file changed, 7242 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index b65591eaf..b4dade718 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1083,7248 +1083,6 @@ HISTORY_MSG_838;Local - Vib gradient strength H HISTORY_MSG_839;Local - Software complexity HISTORY_MSG_840;Local - CL Curve HISTORY_MSG_841;Local - LC curve -HISTORY_MSG_842;Local - Contrast Threshold Blur Mask -HISTORY_MSG_843;Local - Radius blur mask -HISTORY_MSG_844;Local - Color Mask fftw -HISTORY_MSG_845;Local - log encoding -HISTORY_MSG_846;Local - Encoding auto -HISTORY_MSG_847;Local - Source Gray -HISTORY_MSG_848;Local - Source Gray auto -HISTORY_MSG_849;Local - Auto Grayon -HISTORY_MSG_850;Local - Black Ev -HISTORY_MSG_851;Local - White Ev -HISTORY_MSG_852;Local - Target Gray -HISTORY_MSG_853;Local - Local contrast -HISTORY_MSG_854;Local - Scope encoding log -HISTORY_MSG_855;Local - Entire image -HISTORY_MSG_856;Local - Base log -HISTORY_MSG_857;Local - Contrast Blur Residual -HISTORY_MSG_858;Local - Contrast Luminance only -HISTORY_MSG_859;Local - Contrast Maximum Blur levels -HISTORY_MSG_860;Local - Contrast Curve Blur levels -HISTORY_MSG_861;Local - Contrast Curve Contrast levels -HISTORY_MSG_862;Local - Contrast Sigma luminance -HISTORY_MSG_863;Local - Contrast Merge Original -HISTORY_MSG_864;Local - Directional sigma -HISTORY_MSG_865;Local - Directional delta -HISTORY_MSG_866;Local - Contrast Curve Compression -HISTORY_MSG_867;Local - Contrast Amount residual -HISTORY_MSG_868;Local - balance ΔE C-H -HISTORY_MSG_869;Local - denoise curve luminance -HISTORY_MSG_870;Local - LC mask curve LC(H) -HISTORY_MSG_871;Local - LC mask curve C(C) -HISTORY_MSG_872;Local - LC mask curve L(L) -HISTORY_MSG_873;Local - LC mask enable -HISTORY_MSG_875;Local - LC mask blend -HISTORY_MSG_876;Local - LC mask radius -HISTORY_MSG_877;Local - LC mask chroma -HISTORY_MSG_878;Local - LC mask curve contrast -HISTORY_MSG_879;Local - LC Chroma levels -HISTORY_MSG_880;Local - LC Chroma blur levels -HISTORY_MSG_881;Local - Contrast Offset Luminance -HISTORY_MSG_882;Local - Contrast Blur -HISTORY_MSG_883;Local - Contrast By Level -HISTORY_MSG_884;Local - Contrast Dynamic Range Laplacian -HISTORY_MSG_885;Local - Contrast Dynamic Range Wavelet -HISTORY_MSG_886;Local - Contrast Wavelet Curve Compression -HISTORY_MSG_887;Local - Contrast Wavelet Compression Residual -HISTORY_MSG_888;Local - Contrast Wavelet Balance threshold -HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength -HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle -HISTORY_MSG_891;Local - Contrast Wavelet Graduated -HISTORY_MSG_892;Local - Log Encoding Graduated Strength -HISTORY_MSG_893;Local - Log Encoding Graduated angle -HISTORY_MSG_894;Local - Color Preview dE -HISTORY_MSG_897;Local - Contrast Wavelet ES strength -HISTORY_MSG_898;Local - Contrast Wavelet ES radius -HISTORY_MSG_899;Local - Contrast Wavelet ES detail -HISTORY_MSG_900;Local - Contrast Wavelet ES gradient -HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low -HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high -HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast -HISTORY_MSG_904;Local - Contrast Wavelet ES first level -HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness -HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity -HISTORY_MSG_907;Local - Contrast Wavelet ES amplification -HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring -HISTORY_MSG_909;Local - Contrast Wavelet ES show -HISTORY_MSG_910;Local - Wavelet Edge performance -HISTORY_MSG_911;Local - Blur Chroma Luma -HISTORY_MSG_912;Local - Blur Guide filter strength -HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR -HISTORY_MSG_914;Local - Blur Wavelet Sigma BL -HISTORY_MSG_915;Local - Edge Wavelet Sigma ED -HISTORY_MSG_916;Local - Residual wavelet shadows -HISTORY_MSG_917;Local - Residual wavelet shadows threshold -HISTORY_MSG_918;Local - Residual wavelet highlights -HISTORY_MSG_919;Local - Residual wavelet highlights threshold -HISTORY_MSG_920;Local - Wavelet sigma LC -HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 -HISTORY_MSG_922;Local - changes In Black and White -HISTORY_MSG_923;Local - Tool complexity mode -HISTORY_MSG_924;Local - Tool complexity mode -HISTORY_MSG_925;Local - Scope color tools -HISTORY_MSG_926;Local - Show mask type -HISTORY_MSG_927;Local - Shadow mask -HISTORY_MSG_928;Local - Common color mask -HISTORY_MSG_929;Local - Mask common scope -HISTORY_MSG_930;Local - Mask Common blend luma -HISTORY_MSG_931;Local - Mask Common enable -HISTORY_MSG_932;Local - Mask Common radius soft -HISTORY_MSG_933;Local - Mask Common laplacian -HISTORY_MSG_934;Local - Mask Common chroma -HISTORY_MSG_935;Local - Mask Common gamma -HISTORY_MSG_936;Local - Mask Common slope -HISTORY_MSG_937;Local - Mask Common curve C(C) -HISTORY_MSG_938;Local - Mask Common curve L(L) -HISTORY_MSG_939;Local - Mask Common curve LC(H) -HISTORY_MSG_940;Local - Mask Common structure as tool -HISTORY_MSG_941;Local - Mask Common structure strength -HISTORY_MSG_942;Local - Mask Common H(H) curve -HISTORY_MSG_943;Local - Mask Common FFT -HISTORY_MSG_944;Local - Mask Common Blur radius -HISTORY_MSG_945;Local - Mask Common contrast threshold -HISTORY_MSG_946;Local - Mask Common shadows -HISTORY_MSG_947;Local - Mask Common Contrast curve -HISTORY_MSG_948;Local - Mask Common Wavelet curve -HISTORY_MSG_949;Local - Mask Common Threshold levels -HISTORY_MSG_950;Local - Mask Common GF strength -HISTORY_MSG_951;Local - Mask Common GF angle -HISTORY_MSG_952;Local - Mask Common soft radius -HISTORY_MSG_953;Local - Mask Common blend chroma -HISTORY_MSG_954;Local - Show-hide tools -HISTORY_MSG_955;Local - Enable Spot -HISTORY_MSG_956;Local - CH Curve -HISTORY_MSG_957;Local - GF local contrast threshold -HISTORY_MSG_958;Local - GF Local contrast Hue equalizer -HISTORY_MSG_959;Local - GF Local contrast levels -HISTORY_MSG_960;Local - GF Local contrast threshold high -HISTORY_MSG_961;Local - Denoise mode -HISTORY_MSG_962;Local - Equalizer hue -HISTORY_MSG_964;Local - Threshold mask denoise -HISTORY_MSG_966;Local - denoise use mask -HISTORY_MSG_967;Local - Spot settings show hide -HISTORY_MSG_BLSHAPE;Blur by level -HISTORY_MSG_BLURCWAV;Blur chroma -HISTORY_MSG_BLURWAV;Blur luminance -HISTORY_MSG_BLUWAV;Attenuation response -HISTORY_MSG_CAT02PRESET;Cat02 automatic preset -HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors -HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction -HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel -HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask -HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask -HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness -HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask -HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List -HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region blur mask -HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset -HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power -HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation -HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask -HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope -HISTORY_MSG_COMPLEX;Wavelet complexity -HISTORY_MSG_COMPLEXRETI;Retinex complexity -HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth -HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only -HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map -HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength -HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold -HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold -HISTORY_MSG_EDGEFFECT;Edge Attenuation response -HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative -HISTORY_MSG_FILMNEGATIVE_FILMBASE;Film base color -HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values -HISTORY_MSG_HISTMATCHING;Auto-matched tone curve -HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries -HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D -HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type -HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma -HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope -HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method -HISTORY_MSG_ILLUM;Illuminant -HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount -HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness -HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast -HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness -HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius -HISTORY_MSG_METADATA_MODE;Metadata copy mode -HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold -HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold -HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius -HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations -HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations -HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius -HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera -HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera -HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera -HISTORY_MSG_PERSP_METHOD;Perspective - Method -HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery -HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation -HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA -HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion -HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction -HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode -HISTORY_MSG_PROTAB;Protection -HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold -HISTORY_MSG_RANGEAB;Range ab -HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations -HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift -HISTORY_MSG_RAW_BORDER;Raw border -HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling -HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius -HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace -HISTORY_MSG_SIGMACOL;Chroma Attenuation response -HISTORY_MSG_SIGMADIR;Dir Attenuation response -HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response -HISTORY_MSG_SIGMATON;Toning Attenuation response -HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light -HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength -HISTORY_MSG_TEMPOUT;CAM02 automatic temperature -HISTORY_MSG_THRESWAV;Balance threshold -HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor -HISTORY_MSG_TRANS_Method;Geometry - Method -HISTORY_MSG_WAVBALCHROM;Equalizer chrominance -HISTORY_MSG_WAVBALLUM;Equalizer luminance -HISTORY_MSG_WAVBL;Blur levels -HISTORY_MSG_WAVCHROMCO;Coarse chroma -HISTORY_MSG_WAVCHROMFI;Fine chroma -HISTORY_MSG_WAVCLARI;Clarity -HISTORY_MSG_WAVDENLH;Level 5 -HISTORY_MSG_WAVDENOISE;Local contrast -HISTORY_MSG_WAVDENOISEH;High level Local contrast -HISTORY_MSG_WAVDENMET;Local equalizer -HISTORY_MSG_WAVDETEND;Details soft -HISTORY_MSG_WAVEDGS;Edge stopping -HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer -HISTORY_MSG_WAVHUE;Equalizer hue -HISTORY_MSG_WAVLEVDEN;High level local contrast -HISTORY_MSG_WAVLEVSIGM;Radius -HISTORY_MSG_WAVLIMDEN;Interaction 56 14 -HISTORY_MSG_WAVLOWTHR;Threshold low contrast -HISTORY_MSG_WAVMERGEC;Merge C -HISTORY_MSG_WAVMERGEL;Merge L -HISTORY_MSG_WAVMIXMET;Reference local contrast -HISTORY_MSG_WAVOFFSET;Offset -HISTORY_MSG_WAVOLDSH;Old algorithm -HISTORY_MSG_WAVQUAMET;Denoise mode -HISTORY_MSG_WAVRADIUS;Radius shadows-highlights -HISTORY_MSG_WAVSCALE;Scale -HISTORY_MSG_WAVSHOWMASK;Show wavelet mask -HISTORY_MSG_WAVSIGMA;Attenuation response -HISTORY_MSG_WAVSIGM;Sigma -HISTORY_MSG_WAVSOFTRAD;Soft radius clarity -HISTORY_MSG_WAVSOFTRADEND;Soft radius final -HISTORY_MSG_WAVSLIMET;Method -HISTORY_MSG_WAVTHRDEN;Threshold local contrast -HISTORY_MSG_WAVTHREND;Threshold local contrast -HISTORY_MSG_WAVSTREND;Strength soft -HISTORY_MSG_WAVUSHAMET;Clarity method -HISTORY_NEWSNAPSHOT;Add -HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s -HISTORY_SNAPSHOT;Snapshot -HISTORY_SNAPSHOTS;Snapshots -ICCPROFCREATOR_COPYRIGHT;Copyright: -ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" -ICCPROFCREATOR_CUSTOM;Custom -ICCPROFCREATOR_DESCRIPTION;Description: -ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description -ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. -ICCPROFCREATOR_GAMMA;Gamma -ICCPROFCREATOR_ICCVERSION;ICC version: -ICCPROFCREATOR_ILL;Illuminant: -ICCPROFCREATOR_ILL_41;D41 -ICCPROFCREATOR_ILL_50;D50 -ICCPROFCREATOR_ILL_55;D55 -ICCPROFCREATOR_ILL_60;D60 -ICCPROFCREATOR_ILL_65;D65 -ICCPROFCREATOR_ILL_80;D80 -ICCPROFCREATOR_ILL_DEF;Default -ICCPROFCREATOR_ILL_INC;StdA 2856K -ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. -ICCPROFCREATOR_PRIMARIES;Primaries: -ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 -ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 -ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) -ICCPROFCREATOR_PRIM_BEST;BestRGB -ICCPROFCREATOR_PRIM_BETA;BetaRGB -ICCPROFCREATOR_PRIM_BLUX;Blue X -ICCPROFCREATOR_PRIM_BLUY;Blue Y -ICCPROFCREATOR_PRIM_BRUCE;BruceRGB -ICCPROFCREATOR_PRIM_GREX;Green X -ICCPROFCREATOR_PRIM_GREY;Green Y -ICCPROFCREATOR_PRIM_PROPH;Prophoto -ICCPROFCREATOR_PRIM_REC2020;Rec2020 -ICCPROFCREATOR_PRIM_REDX;Red X -ICCPROFCREATOR_PRIM_REDY;Red Y -ICCPROFCREATOR_PRIM_SRGB;sRGB -ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. -ICCPROFCREATOR_PRIM_WIDEG;Widegamut -ICCPROFCREATOR_PROF_V2;ICC v2 -ICCPROFCREATOR_PROF_V4;ICC v4 -ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... -ICCPROFCREATOR_SLOPE;Slope -ICCPROFCREATOR_TRC_PRESET;Tone response curve: -IPTCPANEL_CATEGORY;Category -IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. -IPTCPANEL_CITY;City -IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. -IPTCPANEL_COPYHINT;Copy IPTC settings to clipboard. -IPTCPANEL_COPYRIGHT;Copyright notice -IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as ©2008 Jane Doe. -IPTCPANEL_COUNTRY;Country -IPTCPANEL_COUNTRYHINT;Enter the name of the country pictured in this image. -IPTCPANEL_CREATOR;Creator -IPTCPANEL_CREATORHINT;Enter the name of the person that created this image. -IPTCPANEL_CREATORJOBTITLE;Creator's job title -IPTCPANEL_CREATORJOBTITLEHINT;Enter the Job Title of the person listed in the Creator field. -IPTCPANEL_CREDIT;Credit line -IPTCPANEL_CREDITHINT;Enter who should be credited when this image is published. -IPTCPANEL_DATECREATED;Date created -IPTCPANEL_DATECREATEDHINT;Enter the Date the image was taken. -IPTCPANEL_DESCRIPTION;Description -IPTCPANEL_DESCRIPTIONHINT;Enter a "caption" describing the who, what, and why of what is happening in this image, this might include names of people, and/or their role in the action that is taking place within the image. -IPTCPANEL_DESCRIPTIONWRITER;Description writer -IPTCPANEL_DESCRIPTIONWRITERHINT;Enter the name of the person involved in writing, editing or correcting the description of the image. -IPTCPANEL_EMBEDDED;Embedded -IPTCPANEL_EMBEDDEDHINT;Reset to IPTC data embedded in the image file. -IPTCPANEL_HEADLINE;Headline -IPTCPANEL_HEADLINEHINT;Enter a brief publishable synopsis or summary of the contents of the image. -IPTCPANEL_INSTRUCTIONS;Instructions -IPTCPANEL_INSTRUCTIONSHINT;Enter information about embargoes, or other restrictions not covered by the Copyright field. -IPTCPANEL_KEYWORDS;Keywords -IPTCPANEL_KEYWORDSHINT;Enter any number of keywords, terms or phrases used to express the subject matter in the image. -IPTCPANEL_PASTEHINT;Paste IPTC settings from clipboard. -IPTCPANEL_PROVINCE;Province or state -IPTCPANEL_PROVINCEHINT;Enter the name of the province or state pictured in this image. -IPTCPANEL_RESET;Reset -IPTCPANEL_RESETHINT;Reset to profile default. -IPTCPANEL_SOURCE;Source -IPTCPANEL_SOURCEHINT;Enter or edit the name of a person or party who has a role in the content supply chain, such as a person or entity from whom you received this image from. -IPTCPANEL_SUPPCATEGORIES;Supplemental categories -IPTCPANEL_SUPPCATEGORIESHINT;Further refines the subject of the image. -IPTCPANEL_TITLE;Title -IPTCPANEL_TITLEHINT;Enter a short verbal and human readable name for the image, this may be the file name. -IPTCPANEL_TRANSREFERENCE;Job ID -IPTCPANEL_TRANSREFERENCEHINT;Enter a number or identifier needed for workflow control or tracking. -MAIN_BUTTON_FULLSCREEN;Fullscreen -MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator -MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 -MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 -MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). -MAIN_BUTTON_PREFERENCES;Preferences -MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s -MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor -MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e -MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m -MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen -MAIN_FRAME_EDITOR;Editor -MAIN_FRAME_EDITOR_TOOLTIP;Editor.\nShortcut: Ctrl-F4 -MAIN_FRAME_FILEBROWSER;File Browser -MAIN_FRAME_FILEBROWSER_TOOLTIP;File browser.\nShortcut: Ctrl-F2 -MAIN_FRAME_PLACES;Places -MAIN_FRAME_PLACES_ADD;Add -MAIN_FRAME_PLACES_DEL;Remove -MAIN_FRAME_QUEUE;Queue -MAIN_FRAME_QUEUE_TOOLTIP;Processing queue.\nShortcut: Ctrl-F3 -MAIN_FRAME_RECENT;Recent Folders -MAIN_MSG_ALREADYEXISTS;File already exists. -MAIN_MSG_CANNOTLOAD;Cannot load image -MAIN_MSG_CANNOTSAVE;File saving error -MAIN_MSG_CANNOTSTARTEDITOR;Cannot start editor. -MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Please set the correct path in Preferences. -MAIN_MSG_EMPTYFILENAME;Filename unspecified! -MAIN_MSG_IMAGEUNPROCESSED;This command requires all selected images to be queue-processed first. -MAIN_MSG_NAVIGATOR;Navigator -MAIN_MSG_OPERATIONCANCELLED;Operation cancelled -MAIN_MSG_PATHDOESNTEXIST;The path\n\n%1\n\ndoes not exist. Please set a correct path in Preferences. -MAIN_MSG_QOVERWRITE;Do you want to overwrite it? -MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! -MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. -MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. -MAIN_TAB_ADVANCED;Advanced -MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a -MAIN_TAB_COLOR;Color -MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c -MAIN_TAB_DETAIL;Detail -MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d -MAIN_TAB_DEVELOP; Batch Edit -MAIN_TAB_EXIF;Exif -MAIN_TAB_EXPORT; Fast Export -MAIN_TAB_EXPOSURE;Exposure -MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e -MAIN_TAB_FAVORITES;Favorites -MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u -MAIN_TAB_FILTER; Filter -MAIN_TAB_INSPECT; Inspect -MAIN_TAB_IPTC;IPTC -MAIN_TAB_LOCALLAB;Local -MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o -MAIN_TAB_METADATA;Metadata -MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m -MAIN_TAB_RAW;Raw -MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r -MAIN_TAB_TRANSFORM;Transform -MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: theme-based\nShortcut: 9 -MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: black\nShortcut: 9 -MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: white\nShortcut: 9 -MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 -MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool. -MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: l -MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: > -MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: < -MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b -MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. -MAIN_TOOLTIP_PREVIEWG;Preview the green channel.\nShortcut: g -MAIN_TOOLTIP_PREVIEWL;Preview the luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B -MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r -MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. -MAIN_TOOLTIP_QINFO;Quick info on the image.\nShortcut: i -MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l -MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l -MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l -MAIN_TOOLTIP_THRESHOLD;Threshold -MAIN_TOOLTIP_TOGGLE;Toggle the Before/After view.\nShortcut: Shift-b -MONITOR_PROFILE_SYSTEM;System default -NAVIGATOR_B;B: -NAVIGATOR_G;G: -NAVIGATOR_H;H: -NAVIGATOR_LAB_A;a*: -NAVIGATOR_LAB_B;b*: -NAVIGATOR_LAB_L;L*: -NAVIGATOR_NA; -- -NAVIGATOR_R;R: -NAVIGATOR_S;S: -NAVIGATOR_V;V: -NAVIGATOR_XY_FULL;Width: %1, Height: %2 -NAVIGATOR_XY_NA;x: --, y: -- -OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. -OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. -OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. -PARTIALPASTE_ADVANCEDGROUP;Advanced Settings -PARTIALPASTE_BASICGROUP;Basic Settings -PARTIALPASTE_CACORRECTION;Chromatic aberration correction -PARTIALPASTE_CHANNELMIXER;Channel mixer -PARTIALPASTE_CHANNELMIXERBW;Black-and-white -PARTIALPASTE_COARSETRANS;Coarse rotation/flipping -PARTIALPASTE_COLORAPP;CIECAM02 -PARTIALPASTE_COLORGROUP;Color Related Settings -PARTIALPASTE_COLORTONING;Color toning -PARTIALPASTE_COMMONTRANSFORMPARAMS;Auto-fill -PARTIALPASTE_COMPOSITIONGROUP;Composition Settings -PARTIALPASTE_CROP;Crop -PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection -PARTIALPASTE_DARKFRAMEFILE;Dark-frame file -PARTIALPASTE_DEFRINGE;Defringe -PARTIALPASTE_DEHAZE;Haze removal -PARTIALPASTE_DETAILGROUP;Detail Settings -PARTIALPASTE_DIALOGLABEL;Partial paste processing profile -PARTIALPASTE_DIRPYRDENOISE;Noise reduction -PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels -PARTIALPASTE_DISTORTION;Distortion correction -PARTIALPASTE_EPD;Tone mapping -PARTIALPASTE_EQUALIZER;Wavelet levels -PARTIALPASTE_EVERYTHING;Everything -PARTIALPASTE_EXIFCHANGES;Exif -PARTIALPASTE_EXPOSURE;Exposure -PARTIALPASTE_FILMNEGATIVE;Film Negative -PARTIALPASTE_FILMSIMULATION;Film simulation -PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field auto-selection -PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field blur radius -PARTIALPASTE_FLATFIELDBLURTYPE;Flat-field blur type -PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control -PARTIALPASTE_FLATFIELDFILE;Flat-field file -PARTIALPASTE_GRADIENT;Graduated filter -PARTIALPASTE_HSVEQUALIZER;HSV equalizer -PARTIALPASTE_ICMSETTINGS;Color management settings -PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction -PARTIALPASTE_IPTCINFO;IPTC -PARTIALPASTE_LABCURVE;L*a*b* adjustments -PARTIALPASTE_LENSGROUP;Lens Related Settings -PARTIALPASTE_LENSPROFILE;Profiled lens correction -PARTIALPASTE_LOCALCONTRAST;Local contrast -PARTIALPASTE_LOCALLAB;Local Adjustments -PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings -PARTIALPASTE_LOCGROUP;Local -PARTIALPASTE_METADATA;Metadata mode -PARTIALPASTE_METAGROUP;Metadata settings -PARTIALPASTE_PCVIGNETTE;Vignette filter -PARTIALPASTE_PERSPECTIVE;Perspective -PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter -PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration -PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter -PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter -PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -PARTIALPASTE_PREPROCWB;Preprocess White Balance -PARTIALPASTE_PRSHARPENING;Post-resize sharpening -PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction -PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift -PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue -PARTIALPASTE_RAWEXPOS_BLACK;Black levels -PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -PARTIALPASTE_RAWGROUP;Raw Settings -PARTIALPASTE_RAW_BORDER;Raw border -PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement -PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations -PARTIALPASTE_RAW_DMETHOD;Demosaic method -PARTIALPASTE_RAW_FALSECOLOR;False color suppression -PARTIALPASTE_RAW_IMAGENUM;Sub-image -PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift -PARTIALPASTE_RESIZE;Resize -PARTIALPASTE_RETINEX;Retinex -PARTIALPASTE_RGBCURVES;RGB curves -PARTIALPASTE_ROTATION;Rotation -PARTIALPASTE_SHADOWSHIGHLIGHTS;Shadows/highlights -PARTIALPASTE_SHARPENEDGE;Edges -PARTIALPASTE_SHARPENING;Sharpening (USM/RL) -PARTIALPASTE_SHARPENMICRO;Microcontrast -PARTIALPASTE_SOFTLIGHT;Soft light -PARTIALPASTE_TM_FATTAL;Dynamic range compression -PARTIALPASTE_VIBRANCE;Vibrance -PARTIALPASTE_VIGNETTING;Vignetting correction -PARTIALPASTE_WHITEBALANCE;White balance -PREFERENCES_ADD;Add -PREFERENCES_APPEARANCE;Appearance -PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font -PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color -PREFERENCES_APPEARANCE_MAINFONT;Main font -PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color -PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode -PREFERENCES_APPEARANCE_THEME;Theme -PREFERENCES_APPLNEXTSTARTUP;restart required -PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit -PREFERENCES_BATCH_PROCESSING;Batch Processing -PREFERENCES_BEHADDALL;All to 'Add' -PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. -PREFERENCES_BEHAVIOR;Behavior -PREFERENCES_BEHSETALL;All to 'Set' -PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. -PREFERENCES_CACHECLEAR;Clear -PREFERENCES_CACHECLEAR_ALL;Clear all cached files: -PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: -PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: -PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. -PREFERENCES_CACHEMAXENTRIES;Maximum number of cache entries -PREFERENCES_CACHEOPTS;Cache Options -PREFERENCES_CACHETHUMBHEIGHT;Maximum thumbnail height -PREFERENCES_CHUNKSIZES;Tiles per thread -PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaic -PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA correction -PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic -PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic -PREFERENCES_CHUNKSIZE_RGB;RGB processing -PREFERENCES_CLIPPINGIND;Clipping Indication -PREFERENCES_CLUTSCACHE;HaldCLUT Cache -PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs -PREFERENCES_CLUTSDIR;HaldCLUT directory -PREFERENCES_CMMBPC;Black point compensation -PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments -PREFERENCES_COMPLEXITY_EXP;Advanced -PREFERENCES_COMPLEXITY_NORM;Standard -PREFERENCES_COMPLEXITY_SIMP;Basic -PREFERENCES_CROP;Crop Editing -PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop -PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop -PREFERENCES_CROP_GUIDES_FRAME;Frame -PREFERENCES_CROP_GUIDES_FULL;Original -PREFERENCES_CROP_GUIDES_NONE;None -PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons -PREFERENCES_CURVEBBOXPOS_ABOVE;Above -PREFERENCES_CURVEBBOXPOS_BELOW;Below -PREFERENCES_CURVEBBOXPOS_LEFT;Left -PREFERENCES_CURVEBBOXPOS_RIGHT;Right -PREFERENCES_CUSTPROFBUILD;Custom Processing Profile Builder -PREFERENCES_CUSTPROFBUILDHINT;Executable (or script) file called when a new initial processing profile should be generated for an image.\n\nThe path of the communication file (*.ini style, a.k.a. "Keyfile") is added as a command line parameter. It contains various parameters required for the scripts and image Exif to allow a rules-based processing profile generation.\n\nWARNING: You are responsible for using double quotes where necessary if you're using paths containing spaces. -PREFERENCES_CUSTPROFBUILDKEYFORMAT;Keys format -PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name -PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID -PREFERENCES_CUSTPROFBUILDPATH;Executable path -PREFERENCES_DARKFRAMEFOUND;Found -PREFERENCES_DARKFRAMESHOTS;shots -PREFERENCES_DARKFRAMETEMPLATES;templates -PREFERENCES_DATEFORMAT;Date format -PREFERENCES_DATEFORMATHINT;You can use the following formatting strings:\n%y - year\n%m - month\n%d - day\n\nFor example, the ISO 8601 standard dictates the date format as follows:\n%y-%m-%d -PREFERENCES_DIRDARKFRAMES;Dark-frames directory -PREFERENCES_DIRECTORIES;Directories -PREFERENCES_DIRHOME;Home directory -PREFERENCES_DIRLAST;Last visited directory -PREFERENCES_DIROTHER;Other -PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... -PREFERENCES_DIRSOFTWARE;Installation directory -PREFERENCES_EDITORCMDLINE;Custom command line -PREFERENCES_EDITORLAYOUT;Editor layout -PREFERENCES_EXTERNALEDITOR;External Editor -PREFERENCES_FBROWSEROPTS;File Browser / Thumbnail Options -PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser -PREFERENCES_FLATFIELDFOUND;Found -PREFERENCES_FLATFIELDSDIR;Flat-fields directory -PREFERENCES_FLATFIELDSHOTS;shots -PREFERENCES_FLATFIELDTEMPLATES;templates -PREFERENCES_FORIMAGE;For non-raw photos -PREFERENCES_FORRAW;For raw photos -PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser -PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser. -PREFERENCES_GIMPPATH;GIMP installation directory -PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogram in left panel -PREFERENCES_HISTOGRAM_TOOLTIP;If enabled, the working profile is used for rendering the main histogram and the Navigator panel, otherwise the gamma-corrected output profile is used. -PREFERENCES_HLTHRESHOLD;Threshold for clipped highlights -PREFERENCES_ICCDIR;Directory containing color profiles -PREFERENCES_IMPROCPARAMS;Default Processing Profile -PREFERENCES_INSPECT_LABEL;Inspect -PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Maximum number of cached images -PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Set the maximum number of images stored in cache when hovering over them in the File Browser; systems with little RAM (2GB) should keep this value set to 1 or 2. -PREFERENCES_INTENT_ABSOLUTE;Absolute Colorimetric -PREFERENCES_INTENT_PERCEPTUAL;Perceptual -PREFERENCES_INTENT_RELATIVE;Relative Colorimetric -PREFERENCES_INTENT_SATURATION;Saturation -PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited -PREFERENCES_LANG;Language -PREFERENCES_LANGAUTODETECT;Use system language -PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" -PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" -PREFERENCES_MENUGROUPLABEL;Group "Color label" -PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing profile operations" -PREFERENCES_MENUGROUPRANK;Group "Rank" -PREFERENCES_MENUOPTIONS;Context Menu Options -PREFERENCES_MONINTENT;Default rendering intent -PREFERENCES_MONITOR;Monitor -PREFERENCES_MONPROFILE;Default color profile -PREFERENCES_MONPROFILE_WARNOSX;Due to MacOS limitations, only sRGB is supported. -PREFERENCES_MULTITAB;Multiple Editor Tabs Mode -PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -PREFERENCES_NAVIGATIONFRAME;Navigation -PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser -PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel -PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files -PREFERENCES_PANFACTORLABEL;Pan rate amplification -PREFERENCES_PARSEDEXT;Parsed Extensions -PREFERENCES_PARSEDEXTADD;Add extension -PREFERENCES_PARSEDEXTADDHINT;Add entered extension to the list. -PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list. -PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. -PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. -PREFERENCES_PERFORMANCE_MEASURE;Measure -PREFERENCES_PERFORMANCE_MEASURE_HINT;Logs processing times in console -PREFERENCES_PERFORMANCE_THREADS;Threads -PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) -PREFERENCES_PREVDEMO;Preview Demosaic Method -PREFERENCES_PREVDEMO_FAST;Fast -PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: -PREFERENCES_PREVDEMO_SIDECAR;As in PP3 -PREFERENCES_PRINTER;Printer (Soft-Proofing) -PREFERENCES_PROFILEHANDLING;Processing Profile Handling -PREFERENCES_PROFILELOADPR;Processing profile loading priority -PREFERENCES_PROFILEPRCACHE;Profile in cache -PREFERENCES_PROFILEPRFILE;Profile next to the input file -PREFERENCES_PROFILESAVEBOTH;Save processing profile both to the cache and next to the input file -PREFERENCES_PROFILESAVECACHE;Save processing profile to the cache -PREFERENCES_PROFILESAVEINPUT;Save processing profile next to the input file -PREFERENCES_PROFILESAVELOCATION;Processing profile saving location -PREFERENCES_PROFILE_NONE;None -PREFERENCES_PROPERTY;Property -PREFERENCES_PRTINTENT;Rendering intent -PREFERENCES_PRTPROFILE;Color profile -PREFERENCES_PSPATH;Adobe Photoshop installation directory -PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset -PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now -PREFERENCES_SELECTLANG;Select language -PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings -PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files -PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. -PREFERENCES_SET;Set -PREFERENCES_SHOWBASICEXIF;Show basic Exif info -PREFERENCES_SHOWDATETIME;Show date and time -PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar -PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips -PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows -PREFERENCES_SINGLETAB;Single Editor Tab Mode -PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. -PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -PREFERENCES_SND_QUEUEDONE;Queue processing done -PREFERENCES_SND_THRESHOLDSECS;After seconds -PREFERENCES_STARTUPIMDIR;Image Directory at Startup -PREFERENCES_TAB_BROWSER;File Browser -PREFERENCES_TAB_COLORMGR;Color Management -PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -PREFERENCES_TAB_GENERAL;General -PREFERENCES_TAB_IMPROC;Image Processing -PREFERENCES_TAB_PERFORMANCE;Performance -PREFERENCES_TAB_SOUND;Sounds -PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview -PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show -PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering -PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise -PREFERENCES_TP_LABEL;Tool panel: -PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar -PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles -PREFERENCES_WORKFLOW;Layout -PROFILEPANEL_COPYPPASTE;Parameters to copy -PROFILEPANEL_GLOBALPROFILES;Bundled profiles -PROFILEPANEL_LABEL;Processing Profiles -PROFILEPANEL_LOADDLGLABEL;Load Processing Parameters... -PROFILEPANEL_LOADPPASTE;Parameters to load -PROFILEPANEL_MODE_TIP;Processing profile fill mode.\n\nButton pressed: partial profiles will be converted to full profiles; the missing values will be replaced with hard-coded defaults.\n\nButton released: profiles will be applied as they are, altering only those values which they contain. -PROFILEPANEL_MYPROFILES;My profiles -PROFILEPANEL_PASTEPPASTE;Parameters to paste -PROFILEPANEL_PCUSTOM;Custom -PROFILEPANEL_PDYNAMIC;Dynamic -PROFILEPANEL_PFILE;From file -PROFILEPANEL_PINTERNAL;Neutral -PROFILEPANEL_PLASTSAVED;Last Saved -PROFILEPANEL_SAVEDLGLABEL;Save Processing Parameters... -PROFILEPANEL_SAVEPPASTE;Parameters to save -PROFILEPANEL_TOOLTIPCOPY;Copy current processing profile to clipboard.\nCtrl-click to select the parameters to copy. -PROFILEPANEL_TOOLTIPLOAD;Load a profile from file.\nCtrl-click to select the parameters to load. -PROFILEPANEL_TOOLTIPPASTE;Paste profile from clipboard.\nCtrl-click to select the parameters to paste. -PROFILEPANEL_TOOLTIPSAVE;Save current profile.\nCtrl-click to select the parameters to save. -PROGRESSBAR_DECODING;Decoding... -PROGRESSBAR_GREENEQUIL;Green equilibration... -PROGRESSBAR_HLREC;Highlight reconstruction... -PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... -PROGRESSBAR_LINEDENOISE;Line noise filter... -PROGRESSBAR_LOADING;Loading image... -PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... -PROGRESSBAR_LOADJPEG;Loading JPEG file... -PROGRESSBAR_LOADPNG;Loading PNG file... -PROGRESSBAR_LOADTIFF;Loading TIFF file... -PROGRESSBAR_NOIMAGES;No images found -PROGRESSBAR_PROCESSING;Processing image... -PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved -PROGRESSBAR_RAWCACORR;Raw CA correction... -PROGRESSBAR_READY;Ready -PROGRESSBAR_SAVEJPEG;Saving JPEG file... -PROGRESSBAR_SAVEPNG;Saving PNG file... -PROGRESSBAR_SAVETIFF;Saving TIFF file... -PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added -PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser -QINFO_FRAMECOUNT;%2 frames -QINFO_HDR;HDR / %2 frame(s) -QINFO_ISO;ISO -QINFO_NOEXIF;Exif data not available. -QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) -QUEUE_AUTOSTART;Auto-start -QUEUE_AUTOSTART_TOOLTIP;Start processing automatically when a new job arrives. -QUEUE_DESTFILENAME;Path and file name -QUEUE_FORMAT_TITLE;File Format -QUEUE_LOCATION_FOLDER;Save to folder -QUEUE_LOCATION_TEMPLATE;Use template -QUEUE_LOCATION_TEMPLATE_TOOLTIP;Specify the output location based on the source photo's location, rank, trash status or position in the queue.\n\nUsing the following pathname as an example:\n/home/tom/photos/2010-10-31/photo1.raw\nthe meaning of the formatting strings follows:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = photo1\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\n%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used.\n\n%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'.\n\nIf you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p2/converted/%d1/%f -QUEUE_LOCATION_TITLE;Output Location -QUEUE_STARTSTOP_TOOLTIP;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s -SAMPLEFORMAT_0;Unknown data format -SAMPLEFORMAT_1;8-bit unsigned -SAMPLEFORMAT_2;16-bit unsigned -SAMPLEFORMAT_4;24-bit LogLuv -SAMPLEFORMAT_8;32-bit LogLuv -SAMPLEFORMAT_16;16-bit floating-point -SAMPLEFORMAT_32;24-bit floating-point -SAMPLEFORMAT_64;32-bit floating-point -SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists -SAVEDLG_FILEFORMAT;File format -SAVEDLG_FILEFORMAT_FLOAT; floating-point -SAVEDLG_FORCEFORMATOPTS;Force saving options -SAVEDLG_JPEGQUAL;JPEG quality -SAVEDLG_PUTTOQUEUE;Put into processing queue -SAVEDLG_PUTTOQUEUEHEAD;Put to the head of the processing queue -SAVEDLG_PUTTOQUEUETAIL;Put to the end of the processing queue -SAVEDLG_SAVEIMMEDIATELY;Save immediately -SAVEDLG_SAVESPP;Save processing parameters with image -SAVEDLG_SUBSAMP;Subsampling -SAVEDLG_SUBSAMP_1;Best compression -SAVEDLG_SUBSAMP_2;Balanced -SAVEDLG_SUBSAMP_3;Best quality -SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. -SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF -SAVEDLG_WARNFILENAME;File will be named -SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. -SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. -THRESHOLDSELECTOR_B;Bottom -THRESHOLDSELECTOR_BL;Bottom-left -THRESHOLDSELECTOR_BR;Bottom-right -THRESHOLDSELECTOR_HINT;Hold the Shift key to move individual control points. -THRESHOLDSELECTOR_T;Top -THRESHOLDSELECTOR_TL;Top-left -THRESHOLDSELECTOR_TR;Top-right -TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. -TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop using Shift+mouse drag. -TOOLBAR_TOOLTIP_HAND;Hand tool.\nShortcut: h -TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image preview. Angle of rotation will be shown next to the guide line. Center of rotation is the geometrical center of the image. -TOOLBAR_TOOLTIP_WB;Spot white balance.\nShortcut: w -TP_BWMIX_ALGO;Algorithm OYCPM -TP_BWMIX_ALGO_LI;Linear -TP_BWMIX_ALGO_SP;Special effects -TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. -TP_BWMIX_AUTOCH;Auto -TP_BWMIX_CC_ENABLED;Adjust complementary color -TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. -TP_BWMIX_CHANNEL;Luminance equalizer -TP_BWMIX_CURVEEDITOR1;'Before' curve -TP_BWMIX_CURVEEDITOR2;'After' curve -TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Tone curve, after B&W conversion, at the end of treatment. -TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Tone curve, just before B&W conversion.\nMay take into account the color components. -TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H).\nPay attention to extreme values as they may cause artifacts. -TP_BWMIX_FILTER;Color Filter -TP_BWMIX_FILTER_BLUE;Blue -TP_BWMIX_FILTER_BLUEGREEN;Blue-Green -TP_BWMIX_FILTER_GREEN;Green -TP_BWMIX_FILTER_GREENYELLOW;Green-Yellow -TP_BWMIX_FILTER_NONE;None -TP_BWMIX_FILTER_PURPLE;Purple -TP_BWMIX_FILTER_RED;Red -TP_BWMIX_FILTER_REDYELLOW;Red-Yellow -TP_BWMIX_FILTER_TOOLTIP;The color filter simulates shots taken with a colored filter placed in front of the lens. Colored filters reduce the transmission of specific color ranges and therefore affect their lightness. E.g. a red filter darkens blue skies. -TP_BWMIX_FILTER_YELLOW;Yellow -TP_BWMIX_GAMMA;Gamma Correction -TP_BWMIX_GAM_TOOLTIP;Correct gamma for each RGB channel. -TP_BWMIX_LABEL;Black-and-White -TP_BWMIX_MET;Method -TP_BWMIX_MET_CHANMIX;Channel Mixer -TP_BWMIX_MET_DESAT;Desaturation -TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -TP_BWMIX_MIXC;Channel Mixer -TP_BWMIX_NEUTRAL;Reset -TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% -TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. -TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. -TP_BWMIX_SETTING;Presets -TP_BWMIX_SETTING_TOOLTIP;Different presets (film, landscape, etc.) or manual Channel Mixer settings. -TP_BWMIX_SET_HIGHCONTAST;High contrast -TP_BWMIX_SET_HIGHSENSIT;High Sensitivity -TP_BWMIX_SET_HYPERPANCHRO;Hyper Panchromatic -TP_BWMIX_SET_INFRARED;Infrared -TP_BWMIX_SET_LANDSCAPE;Landscape -TP_BWMIX_SET_LOWSENSIT;Low Sensitivity -TP_BWMIX_SET_LUMINANCE;Luminance -TP_BWMIX_SET_NORMCONTAST;Normal Contrast -TP_BWMIX_SET_ORTHOCHRO;Orthochromatic -TP_BWMIX_SET_PANCHRO;Panchromatic -TP_BWMIX_SET_PORTRAIT;Portrait -TP_BWMIX_SET_RGBABS;Absolute RGB -TP_BWMIX_SET_RGBREL;Relative RGB -TP_BWMIX_SET_ROYGCBPMABS;Absolute ROYGCBPM -TP_BWMIX_SET_ROYGCBPMREL;Relative ROYGCBPM -TP_BWMIX_TCMODE_FILMLIKE;B&W Film-like -TP_BWMIX_TCMODE_SATANDVALBLENDING;B&W Saturation and Value Blending -TP_BWMIX_TCMODE_STANDARD;B&W Standard -TP_BWMIX_TCMODE_WEIGHTEDSTD;B&W Weighted Standard -TP_BWMIX_VAL;L -TP_CACORRECTION_BLUE;Blue -TP_CACORRECTION_LABEL;Chromatic Aberration Correction -TP_CACORRECTION_RED;Red -TP_CBDL_AFT;After Black-and-White -TP_CBDL_BEF;Before Black-and-White -TP_CBDL_METHOD;Process located -TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. -TP_CHMIXER_BLUE;Blue channel -TP_CHMIXER_GREEN;Green channel -TP_CHMIXER_LABEL;Channel Mixer -TP_CHMIXER_RED;Red channel -TP_COARSETRAF_TOOLTIP_HFLIP;Flip horizontally. -TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Editor Tabs Mode,\nAlt-[ - Single Editor Tab Mode. -TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode. -TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically. -TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance -TP_COLORAPP_ALGO;Algorithm -TP_COLORAPP_ALGO_ALL;All -TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) -TP_COLORAPP_ALGO_JS;Lightness + Saturation (JS) -TP_COLORAPP_ALGO_QM;Brightness + Colorfulness (QM) -TP_COLORAPP_ALGO_TOOLTIP;Lets you choose between parameter subsets or all parameters. -TP_COLORAPP_BADPIXSL;Hot/bad pixel filter -TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. -TP_COLORAPP_BRIGHT;Brightness (Q) -TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. -TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. -TP_COLORAPP_CHROMA;Chroma (C) -TP_COLORAPP_CHROMA_M;Colorfulness (M) -TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. -TP_COLORAPP_CHROMA_S;Saturation (S) -TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. -TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 differs from L*a*b* and RGB chroma. -TP_COLORAPP_CIECAT_DEGREE;CAT02 adaptation -TP_COLORAPP_CONTRAST;Contrast (J) -TP_COLORAPP_CONTRAST_Q;Contrast (Q) -TP_COLORAPP_CONTRAST_Q_TOOLTIP;Differs from L*a*b* and RGB contrast. -TP_COLORAPP_CONTRAST_TOOLTIP;Differs from L*a*b* and RGB contrast. -TP_COLORAPP_CURVEEDITOR1;Tone curve 1 -TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of J or Q after CIECAM02.\n\nJ and Q are not shown in the main histogram panel.\n\nFor final output refer to the main histogram panel. -TP_COLORAPP_CURVEEDITOR2;Tone curve 2 -TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Same usage as with the second exposure tone curve. -TP_COLORAPP_CURVEEDITOR3;Color curve -TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. -TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves -TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] -TP_COLORAPP_GAMUT;Gamut control (L*a*b*) -TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. -TP_COLORAPP_HUE;Hue (h) -TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. -TP_COLORAPP_IL41;D41 -TP_COLORAPP_IL50;D50 -TP_COLORAPP_IL55;D55 -TP_COLORAPP_IL60;D60 -TP_COLORAPP_IL65;D65 -TP_COLORAPP_IL75;D75 -TP_COLORAPP_ILA;Incandescent StdA 2856K -TP_COLORAPP_ILFREE;Free -TP_COLORAPP_ILLUM;Illuminant -TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and lattitude. -TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 -TP_COLORAPP_LABEL_CAM02;Image Adjustments -TP_COLORAPP_LABEL_SCENE;Scene Conditions -TP_COLORAPP_LABEL_VIEWING;Viewing Conditions -TP_COLORAPP_LIGHT;Lightness (J) -TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. -TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) -TP_COLORAPP_MODEL;WP Model -TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. -TP_COLORAPP_NEUTRAL;Reset -TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -TP_COLORAPP_PRESETCAT02;Preset cat02 automatic -TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou can change illuminant shooting conditions.\nYou must change Cat02 adaptation Viewing conditions if need.\nYou can change Temperature and Tint Viewing conditions if need, and other settings if need. -TP_COLORAPP_RSTPRO;Red & skin-tones protection -TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -TP_COLORAPP_SURROUND;Surround -TP_COLORAPP_SURROUND_AVER;Average -TP_COLORAPP_SURROUND_DARK;Dark -TP_COLORAPP_SURROUND_DIM;Dim -TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) -TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. -TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness -TP_COLORAPP_TCMODE_CHROMA;Chroma -TP_COLORAPP_TCMODE_COLORF;Colorfulness -TP_COLORAPP_TCMODE_LABEL1;Curve mode 1 -TP_COLORAPP_TCMODE_LABEL2;Curve mode 2 -TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode -TP_COLORAPP_TCMODE_LIGHTNESS;Lightness -TP_COLORAPP_TCMODE_SATUR;Saturation -TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 -TP_COLORAPP_TEMPOUT_TOOLTIP;Disable to change temperature and tint -TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 -TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 -TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. -TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). -TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] -TP_COLORAPP_WBRT;WB [RT] + [output] -TP_COLORTONING_AB;o C/L -TP_COLORTONING_AUTOSAT;Automatic -TP_COLORTONING_BALANCE;Balance -TP_COLORTONING_BY;o C/L -TP_COLORTONING_CHROMAC;Opacity -TP_COLORTONING_COLOR;Color -TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Chroma opacity as a function of luminance oC=f(L) -TP_COLORTONING_HIGHLIGHT;Highlights -TP_COLORTONING_HUE;Hue -TP_COLORTONING_LAB;L*a*b* blending -TP_COLORTONING_LABEL;Color Toning -TP_COLORTONING_LABGRID;L*a*b* color correction grid -TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 -TP_COLORTONING_LABREGIONS;Color correction regions -TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 -TP_COLORTONING_LABREGION_CHANNEL;Channel -TP_COLORTONING_LABREGION_CHANNEL_ALL;All -TP_COLORTONING_LABREGION_CHANNEL_B;Blue -TP_COLORTONING_LABREGION_CHANNEL_G;Green -TP_COLORTONING_LABREGION_CHANNEL_R;Red -TP_COLORTONING_LABREGION_CHROMATICITYMASK;C -TP_COLORTONING_LABREGION_HUEMASK;H -TP_COLORTONING_LABREGION_LIGHTNESS;Lightness -TP_COLORTONING_LABREGION_LIGHTNESSMASK;L -TP_COLORTONING_LABREGION_LIST_TITLE;Correction -TP_COLORTONING_LABREGION_MASK;Mask -TP_COLORTONING_LABREGION_MASKBLUR;Blur Mask -TP_COLORTONING_LABREGION_OFFSET;Offset -TP_COLORTONING_LABREGION_POWER;Power -TP_COLORTONING_LABREGION_SATURATION;Saturation -TP_COLORTONING_LABREGION_SHOWMASK;Show mask -TP_COLORTONING_LABREGION_SLOPE;Slope -TP_COLORTONING_LUMA;Luminance -TP_COLORTONING_LUMAMODE;Preserve luminance -TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. -TP_COLORTONING_METHOD;Method -TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* blending", "RGB sliders" and "RGB curves" use interpolated color blending.\n"Color balance (Shadows/Midtones/Highlights)" and "Saturation 2 colors" use direct colors.\n\nThe Black-and-White tool can be enabled when using any color toning method, which allows for color toning. -TP_COLORTONING_MIDTONES;Midtones -TP_COLORTONING_NEUTRAL;Reset sliders -TP_COLORTONING_NEUTRAL_TIP;Reset all values (Shadows, Midtones, Highlights) to default. -TP_COLORTONING_OPACITY;Opacity -TP_COLORTONING_RGBCURVES;RGB - Curves -TP_COLORTONING_RGBSLIDERS;RGB - Sliders -TP_COLORTONING_SA;Saturation Protection -TP_COLORTONING_SATURATEDOPACITY;Strength -TP_COLORTONING_SATURATIONTHRESHOLD;Threshold -TP_COLORTONING_SHADOWS;Shadows -TP_COLORTONING_SPLITCO;Shadows/Midtones/Highlights -TP_COLORTONING_SPLITCOCO;Color Balance Shadows/Midtones/Highlights -TP_COLORTONING_SPLITLR;Saturation 2 colors -TP_COLORTONING_STR;Strength -TP_COLORTONING_STRENGTH;Strength -TP_COLORTONING_TWO2;Special chroma '2 colors' -TP_COLORTONING_TWOALL;Special chroma -TP_COLORTONING_TWOBY;Special a* and b* -TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. -TP_COLORTONING_TWOSTD;Standard chroma -TP_CROP_FIXRATIO;Lock ratio -TP_CROP_GTDIAGONALS;Rule of Diagonals -TP_CROP_GTEPASSPORT;Biometric Passport -TP_CROP_GTFRAME;Frame -TP_CROP_GTGRID;Grid -TP_CROP_GTHARMMEANS;Harmonic Means -TP_CROP_GTNONE;None -TP_CROP_GTRULETHIRDS;Rule of Thirds -TP_CROP_GTTRIANGLE1;Golden Triangles 1 -TP_CROP_GTTRIANGLE2;Golden Triangles 2 -TP_CROP_GUIDETYPE;Guide type: -TP_CROP_H;Height -TP_CROP_LABEL;Crop -TP_CROP_PPI;PPI -TP_CROP_RESETCROP;Reset -TP_CROP_SELECTCROP;Select -TP_CROP_W;Width -TP_CROP_X;Left -TP_CROP_Y;Top -TP_DARKFRAME_AUTOSELECT;Auto-selection -TP_DARKFRAME_LABEL;Dark-Frame -TP_DEFRINGE_LABEL;Defringe -TP_DEFRINGE_RADIUS;Radius -TP_DEFRINGE_THRESHOLD;Threshold -TP_DEHAZE_DEPTH;Depth -TP_DEHAZE_LABEL;Haze Removal -TP_DEHAZE_LUMINANCE;Luminance only -TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map -TP_DEHAZE_STRENGTH;Strength -TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones -TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global -TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow -TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve -TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance -TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual -TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master -TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method -TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 -TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green -TP_DIRPYRDENOISE_LABEL;Noise Reduction -TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control -TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve -TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery -TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance -TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance -TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space -TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* -TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB -TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma -TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -TP_DIRPYRDENOISE_MAIN_MODE;Mode -TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive -TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative -TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. -TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method -TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only -TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* -TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter -TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only -TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB -TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) -TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations -TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type -TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -TP_DIRPYRDENOISE_TYPE_3X3;3×3 -TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft -TP_DIRPYRDENOISE_TYPE_5X5;5×5 -TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft -TP_DIRPYRDENOISE_TYPE_7X7;7×7 -TP_DIRPYRDENOISE_TYPE_9X9;9×9 -TP_DIRPYREQUALIZER_ALGO;Skin Color Range -TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. -TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts -TP_DIRPYREQUALIZER_HUESKIN;Skin hue -TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;This pyramid is for the upper part, so far as the algorithm at its maximum efficiency.\nTo the lower part, the transition zones.\nIf you need to move the area significantly to the left or right - or if there are artifacts: the white balance is incorrect\nYou can slightly reduce the zone to prevent the rest of the image is affected. -TP_DIRPYREQUALIZER_LABEL;Contrast by Detail Levels -TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest -TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast - -TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast + -TP_DIRPYREQUALIZER_LUMAFINEST;Finest -TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral -TP_DIRPYREQUALIZER_SKIN;Skin targetting/protection -TP_DIRPYREQUALIZER_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. -TP_DIRPYREQUALIZER_THRESHOLD;Threshold -TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colors (hue, chroma, luma) and the rest of the image. -TP_DISTORTION_AMOUNT;Amount -TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. -TP_DISTORTION_LABEL;Distortion Correction -TP_EPD_EDGESTOPPING;Edge stopping -TP_EPD_GAMMA;Gamma -TP_EPD_LABEL;Tone Mapping -TP_EPD_REWEIGHTINGITERATES;Reweighting iterates -TP_EPD_SCALE;Scale -TP_EPD_STRENGTH;Strength -TP_EXPOSURE_AUTOLEVELS;Auto Levels -TP_EXPOSURE_AUTOLEVELS_TIP;Toggles execution of Auto Levels to automatically set Exposure slider values based on an image analysis.\nEnables Highlight Reconstruction if necessary. -TP_EXPOSURE_BLACKLEVEL;Black -TP_EXPOSURE_BRIGHTNESS;Lightness -TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors -TP_EXPOSURE_CLIP;Clip % -TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. -TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight compression -TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold -TP_EXPOSURE_COMPRSHADOWS;Shadow compression -TP_EXPOSURE_CONTRAST;Contrast -TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 -TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 -TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. -TP_EXPOSURE_EXPCOMP;Exposure compensation -TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve -TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. -TP_EXPOSURE_LABEL;Exposure -TP_EXPOSURE_SATURATION;Saturation -TP_EXPOSURE_TCMODE_FILMLIKE;Film-like -TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 -TP_EXPOSURE_TCMODE_LABEL2;Curve mode 2 -TP_EXPOSURE_TCMODE_LUMINANCE;Luminance -TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual -TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Saturation and Value Blending -TP_EXPOSURE_TCMODE_STANDARD;Standard -TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard -TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points -TP_EXPOS_WHITEPOINT_LABEL;Raw White Points -TP_FILMNEGATIVE_BLUE;Blue ratio -TP_FILMNEGATIVE_FILMBASE_PICK;Pick film base color -TP_FILMNEGATIVE_FILMBASE_TOOLTIP;Pick a spot of unexposed film (eg. the border between frames), to get the actual film base color values, and save them in the processing profile.\nThis makes it easy to get a more consistent color balance when batch-processing multiple pictures from the same roll.\nAlso use this when the converted image is extremely dark, bright, or color-unbalanced. -TP_FILMNEGATIVE_FILMBASE_VALUES;Film base RGB: -TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. -TP_FILMNEGATIVE_LABEL;Film Negative -TP_FILMNEGATIVE_PICK;Pick neutral spots -TP_FILMNEGATIVE_RED;Red ratio -TP_FILMSIMULATION_LABEL;Film Simulation -TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? -TP_FILMSIMULATION_STRENGTH;Strength -TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences -TP_FLATFIELD_AUTOSELECT;Auto-selection -TP_FLATFIELD_BLURRADIUS;Blur radius -TP_FLATFIELD_BLURTYPE;Blur type -TP_FLATFIELD_BT_AREA;Area -TP_FLATFIELD_BT_HORIZONTAL;Horizontal -TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal -TP_FLATFIELD_BT_VERTICAL;Vertical -TP_FLATFIELD_CLIPCONTROL;Clip control -TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. -TP_FLATFIELD_LABEL;Flat-Field -TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. -TP_GRADIENT_CENTER;Center -TP_GRADIENT_CENTER_X;Center X -TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values). -TP_GRADIENT_CENTER_Y;Center Y -TP_GRADIENT_CENTER_Y_TOOLTIP;Shift gradient up (negative values) or down (positive values). -TP_GRADIENT_DEGREE;Angle -TP_GRADIENT_DEGREE_TOOLTIP;Rotation angle in degrees. -TP_GRADIENT_FEATHER;Feather -TP_GRADIENT_FEATHER_TOOLTIP;Gradient width in percent of the image diagonal. -TP_GRADIENT_LABEL;Graduated Filter -TP_GRADIENT_STRENGTH;Strength -TP_GRADIENT_STRENGTH_TOOLTIP;Filter strength in stops. -TP_HLREC_BLEND;Blend -TP_HLREC_CIELAB;CIELab Blending -TP_HLREC_COLOR;Color Propagation -TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels. -TP_HLREC_LABEL;Highlight reconstruction -TP_HLREC_LUMINANCE;Luminance Recovery -TP_HLREC_METHOD;Method: -TP_HSVEQUALIZER_CHANNEL;Channel -TP_HSVEQUALIZER_HUE;H -TP_HSVEQUALIZER_LABEL;HSV Equalizer -TP_HSVEQUALIZER_SAT;S -TP_HSVEQUALIZER_VAL;V -TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure -TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. -TP_ICM_APPLYHUESATMAP;Base table -TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only available if the selected DCP has one. -TP_ICM_APPLYLOOKTABLE;Look table -TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only available if the selected DCP has one. -TP_ICM_BPC;Black Point Compensation -TP_ICM_DCPILLUMINANT;Illuminant -TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolated -TP_ICM_DCPILLUMINANT_TOOLTIP;Select which embedded DCP illuminant to employ. Default is "interpolated" which is a mix between the two based on white balance. The setting is only available if a dual-illuminant DCP with interpolation support is selected. -TP_ICM_INPUTCAMERA;Camera standard -TP_ICM_INPUTCAMERAICC;Auto-matched camera profile -TP_ICM_INPUTCAMERAICC_TOOLTIP;Use RawTherapee's camera-specific DCP or ICC input color profiles. These profiles are more precise than simpler matrix ones. They are not available for all cameras. These profiles are stored in the /iccprofiles/input and /dcpprofiles folders and are automatically retrieved based on a file name matching to the exact model name of the camera. -TP_ICM_INPUTCAMERA_TOOLTIP;Use a simple color matrix from dcraw, an enhanced RawTherapee version (whichever is available based on camera model) or one embedded in the DNG. -TP_ICM_INPUTCUSTOM;Custom -TP_ICM_INPUTCUSTOM_TOOLTIP;Select your own DCP/ICC color profile file for the camera. -TP_ICM_INPUTDLGLABEL;Select Input DCP/ICC Profile... -TP_ICM_INPUTEMBEDDED;Use embedded, if possible -TP_ICM_INPUTEMBEDDED_TOOLTIP;Use color profile embedded in non-raw files. -TP_ICM_INPUTNONE;No profile -TP_ICM_INPUTNONE_TOOLTIP;Use no input color profile at all.\nUse only in special cases. -TP_ICM_INPUTPROFILE;Input Profile -TP_ICM_LABEL;Color Management -TP_ICM_NOICM;No ICM: sRGB Output -TP_ICM_OUTPUTPROFILE;Output Profile -TP_ICM_PROFILEINTENT;Rendering Intent -TP_ICM_SAVEREFERENCE;Save Reference Image -TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance -TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. -TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. -TP_ICM_TONECURVE;Tone curve -TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. -TP_ICM_WORKINGPROFILE;Working Profile -TP_ICM_WORKING_TRC;Tone response curve: -TP_ICM_WORKING_TRC_CUSTOM;Custom -TP_ICM_WORKING_TRC_GAMMA;Gamma -TP_ICM_WORKING_TRC_NONE;None -TP_ICM_WORKING_TRC_SLOPE;Slope -TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. -TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction -TP_IMPULSEDENOISE_THRESH;Threshold -TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction. -TP_LABCURVE_BRIGHTNESS;Lightness -TP_LABCURVE_CHROMATICITY;Chromaticity -TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100. -TP_LABCURVE_CONTRAST;Contrast -TP_LABCURVE_CURVEEDITOR;Luminance Curve -TP_LABCURVE_CURVEEDITOR_A_RANGE1;Green Saturated -TP_LABCURVE_CURVEEDITOR_A_RANGE2;Green Pastel -TP_LABCURVE_CURVEEDITOR_A_RANGE3;Red Pastel -TP_LABCURVE_CURVEEDITOR_A_RANGE4;Red Saturated -TP_LABCURVE_CURVEEDITOR_B_RANGE1;Blue Saturated -TP_LABCURVE_CURVEEDITOR_B_RANGE2;Blue Pastel -TP_LABCURVE_CURVEEDITOR_B_RANGE3;Yellow Pastel -TP_LABCURVE_CURVEEDITOR_B_RANGE4;Yellow Saturated -TP_LABCURVE_CURVEEDITOR_CC;CC -TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutral -TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Dull -TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel -TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturated -TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Chromaticity according to chromaticity C=f(C) -TP_LABCURVE_CURVEEDITOR_CH;CH -TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Chromaticity according to hue C=f(H) -TP_LABCURVE_CURVEEDITOR_CL;CL -TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Chromaticity according to luminance C=f(L) -TP_LABCURVE_CURVEEDITOR_HH;HH -TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Hue according to hue H=f(H) -TP_LABCURVE_CURVEEDITOR_LC;LC -TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminance according to chromaticity L=f(C) -TP_LABCURVE_CURVEEDITOR_LH;LH -TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H) -TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminance according to luminance L=f(L) -TP_LABCURVE_LABEL;L*a*b* Adjustments -TP_LABCURVE_LCREDSK;Restrict LC to red and skin-tones -TP_LABCURVE_LCREDSK_TIP;If enabled, the LC Curve affects only red and skin-tones.\nIf disabled, it applies to all tones. -TP_LABCURVE_RSTPROTECTION;Red and skin-tones protection -TP_LABCURVE_RSTPRO_TOOLTIP;Works on the Chromaticity slider and the CC curve. -TP_LENSGEOM_AUTOCROP;Auto-Crop -TP_LENSGEOM_FILL;Auto-fill -TP_LENSGEOM_LABEL;Lens / Geometry -TP_LENSGEOM_LIN;Linear -TP_LENSGEOM_LOG;Logarithmic -TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected -TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file -TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected -TP_LENSPROFILE_LABEL;Profiled Lens Correction -TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. -TP_LENSPROFILE_MODE_HEADER;Lens Profile -TP_LENSPROFILE_USE_CA;Chromatic aberration -TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion -TP_LENSPROFILE_USE_HEADER;Correct -TP_LENSPROFILE_USE_VIGNETTING;Vignetting -TP_LOCALCONTRAST_AMOUNT;Amount -TP_LOCALCONTRAST_DARKNESS;Darkness level -TP_LOCALCONTRAST_LABEL;Local Contrast -TP_LOCALCONTRAST_LIGHTNESS;Lightness level -TP_LOCALCONTRAST_RADIUS;Radius -TP_LOCALLAB_ACTIV;Luminance only -TP_LOCALLAB_ACTIVSPOT;Enable Spot -TP_LOCALLAB_ADJ;Equalizer Blue-yellow Red-green -TP_LOCALLAB_ALL;All rubrics -TP_LOCALLAB_AMOUNT;Amount -TP_LOCALLAB_ARTIF;Shape detection -//TP_LOCALLAB_ARTIF_TOOLTIP;Threshold deltaE-scope increase the range of scope-deltaE - high values are for very wide gamut images.\nIncrease deltaE decay improve shape detection, but can reduce the scope of detection. -TP_LOCALLAB_ARTIF_TOOLTIP;ΔE-scope threshold increases the range of deltaE scope. High values are for very wide gamut images.\nIncreasing deltaE decay can improve shape detection, but can also reduce the scope. -TP_LOCALLAB_AUTOGRAY;Automatic -TP_LOCALLAB_AVOID;Avoid color shift -TP_LOCALLAB_BALAN;ab-L balance (ΔE) -TP_LOCALLAB_BALANEXP;Laplacian balance -TP_LOCALLAB_BALANH;C-H balance (ΔE) -//TP_LOCALLAB_BALAN_TOOLTIP;Change algorithm ΔE parameter.\nMore or less ab-L, more or less C - H.\nNot for Denoise -TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less ab-L, or more or less C - H.\nNot for Denoise -TP_LOCALLAB_BASELOG;Logarithm base -TP_LOCALLAB_BILATERAL;Bilateral filter -TP_LOCALLAB_BLACK_EV;Black Ev -TP_LOCALLAB_BLCO;Chrominance only -TP_LOCALLAB_BLENDMASKCOL;Blend -TP_LOCALLAB_BLENDMASKMASK;Add / subtract luminance mask -TP_LOCALLAB_BLENDMASKMASKAB;Add / subtract chrominance mask -TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image -TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image -TP_LOCALLAB_BLGUID;Guided Filter -TP_LOCALLAB_BLINV;Inverse -TP_LOCALLAB_BLLC;Luminance & Chrominance -TP_LOCALLAB_BLLO;Luminance only -TP_LOCALLAB_BLMED;Median -TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - direct blur and noise with all settings.\nInverse blur and noise with all settings. Be careful some results may be curious -TP_LOCALLAB_BLNOI_EXP;Blur & Noise -TP_LOCALLAB_BLNORM;Normal -TP_LOCALLAB_BLSYM;Symmetric -TP_LOCALLAB_BLUFR;Blur/Grain & Denoise -TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n*Blur the background by a RT-spot fully covering the image (high values for scope and transition) - normal or inverse.\n*Isolate the foreground by one or more excluding RT-spot with the tools you want (increse scope).\n\nThis module can be used in additional noise reduction,including "median" and "Guided filter" -TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain -TP_LOCALLAB_BLURCBDL;Blur levels 0-1-2-3-4 -TP_LOCALLAB_BLURCOL;Radius -TP_LOCALLAB_BLURDE;Blur shape detection -TP_LOCALLAB_BLURLC;Luminance Only -TP_LOCALLAB_BLURLEVELFRA;Blur Levels -TP_LOCALLAB_BLURMASK_TOOLTIP;Generate a blur mask, take into account the structure with the contrast threshold Blur Mask slider. -TP_LOCALLAB_BLURRESIDFRA;Blur Residual -TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise - 1 -TP_LOCALLAB_BLWH;All changes forced in Black-and-White -//TP_LOCALLAB_BLWH_TOOLTIP;Force color change composante "a" and "b" to zero.\nUsefull when the user chooses black and white processes, or film. -TP_LOCALLAB_BLWH_TOOLTIP;Force color components "a" and "b" to zero.\nUseful for black and white processing, or film simulation. -TP_LOCALLAB_BUTTON_ADD;Add -TP_LOCALLAB_BUTTON_DEL;Delete -TP_LOCALLAB_BUTTON_DUPL;Duplicate -TP_LOCALLAB_BUTTON_REN;Rename -TP_LOCALLAB_BUTTON_VIS;Show/Hide -TP_LOCALLAB_CBDL;Contrast by detail levels -TP_LOCALLAB_CBDLCLARI_TOOLTIP;Takes the midtones and enhance them. -TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Acts as a wavelet tools.\nThe first level (0) acts on 2x2 details.\nThe last level (5) acts on 64x64 details. -TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevent the sharpening of noise -TP_LOCALLAB_CBDL_TOOLNAME;CBDL - 2 -TP_LOCALLAB_CENTER_X;Center X -TP_LOCALLAB_CENTER_Y;Center Y -TP_LOCALLAB_CH;Curves CL - LC -TP_LOCALLAB_CHROMA;Chrominance -TP_LOCALLAB_CHROMABLU;Chroma levels -TP_LOCALLAB_CHROMABLU_TOOLTIP;Acts as an amplifier-reducer action compare to settings of luma.\nUnder 1 reduce, above 1 amplifie -TP_LOCALLAB_CHROMACBDL;Chroma -TP_LOCALLAB_CHROMACB_TOOLTIP;Acts as an amplifier-reducer action compare to sliders of luminance.\nUnder 100 reduce, above 100 amplifie -TP_LOCALLAB_CHROMALEV;Chroma levels -TP_LOCALLAB_CHROMASKCOL;Chroma -TP_LOCALLAB_CHROMASK_TOOLTIP;You can use this slider to desaturated background (inverse mask - curve near 0).\nAlso to attenuate or enhance the action of a mask on the chroma -TP_LOCALLAB_CHRRT;Chroma -TP_LOCALLAB_CIRCRADIUS;Spot size -TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for treating foliage.\nHigh values may be useful for treating skin -TP_LOCALLAB_CLARICRES;Merge chroma -TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask - Blend & Soft images -TP_LOCALLAB_CLARILRES;Merge luma -TP_LOCALLAB_CLARISOFT;Soft radius -TP_LOCALLAB_CLARISOFT_TOOLTIP;Enabled for Clarity and Sharp mask if Merge Luma different from zero.\n\nEnabled for all wavelets pyramid modules.\nDisabled if Soft radius = 0 -TP_LOCALLAB_CLARITYML;Clarity -TP_LOCALLAB_CLARI_TOOLTIP;Under or equal level wavelet 4, 'Sharp mask' is enabled.\nAbove level wavelet 5 'Clarity' is enabled.\nUsefull if you use 'Level dynamic Range Compression' -TP_LOCALLAB_CLIPTM;Clip restored data (gain) -TP_LOCALLAB_COFR;Color & Light -TP_LOCALLAB_COLORDE;ΔE preview color - intensity -//TP_LOCALLAB_COLORDEPREV_TOOLTIP;Button Preview ΔE needs that only one tool is enabled (expander).\nTo be able to have an Preview ΔE with several enable tools use Mask and modifications - Preview ΔE -TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in "Add tool to current spot" menu\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE -//TP_LOCALLAB_COLORDE_TOOLTIP;Show preview selection ΔE in blue if negative and in green if positive.\n\nMask and modifications (show modifications without mask): show real modifications if positive, show enhanced modifications (only luminance) with blue and yellow if negative. -TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color-preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modifications without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. -TP_LOCALLAB_COLORSCOPE;Scope (color tools) -//TP_LOCALLAB_COLORSCOPE_TOOLTIP;Use a common Scope for Color and light, Shadows highlight, Vibrance.\nOthers tools have their specific scope. -TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows & Highlights, Vibrance.\nOther tools have their own scope controls. -TP_LOCALLAB_COLOR_TOOLNAME;Color & Light - 11 -TP_LOCALLAB_COL_NAME;Name -TP_LOCALLAB_COL_VIS;Status -TP_LOCALLAB_COMPFRA;Directional Contrast -TP_LOCALLAB_COMPFRAME_TOOLTIP;Allows special effects. You can reduce artifacts with 'Clarity & Sharp mask - Blend & Soft Images".\nUses a lot of resources -TP_LOCALLAB_COMPLEX_METHOD;Software Complexity -TP_LOCALLAB_COMPLEX_TOOLTIP; Allow user to select Local adjustments rubrics. -TP_LOCALLAB_COMPREFRA;Wavelet level tone-mapping -TP_LOCALLAB_COMPRESS_TOOLTIP;Use if necessary the module 'Clarity & Sharp mask and Blend & Soft Images' by adjusting 'Soft radius' to reduce artifacts. -TP_LOCALLAB_CONTCOL;Contrast threshold -TP_LOCALLAB_CONTFRA;Contrast by Level -TP_LOCALLAB_CONTRAST;Contrast -TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Main mask contrast control. -TP_LOCALLAB_CONTRESID;Contrast -TP_LOCALLAB_CONTTHR;Contrast Threshold -TP_LOCALLAB_CONTWFRA;Local contrast -TP_LOCALLAB_CSTHRESHOLD;Ψ Wavelets Levels -TP_LOCALLAB_CSTHRESHOLDBLUR;Ψ Wavelet level selection -TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance "Super" -TP_LOCALLAB_CURVCURR;Normal -TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nIt is recommended (not required) to position the top of the curves on the gray transition line which represents the references (chroma, luma, hue). -TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nThe gray transition line which represents the references (chroma, luma, hue).\nYou can choose or not to position the top of the curves on this transition. -TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To be active, you must enable combobox 'Curve type' -TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve -TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light -TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) has the same algorithm than slider lightness.\n'Super' the curve L=f(L) has an new improved algorithm, which can leeds in some cases to artifacts. -TP_LOCALLAB_CURVENCONTRAST;Super+Contrast threshold (experimental) -TP_LOCALLAB_CURVENH;Super -TP_LOCALLAB_CURVENHSU;Combined HueChroma (experimental) -TP_LOCALLAB_CURVENSOB2;Combined HueChroma + Contrast threshold (experimental) -TP_LOCALLAB_CURVNONE;Disable curves -TP_LOCALLAB_DARKRETI;Darkness -TP_LOCALLAB_DEHAFRA;Dehaze -TP_LOCALLAB_DEHAZ;Strength -TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values adds haze -TP_LOCALLAB_DELTAD;Delta balance -TP_LOCALLAB_DELTAEC;ΔE Image Mask -TP_LOCALLAB_DENOIS;Ψ Denoise -TP_LOCALLAB_DENOIS;Ψ Denoise -TP_LOCALLAB_DENOI_EXP;Denoise -TP_LOCALLAB_DENOI1_EXP;Denoise using local contrast mask -TP_LOCALLAB_DENOI_TOOLTIP;This module can be used alone (at the end of process), or in complement of main denoise (at the beginning).\nScope allows to differentiate the action according to the color (deltaE).\nYou can complete the action with "median" or "Guided Filter" (Smooth Blur...).\nYou can complete the action with "Blur levels" "Wavelet pyramid" -TP_LOCALLAB_DEPTH;Depth -TP_LOCALLAB_DETAIL;Local contrast -TP_LOCALLAB_DETAILSH;Details -TP_LOCALLAB_DETAILTHR;Luminance & Chroma detail threshold (DCT ƒ) -TP_LOCALLAB_DUPLSPOTNAME;Copy -TP_LOCALLAB_EDGFRA;Edge Sharpness -TP_LOCALLAB_EDGSHOW;Show all tolls -TP_LOCALLAB_ELI;Ellipse -TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping -TP_LOCALLAB_ENABLE_MASK;Enable mask -TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure -TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled Mask uses Restored Datas after Transmission Map instead of Original datas -TP_LOCALLAB_ENH;Enhanced -TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise -TP_LOCALLAB_EPSBL;Detail -TP_LOCALLAB_EQUIL;Normalize Luminance -TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance in such a way that the mean and the variance of the output image is identical to that of the original. -TP_LOCALLAB_ESTOP;Edge stopping -TP_LOCALLAB_EV_DUPL;Copy of -TP_LOCALLAB_EV_NVIS;Hide -TP_LOCALLAB_EV_NVIS_ALL;Hide all -TP_LOCALLAB_EV_VIS;Show -TP_LOCALLAB_EV_VIS_ALL;Show all -TP_LOCALLAB_EXCLUF;Excluding -TP_LOCALLAB_EXCLUF_TOOLTIP;Can be used to exclude this part of datas - move Scope to extend color.\n You can apply all settings to this RT-spot. -TP_LOCALLAB_EXCLUTYPE;Spot method -//TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot use recursive data.\n\nExcluding spot reinitialize data to origin.\nCan be used to totally or partially cancel a previous action or to perform a inverse mode -TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in inverted mode -TP_LOCALLAB_EXECLU;Excluding spot -TP_LOCALLAB_EXNORM;Normal spot -//TP_LOCALLAB_EXPCBDL_TOOLTIP;In the case of contaminated sensor (type "grease"), and when the area is important or for a series of small defects.\n\na) Put the selection spot on a pronounced default (adapting its size if necessary), use a large spot enough to allow wavelet; b) choose a wide selection area to cover most of the area affected by the defects; c) Select a transition value (low) and transition decay (high value); d) act on levels 2, 3, 4 or 5 or lower by reducing the contrast (values below 100) and by acting on the chroma slider if necessary. e)possibly act on "scope" to reduce the extent of the action.\n\nYou can also complete with Blur levels and Gaussian blur (Smooth Blur and noise) -TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens. -TP_LOCALLAB_EXPCHROMA;Chroma compensation -TP_LOCALLAB_EXPCHROMA_TOOLTIP;Only in association with exposure compensation and PDE Ipol.\nAvoids desaturation of colors -//TP_LOCALLAB_EXPCOLOR_TOOLTIP;In the case of small defects.\n\nRed-eyes : red-centered circular selector, spot delimiters close to the eye, weak scope, "lightness" -100, "chrominance" -100.\n\nSpotIR :Circular selector centered on the defect, spot delimiters close to the default - reduce "chrominance", possibly act on "scope" to reduce the extent of the action.\n\nDust - grease (small) :Circular selector centered on the defect (adapt the size of the spot), spot delimiters not too close to the defect to allow an inconspicuous transition. a) "Transition" (low values) and "Transition weak" (high values); b) act on "lightness" and possibly on "chrominance" or "Color correction grid - direct" to approach the rendering of the polluted zone to that of the healthy zone; c) act moderately on "scope" to modulate the desired action.\n\nYou can also complete with Gaussian blur (Smooth Blur and noise) -TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. -TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ -TP_LOCALLAB_EXPCOMPINV;Exposure compensation -TP_LOCALLAB_EXPCOMP_TOOLTIP;For portrait or images with low color gradient, you can change "Shape detection" in "settings":\n\nIncrease 'Threshold ΔE scope'\nReduce 'ΔE decay'\nIncrease 'Balance ΔE ab-L' -TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation of wavelet levels.\nHowever there are some differences: more tools and closer to the details.\nEx: Tone mapping for wavelet levels. -TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small(< 32x32 pixels).\nUse low transition values and high decay transition values and scope to simulate small RT-spot and deal wth defects.\nUse if necessary the module 'Clarity & Sharp mask and Blend images' by adjusting 'Soft radius' to reduce artifacts. -TP_LOCALLAB_EXPCURV;Curves -TP_LOCALLAB_EXPGRAD;Graduated Filter -TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Balances the action between the original image and the Laplace transform. -TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Apply a gamma before and after Laplace transform -TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Add linear exposure component before application Laplace transform -TP_LOCALLAB_EXPLAP_TOOLTIP;The more you act on this threshold slider, the greater the action of reducing contrast. -TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows various possibilities to blend image (as layers in Photoshop (c)) : difference, multiply, soft light, overlay...with opacity...\nOriginal Image : merge current RT-spot with Original.\nPrevious spot : merge current Rt-spot with previous - if there is only one spot previous = original.\nBackground : merge current RT-spot with a color and luminance background (less possibilties) -TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : use an algorithm similar as main Exposure but in L*a*b* and taking account of deltaE.\n\nContrast attenuator : use another algorithm also with deltaE and with Poisson equation to solve Laplacian in Fourier space.\nContrast attenuator, Dynamic range compression and Standard can be combined.\nFFTW Fourier Transform is optimized in size to reduce processing time.\nReduce artifacts and noise. -TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Apply a median before Laplace transform to prevent artifacts (noise).\nYou can also use "Denoise" tool. -TP_LOCALLAB_EXPOSE;Dynamic Range Compr. & Exposure -//TP_LOCALLAB_EXPOSURE_TOOLTIP;In some cases (strong shadows ..) you can use others modules "Shadows Highlights", "Tone equalizer", "TRC", "Log Encoding"... -TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. -TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools -TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high decay transition values and scope to simulate small RT-spot. -TP_LOCALLAB_EXPTOOL;Exposure tools -TP_LOCALLAB_EXPTRC;Tone Response Curve - TRC -TP_LOCALLAB_EXP_TOOLNAME;Contrast Attenuator/Dynamic Range Compression & Exposure- 10 -TP_LOCALLAB_FATAMOUNT;Amount -TP_LOCALLAB_FATANCHOR;Anchor -TP_LOCALLAB_FATANCHORA;Offset -TP_LOCALLAB_FATDETAIL;Detail -TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ -TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal - use Fattal Tone mapping algorithm. -TP_LOCALLAB_FATLEVEL;Sigma -TP_LOCALLAB_FATRES;Amount Residual Image -TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ -//TP_LOCALLAB_FEATH_TOOLTIP;Gradient width in percent of the Spot diagonal\nUsed by all Graduated filter in all tools.\nNo action if Graduated Filter are not used. -TP_LOCALLAB_FEATH_TOOLTIP;Gradient width in percent of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn’t been activated. -TP_LOCALLAB_FEATVALUE;Feather gradient (Graduated Filters) -TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ -TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform -TP_LOCALLAB_FFTW2;ƒ - Use Fast Fourier Transform (TIF, JPG,..) -TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform -//TP_LOCALLAB_FULLIMAGE;Calculate DarkEv - WhiteEv - Value on the entire image -TP_LOCALLAB_FULLIMAGE;Calculate dark-Ev/white-Ev value on the entire image -TP_LOCALLAB_GAM;Gamma -TP_LOCALLAB_GAMFRA;Tone response curve (TRC) -TP_LOCALLAB_GAMM;Gamma -TP_LOCALLAB_GAMMASKCOL;Gamma -TP_LOCALLAB_GAMSH;Gamma -TP_LOCALLAB_GRADANG;Gradient angle -TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees : -180 0 +180 -TP_LOCALLAB_GRADFRA;Graduated Filter Mask -TP_LOCALLAB_GRADGEN_TOOLTIP;Graduated filter is supplied with Color and Light & merge file, Exposure & mask, Shadows Highlight, Vibrance, Log Encoding.\n\nVibrance, Color and Light & merge file, are provided with GF luminance, chrominance, Hue.\nFeather is located in settings. -TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance -TP_LOCALLAB_GRADSTR;Gradient strength -TP_LOCALLAB_GRADSTRAB_TOOLTIP;Filter chroma strength -TP_LOCALLAB_GRADSTRCHRO;Chrominance gradient strength -TP_LOCALLAB_GRADSTRHUE;Hue gradient strength -TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength -TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Filter Hue strength -TP_LOCALLAB_GRADSTRLUM;Luminance gradient strength -TP_LOCALLAB_GRADSTR_TOOLTIP;Filter strength in stops -TP_LOCALLAB_GRAINFRA;Film Grain 1:1 -TP_LOCALLAB_GRALWFRA;Graduated Filter Local contrast -TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use small spot and adapt transition and transition decay\nOnly mode NORMAL and eventually Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE) -TP_LOCALLAB_GRIDONE;Color Toning -TP_LOCALLAB_GRIDTWO;Direct -TP_LOCALLAB_GUIDBL;Soft radius -TP_LOCALLAB_GUIDFILTER;Guided filter radius -TP_LOCALLAB_GUIDFILTER_TOOLTIP;Adapt this values according to images - can reduce or increase artifacts. -TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. -TP_LOCALLAB_HIGHMASKCOL;Highlights -TP_LOCALLAB_HLH;Curves H -TP_LOCALLAB_IND;Independent (mouse) -TP_LOCALLAB_INDSL;Independent (mouse + sliders) -TP_LOCALLAB_INVERS;Inverse -TP_LOCALLAB_INVERS_TOOLTIP;If selected (inverse) less possibilities.\n\nAlternative\nFirst Spot:\n full image - delimiter outside preview\n Shape RT-spot area : rectangle. Transition 100\n\nSecond spot : Excluding spot -TP_LOCALLAB_ISOGR;Coarseness (ISO) -TP_LOCALLAB_LABBLURM;Blur Mask -TP_LOCALLAB_LABEL;Local Adjustments -TP_LOCALLAB_LABGRID;Color correction grid -TP_LOCALLAB_LABGRIDMERG;Background -TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 -TP_LOCALLAB_LABSTRUM;Structure Mask -TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE -TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE -TP_LOCALLAB_LAPLACEXP;Laplacian threshold -TP_LOCALLAB_LAPMASKCOL;Laplacian threshold -TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using Radius and Laplace Threshold (advanced) simultaneously.\nLaplacian threshold reduce contrast, artifacts, smooth result. -TP_LOCALLAB_LAP_MASK_TOOLTIP;Solve PDE for all Laplacian masks.\nIf enabled Laplacian threshold mask reduce artifacts and smooth result.\nIf disabled linear response. -TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated.\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\n -TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets - 7 -TP_LOCALLAB_LCTHR;Guided threshold by details levels -TP_LOCALLAB_LEVELBLUR;Maximum Blur levels -TP_LOCALLAB_LEVELLOCCONTRAST_TOOLTIP;On the abscissa local contrast (near concept luminance). On the ordinate, amplification or reduction local contrast. -TP_LOCALLAB_LEVELHIGH;Radius 57 -TP_LOCALLAB_LEVELLOW;Radius 14 -TP_LOCALLAB_LEVELWAV;Ψ Wavelets Levels -TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4 -TP_LOCALLAB_LEVFRA;Levels -TP_LOCALLAB_LIGHTNESS;Lightness -TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 force luminance to zero -TP_LOCALLAB_LIGHTRETI;Lightness -TP_LOCALLAB_LIMDEN;Interaction levels 57 on level 14 -TP_LOCALLAB_LINEAR;Linearity -TP_LOCALLAB_LIST_NAME;Add tool to current spot... -TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard & Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing -TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Give priority to action on midtones and high lights and by choosing the concerned wavelet levels -TP_LOCALLAB_LMASK_LL_TOOLTIP;Give priority to action on midtones and high lights -TP_LOCALLAB_LOCCONT;Unsharp Mask -TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets -TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pyramid 1: -TP_LOCALLAB_LOC_CONTRASTPYR2;Ψ Pyramid 2: -TP_LOCALLAB_LOC_CONTRASTPYR2LAB;Contrast by Level - Tone Mapping - Dir.Contrast -TP_LOCALLAB_LOC_CONTRASTPYRLAB;Graduated Filter - Edge Sharpness - Blur -TP_LOCALLAB_LOC_RESIDPYR;Residual Image (Main) -TP_LOCALLAB_LOG;Log Encoding -TP_LOCALLAB_LOGAUTO;Automatic -TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will bring an evaluation of dynamic range and Source Gray point (if "Automatic" Source gray enabled).\nTo be able to touch up the automatic values, press the button again -TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm, the shadows are darker, the highlights are brighter.\nValues greater than 2 change the action of the algorithm, the shadows are grayer the highlights are more washed out -TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of Dynamic Range - Black Ev and White Ev -TP_LOCALLAB_LOGENCOD_TOOLTIP;Allows Tone Mapping with Logarithm encoding (ACES).\nUsefull for underexposed pictures, or with high dynamic range.\n\nTwo steps in the process : 1) Calculate Dynamic Range 2) User adaptation -TP_LOCALLAB_LOGFRA;Source Gray Point -TP_LOCALLAB_LOGFRAME_TOOLTIP;Calculate or use Exposure levels of the image early in the process:\n Black Ev, White Ev and Source Gray point.\n Take into account main exposure compensation. -TP_LOCALLAB_LOGLIN;Logarithm mode -TP_LOCALLAB_LOGPFRA;Relative Exposure Levels -TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estimated gray point value of the image, early in the process -TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can change this value to adapt it to your taste. -TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 -TP_LOCALLAB_LUM;Curves LL - CC -TP_LOCALLAB_LUMADARKEST;Darkest -TP_LOCALLAB_LUMASK;Background color for luminance and color masks -//TP_LOCALLAB_LUMASK_TOOLTIP;Adjust the gray and the color of the mask background in Show Mask (Mask and modifications) -TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications) -TP_LOCALLAB_LUMAWHITESEST;Whiteest -TP_LOCALLAB_LUMFRA;L*a*b* standard -TP_LOCALLAB_LUMONLY;Luminance only -TP_LOCALLAB_MASKCOM;Common Color Mask -TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. -//These masks works as all tools, they take into account scope color.\nThey are different from others masks which complete a tool (Color and Light, Exposure...) -TP_LOCALLAB_MASFRAME;Mask and Merge -//TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and curves contrast , levels contrasts, and blur mask, structure(if enabled tool) are used.\nDisabled in Inverse -TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the deltaE image to avoid modifying the selection area when the following sliders are used: gamma mask, slope mask, chroma mask and curve contrast , level contrasts, and blur mask, structure (if tool enabled ) .\nDisabled when Inverse mode is used -TP_LOCALLAB_MASK;Mask -TP_LOCALLAB_MASK2;Contrast curve -TP_LOCALLAB_MASKCOL;Mask Curves -TP_LOCALLAB_MASKH;Hue curve -TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a single tool, this requires activating another tool (but without using the tool : sliders to 0,...) where is the mask you want to activate.\n\nYou can also duplicate the RT-spot and place it right next to each other,variations of references allow fine work on images. -TP_LOCALLAB_MASKLCTHR;Threshold luminance mask -TP_LOCALLAB_THRESMASKHIGH;Highlights -TP_LOCALLAB_THRESMASKLOW;Shadows - -TP_LOCALLAB_MED;Medium -TP_LOCALLAB_MEDIAN;Median Low -TP_LOCALLAB_MEDNONE;None -TP_LOCALLAB_MERCOL;Color -TP_LOCALLAB_MERDCOL;Merge background (ΔE) -TP_LOCALLAB_MERELE;Lighten only -TP_LOCALLAB_MERFIV;Addition -TP_LOCALLAB_MERFOR;Color Dodge -TP_LOCALLAB_MERFOU;Multiply -TP_LOCALLAB_MERGE1COLFRA;Merge with Original or Previous or Background -TP_LOCALLAB_MERGECOLFRA;Mask: LCH & Structure -TP_LOCALLAB_MERGEFIV;Previous Spot(Mask 7) + Mask LCH -TP_LOCALLAB_MERGEFOU;Previous Spot(Mask 7) -TP_LOCALLAB_MERGEMER_TOOLTIP;Take into account ΔE to merge files (equivalent of scope for this use) -TP_LOCALLAB_MERGENONE;None -TP_LOCALLAB_MERGEONE;Short Curves 'L' Mask -TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity merge % current Spot with original or previous Spot.\nContrast threshold : adjust result in function of Original contrast -TP_LOCALLAB_MERGETHR;Original(Mask 7) + Mask LCH -TP_LOCALLAB_MERGETWO;Original(Mask 7) -TP_LOCALLAB_MERGETYPE;Merge image and mask -TP_LOCALLAB_MERGETYPE_TOOLTIP;None, use all mask in LCH mode.\nShort curves 'L' mask, use a short circuit for mask 2, 3, 4, 6, 7.\nOriginal mask 8, blend current image with original -TP_LOCALLAB_MERHEI;Overlay -TP_LOCALLAB_MERHUE;Hue -TP_LOCALLAB_MERLUCOL;Luminance -TP_LOCALLAB_MERLUM;Luminosity -TP_LOCALLAB_MERNIN;Screen -TP_LOCALLAB_MERONE;Normal -TP_LOCALLAB_MERSAT;Saturation -TP_LOCALLAB_MERSEV;Soft Light (legacy) -TP_LOCALLAB_MERSEV0;Soft Light Illusion -TP_LOCALLAB_MERSEV1;Soft Light W3C -TP_LOCALLAB_MERSEV2;Hard Light -TP_LOCALLAB_MERSIX;Divide -TP_LOCALLAB_MERTEN;Darken only -TP_LOCALLAB_MERTHI;Color Burn -TP_LOCALLAB_MERTHR;Difference -TP_LOCALLAB_MERTWE;Exclusion -TP_LOCALLAB_MERTWO;Subtract -TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. -TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 (Clip - Offset) -TP_LOCALLAB_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible.\nYou can act on Clip Restored datas and Offset to normalize.\n\nRestored image with no mixture. -TP_LOCALLAB_MODE_EXPERT;Advanced -TP_LOCALLAB_MODE_NORMAL;Standard -TP_LOCALLAB_MODE_SIMPLE;Basic -TP_LOCALLAB_MRFIV;Background -TP_LOCALLAB_MRFOU;Previous Spot -TP_LOCALLAB_MRONE;None -TP_LOCALLAB_MRTHR;Original Image -TP_LOCALLAB_MRTWO;Short Curves 'L' Mask -TP_LOCALLAB_MULTIPL_TOOLTIP;Allows the retouching of tones over a very wide range : -18EV +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts light tones up to 4EV -TP_LOCALLAB_NEIGH;Radius -TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) -TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02 -TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery (DCT ƒ) -TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) -TP_LOCALLAB_NOISEDETAIL_TOOLTIP;Disabled if slider = 100 -TP_LOCALLAB_NOISELEQUAL;Equalizer white-black -TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) -TP_LOCALLAB_NOISELUMDETAIL;Luminance detail recovery (DCT ƒ) -TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) -TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) -TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) -TP_LOCALLAB_NOISEMETH;Denoise -TP_LOCALLAB_NONENOISE;None -TP_LOCALLAB_OFFS;Offset -TP_LOCALLAB_OFFSETWAV;Offset -TP_LOCALLAB_OPACOL;Opacity -TP_LOCALLAB_ORIGLC;Merge only with original image -TP_LOCALLAB_ORRETILAP_TOOLTIP;Acts on a second Laplacian threshold, to take into account ΔE to differentiate the action especially with the background (different from Scope) -TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced -TP_LOCALLAB_PASTELS2;Vibrance -TP_LOCALLAB_PDE;Contrast Attenuator/Dynamic Range compression -TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ -TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL - personal algorithm adapted from IPOL to Rawtherapee: lead to very different results and needs differents settings that Standard (negative black, gamma < 1,...)\nMay be usefull for low exposure or high dynamic range.\n -TP_LOCALLAB_PREVIEW;Preview ΔE -TP_LOCALLAB_PREVHIDE;Hide additional settings -TP_LOCALLAB_PREVSHOW;Show additional settings -TP_LOCALLAB_PROXI;ΔE decay -TP_LOCALLAB_QUALCURV_METHOD;Curve type -TP_LOCALLAB_QUAL_METHOD;Global quality -TP_LOCALLAB_RADIUS;Radius -TP_LOCALLAB_RADIUS_TOOLTIP;Above Radius 30 Use Fast Fourier Transform -TP_LOCALLAB_RADMASKCOL;Smooth radius -TP_LOCALLAB_RECT;Rectangle -TP_LOCALLAB_RECURS;Recursive references -TP_LOCALLAB_RECURS_TOOLTIP;Recalculate references for hue, luma, chroma after each module and after each RT-spot.\nAlso useful for working with masks. -TP_LOCALLAB_REFLABEL;Ref. (0..1) Chroma=%1 Luma=%2 Hue=%3 -TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name -TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot -TP_LOCALLAB_RESETSHOW;Reset All Show Modifications -TP_LOCALLAB_RESID;Residual Image -TP_LOCALLAB_RESIDBLUR;Blur Residual Image -TP_LOCALLAB_RESIDCHRO;Residual image Chroma -TP_LOCALLAB_RESIDCOMP;Compress residual image -TP_LOCALLAB_RESIDCONT;Residual image Contrast -TP_LOCALLAB_RESIDHI;Highlights -TP_LOCALLAB_RESIDHITHR;Highlights threshold -TP_LOCALLAB_RESIDSHA;Shadows -TP_LOCALLAB_RESIDSHATHR;Shadows threshold -TP_LOCALLAB_RETI;Dehaze - Retinex -TP_LOCALLAB_RETIFRA;Retinex -TP_LOCALLAB_RETIM;Original Retinex -TP_LOCALLAB_RETITOOLFRA;Retinex Tools -TP_LOCALLAB_RETI_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated\nThe treatment time depends on the value of scale (be carefull to high values).\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\nOptimization not used in Preview -TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Have no effect when the value "Lightness = 1" or "Darkness =2" is chosen.\nIn other cases, the last step of "Multiple scale Retinex" is applied an algorithm close to "local contrast", these 2 cursors, associated with "Strength" will allow to play upstream on the local contrast. -TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Play on internal parameters to optimize response.\nLook at the "restored datas" indicators "near" min=0 and max=32768 (log mode), but others values are possible. -TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm allows differenciation for haze or normal.\nLogarithm brings more contrast but will generate more halo. -TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;Adapt these values according to images - if misty images and depending on whether you want to act on the front or the background -TP_LOCALLAB_RETI_SCALE_TOOLTIP;If scale=1, retinex behaves like local contrast with many more possibilities.\nThe greater the scale, the more intense the recursive action, the longer the calculation times -TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex - 9 -TP_LOCALLAB_REWEI;Reweighting iterates -TP_LOCALLAB_RGB;RGB Tone Curve -TP_LOCALLAB_ROW_NVIS;Not visible -TP_LOCALLAB_ROW_VIS;Visible -TP_LOCALLAB_SATUR;Saturation -TP_LOCALLAB_SAVREST;Save - Restore Current Image -TP_LOCALLAB_SCALEGR;Scale -TP_LOCALLAB_SCALERETI;Scale -TP_LOCALLAB_SCALTM;Scale -TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) -//TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if Mask DeltaE Image is enabled.\nLow values avoid retouching selected area -TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if DeltaE Image Mask is enabled.\nLow values avoid retouching selected area -TP_LOCALLAB_SENSI;Scope -TP_LOCALLAB_SENSIBN;Scope -TP_LOCALLAB_SENSICB;Scope -TP_LOCALLAB_SENSIDEN;Scope -TP_LOCALLAB_SENSIEXCLU;Scope -TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust color to include in exclusion! -TP_LOCALLAB_SENSIH;Scope -TP_LOCALLAB_SENSIH_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors. -TP_LOCALLAB_SENSILOG;Scope -TP_LOCALLAB_SENSIS;Scope -TP_LOCALLAB_SENSIS_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm. -TP_LOCALLAB_SENSI_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm. -TP_LOCALLAB_SENSIMASK_TOOLTIP;Adjust scope of action for this common mask tool.\nActs on the gap between the original image and the mask.\nThe references (luma, chroma, hue) are those of the center of the RT-spot\n\nYou can also act on deltaE internal to the mask with 'Scope Mask deltaE image' in 'Settings' -TP_LOCALLAB_SETTINGS;Settings -TP_LOCALLAB_SH1;Shadows Highlights -TP_LOCALLAB_SH2;Equalizer -TP_LOCALLAB_SHADEX;Shadows -TP_LOCALLAB_SHADEXCOMP;Shadows compression & tonal width -TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone equalizer -TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows & highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. -//Can be used instead - or in complement - of exposure module in difficult cases.\nThe use of Denoise may be necessary : lightening the shadows.\n\nCan be used as graduated filter (increase Scope) -TP_LOCALLAB_SHAMASKCOL;Shadows -TP_LOCALLAB_SHAPETYPE;RT-spot shape -TP_LOCALLAB_SHAPE_TOOLTIP;Elipse is normal mode.\nRectangle can be used in some cases, for example to work in full image in conjonction with delimiters outside preview, transition = 100.\n\nPolygone - Beziers are waiting for GUI... -TP_LOCALLAB_SHARAMOUNT;Amount -TP_LOCALLAB_SHARBLUR;Blur radius -TP_LOCALLAB_SHARDAMPING;Damping -TP_LOCALLAB_SHARFRAME;Modifications -TP_LOCALLAB_SHARITER;Iterations -TP_LOCALLAB_SHARP;Sharpening -TP_LOCALLAB_SHARP_TOOLNAME;Sharpening - 8 -TP_LOCALLAB_SHARRADIUS;Radius -TP_LOCALLAB_SHORTC;Short Curves 'L' Mask -TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7 -TP_LOCALLAB_SHOWC;Mask and modifications -TP_LOCALLAB_SHOWC1;Merge file -TP_LOCALLAB_SHOWCB;Mask and modifications -TP_LOCALLAB_SHOWDCT;Show process Fourier ƒ -TP_LOCALLAB_SHOWE;Mask and modifications -TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) -TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) -TP_LOCALLAB_SHOWLC;Mask and modifications -TP_LOCALLAB_SHOWMASK;Show mask -TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Display mask modifications.\nBeware, you can only view one tool mask at the same time.\nShow modified image: Shows the modified image including any adjustments and masks\n\nNote: Use Mask is before algorihtm shape detection. -TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Show process Fourier:\nShows the different stages of the process.\nLaplace - builds the second derivative according to the threshold (first step).\nFourier -shows the transformed Laplacian with DCT.\nPoisson - show solution of Poisson DCE.\nNormalize - show result without normalization luminance. -TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise -TP_LOCALLAB_SHOWMASKTYP2;Denoise -TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise -TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Mask and modifications can be chosen.\nBlur and noise : in this case it is not used for 'denoise'.\nDenoise : in this case it is not used for 'blur and noise'.\n\nBlur and noise + denoise : mask is shared, be carefull to 'show modifications' and 'scope' -TP_LOCALLAB_SHOWMNONE;Show modified image -TP_LOCALLAB_SHOWMODIF;Show modifications without mask -TP_LOCALLAB_SHOWMODIFMASK;Show modifications with mask -TP_LOCALLAB_SHOWNORMAL;Normalize luminance (no) -TP_LOCALLAB_SHOWPLUS;Mask and modifications - Blur/Grain & Denoise -TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) -TP_LOCALLAB_SHOWR;Mask and modifications -TP_LOCALLAB_SHOWREF;Preview ΔE -TP_LOCALLAB_SHOWS;Mask and modifications -TP_LOCALLAB_SHOWSTRUC;Show spot structure (advanced) -TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(advanced) -TP_LOCALLAB_SHOWT;Mask and modifications -TP_LOCALLAB_SHOWVI;Mask and modifications -TP_LOCALLAB_SHRESFRA;Shadows/Highlights -TP_LOCALLAB_SHTRC_TOOLTIP;Modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones -TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer - 5 -TP_LOCALLAB_SIGMAWAV;Attenuation response -TP_LOCALLAB_SIM;Simple -TP_LOCALLAB_SLOMASKCOL;Slope -TP_LOCALLAB_SLOSH;Slope -TP_LOCALLAB_SOFT;Soft Light - Original Retinex -TP_LOCALLAB_SOFTM;Soft Light -//TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Original Retinex is very different from others Retinex method.\nIts acts on grey and balance luminance.\nIt is an emulation of "Dodge" and "Burn" -TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. -TP_LOCALLAB_SOFTRADIUSCOL;Soft radius -TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts -TP_LOCALLAB_SOFTRETI_TOOLTIP;Take into account deltaE to improve Transmission map -TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 -TP_LOCALLAB_SOURCE_GRAY;Value -TP_LOCALLAB_SPECCASE;Specific cases -TP_LOCALLAB_SPECIAL;Special use of RGB curves -TP_LOCALLAB_SPECIAL_TOOLTIP;Only for this RGB curve, disabled (or reduce effects) of Scope, mask...for example, if you want to have a negative effect. -TP_LOCALLAB_SPOTNAME;New Spot -TP_LOCALLAB_STD;Standard -TP_LOCALLAB_STR;Strength -TP_LOCALLAB_STRBL;Strength -TP_LOCALLAB_STREN;Compression Strength -TP_LOCALLAB_STRENG;Strength -TP_LOCALLAB_STRENGR;Strength -TP_LOCALLAB_STRENGTH;Noise -TP_LOCALLAB_STRGRID;Strength -TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\nif Strength Retinex >= 0.1 Dehaze is in luminance mode. -TP_LOCALLAB_STRUC;Structure -TP_LOCALLAB_STRUCCOL;Structure -TP_LOCALLAB_STRUCCOL1;Spot structure -TP_LOCALLAB_STRUCT_TOOLTIP;Use Sobel algorithm to take into account structure in shape detection.\nyou can have a preview by activating "mask and modifications - Show structure spot".\n\nCan be used in conjunction with masks (advanced) structure, blur, wavelet to improve edge detection.\n\nNeeds maskless adjustments to be activated (lightness, exposure...) -TP_LOCALLAB_STRUMASKCOL;Structure mask strength -TP_LOCALLAB_STRUMASK_TOOLTIP;Generate a structure mask with difference between surface areas and reliefs.\nIf structure mask as tool is enabled, this mask is used in addition to the other tools (gamma, slope, contrast curve ...) -TP_LOCALLAB_STYPE;Shape method -TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. -TP_LOCALLAB_SYM;Symmetrical (mouse) -TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) -TP_LOCALLAB_TARGET_GRAY;Target gray point -TP_LOCALLAB_THRES;Threshold structure -TP_LOCALLAB_THRESDELTAE;ΔE-scope threshold -TP_LOCALLAB_THRESRETI;Threshold -TP_LOCALLAB_THRESWAV;Balance threshold -TP_LOCALLAB_TLABEL;TM Data Min=%1 Max=%2 Mean=%3 Sigma=%4 (Threshold) -TP_LOCALLAB_TLABEL2;TM Effective Tm=%1 TM=%2 -TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize -TP_LOCALLAB_TM;Tone Mapping - Texture -TP_LOCALLAB_TM_MASK;Use transmission map -TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This parameter affects sensitivity to edges.\n The greater it is the more likely an illumination change is to be considered an "edge".\n If set to zero tone mapping will have an effect similar to unsharp masking. -TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Gamma moves the action of tone-mapping to shadows or highlights. -TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. -TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main menu tool must be de-activated if this tool is used. -//Tone Mapping - main menu must be disabled -TP_LOCALLAB_TONEMASCALE_TOOLTIP;This control gives meaning to the difference between "local" and "global" contrast.\nThe greater it is the larger a detail needs to be in order to be boosted -TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 -TP_LOCALLAB_TOOLCOL;Structure mask as tool -TP_LOCALLAB_TOOLMASK;Mask Tools -TP_LOCALLAB_THREND;Local contrast threshold -TP_LOCALLAB_THRENDSIG;Local contrast threshold High levels -TP_LOCALLAB_THRENDLEV;Levels -TP_LOCALLAB_THRESLOW;Guided threshold 14 -TP_LOCALLAB_THRESHIGH;Guided threshold 57 -TP_LOCALLAB_TRANSIT;Transition Gradient -TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY -TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Changes the transition of the abscissa to that of the ordinate -TP_LOCALLAB_TRANSITVALUE;Transition value -TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) -//TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay : change smoothness process - 1 linear - 2 parabolic - 3 cubic - ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelet, Color & Light) -TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light) -TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas, as a percentage of the "radius" -TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain -TP_LOCALLAB_TRANSMISSIONMAP;Transmission map -TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.\nYou can act on this curve to change Transmission and reduce the artifacts -TP_LOCALLAB_USEMASK;Use mask -TP_LOCALLAB_VART;Variance (contrast) -TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool -TP_LOCALLAB_VIBRA_TOOLTIP;Adjust vibrance (essentially the same as the global adjustment).\nCarry out the equivalent of a white-balance adjustment using a CIECAM algorithm. -TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool - 3 -TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 -TP_LOCALLAB_BLUR_TOOLNAME;Smooth Blur/Grain & Denoise - 1 -TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 -TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex - 9 -TP_LOCALLAB_SHARP_TOOLNAME;Sharpening - 8 -TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelet - 7 -TP_LOCALLAB_CBDL_TOOLNAME;CBDL - 2 -TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 -TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask - 13 -TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. -TP_LOCALLAB_WAMASKCOL;Ψ Mask Wavelet level -TP_LOCALLAB_WARM;Warm - Cool & Color artifacts -TP_LOCALLAB_WARM_TOOLTIP;This slider use Ciecam algorithm and acts as White Balance, it can warm or cool the area selected.\nIt can also in some cases reduce color artifacts. -TP_LOCALLAB_WASDEN_TOOLTIP;Denoise luminance for the 4 first levels (fine).\nThe right limit of the curve correspond to coarse : level 4 and beyond (6) -TP_LOCALLAB_WAV;Level local contrast -TP_LOCALLAB_WAVBLUR_TOOLTIP;Performs a blur for each level of decomposition, as well as the residual image. -TP_LOCALLAB_WAVCOMP;Compression by Level -TP_LOCALLAB_WAVCOMPRE;(un)Compression by Level -TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Achieve a Tone-mapping or reduction local contrast by level.\nOn abscissa levels -TP_LOCALLAB_WAVCOMP_TOOLTIP;Achive local contrast in function of the direction wavelet decomposition : horizontal, vertical, diagonal -TP_LOCALLAB_WAVCON;Contrast by Level -TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels : on abscissa levels. -TP_LOCALLAB_WAVDEN;Luminance denoise by level (1 2 3 4 .. 6) -TP_LOCALLAB_WAVE;Ψ Wavelet -TP_LOCALLAB_WAVEDG;Local contrast -TP_LOCALLAB_WAVEEDG_TOOLTIP;Achieves a sharpness taking into account the notion of edges wavelet.\nRequires that at least the first 4 levels are usable -TP_LOCALLAB_WAVGRAD_TOOLTIP;Graduated filter for Local contrast "luminance" -TP_LOCALLAB_WAVHIGH;Ψ Wavelet high -TP_LOCALLAB_WAVLEV;Blur by Level -TP_LOCALLAB_WAVLOW;Ψ Wavelet low -TP_LOCALLAB_WAVMASK;Ψ Local contrast (by wavelet level) -TP_LOCALLAB_WAVMASK_TOOLTIP;Allows fine work on mask levels contrasts (structure) -TP_LOCALLAB_WAVMED;Ψ Wavelet normal -TP_LOCALLAB_WEDIANHI;Median Hi -TP_LOCALLAB_WHITE_EV;White Ev -TP_LOCAL_HEIGHT;Bottom -TP_LOCAL_HEIGHT_T;Top -TP_LOCAL_WIDTH;Right -TP_LOCAL_WIDTH_L;Left -TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\n -TP_METADATA_EDIT;Apply modifications -TP_METADATA_MODE;Metadata copy mode -TP_METADATA_STRIP;Strip all metadata -TP_METADATA_TUNNEL;Copy unchanged -TP_NEUTRAL;Reset -TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. -TP_PCVIGNETTE_FEATHER;Feather -TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. -TP_PCVIGNETTE_LABEL;Vignette Filter -TP_PCVIGNETTE_ROUNDNESS;Roundness -TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. -TP_PCVIGNETTE_STRENGTH;Strength -TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). -TP_PDSHARPENING_LABEL;Capture Sharpening -TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor -TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length -TP_PERSPECTIVE_CAMERA_FRAME;Correction -TP_PERSPECTIVE_CAMERA_PITCH;Vertical -TP_PERSPECTIVE_CAMERA_ROLL;Rotation -TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift -TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift -TP_PERSPECTIVE_CAMERA_YAW;Horizontal -TP_PERSPECTIVE_HORIZONTAL;Horizontal -TP_PERSPECTIVE_LABEL;Perspective -TP_PERSPECTIVE_METHOD;Method -TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based -TP_PERSPECTIVE_METHOD_SIMPLE;Simple -TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment -TP_PERSPECTIVE_PROJECTION_PITCH;Vertical -TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation -TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift -TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift -TP_PERSPECTIVE_PROJECTION_YAW;Horizontal -TP_PERSPECTIVE_RECOVERY_FRAME;Recovery -TP_PERSPECTIVE_VERTICAL;Vertical -TP_PFCURVE_CURVEEDITOR_CH;Hue -TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. -TP_PREPROCESS_DEADPIXFILT;Dead pixel filter -TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. -TP_PREPROCESS_GREENEQUIL;Green equilibration -TP_PREPROCESS_HOTPIXFILT;Hot pixel filter -TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. -TP_PREPROCESS_LABEL;Preprocessing -TP_PREPROCESS_LINEDENOISE;Line noise filter -TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction -TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both -TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal -TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows -TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical -TP_PREPROCESS_NO_FOUND;None found -TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -TP_PREPROCWB_LABEL;Preprocess White Balance -TP_PREPROCWB_MODE;Mode -TP_PREPROCWB_MODE_AUTO;Auto -TP_PREPROCWB_MODE_CAMERA;Camera -TP_PRSHARPENING_LABEL;Post-Resize Sharpening -TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. -TP_RAWCACORR_AUTO;Auto-correction -TP_RAWCACORR_AUTOIT;Iterations -TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. -TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift -TP_RAWCACORR_CABLUE;Blue -TP_RAWCACORR_CARED;Red -TP_RAWCACORR_LABEL;Chromatic Aberration Correction -TP_RAWEXPOS_BLACK_0;Green 1 (lead) -TP_RAWEXPOS_BLACK_1;Red -TP_RAWEXPOS_BLACK_2;Blue -TP_RAWEXPOS_BLACK_3;Green 2 -TP_RAWEXPOS_BLACK_BLUE;Blue -TP_RAWEXPOS_BLACK_GREEN;Green -TP_RAWEXPOS_BLACK_RED;Red -TP_RAWEXPOS_LINEAR;White-point correction -TP_RAWEXPOS_RGB;Red, Green, Blue -TP_RAWEXPOS_TWOGREEN;Link greens -TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) -TP_RAW_2PASS;1-pass+fast -TP_RAW_3PASSBEST;3-pass (Markesteijn) -TP_RAW_4PASS;3-pass+fast -TP_RAW_AHD;AHD -TP_RAW_AMAZE;AMaZE -TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear -TP_RAW_AMAZEVNG4;AMaZE+VNG4 -TP_RAW_BORDER;Border -TP_RAW_DCB;DCB -TP_RAW_DCBENHANCE;DCB enhancement -TP_RAW_DCBITERATIONS;Number of DCB iterations -TP_RAW_DCBBILINEAR;DCB+Bilinear -TP_RAW_DCBVNG4;DCB+VNG4 -TP_RAW_DMETHOD;Method -TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... -TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. -TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold -TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). -TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold -TP_RAW_EAHD;EAHD -TP_RAW_FALSECOLOR;False color suppression steps -TP_RAW_FAST;Fast -TP_RAW_HD;Threshold -TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear. -TP_RAW_HPHD;HPHD -TP_RAW_IGV;IGV -TP_RAW_IMAGENUM;Sub-image -TP_RAW_IMAGENUM_SN;SN mode -TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. -TP_RAW_LABEL;Demosaicing -TP_RAW_LMMSE;LMMSE -TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps -TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (steps 5-6) to reduce artifacts and improve the signal-to-noise ratio. -TP_RAW_MONO;Mono -TP_RAW_NONE;None (Shows sensor pattern) -TP_RAW_PIXELSHIFT;Pixel Shift -TP_RAW_PIXELSHIFTBLUR;Blur motion mask -TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion -TP_RAW_PIXELSHIFTEPERISO;Sensitivity -TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. -TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames -TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equalize per channel -TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Enabled: Equalize the RGB channels individually.\nDisabled: Use same equalization factor for all channels. -TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. -TP_RAW_PIXELSHIFTGREEN;Check green channel for motion -TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask -TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask -TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. -TP_RAW_PIXELSHIFTMM_AUTO;Automatic -TP_RAW_PIXELSHIFTMM_CUSTOM;Custom -TP_RAW_PIXELSHIFTMM_OFF;Off -TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction -TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask -TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask -TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. -TP_RAW_PIXELSHIFTSIGMA;Blur radius -TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. -TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions -TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -TP_RAW_RCD;RCD -TP_RAW_RCDBILINEAR;RCD+Bilinear -TP_RAW_RCDVNG4;RCD+VNG4 -TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix -TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.\n+fast gives less artifacts in flat areas -TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix -TP_RAW_VNG4;VNG4 -TP_RAW_XTRANS;X-Trans -TP_RAW_XTRANSFAST;Fast X-Trans -TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling -TP_RESIZE_APPLIESTO;Applies to: -TP_RESIZE_CROPPEDAREA;Cropped Area -TP_RESIZE_FITBOX;Bounding Box -TP_RESIZE_FULLIMAGE;Full Image -TP_RESIZE_H;Height: -TP_RESIZE_HEIGHT;Height -TP_RESIZE_LABEL;Resize -TP_RESIZE_LANCZOS;Lanczos -TP_RESIZE_METHOD;Method: -TP_RESIZE_NEAREST;Nearest -TP_RESIZE_SCALE;Scale -TP_RESIZE_SPECIFY;Specify: -TP_RESIZE_W;Width: -TP_RESIZE_WIDTH;Width -TP_RETINEX_CONTEDIT_HSL;HSL histogram -TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram -TP_RETINEX_CONTEDIT_LH;Hue -TP_RETINEX_CONTEDIT_MAP;Equalizer -TP_RETINEX_CURVEEDITOR_CD;L=f(L) -TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts. -TP_RETINEX_CURVEEDITOR_LH;Strength=f(H) -TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. -TP_RETINEX_CURVEEDITOR_MAP;L=f(L) -TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! -TP_RETINEX_EQUAL;Equalizer -TP_RETINEX_FREEGAMMA;Free gamma -TP_RETINEX_GAIN;Gain -TP_RETINEX_GAINOFFS;Gain and Offset (brightness) -TP_RETINEX_GAINTRANSMISSION;Gain transmission -TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. -TP_RETINEX_GAMMA;Gamma -TP_RETINEX_GAMMA_FREE;Free -TP_RETINEX_GAMMA_HIGH;High -TP_RETINEX_GAMMA_LOW;Low -TP_RETINEX_GAMMA_MID;Middle -TP_RETINEX_GAMMA_NONE;None -TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.). -TP_RETINEX_GRAD;Transmission gradient -TP_RETINEX_GRADS;Strength gradient -TP_RETINEX_GRADS_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Strength is reduced when iterations increase, and conversely. -TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Variance and Threshold are reduced when iterations increase, and conversely. -TP_RETINEX_HIGH;High -TP_RETINEX_HIGHLIG;Highlight -TP_RETINEX_HIGHLIGHT;Highlight threshold -TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool. -TP_RETINEX_HSLSPACE_LIN;HSL-Linear -TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic -TP_RETINEX_ITER;Iterations (Tone-mapping) -TP_RETINEX_ITERF;Tone mapping -TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. -TP_RETINEX_LABEL;Retinex -TP_RETINEX_LABEL_MASK;Mask -TP_RETINEX_LABSPACE;L*a*b* -TP_RETINEX_LOW;Low -TP_RETINEX_MAP;Method -TP_RETINEX_MAP_GAUS;Gaussian mask -TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) -TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) -TP_RETINEX_MAP_METHOD_TOOLTIP;Use the mask generated by the Gaussian function above (Radius, Method) to reduce halos and artifacts.\n\nCurve only: apply a diagonal contrast curve on the mask.\nBeware of artifacts!\n\nGaussian mask: generate and use a Gaussian blur of the original mask.\nQuick.\n\nSharp mask: generate and use a wavelet on the original mask.\nSlow. -TP_RETINEX_MAP_NONE;None -TP_RETINEX_MEDIAN;Transmission median filter -TP_RETINEX_METHOD;Method -TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\nHighlights = Remove magenta in highlights. -TP_RETINEX_MLABEL;Restored data Min=%1 Max=%2 -TP_RETINEX_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible\nRestored image with no mixture. -TP_RETINEX_NEIGHBOR;Radius -TP_RETINEX_NEUTRAL;Reset -TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -TP_RETINEX_OFFSET;Offset (brightness) -TP_RETINEX_SCALES;Gaussian gradient -TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. -TP_RETINEX_SETTINGS;Settings -TP_RETINEX_SKAL;Scale -TP_RETINEX_SLOPE;Free gamma slope -TP_RETINEX_STRENGTH;Strength -TP_RETINEX_THRESHOLD;Threshold -TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss. -TP_RETINEX_TLABEL;TM Data Min=%1 Max=%2 Mean=%3 Sigma=%4 -TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 -TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map. -TP_RETINEX_TRANF;Transmission -TP_RETINEX_TRANSMISSION;Transmission map -TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. -TP_RETINEX_UNIFORM;Uniform -TP_RETINEX_VARIANCE;Contrast -TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts. -TP_RETINEX_VIEW;Process -TP_RETINEX_VIEW_MASK;Mask -TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Normal display.\nMask - Displays the mask.\nUnsharp mask - Displays the image with a high radius unsharp mask.\nTransmission - Auto/Fixed - Displays the file transmission-map, before any action on contrast and brightness.\n\nAttention: the mask does not correspond to reality, but is amplified to make it more visible. -TP_RETINEX_VIEW_NONE;Standard -TP_RETINEX_VIEW_TRAN;Transmission - Auto -TP_RETINEX_VIEW_TRAN2;Transmission - Fixed -TP_RETINEX_VIEW_UNSHARP;Unsharp mask -TP_RGBCURVES_BLUE;B -TP_RGBCURVES_CHANNEL;Channel -TP_RGBCURVES_GREEN;G -TP_RGBCURVES_LABEL;RGB Curves -TP_RGBCURVES_LUMAMODE;Luminosity mode -TP_RGBCURVES_LUMAMODE_TOOLTIP;Luminosity mode allows to vary the contribution of R, G and B channels to the luminosity of the image, without altering image color. -TP_RGBCURVES_RED;R -TP_ROTATE_DEGREE;Degree -TP_ROTATE_LABEL;Rotate -TP_ROTATE_SELECTLINE;Select Straight Line -TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter -TP_SHADOWSHLIGHTS_HIGHLIGHTS;Highlights -TP_SHADOWSHLIGHTS_HLTONALW;Highlights tonal width -TP_SHADOWSHLIGHTS_LABEL;Shadows/Highlights -TP_SHADOWSHLIGHTS_RADIUS;Radius -TP_SHADOWSHLIGHTS_SHADOWS;Shadows -TP_SHADOWSHLIGHTS_SHTONALW;Shadows tonal width -TP_SHARPENEDGE_AMOUNT;Quantity -TP_SHARPENEDGE_LABEL;Edges -TP_SHARPENEDGE_PASSES;Iterations -TP_SHARPENEDGE_THREE;Luminance only -TP_SHARPENING_AMOUNT;Amount -TP_SHARPENING_BLUR;Blur radius -TP_SHARPENING_CONTRAST;Contrast threshold -TP_SHARPENING_EDRADIUS;Radius -TP_SHARPENING_EDTOLERANCE;Edge tolerance -TP_SHARPENING_HALOCONTROL;Halo control -TP_SHARPENING_HCAMOUNT;Amount -TP_SHARPENING_ITERCHECK;Auto limit iterations -TP_SHARPENING_LABEL;Sharpening -TP_SHARPENING_METHOD;Method -TP_SHARPENING_ONLYEDGES;Sharpen only edges -TP_SHARPENING_RADIUS;Radius -TP_SHARPENING_RADIUS_BOOST;Corner radius boost -TP_SHARPENING_RLD;RL Deconvolution -TP_SHARPENING_RLD_AMOUNT;Amount -TP_SHARPENING_RLD_DAMPING;Damping -TP_SHARPENING_RLD_ITERATIONS;Iterations -TP_SHARPENING_THRESHOLD;Threshold -TP_SHARPENING_USM;Unsharp Mask -TP_SHARPENMICRO_AMOUNT;Quantity -TP_SHARPENMICRO_CONTRAST;Contrast threshold -TP_SHARPENMICRO_LABEL;Microcontrast -TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 -TP_SHARPENMICRO_UNIFORMITY;Uniformity -TP_SOFTLIGHT_LABEL;Soft Light -TP_SOFTLIGHT_STRENGTH;Strength -TP_TM_FATTAL_AMOUNT;Amount -TP_TM_FATTAL_ANCHOR;Anchor -TP_TM_FATTAL_LABEL;Dynamic Range Compression -TP_TM_FATTAL_THRESHOLD;Detail -TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift -TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH -TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones -TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple -TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Red -TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Red/Yellow -TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Yellow -TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H) -TP_VIBRANCE_LABEL;Vibrance -TP_VIBRANCE_PASTELS;Pastel tones -TP_VIBRANCE_PASTSATTOG;Link pastel and saturated tones -TP_VIBRANCE_PROTECTSKINS;Protect skin-tones -TP_VIBRANCE_PSTHRESHOLD;Pastel/saturated tones threshold -TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Saturation threshold -TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;The vertical axis represents pastel tones at the bottom and saturated tones at the top.\nThe horizontal axis represents the saturation range. -TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Pastel/saturated transition's weighting -TP_VIBRANCE_SATURATED;Saturated Tones -TP_VIGNETTING_AMOUNT;Amount -TP_VIGNETTING_CENTER;Center -TP_VIGNETTING_CENTER_X;Center X -TP_VIGNETTING_CENTER_Y;Center Y -TP_VIGNETTING_LABEL;Vignetting Correction -TP_VIGNETTING_RADIUS;Radius -TP_VIGNETTING_STRENGTH;Strength -TP_WAVELET_1;Level 1 -TP_WAVELET_2;Level 2 -TP_WAVELET_3;Level 3 -TP_WAVELET_4;Level 4 -TP_WAVELET_5;Level 5 -TP_WAVELET_6;Level 6 -TP_WAVELET_7;Level 7 -TP_WAVELET_8;Level 8 -TP_WAVELET_9;Level 9 -TP_WAVELET_APPLYTO;Apply to -TP_WAVELET_AVOID;Avoid color shift -TP_WAVELET_B0;Black -TP_WAVELET_B1;Gray -TP_WAVELET_B2;Residual -TP_WAVELET_BACKGROUND;Background -TP_WAVELET_BACUR;Curve -TP_WAVELET_BALANCE;Contrast balance d/v-h -TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified. -TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the vertical, horizontal and diagonal wavelet directions: .\nActivating contrast, chroma or residual tone mapping amplifies the effect due to balance -TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. -TP_WAVELET_BALCHROM;Denoise equalizer Blue-Yellow Red-Green -TP_WAVELET_BALLUM;Denoise equalizer White-Black -TP_WAVELET_BANONE;None -TP_WAVELET_BASLI;Slider -TP_WAVELET_BATYPE;Contrast balance method -TP_WAVELET_BL;Blur levels -TP_WAVELET_BLCURVE;Blur by levels -TP_WAVELET_BLURFRAME;Blur -TP_WAVELET_BLUWAV;Attenuation response -TP_WAVELET_CBENAB;Toning and Color balance -TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance -TP_WAVELET_CCURVE;Local contrast -TP_WAVELET_CH1;Whole chroma range -TP_WAVELET_CH2;Saturated/pastel -TP_WAVELET_CH3;Link contrast levels -TP_WAVELET_CHCU;Curve -TP_WAVELET_CHR;Chroma-contrast link strength -TP_WAVELET_CHRO;Saturated/pastel threshold -TP_WAVELET_CHROFRAME;Denoise chrominance -TP_WAVELET_CHROMAFRAME;Chroma -TP_WAVELET_CHROMCO;Coarse chroma -TP_WAVELET_CHROMFI;Fine Chroma -TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored. -TP_WAVELET_CHRWAV;Blur chroma -TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" -TP_WAVELET_CHSL;Sliders -TP_WAVELET_CHTYPE;Chrominance method -TP_WAVELET_CLA;Clarity -TP_WAVELET_CLARI;Sharp-mask and Clarity -TP_WAVELET_COLORT;Opacity red-green -TP_WAVELET_COMPCONT;Contrast -TP_WAVELET_COMPGAMMA;Compression gamma -TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram. -TP_WAVELET_COMPLEXLAB;Complexity -TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations -TP_WAVELET_COMPNORMAL;Standard -TP_WAVELET_COMPEXPERT;Advanced -TP_WAVELET_COMPTM;Tone mapping -TP_WAVELET_CONTEDIT;'After' contrast curve -TP_WAVELET_CONTFRAME;Contrast - Compression -TP_WAVELET_CONTR;Gamut -TP_WAVELET_CONTRA;Contrast -TP_WAVELET_CONTRASTEDIT;Finer - Coarser levels -TP_WAVELET_CONTRAST_MINUS;Contrast - -TP_WAVELET_CONTRAST_PLUS;Contrast + -TP_WAVELET_CONTRA_TOOLTIP;Changes the residual image contrast. -TP_WAVELET_CTYPE;Chrominance control -TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300% -TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000). -TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue) -TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero. -TP_WAVELET_CURVEEDITOR_CL;L -TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. -TP_WAVELET_CURVEEDITOR_HH;HH -TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. -TP_WAVELET_DALL;All directions -TP_WAVELET_DAUB;Edge performance -TP_WAVELET_DAUB2;D2 - low -TP_WAVELET_DAUB4;D4 - standard -TP_WAVELET_DAUB6;D6 - standard plus -TP_WAVELET_DAUB10;D10 - medium -TP_WAVELET_DAUB14;D14 - high -TP_WAVELET_DAUBLOCAL;Wavelet Edge performance -TP_WAVELET_DAUB_TOOLTIP;Changes Daubechies coefficients:\nD4 = Standard,\nD14 = Often best performance, 10% more time-intensive.\n\nAffects edge detection as well as the general quality of the first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. -TP_WAVELET_DENOISE;Guide curve based on Local contrast -TP_WAVELET_DENOISEGUID;Guided threshold based on hue -TP_WAVELET_DENOISEH;High levels Curve Local contrast -TP_WAVELET_DENOISEHUE;Denoise equalizer Hue -TP_WAVELET_DENCONTRAST;Local contrast Equalizer -TP_WAVELET_DENEQUAL;1 2 3 4 Equal -TP_WAVELET_DEN14PLUS;1 4 High -TP_WAVELET_DEN14LOW;1 4 Low -TP_WAVELET_DEN12PLUS;1 2 High -TP_WAVELET_DEN12LOW;1 2 Low -TP_WAVELET_DEN5THR;Guided threshold -//TP_WAVELET_DENH;Low levels (1234)- Finest details -//TP_WAVELET_DENLH;Guided threshold by detail levels 1-4 -//TP_WAVELET_DENL;High levels - Coarsest details -TP_WAVELET_DENH;Threshold -TP_WAVELET_DENLH;Guided threshold by detail levels 1-4 -TP_WAVELET_DENL;Correction structure -TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained -TP_WAVELET_DENMIX_TOOLTIP;Balances the action of the guide taking into account the original image and the denoised image -TP_WAVELET_DENQUA;Mode -TP_WAVELET_DENSLILAB;Method -TP_WAVELET_DENSLI;Slider -TP_WAVELET_DENCURV;Curve -TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide -TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color -TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter -TP_WAVELET_DETEND;Details -TP_WAVELET_DIRFRAME;Directional contrast -TP_WAVELET_DONE;Vertical -TP_WAVELET_DTHR;Diagonal -TP_WAVELET_DTWO;Horizontal -TP_WAVELET_EDCU;Curve -TP_WAVELET_EDEFFECT;Attenuation response -TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment -TP_WAVELET_EDGCONT;Local contrast -TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+std. dev. and maxima. -TP_WAVELET_EDGE;Edge Sharpness -TP_WAVELET_EDGEAMPLI;Base amplification -TP_WAVELET_EDGEDETECT;Gradient sensitivity -TP_WAVELET_EDGEDETECTTHR;Threshold low (noise) -TP_WAVELET_EDGEDETECTTHR2;Edge enhancement -TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge -TP_WAVELET_EDGEDETECT_TOOLTIP;Moving the slider to the right increases edge sensitivity. This affects local contrast, edge settings and noise. -TP_WAVELET_EDGESENSI;Edge sensitivity -TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. -TP_WAVELET_EDGTHRESH;Detail -TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. -TP_WAVELET_EDRAD;Radius -TP_WAVELET_EDRAD_TOOLTIP;This adjustment controls the local enhancement. A value of zero still has an effect -TP_WAVELET_EDSL;Threshold sliders -TP_WAVELET_EDTYPE;Local contrast method -TP_WAVELET_EDVAL;Strength -TP_WAVELET_FINAL;Final Touchup -TP_WAVELET_FINCFRAME;Final local contrast -TP_WAVELET_FINCOAR_TOOLTIP;The left (positive) part of the curve acts on the finer levels (increase).\nThe 2 points on the abscissa represent the respective action limits of finer and coarser levels 5 and 6 (default).\nThe right (negative) part of the curve acts on the coarser levels (increase).\nAvoid moving the left part of the curve with negative values. Avoid moving the right part of the curve with positives values -TP_WAVELET_FINEST;Finest -TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter -TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) -TP_WAVELET_HIGHLIGHT;Finer levels luminance range -TP_WAVELET_HS1;Whole luminance range -TP_WAVELET_HS2;Selective luminance range -TP_WAVELET_HUESKIN;Skin hue -TP_WAVELET_HUESKIN_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. -TP_WAVELET_HUESKY;Hue range -TP_WAVELET_HUESKY_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. -TP_WAVELET_ITER;Delta balance levels -TP_WAVELET_ITER_TOOLTIP;Left: increase low levels and reduce high levels,\nRight: reduce low levels and increase high levels. -TP_WAVELET_LABEL;Wavelet Levels -TP_WAVELET_LARGEST;Coarsest -TP_WAVELET_LEVCH;Chroma -TP_WAVELET_LEVDEN;Level 5-6 denoise -TP_WAVELET_LEVDIR_ALL;All levels, in all directions -TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level -TP_WAVELET_LEVDIR_ONE;One level -TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level -TP_WAVELET_LEVELS;Wavelet levels -TP_WAVELET_LEVELLOW;Radius 1-4 -TP_WAVELET_LEVELHIGH;Radius 5-6 -TP_WAVELET_LEVELSIGM;Radius -TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. -TP_WAVELET_LEVF;Contrast -TP_WAVELET_LEVLABEL;Preview maximum possible levels = %1 -TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold -TP_WAVELET_LEVONE;Level 2 -TP_WAVELET_LEVTHRE;Level 4 -TP_WAVELET_LEVTWO;Level 3 -TP_WAVELET_LEVZERO;Level 1 -TP_WAVELET_LIMDEN;Interaction levels 56 on levels 14 -TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength -TP_WAVELET_LIPST;Enhanced algoritm -TP_WAVELET_LOWLIGHT;Coarser levels luminance range -TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise -TP_WAVELET_MEDGREINF;First level -TP_WAVELET_MEDI;Reduce artifacts in blue sky -TP_WAVELET_MEDILEV;Edge detection -TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine. -TP_WAVELET_MERGEC;Merge chroma -TP_WAVELET_MERGEL;Merge luma -TP_WAVELET_NEUTRAL;Neutral -TP_WAVELET_MIXCONTRAST;Reference local contrast -TP_WAVELET_MIXDENOISE;Denoise -TP_WAVELET_MIXNOISE;Noise -TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise -TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise -TP_WAVELET_NOIS;Denoise -TP_WAVELET_NOISE;Denoise and Refine -TP_WAVELET_NOISE_TOOLTIP;If level 4 luminance denoise superior to 50, mode Agressive is used.\nIf chrominance coarse superior to 20, mode Agressive is used. -TP_WAVELET_NPHIGH;High -TP_WAVELET_NPLOW;Low -TP_WAVELET_NPNONE;None -TP_WAVELET_NPTYPE;Neighboring pixels -TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced. -TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. -TP_WAVELET_OLDSH;Algorithm using negatives values -TP_WAVELET_OPACITY;Opacity blue-yellow -TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -TP_WAVELET_OPACITYWL;Local contrast -TP_WAVELET_OPACITYWL_TOOLTIP;Modify the final local contrast at the end of the wavelet treatment.\n\nThe left side represents the smallest local contrast, progressing to the largest local contrast on the right. -TP_WAVELET_PASTEL;Pastel chroma -TP_WAVELET_PROC;Process -TP_WAVELET_PROTAB;Protection -TP_WAVELET_QUAAGRES;Agressive -TP_WAVELET_QUACONSER;Conservative -TP_WAVELET_RADIUS;Radius shadows - highlight -TP_WAVELET_RANGEAB;Range a and b % -TP_WAVELET_RE1;Reinforced -TP_WAVELET_RE2;Unchanged -TP_WAVELET_RE3;Reduced -TP_WAVELET_RESBLUR;Blur luminance -TP_WAVELET_RESBLURC;Blur chroma -TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500% -TP_WAVELET_RESCHRO;Strength -TP_WAVELET_RESCON;Shadows -TP_WAVELET_RESCONH;Highlights -TP_WAVELET_RESID;Residual Image -TP_WAVELET_SAT;Saturated chroma -TP_WAVELET_SETTINGS;Wavelet Settings -TP_WAVELET_SHA;Sharp mask -TP_WAVELET_SHFRAME;Shadows/Highlights -TP_WAVELET_SHOWMASK;Show wavelet 'mask' -TP_WAVELET_SIGMA;Attenuation response -TP_WAVELET_SIGM;Radius -TP_WAVELET_SIGMAFIN;Attenuation response -TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values -TP_WAVELET_SKIN;Skin targetting/protection -TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. -TP_WAVELET_SKY;Hue targetting/protection -TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. -TP_WAVELET_SOFTRAD;Soft radius -TP_WAVELET_STREN;Refine -TP_WAVELET_STREND;Strength -TP_WAVELET_STRENGTH;Strength -TP_WAVELET_SUPE;Extra -TP_WAVELET_THR;Shadows threshold -TP_WAVELET_THREND;Local contrast threshold -TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained -//TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped denoise curve based on local contrast.\nReduces noise in uniform areas and preserves image structure -TP_WAVELET_THRESHOLD;Finer levels -TP_WAVELET_THRESHOLD2;Coarser levels -TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of ‘wavelet levels’ will be affected by the Shadow luminance range. -TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. -TP_WAVELET_THRESWAV;Balance threshold -TP_WAVELET_THRH;Highlights threshold -TP_WAVELET_TILESBIG;Tiles -TP_WAVELET_TILESFULL;Full image -TP_WAVELET_TILESIZE;Tiling method -TP_WAVELET_TILESLIT;Little tiles -TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements. -TP_WAVELET_TMEDGS;Edge stopping -TP_WAVELET_TMSCALE;Scale -TP_WAVELET_TMSTRENGTH;Compression strength -TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. -TP_WAVELET_TMTYPE;Compression method -TP_WAVELET_TON;Toning -TP_WAVELET_TONFRAME;Excluded colors -TP_WAVELET_USH;None -TP_WAVELET_USHARP;Clarity method -TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment -TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. -TP_WAVELET_WAVLOWTHR;Low contrast threshold -TP_WAVELET_WAVOFFSET;Offset -TP_WBALANCE_AUTO;Auto -TP_WBALANCE_AUTOITCGREEN;Temperature correlation -TP_WBALANCE_AUTOOLD;RGB grey -TP_WBALANCE_AUTO_HEADER;Automatic -TP_WBALANCE_CAMERA;Camera -TP_WBALANCE_CLOUDY;Cloudy -TP_WBALANCE_CUSTOM;Custom -TP_WBALANCE_DAYLIGHT;Daylight (sunny) -TP_WBALANCE_EQBLUERED;Blue/Red equalizer -TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behavior of "white balance" by modulating the blue/red balance.\nThis can be useful when shooting conditions:\na) are far from the standard illuminant (e.g. underwater),\nb) are far from conditions where calibrations were performed,\nc) where the matrices or ICC profiles are unsuitable. -TP_WBALANCE_FLASH55;Leica -TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus -TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta -TP_WBALANCE_FLASH_HEADER;Flash -TP_WBALANCE_FLUO1;F1 - Daylight -TP_WBALANCE_FLUO2;F2 - Cool White -TP_WBALANCE_FLUO3;F3 - White -TP_WBALANCE_FLUO4;F4 - Warm White -TP_WBALANCE_FLUO5;F5 - Daylight -TP_WBALANCE_FLUO6;F6 - Lite White -TP_WBALANCE_FLUO7;F7 - D65 Daylight Simulator -TP_WBALANCE_FLUO8;F8 - D50 / Sylvania F40 Design -TP_WBALANCE_FLUO9;F9 - Cool White Deluxe -TP_WBALANCE_FLUO10;F10 - Philips TL85 -TP_WBALANCE_FLUO11;F11 - Philips TL84 -TP_WBALANCE_FLUO12;F12 - Philips TL83 -TP_WBALANCE_FLUO_HEADER;Fluorescent -TP_WBALANCE_GREEN;Tint -TP_WBALANCE_GTI;GTI -TP_WBALANCE_HMI;HMI -TP_WBALANCE_JUDGEIII;JudgeIII -TP_WBALANCE_LABEL;White Balance -TP_WBALANCE_LAMP_HEADER;Lamp -TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 -TP_WBALANCE_LED_HEADER;LED -TP_WBALANCE_LED_LSI;LSI Lumelex 2040 -TP_WBALANCE_METHOD;Method -TP_WBALANCE_PICKER;Pick -TP_WBALANCE_SHADE;Shade -TP_WBALANCE_SIZE;Size: -TP_WBALANCE_SOLUX35;Solux 3500K -TP_WBALANCE_SOLUX41;Solux 4100K -TP_WBALANCE_SOLUX47;Solux 4700K (vendor) -TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) -TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. -TP_WBALANCE_STUDLABEL;Correlation factor: %1 -TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. -TP_WBALANCE_TEMPBIAS;AWB temperature bias -TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". -TP_WBALANCE_TEMPERATURE;Temperature -TP_WBALANCE_TUNGSTEN;Tungsten -TP_WBALANCE_WATER1;UnderWater 1 -TP_WBALANCE_WATER2;UnderWater 2 -TP_WBALANCE_WATER_HEADER;UnderWater -ZOOMPANEL_100;(100%) -ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window -ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f -ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f -ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + -ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - - -#00 default translation file -#01 Developers should add translations to this file and then run the 'generateTranslationDiffs' Bash script to update other locales. -#02 Translators please append a comment here with the current date and your name(s) as used in the RawTherapee forum or GitHub page, e.g.: -#03 2525-12-24 Zager and Evans - -ABOUT_TAB_BUILD;Version -ABOUT_TAB_CREDITS;Credits -ABOUT_TAB_LICENSE;License -ABOUT_TAB_RELEASENOTES;Release Notes -ABOUT_TAB_SPLASH;Splash -ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. -BATCH_PROCESSING;Batch Processing -CURVEEDITOR_AXIS_IN;I: -CURVEEDITOR_AXIS_LEFT_TAN;LT: -CURVEEDITOR_AXIS_OUT;O: -CURVEEDITOR_AXIS_RIGHT_TAN;RT: -CURVEEDITOR_CATMULLROM;Flexible -CURVEEDITOR_CURVE;Curve -CURVEEDITOR_CURVES;Curves -CURVEEDITOR_CUSTOM;Standard -CURVEEDITOR_DARKS;Darks -CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node. -CURVEEDITOR_HIGHLIGHTS;Highlights -CURVEEDITOR_LIGHTS;Lights -CURVEEDITOR_LINEAR;Linear -CURVEEDITOR_LOADDLGLABEL;Load curve -CURVEEDITOR_MINMAXCPOINTS;Equalizer -CURVEEDITOR_NURBS;Control cage -CURVEEDITOR_PARAMETRIC;Parametric -CURVEEDITOR_SAVEDLGLABEL;Save curve... -CURVEEDITOR_SHADOWS;Shadows -CURVEEDITOR_TOOLTIPCOPY;Copy current curve to clipboard. -CURVEEDITOR_TOOLTIPLINEAR;Reset curve to linear. -CURVEEDITOR_TOOLTIPLOAD;Load a curve from file. -CURVEEDITOR_TOOLTIPPASTE;Paste curve from clipboard. -CURVEEDITOR_TOOLTIPSAVE;Save current curve. -CURVEEDITOR_TYPE;Type: -DIRBROWSER_FOLDERS;Folders -DONT_SHOW_AGAIN;Don't show this message again. -DYNPROFILEEDITOR_DELETE;Delete -DYNPROFILEEDITOR_EDIT;Edit -DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule -DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. -DYNPROFILEEDITOR_IMGTYPE_ANY;Any -DYNPROFILEEDITOR_IMGTYPE_HDR;HDR -DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift -DYNPROFILEEDITOR_IMGTYPE_STD;Standard -DYNPROFILEEDITOR_MOVE_DOWN;Move Down -DYNPROFILEEDITOR_MOVE_UP;Move Up -DYNPROFILEEDITOR_NEW;New -DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule -DYNPROFILEEDITOR_PROFILE;Processing Profile -EDITWINDOW_TITLE;Image Edit -EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. -EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. -EXIFFILTER_APERTURE;Aperture -EXIFFILTER_CAMERA;Camera -EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) -EXIFFILTER_FILETYPE;File type -EXIFFILTER_FOCALLEN;Focal length -EXIFFILTER_IMAGETYPE;Image type -EXIFFILTER_ISO;ISO -EXIFFILTER_LENS;Lens -EXIFFILTER_METADATAFILTER;Enable metadata filters -EXIFFILTER_SHUTTER;Shutter -EXIFPANEL_ADDEDIT;Add/Edit -EXIFPANEL_ADDEDITHINT;Add new tag or edit tag. -EXIFPANEL_ADDTAGDLG_ENTERVALUE;Enter value -EXIFPANEL_ADDTAGDLG_SELECTTAG;Select tag -EXIFPANEL_ADDTAGDLG_TITLE;Add/Edit Tag -EXIFPANEL_KEEP;Keep -EXIFPANEL_KEEPHINT;Keep the selected tags when writing output file. -EXIFPANEL_REMOVE;Remove -EXIFPANEL_REMOVEHINT;Remove the selected tags when writing output file. -EXIFPANEL_RESET;Reset -EXIFPANEL_RESETALL;Reset All -EXIFPANEL_RESETALLHINT;Reset all tags to their original values. -EXIFPANEL_RESETHINT;Reset the selected tags to their original values. -EXIFPANEL_SHOWALL;Show all -EXIFPANEL_SUBDIRECTORY;Subdirectory -EXPORT_BYPASS;Processing steps to bypass -EXPORT_BYPASS_ALL;Select / Unselect All -EXPORT_BYPASS_DEFRINGE;Bypass Defringe -EXPORT_BYPASS_DIRPYRDENOISE;Bypass Noise Reduction -EXPORT_BYPASS_DIRPYREQUALIZER;Bypass Contrast by Detail Levels -EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels -EXPORT_BYPASS_RAW_CA;Bypass [raw] Chromatic Aberration Correction -EXPORT_BYPASS_RAW_CCSTEPS;Bypass [raw] False Color Suppression -EXPORT_BYPASS_RAW_DCB_ENHANCE;Bypass [raw] DCB Enhancement Steps -EXPORT_BYPASS_RAW_DCB_ITERATIONS;Bypass [raw] DCB Iterations -EXPORT_BYPASS_RAW_DF;Bypass [raw] Dark-Frame -EXPORT_BYPASS_RAW_FF;Bypass [raw] Flat-Field -EXPORT_BYPASS_RAW_GREENTHRESH;Bypass [raw] Green Equilibration -EXPORT_BYPASS_RAW_LINENOISE;Bypass [raw] Line Noise Filter -EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Bypass [raw] LMMSE Enhancement Steps -EXPORT_BYPASS_SHARPENEDGE;Bypass Edge Sharpening -EXPORT_BYPASS_SHARPENING;Bypass Sharpening -EXPORT_BYPASS_SHARPENMICRO;Bypass Microcontrast -EXPORT_FASTEXPORTOPTIONS;Fast Export Options -EXPORT_INSTRUCTIONS;Fast Export options provide overrides to bypass time and resource consuming development settings and to run queue processing using the fast export settings instead. This method is recommended for quicker generation of lower resolution images when speed is a priority or when resized output is desired for one or many images without making modifications to their saved development parameters. -EXPORT_MAXHEIGHT;Maximum height: -EXPORT_MAXWIDTH;Maximum width: -EXPORT_PIPELINE;Processing pipeline -EXPORT_PUTTOQUEUEFAST; Put to queue for fast export -EXPORT_RAW_DMETHOD;Demosaic method -EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) -EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. -EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) -EXTPROGTARGET_1;raw -EXTPROGTARGET_2;queue-processed -FILEBROWSER_APPLYPROFILE;Apply -FILEBROWSER_APPLYPROFILE_PARTIAL;Apply - partial -FILEBROWSER_AUTODARKFRAME;Auto dark-frame -FILEBROWSER_AUTOFLATFIELD;Auto flat-field -FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. -FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory -FILEBROWSER_CACHE;Cache -FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles -FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles -FILEBROWSER_CLEARPROFILE;Clear -FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple -FILEBROWSER_COPYPROFILE;Copy -FILEBROWSER_CURRENT_NAME;Current name: -FILEBROWSER_DARKFRAME;Dark-frame -FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? -FILEBROWSER_DELETEDIALOG_HEADER;File delete confirmation: -FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? -FILEBROWSER_EMPTYTRASH;Empty trash -FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. -FILEBROWSER_EXTPROGMENU;Open with -FILEBROWSER_FLATFIELD;Flat-Field -FILEBROWSER_MOVETODARKFDIR;Move to dark-frames directory -FILEBROWSER_MOVETOFLATFIELDDIR;Move to flat-fields directory -FILEBROWSER_NEW_NAME;New name: -FILEBROWSER_OPENDEFAULTVIEWER;Windows default viewer (queue-processed) -FILEBROWSER_PARTIALPASTEPROFILE;Paste - partial -FILEBROWSER_PASTEPROFILE;Paste -FILEBROWSER_POPUPCANCELJOB;Cancel job -FILEBROWSER_POPUPCOLORLABEL;Color label -FILEBROWSER_POPUPCOLORLABEL0;Label: None -FILEBROWSER_POPUPCOLORLABEL1;Label: Red -FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow -FILEBROWSER_POPUPCOLORLABEL3;Label: Green -FILEBROWSER_POPUPCOLORLABEL4;Label: Blue -FILEBROWSER_POPUPCOLORLABEL5;Label: Purple -FILEBROWSER_POPUPCOPYTO;Copy to... -FILEBROWSER_POPUPFILEOPERATIONS;File operations -FILEBROWSER_POPUPMOVEEND;Move to end of queue -FILEBROWSER_POPUPMOVEHEAD;Move to head of queue -FILEBROWSER_POPUPMOVETO;Move to... -FILEBROWSER_POPUPOPEN;Open -FILEBROWSER_POPUPOPENINEDITOR;Open in Editor -FILEBROWSER_POPUPPROCESS;Put to queue -FILEBROWSER_POPUPPROCESSFAST;Put to queue (Fast export) -FILEBROWSER_POPUPPROFILEOPERATIONS;Processing profile operations -FILEBROWSER_POPUPRANK;Rank -FILEBROWSER_POPUPRANK0;Unrank -FILEBROWSER_POPUPRANK1;Rank 1 * -FILEBROWSER_POPUPRANK2;Rank 2 ** -FILEBROWSER_POPUPRANK3;Rank 3 *** -FILEBROWSER_POPUPRANK4;Rank 4 **** -FILEBROWSER_POPUPRANK5;Rank 5 ***** -FILEBROWSER_POPUPREMOVE;Delete permanently -FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version -FILEBROWSER_POPUPRENAME;Rename -FILEBROWSER_POPUPSELECTALL;Select all -FILEBROWSER_POPUPTRASH;Move to trash -FILEBROWSER_POPUPUNRANK;Unrank -FILEBROWSER_POPUPUNTRASH;Remove from trash -FILEBROWSER_QUERYBUTTONHINT;Clear the Find query -FILEBROWSER_QUERYHINT;Type filenames to search for. Supports partial filenames. Separate the search terms using commas, e.g.\n1001,1004,1199\n\nExclude search terms by prefixing them with !=\ne.g.\n!=1001,1004,1199\n\nShortcuts:\nCtrl-f - focus the Find box,\nEnter - search,\nEsc - clear the Find box,\nShift-Esc - defocus the Find box. -FILEBROWSER_QUERYLABEL; Find: -FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nShortcut: Shift-1 -FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nShortcut: Shift-2 -FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nShortcut: Shift-3 -FILEBROWSER_RANK4_TOOLTIP;Rank 4 *\nShortcut: Shift-4 -FILEBROWSER_RANK5_TOOLTIP;Rank 5 *\nShortcut: Shift-5 -FILEBROWSER_RENAMEDLGLABEL;Rename file -FILEBROWSER_RESETDEFAULTPROFILE;Reset to default -FILEBROWSER_SELECTDARKFRAME;Select dark-frame... -FILEBROWSER_SELECTFLATFIELD;Select flat-field... -FILEBROWSER_SHOWCOLORLABEL1HINT;Show images labeled Red.\nShortcut: Alt-1 -FILEBROWSER_SHOWCOLORLABEL2HINT;Show images labeled Yellow.\nShortcut: Alt-2 -FILEBROWSER_SHOWCOLORLABEL3HINT;Show images labeled Green.\nShortcut: Alt-3 -FILEBROWSER_SHOWCOLORLABEL4HINT;Show images labeled Blue.\nShortcut: Alt-4 -FILEBROWSER_SHOWCOLORLABEL5HINT;Show images labeled Purple.\nShortcut: Alt-5 -FILEBROWSER_SHOWDIRHINT;Clear all filters.\nShortcut: d -FILEBROWSER_SHOWEDITEDHINT;Show edited images.\nShortcut: 7 -FILEBROWSER_SHOWEDITEDNOTHINT;Show not edited images.\nShortcut: 6 -FILEBROWSER_SHOWEXIFINFO;Show Exif info.\n\nShortcuts:\ni - Multiple Editor Tabs Mode,\nAlt-i - Single Editor Tab Mode. -FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. -FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. -FILEBROWSER_SHOWRANK1HINT;Show images ranked as 1-star.\nShortcut: 1 -FILEBROWSER_SHOWRANK2HINT;Show images ranked as 2-star.\nShortcut: 2 -FILEBROWSER_SHOWRANK3HINT;Show images ranked as 3-star.\nShortcut: 3 -FILEBROWSER_SHOWRANK4HINT;Show images ranked as 4-star.\nShortcut: 4 -FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5-star.\nShortcut: 5 -FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 -FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 -FILEBROWSER_SHOWTRASHHINT;Show contents of trash.\nShortcut: Ctrl-t -FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -FILEBROWSER_SHOWUNRANKHINT;Show unranked images.\nShortcut: 0 -FILEBROWSER_THUMBSIZE;Thumbnail size -FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 -FILEBROWSER_ZOOMINHINT;Increase thumbnail size.\n\nShortcuts:\n+ - Multiple Editor Tabs Mode,\nAlt-+ - Single Editor Tab Mode. -FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size.\n\nShortcuts:\n- - Multiple Editor Tabs Mode,\nAlt-- - Single Editor Tab Mode. -FILECHOOSER_FILTER_ANY;All files -FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) -FILECHOOSER_FILTER_CURVE;Curve files -FILECHOOSER_FILTER_LCP;Lens correction profiles -FILECHOOSER_FILTER_PP;Processing profiles -FILECHOOSER_FILTER_SAME;Same format as current photo -FILECHOOSER_FILTER_TIFF;TIFF files -GENERAL_ABOUT;About -GENERAL_AFTER;After -GENERAL_APPLY;Apply -GENERAL_ASIMAGE;As Image -GENERAL_AUTO;Automatic -GENERAL_BEFORE;Before -GENERAL_CANCEL;Cancel -GENERAL_CLOSE;Close -GENERAL_CURRENT;Current -GENERAL_DISABLE;Disable -GENERAL_DISABLED;Disabled -GENERAL_ENABLE;Enable -GENERAL_ENABLED;Enabled -GENERAL_FILE;File -GENERAL_HELP;Help -GENERAL_LANDSCAPE;Landscape -GENERAL_NA;n/a -GENERAL_NO;No -GENERAL_NONE;None -GENERAL_OK;OK -GENERAL_OPEN;Open -GENERAL_PORTRAIT;Portrait -GENERAL_RESET;Reset -GENERAL_SAVE;Save -GENERAL_SAVE_AS;Save as... -GENERAL_SLIDER;Slider -GENERAL_UNCHANGED;(Unchanged) -GENERAL_WARNING;Warning -GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. -HISTOGRAM_TOOLTIP_B;Show/Hide blue histogram. -HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. -HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -HISTOGRAM_TOOLTIP_G;Show/Hide green histogram. -HISTOGRAM_TOOLTIP_L;Show/Hide CIELab luminance histogram. -HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. -HISTOGRAM_TOOLTIP_R;Show/Hide red histogram. -HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. -HISTORY_CHANGED;Changed -HISTORY_CUSTOMCURVE;Custom curve -HISTORY_FROMCLIPBOARD;From clipboard -HISTORY_LABEL;History -HISTORY_MSG_1;Photo loaded -HISTORY_MSG_2;PP3 loaded -HISTORY_MSG_3;PP3 changed -HISTORY_MSG_4;History browsing -HISTORY_MSG_5;Exposure - Lightness -HISTORY_MSG_6;Exposure - Contrast -HISTORY_MSG_7;Exposure - Black -HISTORY_MSG_8;Exposure - Compensation -HISTORY_MSG_9;Exposure - Highlight compression -HISTORY_MSG_10;Exposure - Shadow compression -HISTORY_MSG_11;Exposure - Tone curve 1 -HISTORY_MSG_12;Exposure - Auto levels -HISTORY_MSG_13;Exposure - Clip -HISTORY_MSG_14;L*a*b* - Lightness -HISTORY_MSG_15;L*a*b* - Contrast -HISTORY_MSG_16;- -HISTORY_MSG_17;- -HISTORY_MSG_18;- -HISTORY_MSG_19;L*a*b* - L* curve -HISTORY_MSG_20;Sharpening -HISTORY_MSG_21;USM - Radius -HISTORY_MSG_22;USM - Amount -HISTORY_MSG_23;USM - Threshold -HISTORY_MSG_24;USM - Sharpen only edges -HISTORY_MSG_25;USM - Edge detection radius -HISTORY_MSG_26;USM - Edge tolerance -HISTORY_MSG_27;USM - Halo control -HISTORY_MSG_28;USM - Halo control amount -HISTORY_MSG_29;Sharpening - Method -HISTORY_MSG_30;RLD - Radius -HISTORY_MSG_31;RLD - Amount -HISTORY_MSG_32;RLD - Damping -HISTORY_MSG_33;RLD - Iterations -HISTORY_MSG_34;Lens Correction - Distortion -HISTORY_MSG_35;Lens Correction - Vignetting -HISTORY_MSG_36;Lens Correction - CA -HISTORY_MSG_37;Exposure - Auto levels -HISTORY_MSG_38;White Balance - Method -HISTORY_MSG_39;WB - Temperature -HISTORY_MSG_40;WB - Tint -HISTORY_MSG_41;Exposure - Tone curve 1 mode -HISTORY_MSG_42;Exposure - Tone curve 2 -HISTORY_MSG_43;Exposure - Tone curve 2 mode -HISTORY_MSG_44;Lum. denoising radius -HISTORY_MSG_45;Lum. denoising edge tolerance -HISTORY_MSG_46;Color denoising -HISTORY_MSG_47;Blend ICC highlights with matrix -HISTORY_MSG_48;DCP - Tone curve -HISTORY_MSG_49;DCP illuminant -HISTORY_MSG_50;Shadows/Highlights -HISTORY_MSG_51;S/H - Highlights -HISTORY_MSG_52;S/H - Shadows -HISTORY_MSG_53;S/H - Highlights tonal width -HISTORY_MSG_54;S/H - Shadows tonal width -HISTORY_MSG_55;S/H - Local contrast -HISTORY_MSG_56;S/H - Radius -HISTORY_MSG_57;Coarse rotation -HISTORY_MSG_58;Horizontal flipping -HISTORY_MSG_59;Vertical flipping -HISTORY_MSG_60;Rotation -HISTORY_MSG_61;Auto-fill -HISTORY_MSG_62;Distortion correction -HISTORY_MSG_63;Snapshot selected -HISTORY_MSG_64;Crop -HISTORY_MSG_65;CA correction -HISTORY_MSG_66;Exposure - Highlight reconstruction -HISTORY_MSG_67;Exposure - HLR amount -HISTORY_MSG_68;Exposure - HLR method -HISTORY_MSG_69;Working color space -HISTORY_MSG_70;Output color space -HISTORY_MSG_71;Input color space -HISTORY_MSG_72;VC - Amount -HISTORY_MSG_73;Channel Mixer -HISTORY_MSG_74;Resize - Scale -HISTORY_MSG_75;Resize - Method -HISTORY_MSG_76;Exif metadata -HISTORY_MSG_77;IPTC metadata -HISTORY_MSG_78;- -HISTORY_MSG_79;Resize - Width -HISTORY_MSG_80;Resize - Height -HISTORY_MSG_81;Resize -HISTORY_MSG_82;Profile changed -HISTORY_MSG_83;S/H - Sharp mask -HISTORY_MSG_84;Perspective correction -HISTORY_MSG_85;Lens Correction - LCP file -HISTORY_MSG_86;RGB Curves - Luminosity mode -HISTORY_MSG_87;Impulse Noise Reduction -HISTORY_MSG_88;Impulse NR threshold -HISTORY_MSG_89;Noise Reduction -HISTORY_MSG_90;NR - Luminance -HISTORY_MSG_91;NR - Chrominance master -HISTORY_MSG_92;NR - Gamma -HISTORY_MSG_93;CbDL - Value -HISTORY_MSG_94;Contrast by Detail Levels -HISTORY_MSG_95;L*a*b* - Chromaticity -HISTORY_MSG_96;L*a*b* - a* curve -HISTORY_MSG_97;L*a*b* - b* curve -HISTORY_MSG_98;Demosaicing method -HISTORY_MSG_99;Hot pixel filter -HISTORY_MSG_100;Exposure - Saturation -HISTORY_MSG_101;HSV - Hue -HISTORY_MSG_102;HSV - Saturation -HISTORY_MSG_103;HSV - Value -HISTORY_MSG_104;HSV Equalizer -HISTORY_MSG_105;Defringe -HISTORY_MSG_106;Defringe - Radius -HISTORY_MSG_107;Defringe - Threshold -HISTORY_MSG_108;Exposure - HLC threshold -HISTORY_MSG_109;Resize - Bounding box -HISTORY_MSG_110;Resize - Applies to -HISTORY_MSG_111;L*a*b* - Avoid color shift -HISTORY_MSG_112;--unused-- -HISTORY_MSG_113;L*a*b* - Red/skin prot. -HISTORY_MSG_114;DCB iterations -HISTORY_MSG_115;False color suppression -HISTORY_MSG_116;DCB enhancement -HISTORY_MSG_117;Raw CA correction - Red -HISTORY_MSG_118;Raw CA correction - Blue -HISTORY_MSG_119;Line noise filter -HISTORY_MSG_120;Green equilibration -HISTORY_MSG_121;Raw CA Correction - Auto -HISTORY_MSG_122;Dark-Frame - Auto-selection -HISTORY_MSG_123;Dark-Frame - File -HISTORY_MSG_124;White point correction -HISTORY_MSG_126;Flat-Field - File -HISTORY_MSG_127;Flat-Field - Auto-selection -HISTORY_MSG_128;Flat-Field - Blur radius -HISTORY_MSG_129;Flat-Field - Blur type -HISTORY_MSG_130;Auto distortion correction -HISTORY_MSG_131;NR - Luma -HISTORY_MSG_132;NR - Chroma -HISTORY_MSG_133;Output gamma -HISTORY_MSG_134;Free gamma -HISTORY_MSG_135;Free gamma -HISTORY_MSG_136;Free gamma slope -HISTORY_MSG_137;Black level - Green 1 -HISTORY_MSG_138;Black level - Red -HISTORY_MSG_139;Black level - Blue -HISTORY_MSG_140;Black level - Green 2 -HISTORY_MSG_141;Black level - Link greens -HISTORY_MSG_142;ES - Iterations -HISTORY_MSG_143;ES - Quantity -HISTORY_MSG_144;Microcontrast - Quantity -HISTORY_MSG_145;Microcontrast - Uniformity -HISTORY_MSG_146;Edge sharpening -HISTORY_MSG_147;ES - Luminance only -HISTORY_MSG_148;Microcontrast -HISTORY_MSG_149;Microcontrast - 3×3 matrix -HISTORY_MSG_150;Post-demosaic artifact/noise red. -HISTORY_MSG_151;Vibrance -HISTORY_MSG_152;Vib - Pastel tones -HISTORY_MSG_153;Vib - Saturated tones -HISTORY_MSG_154;Vib - Protect skin-tones -HISTORY_MSG_155;Vib - Avoid color shift -HISTORY_MSG_156;Vib - Link pastel/saturated -HISTORY_MSG_157;Vib - P/S threshold -HISTORY_MSG_158;TM - Strength -HISTORY_MSG_159;TM - Edge stopping -HISTORY_MSG_160;TM - Scale -HISTORY_MSG_161;TM - Reweighting iterates -HISTORY_MSG_162;Tone Mapping -HISTORY_MSG_163;RGB Curves - Red -HISTORY_MSG_164;RGB Curves - Green -HISTORY_MSG_165;RGB Curves - Blue -HISTORY_MSG_166;Exposure - Reset -HISTORY_MSG_167;Demosaicing method -HISTORY_MSG_168;L*a*b* - CC curve -HISTORY_MSG_169;L*a*b* - CH curve -HISTORY_MSG_170;Vibrance - HH curve -HISTORY_MSG_171;L*a*b* - LC curve -HISTORY_MSG_172;L*a*b* - Restrict LC -HISTORY_MSG_173;NR - Detail recovery -HISTORY_MSG_174;CIECAM02 -HISTORY_MSG_175;CAM02 - CAT02 adaptation -HISTORY_MSG_176;CAM02 - Viewing surround -HISTORY_MSG_177;CAM02 - Scene luminosity -HISTORY_MSG_178;CAM02 - Viewing luminosity -HISTORY_MSG_179;CAM02 - White-point model -HISTORY_MSG_180;CAM02 - Lightness (J) -HISTORY_MSG_181;CAM02 - Chroma (C) -HISTORY_MSG_182;CAM02 - Automatic CAT02 -HISTORY_MSG_183;CAM02 - Contrast (J) -HISTORY_MSG_184;CAM02 - Scene surround -HISTORY_MSG_185;CAM02 - Gamut control -HISTORY_MSG_186;CAM02 - Algorithm -HISTORY_MSG_187;CAM02 - Red/skin prot. -HISTORY_MSG_188;CAM02 - Brightness (Q) -HISTORY_MSG_189;CAM02 - Contrast (Q) -HISTORY_MSG_190;CAM02 - Saturation (S) -HISTORY_MSG_191;CAM02 - Colorfulness (M) -HISTORY_MSG_192;CAM02 - Hue (h) -HISTORY_MSG_193;CAM02 - Tone curve 1 -HISTORY_MSG_194;CAM02 - Tone curve 2 -HISTORY_MSG_195;CAM02 - Tone curve 1 -HISTORY_MSG_196;CAM02 - Tone curve 2 -HISTORY_MSG_197;CAM02 - Color curve -HISTORY_MSG_198;CAM02 - Color curve -HISTORY_MSG_199;CAM02 - Output histograms -HISTORY_MSG_200;CAM02 - Tone mapping -HISTORY_MSG_201;NR - Chrominance - R&G -HISTORY_MSG_202;NR - Chrominance - B&Y -HISTORY_MSG_203;NR - Color space -HISTORY_MSG_204;LMMSE enhancement steps -HISTORY_MSG_205;CAM02 - Hot/bad pixel filter -HISTORY_MSG_206;CAT02 - Auto scene luminosity -HISTORY_MSG_207;Defringe - Hue curve -HISTORY_MSG_208;WB - B/R equalizer -HISTORY_MSG_210;GF - Angle -HISTORY_MSG_211;Graduated Filter -HISTORY_MSG_212;VF - Strength -HISTORY_MSG_213;Vignette Filter -HISTORY_MSG_214;Black-and-White -HISTORY_MSG_215;B&W - CM - Red -HISTORY_MSG_216;B&W - CM - Green -HISTORY_MSG_217;B&W - CM - Blue -HISTORY_MSG_218;B&W - Gamma - Red -HISTORY_MSG_219;B&W - Gamma - Green -HISTORY_MSG_220;B&W - Gamma - Blue -HISTORY_MSG_221;B&W - Color filter -HISTORY_MSG_222;B&W - Presets -HISTORY_MSG_223;B&W - CM - Orange -HISTORY_MSG_224;B&W - CM - Yellow -HISTORY_MSG_225;B&W - CM - Cyan -HISTORY_MSG_226;B&W - CM - Magenta -HISTORY_MSG_227;B&W - CM - Purple -HISTORY_MSG_228;B&W - Luminance equalizer -HISTORY_MSG_229;B&W - Luminance equalizer -HISTORY_MSG_230;B&W - Mode -HISTORY_MSG_231;B&W - 'Before' curve -HISTORY_MSG_232;B&W - 'Before' curve type -HISTORY_MSG_233;B&W - 'After' curve -HISTORY_MSG_234;B&W - 'After' curve type -HISTORY_MSG_235;B&W - CM - Auto -HISTORY_MSG_236;--unused-- -HISTORY_MSG_237;B&W - CM -HISTORY_MSG_238;GF - Feather -HISTORY_MSG_239;GF - Strength -HISTORY_MSG_240;GF - Center -HISTORY_MSG_241;VF - Feather -HISTORY_MSG_242;VF - Roundness -HISTORY_MSG_243;VC - Radius -HISTORY_MSG_244;VC - Strength -HISTORY_MSG_245;VC - Center -HISTORY_MSG_246;L*a*b* - CL curve -HISTORY_MSG_247;L*a*b* - LH curve -HISTORY_MSG_248;L*a*b* - HH curve -HISTORY_MSG_249;CbDL - Threshold -HISTORY_MSG_250;NR - Enhanced -HISTORY_MSG_251;B&W - Algorithm -HISTORY_MSG_252;CbDL - Skin tar/prot -HISTORY_MSG_253;CbDL - Reduce artifacts -HISTORY_MSG_254;CbDL - Skin hue -HISTORY_MSG_255;NR - Median filter -HISTORY_MSG_256;NR - Median - Type -HISTORY_MSG_257;Color Toning -HISTORY_MSG_258;CT - Color curve -HISTORY_MSG_259;CT - Opacity curve -HISTORY_MSG_260;CT - a*[b*] opacity -HISTORY_MSG_261;CT - Method -HISTORY_MSG_262;CT - b* opacity -HISTORY_MSG_263;CT - Shadows - Red -HISTORY_MSG_264;CT - Shadows - Green -HISTORY_MSG_265;CT - Shadows - Blue -HISTORY_MSG_266;CT - Mid - Red -HISTORY_MSG_267;CT - Mid - Green -HISTORY_MSG_268;CT - Mid - Blue -HISTORY_MSG_269;CT - High - Red -HISTORY_MSG_270;CT - High - Green -HISTORY_MSG_271;CT - High - Blue -HISTORY_MSG_272;CT - Balance -HISTORY_MSG_273;CT - Color Balance SMH -HISTORY_MSG_274;CT - Sat. Shadows -HISTORY_MSG_275;CT - Sat. Highlights -HISTORY_MSG_276;CT - Opacity -HISTORY_MSG_277;--unused-- -HISTORY_MSG_278;CT - Preserve luminance -HISTORY_MSG_279;CT - Shadows -HISTORY_MSG_280;CT - Highlights -HISTORY_MSG_281;CT - Sat. strength -HISTORY_MSG_282;CT - Sat. threshold -HISTORY_MSG_283;CT - Strength -HISTORY_MSG_284;CT - Auto sat. protection -HISTORY_MSG_285;NR - Median - Method -HISTORY_MSG_286;NR - Median - Type -HISTORY_MSG_287;NR - Median - Iterations -HISTORY_MSG_288;Flat-Field - Clip control -HISTORY_MSG_289;Flat-Field - Clip control - Auto -HISTORY_MSG_290;Black Level - Red -HISTORY_MSG_291;Black Level - Green -HISTORY_MSG_292;Black Level - Blue -HISTORY_MSG_293;Film Simulation -HISTORY_MSG_294;Film Simulation - Strength -HISTORY_MSG_295;Film Simulation - Film -HISTORY_MSG_296;NR - Luminance curve -HISTORY_MSG_297;NR - Mode -HISTORY_MSG_298;Dead pixel filter -HISTORY_MSG_299;NR - Chrominance curve -HISTORY_MSG_300;- -HISTORY_MSG_301;NR - Luma control -HISTORY_MSG_302;NR - Chroma method -HISTORY_MSG_303;NR - Chroma method -HISTORY_MSG_304;W - Contrast levels -HISTORY_MSG_305;Wavelet Levels -HISTORY_MSG_306;W - Process -HISTORY_MSG_307;W - Process -HISTORY_MSG_308;W - Process direction -HISTORY_MSG_309;W - ES - Detail -HISTORY_MSG_310;W - Residual - Sky tar/prot -HISTORY_MSG_311;W - Wavelet levels -HISTORY_MSG_312;W - Residual - Shadows threshold -HISTORY_MSG_313;W - Chroma - Sat/past -HISTORY_MSG_314;W - Gamut - Reduce artifacts -HISTORY_MSG_315;W - Residual - Contrast -HISTORY_MSG_316;W - Gamut - Skin tar/prot -HISTORY_MSG_317;W - Gamut - Skin hue -HISTORY_MSG_318;W - Contrast - Finer levels -HISTORY_MSG_319;W - Contrast - Finer range -HISTORY_MSG_320;W - Contrast - Coarser range -HISTORY_MSG_321;W - Contrast - Coarser levels -HISTORY_MSG_322;W - Gamut - Avoid color shift -HISTORY_MSG_323;W - ES - Local contrast -HISTORY_MSG_324;W - Chroma - Pastel -HISTORY_MSG_325;W - Chroma - Saturated -HISTORY_MSG_326;W - Chroma - Method -HISTORY_MSG_327;W - Contrast - Apply to -HISTORY_MSG_328;W - Chroma - Link strength -HISTORY_MSG_329;W - Toning - Opacity RG -HISTORY_MSG_330;W - Toning - Opacity BY -HISTORY_MSG_331;W - Contrast levels - Extra -HISTORY_MSG_332;W - Tiling method -HISTORY_MSG_333;W - Residual - Shadows -HISTORY_MSG_334;W - Residual - Chroma -HISTORY_MSG_335;W - Residual - Highlights -HISTORY_MSG_336;W - Residual - Highlights threshold -HISTORY_MSG_337;W - Residual - Sky hue -HISTORY_MSG_338;W - ES - Radius -HISTORY_MSG_339;W - ES - Strength -HISTORY_MSG_340;W - Strength -HISTORY_MSG_341;W - Edge performance -HISTORY_MSG_342;W - ES - First level -HISTORY_MSG_343;W - Chroma levels -HISTORY_MSG_344;W - Meth chroma sl/cur -HISTORY_MSG_345;W - ES - Local contrast -HISTORY_MSG_346;W - ES - Local contrast method -HISTORY_MSG_347;W - Denoise - Level 1 -HISTORY_MSG_348;W - Denoise - Level 2 -HISTORY_MSG_349;W - Denoise - Level 3 -HISTORY_MSG_350;W - ES - Edge detection -HISTORY_MSG_351;W - Residual - HH curve -HISTORY_MSG_352;W - Background -HISTORY_MSG_353;W - ES - Gradient sensitivity -HISTORY_MSG_354;W - ES - Enhanced -HISTORY_MSG_355;W - ES - Threshold low -HISTORY_MSG_356;W - ES - Threshold high -HISTORY_MSG_357;W - Denoise - Link with ES -HISTORY_MSG_358;W - Gamut - CH -HISTORY_MSG_359;Hot/Dead - Threshold -HISTORY_MSG_360;TM - Gamma -HISTORY_MSG_361;W - Final - Chroma balance -HISTORY_MSG_362;W - Residual - Compression method -HISTORY_MSG_363;W - Residual - Compression strength -HISTORY_MSG_364;W - Final - Contrast balance -HISTORY_MSG_365;W - Final - Delta balance -HISTORY_MSG_366;W - Residual - Compression gamma -HISTORY_MSG_367;W - Final - 'After' contrast curve -HISTORY_MSG_368;W - Final - Contrast balance -HISTORY_MSG_369;W - Final - Balance method -HISTORY_MSG_370;W - Final - Local contrast curve -HISTORY_MSG_371;Post-Resize Sharpening -HISTORY_MSG_372;PRS USM - Radius -HISTORY_MSG_373;PRS USM - Amount -HISTORY_MSG_374;PRS USM - Threshold -HISTORY_MSG_375;PRS USM - Sharpen only edges -HISTORY_MSG_376;PRS USM - Edge detection radius -HISTORY_MSG_377;PRS USM - Edge tolerance -HISTORY_MSG_378;PRS USM - Halo control -HISTORY_MSG_379;PRS USM - Halo control amount -HISTORY_MSG_380;PRS - Method -HISTORY_MSG_381;PRS RLD - Radius -HISTORY_MSG_382;PRS RLD - Amount -HISTORY_MSG_383;PRS RLD - Damping -HISTORY_MSG_384;PRS RLD - Iterations -HISTORY_MSG_385;W - Residual - Color balance -HISTORY_MSG_386;W - Residual - CB green high -HISTORY_MSG_387;W - Residual - CB blue high -HISTORY_MSG_388;W - Residual - CB green mid -HISTORY_MSG_389;W - Residual - CB blue mid -HISTORY_MSG_390;W - Residual - CB green low -HISTORY_MSG_391;W - Residual - CB blue low -HISTORY_MSG_392;W - Residual - Color balance -HISTORY_MSG_393;DCP - Look table -HISTORY_MSG_394;DCP - Baseline exposure -HISTORY_MSG_395;DCP - Base table -HISTORY_MSG_396;W - Contrast sub-tool -HISTORY_MSG_397;W - Chroma sub-tool -HISTORY_MSG_398;W - ES sub-tool -HISTORY_MSG_399;W - Residual sub-tool -HISTORY_MSG_400;W - Final sub-tool -HISTORY_MSG_401;W - Toning sub-tool -HISTORY_MSG_402;W - Denoise sub-tool -HISTORY_MSG_403;W - ES - Edge sensitivity -HISTORY_MSG_404;W - ES - Base amplification -HISTORY_MSG_405;W - Denoise - Level 4 -HISTORY_MSG_406;W - ES - Neighboring pixels -HISTORY_MSG_407;Retinex - Method -HISTORY_MSG_408;Retinex - Radius -HISTORY_MSG_409;Retinex - Contrast -HISTORY_MSG_410;Retinex - Offset -HISTORY_MSG_411;Retinex - Strength -HISTORY_MSG_412;Retinex - Gaussian gradient -HISTORY_MSG_413;Retinex - Contrast -HISTORY_MSG_414;Retinex - Histogram - Lab -HISTORY_MSG_415;Retinex - Transmission -HISTORY_MSG_416;Retinex -HISTORY_MSG_417;Retinex - Transmission median -HISTORY_MSG_418;Retinex - Threshold -HISTORY_MSG_419;Retinex - Color space -HISTORY_MSG_420;Retinex - Histogram - HSL -HISTORY_MSG_421;Retinex - Gamma -HISTORY_MSG_422;Retinex - Gamma -HISTORY_MSG_423;Retinex - Gamma slope -HISTORY_MSG_424;Retinex - HL threshold -HISTORY_MSG_425;Retinex - Log base -HISTORY_MSG_426;Retinex - Hue equalizer -HISTORY_MSG_427;Output rendering intent -HISTORY_MSG_428;Monitor rendering intent -HISTORY_MSG_429;Retinex - Iterations -HISTORY_MSG_430;Retinex - Transmission gradient -HISTORY_MSG_431;Retinex - Strength gradient -HISTORY_MSG_432;Retinex - M - Highlights -HISTORY_MSG_433;Retinex - M - Highlights TW -HISTORY_MSG_434;Retinex - M - Shadows -HISTORY_MSG_435;Retinex - M - Shadows TW -HISTORY_MSG_436;Retinex - M - Radius -HISTORY_MSG_437;Retinex - M - Method -HISTORY_MSG_438;Retinex - M - Equalizer -HISTORY_MSG_439;Retinex - Process -HISTORY_MSG_440;CbDL - Method -HISTORY_MSG_441;Retinex - Gain transmission -HISTORY_MSG_442;Retinex - Scale -HISTORY_MSG_443;Output black point compensation -HISTORY_MSG_444;WB - Temp bias -HISTORY_MSG_445;Raw Sub-Image -HISTORY_MSG_446;EvPixelShiftMotion -HISTORY_MSG_447;EvPixelShiftMotionCorrection -HISTORY_MSG_448;EvPixelShiftStddevFactorGreen -HISTORY_MSG_449;PS ISO adaption -HISTORY_MSG_450;EvPixelShiftNreadIso -HISTORY_MSG_451;EvPixelShiftPrnu -HISTORY_MSG_452;PS Show motion -HISTORY_MSG_453;PS Show mask only -HISTORY_MSG_454;EvPixelShiftAutomatic -HISTORY_MSG_455;EvPixelShiftNonGreenHorizontal -HISTORY_MSG_456;EvPixelShiftNonGreenVertical -HISTORY_MSG_457;PS Check red/blue -HISTORY_MSG_458;EvPixelShiftStddevFactorRed -HISTORY_MSG_459;EvPixelShiftStddevFactorBlue -HISTORY_MSG_460;EvPixelShiftGreenAmaze -HISTORY_MSG_461;EvPixelShiftNonGreenAmaze -HISTORY_MSG_462;PS Check green -HISTORY_MSG_463;EvPixelShiftRedBlueWeight -HISTORY_MSG_464;PS Blur motion mask -HISTORY_MSG_465;PS Blur radius -HISTORY_MSG_466;EvPixelShiftSum -HISTORY_MSG_467;EvPixelShiftExp0 -HISTORY_MSG_468;PS Fill holes -HISTORY_MSG_469;PS Median -HISTORY_MSG_470;EvPixelShiftMedian3 -HISTORY_MSG_471;PS Motion correction -HISTORY_MSG_472;PS Smooth transitions -HISTORY_MSG_473;PS Use lmmse -HISTORY_MSG_474;PS Equalize -HISTORY_MSG_475;PS Equalize channel -HISTORY_MSG_476;CAM02 - Temp out -HISTORY_MSG_477;CAM02 - Green out -HISTORY_MSG_478;CAM02 - Yb out -HISTORY_MSG_479;CAM02 - CAT02 adaptation out -HISTORY_MSG_480;CAM02 - Automatic CAT02 out -HISTORY_MSG_481;CAM02 - Temp scene -HISTORY_MSG_482;CAM02 - Green scene -HISTORY_MSG_483;CAM02 - Yb scene -HISTORY_MSG_484;CAM02 - Auto Yb scene -HISTORY_MSG_485;Lens Correction -HISTORY_MSG_486;Lens Correction - Camera -HISTORY_MSG_487;Lens Correction - Lens -HISTORY_MSG_488;Dynamic Range Compression -HISTORY_MSG_489;DRC - Detail -HISTORY_MSG_490;DRC - Amount -HISTORY_MSG_491;White Balance -HISTORY_MSG_492;RGB Curves -HISTORY_MSG_493;Local Adjustments -HISTORY_MSG_494;Capture Sharpening -HISTORY_MSG_496;Local Spot deleted -HISTORY_MSG_497;Local Spot selected -HISTORY_MSG_498;Local Spot name -HISTORY_MSG_499;Local Spot visibility -HISTORY_MSG_500;Local Spot shape -HISTORY_MSG_501;Local Spot method -HISTORY_MSG_502;Local Spot shape method -HISTORY_MSG_503;Local Spot locX -HISTORY_MSG_504;Local Spot locXL -HISTORY_MSG_505;Local Spot locY -HISTORY_MSG_506;Local Spot locYT -HISTORY_MSG_507;Local Spot center -HISTORY_MSG_508;Local Spot circrad -HISTORY_MSG_509;Local Spot quality method -HISTORY_MSG_510;Local Spot transition -HISTORY_MSG_511;Local Spot thresh -HISTORY_MSG_512;Local Spot ΔE -decay -HISTORY_MSG_513;Local Spot scope -HISTORY_MSG_514;Local Spot structure -HISTORY_MSG_515;Local Adjustments -HISTORY_MSG_516;Local - Color and light -HISTORY_MSG_517;Local - Enable super -HISTORY_MSG_518;Local - Lightness -HISTORY_MSG_519;Local - Contrast -HISTORY_MSG_520;Local - Chrominance -HISTORY_MSG_521;Local - Scope -HISTORY_MSG_522;Local - curve method -HISTORY_MSG_523;Local - LL Curve -HISTORY_MSG_524;Local - CC curve -HISTORY_MSG_525;Local - LH Curve -HISTORY_MSG_526;Local - H curve -HISTORY_MSG_527;Local - Color Inverse -HISTORY_MSG_528;Local - Exposure -HISTORY_MSG_529;Local - Exp Compensation -HISTORY_MSG_530;Local - Exp Hlcompr -HISTORY_MSG_531;Local - Exp hlcomprthresh -HISTORY_MSG_532;Local - Exp black -HISTORY_MSG_533;Local - Exp Shcompr -HISTORY_MSG_534;Local - Warm Cool -HISTORY_MSG_535;Local - Exp Scope -HISTORY_MSG_536;Local - Exp Contrast curve -HISTORY_MSG_537;Local - Vibrance -HISTORY_MSG_538;Local - Vib Saturated -HISTORY_MSG_539;Local - Vib Pastel -HISTORY_MSG_540;Local - Vib Threshold -HISTORY_MSG_541;Local - Vib Protect skin tones -HISTORY_MSG_542;Local - Vib avoid colorshift -HISTORY_MSG_543;Local - Vib link -HISTORY_MSG_544;Local - Vib Scope -HISTORY_MSG_545;Local - Vib H curve -HISTORY_MSG_546;Local - Blur and noise -HISTORY_MSG_547;Local - Radius -HISTORY_MSG_548;Local - Noise -HISTORY_MSG_549;Local - Blur scope -HISTORY_MSG_550;Local - Blur method -HISTORY_MSG_551;Local - Blur Luminance only -HISTORY_MSG_552;Local - Tone mapping -HISTORY_MSG_553;Local - TM compression strength -HISTORY_MSG_554;Local - TM gamma -HISTORY_MSG_555;Local - TM edge stopping -HISTORY_MSG_556;Local - TM scale -HISTORY_MSG_557;Local - TM Reweighting -HISTORY_MSG_558;Local - TM scope -HISTORY_MSG_559;Local - Retinex -HISTORY_MSG_560;Local - Retinex method -HISTORY_MSG_561;Local - Retinex strength -HISTORY_MSG_562;Local - Retinex chroma -HISTORY_MSG_563;Local - Retinex radius -HISTORY_MSG_564;Local - Retinex contrast -HISTORY_MSG_565;Local - scope -HISTORY_MSG_566;Local - Retinex Gain curve -HISTORY_MSG_567;Local - Retinex Inverse -HISTORY_MSG_568;Local - Sharpening -HISTORY_MSG_569;Local - Sh Radius -HISTORY_MSG_570;Local - Sh Amount -HISTORY_MSG_571;Local - Sh Damping -HISTORY_MSG_572;Local - Sh Iterations -HISTORY_MSG_573;Local - Sh Scope -HISTORY_MSG_574;Local - Sh Inverse -HISTORY_MSG_575;Local - CBDL -HISTORY_MSG_576;Local - cbdl mult -HISTORY_MSG_577;Local - cbdl chroma -HISTORY_MSG_578;Local - cbdl threshold -HISTORY_MSG_579;Local - cbdl scope -HISTORY_MSG_580;Local - Denoise -HISTORY_MSG_581;Local - deNoise lum f 1 -HISTORY_MSG_582;Local - deNoise lum c -HISTORY_MSG_583;Local - deNoise lum detail -HISTORY_MSG_584;Local - deNoise equalizer White-Black -HISTORY_MSG_585;Local - deNoise chro f -HISTORY_MSG_586;Local - deNoise chro c -HISTORY_MSG_587;Local - deNoise chro detail -HISTORY_MSG_588;Local - deNoise equalizer Blue-Red -HISTORY_MSG_589;Local - deNoise bilateral -HISTORY_MSG_590;Local - deNoise Scope -HISTORY_MSG_591;Local - Avoid color shift -HISTORY_MSG_592;Local - Sh Contrast -HISTORY_MSG_593;Local - Local contrast -HISTORY_MSG_594;Local - Local contrast radius -HISTORY_MSG_595;Local - Local contrast amount -HISTORY_MSG_596;Local - Local contrast darkness -HISTORY_MSG_597;Local - Local contrast lightness -HISTORY_MSG_598;Local - Local contrast scope -HISTORY_MSG_599;Local - Retinex dehaze -HISTORY_MSG_600;Local - Soft Light enable -HISTORY_MSG_601;Local - Soft Light strength -HISTORY_MSG_602;Local - Soft Light scope -HISTORY_MSG_603;Local - Sh Blur radius -HISTORY_MSG_605;Local - Mask preview choice -HISTORY_MSG_606;Local Spot selected -HISTORY_MSG_607;Local - Color Mask C -HISTORY_MSG_608;Local - Color Mask L -HISTORY_MSG_609;Local - Exp Mask C -HISTORY_MSG_610;Local - Exp Mask L -HISTORY_MSG_611;Local - Color Mask H -HISTORY_MSG_612;Local - Color Structure -HISTORY_MSG_613;Local - Exp Structure -HISTORY_MSG_614;Local - Exp Mask H -HISTORY_MSG_615;Local - Blend color -HISTORY_MSG_616;Local - Blend Exp -HISTORY_MSG_617;Local - Blur Exp -HISTORY_MSG_618;Local - Use Color Mask -HISTORY_MSG_619;Local - Use Exp Mask -HISTORY_MSG_620;Local - Blur col -HISTORY_MSG_621;Local - Exp inverse -HISTORY_MSG_622;Local - Exclude structure -HISTORY_MSG_623;Local - Exp Chroma compensation -HISTORY_MSG_624;Local - Color correction grid -HISTORY_MSG_625;Local - Color correction strength -HISTORY_MSG_626;Local - Color correction Method -HISTORY_MSG_627;Local - Shadow Highlight -HISTORY_MSG_628;Local - SH Highlight -HISTORY_MSG_629;Local - SH H tonalwidth -HISTORY_MSG_630;Local - SH Shadows -HISTORY_MSG_631;Local - SH S tonalwidth -HISTORY_MSG_632;Local - SH radius -HISTORY_MSG_633;Local - SH Scope -HISTORY_MSG_634;Local - radius color -HISTORY_MSG_635;Local - radius Exp -HISTORY_MSG_636;Local - Tool added -HISTORY_MSG_637;Local - SH Mask C -HISTORY_MSG_638;Local - SH Mask L -HISTORY_MSG_639;Local - SH Mask H -HISTORY_MSG_640;Local - SH blend -HISTORY_MSG_641;Local - Use SH mask -HISTORY_MSG_642;Local - radius SH -HISTORY_MSG_643;Local - Blur SH -HISTORY_MSG_644;Local - inverse SH -HISTORY_MSG_645;Local - balance ΔE ab-L -HISTORY_MSG_646;Local - Exp mask chroma -HISTORY_MSG_647;Local - Exp mask gamma -HISTORY_MSG_648;Local - Exp mask slope -HISTORY_MSG_649;Local - Exp soft radius -HISTORY_MSG_650;Local - Color mask chroma -HISTORY_MSG_651;Local - Color mask gamma -HISTORY_MSG_652;Local - Color mask slope -HISTORY_MSG_653;Local - SH mask chroma -HISTORY_MSG_654;Local - SH mask gamma -HISTORY_MSG_655;Local - SH mask slope -HISTORY_MSG_656;Local - Color soft radius -HISTORY_MSG_657;Local - Retinex Reduce artifacts -HISTORY_MSG_658;Local - CBDL soft radius -HISTORY_MSG_659;Local Spot transition-decay -HISTORY_MSG_660;Local - cbdl clarity -HISTORY_MSG_661;Local - cbdl contrast residual -HISTORY_MSG_662;Local - deNoise lum f 0 -HISTORY_MSG_663;Local - deNoise lum f 2 -HISTORY_MSG_664;Local - cbdl Blur -HISTORY_MSG_665;Local - cbdl mask Blend -HISTORY_MSG_666;Local - cbdl mask radius -HISTORY_MSG_667;Local - cbdl mask chroma -HISTORY_MSG_668;Local - cbdl mask gamma -HISTORY_MSG_669;Local - cbdl mask slope -HISTORY_MSG_670;Local - cbdl mask C -HISTORY_MSG_671;Local - cbdl mask L -HISTORY_MSG_672;Local - cbdl mask CL -HISTORY_MSG_673;Local - Use cbdl mask -HISTORY_MSG_674;Local - Tool removed -HISTORY_MSG_675;Local - TM soft radius -HISTORY_MSG_676;Local Spot transition-differentiation -HISTORY_MSG_677;Local - TM amount -HISTORY_MSG_678;Local - TM saturation -HISTORY_MSG_679;Local - Retinex mask C -HISTORY_MSG_680;Local - Retinex mask L -HISTORY_MSG_681;Local - Retinex mask CL -HISTORY_MSG_682;Local - Retinex mask -HISTORY_MSG_683;Local - Retinex mask Blend -HISTORY_MSG_684;Local - Retinex mask radius -HISTORY_MSG_685;Local - Retinex mask chroma -HISTORY_MSG_686;Local - Retinex mask gamma -HISTORY_MSG_687;Local - Retinex mask slope -HISTORY_MSG_688;Local - Tool removed -HISTORY_MSG_689;Local - Retinex mask transmission map -HISTORY_MSG_690;Local - Retinex scale -HISTORY_MSG_691;Local - Retinex darkness -HISTORY_MSG_692;Local - Retinex lightness -HISTORY_MSG_693;Local - Retinex threshold -HISTORY_MSG_694;Local - Retinex Laplacian threshold -HISTORY_MSG_695;Local - Soft method -HISTORY_MSG_696;Local - Retinex Normalize -HISTORY_MSG_697;Local - TM Normalize -HISTORY_MSG_698;Local - Local contrast Fast Fourier -HISTORY_MSG_699;Local - Retinex Fast Fourier -HISTORY_MSG_701;Local - Exp Shadows -HISTORY_MSG_702;Local - Exp Method -HISTORY_MSG_703;Local - Exp Laplacian threshold -HISTORY_MSG_704;Local - Exp PDE balance -HISTORY_MSG_705;Local - Exp linearity -HISTORY_MSG_706;Local - TM mask C -HISTORY_MSG_707;Local - TM mask L -HISTORY_MSG_708;Local - TM mask CL -HISTORY_MSG_709;Local - use TM mask -HISTORY_MSG_710;Local - TM mask Blend -HISTORY_MSG_711;Local - TM mask radius -HISTORY_MSG_712;Local - TM mask chroma -HISTORY_MSG_713;Local - TM mask gamma -HISTORY_MSG_714;Local - TM mask slope -HISTORY_MSG_716;Local - Local method -HISTORY_MSG_717;Local - Local contrast -HISTORY_MSG_718;Local - Local contrast levels -HISTORY_MSG_719;Local - Local contrast residual L -HISTORY_MSG_720;Local - Blur mask C -HISTORY_MSG_721;Local - Blur mask L -HISTORY_MSG_722;Local - Blur mask CL -HISTORY_MSG_723;Local - use Blur mask -HISTORY_MSG_725;Local - Blur mask Blend -HISTORY_MSG_726;Local - Blur mask radius -HISTORY_MSG_727;Local - Blur mask chroma -HISTORY_MSG_728;Local - Blur mask gamma -HISTORY_MSG_729;Local - Blur mask slope -HISTORY_MSG_730;Local - Blur method -HISTORY_MSG_731;Local - median method -HISTORY_MSG_732;Local - median iterations -HISTORY_MSG_733;Local - soft radius -HISTORY_MSG_734;Local - detail -HISTORY_MSG_738;Local - Local contrast Merge L -HISTORY_MSG_739;Local - Local contrast Soft radius -HISTORY_MSG_740;Local - Local contrast Merge C -HISTORY_MSG_741;Local - Local contrast Residual C -HISTORY_MSG_742;Local - Exp Laplacian gamma -HISTORY_MSG_743;Local - Exp Fattal Amount -HISTORY_MSG_744;Local - Exp Fattal Detail -HISTORY_MSG_745;Local - Exp Fattal Offset -HISTORY_MSG_746;Local - Exp Fattal Sigma -HISTORY_MSG_747;Local Spot created -HISTORY_MSG_748;Local - Exp Denoise -HISTORY_MSG_749;Local - Reti Depth -HISTORY_MSG_750;Local - Reti Mode log - lin -HISTORY_MSG_751;Local - Reti Dehaze luminance -HISTORY_MSG_752;Local - Reti Offset -HISTORY_MSG_753;Local - Reti Transmission map -HISTORY_MSG_754;Local - Reti Clip -HISTORY_MSG_755;Local - TM use tm mask -HISTORY_MSG_756;Local - Exp use algo exposure mask -HISTORY_MSG_757;Local - Exp Laplacian mask -HISTORY_MSG_758;Local - Reti Laplacian mask -HISTORY_MSG_759;Local - Exp Laplacian mask -HISTORY_MSG_760;Local - Color Laplacian mask -HISTORY_MSG_761;Local - SH Laplacian mask -HISTORY_MSG_762;Local - cbdl Laplacian mask -HISTORY_MSG_763;Local - Blur Laplacian mask -HISTORY_MSG_764;Local - Solve PDE Laplacian mask -HISTORY_MSG_765;Local - deNoise Detail threshold -HISTORY_MSG_766;Local - Blur Fast Fourier -HISTORY_MSG_767;Local - Grain Iso -HISTORY_MSG_768;Local - Grain Strength -HISTORY_MSG_769;Local - Grain Scale -HISTORY_MSG_770;Local - Color Mask contrast curve -HISTORY_MSG_771;Local - Exp Mask contrast curve -HISTORY_MSG_772;Local - SH Mask contrast curve -HISTORY_MSG_773;Local - TM Mask contrast curve -HISTORY_MSG_774;Local - Reti Mask contrast curve -HISTORY_MSG_775;Local - CBDL Mask contrast curve -HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve -HISTORY_MSG_777;Local - Blur Mask local contrast curve -HISTORY_MSG_778;Local - Mask highlights -HISTORY_MSG_779;Local - Color Mask local contrast curve -HISTORY_MSG_780;Local - Color Mask shadows -HISTORY_MSG_781;Local - Contrast Mask Wavelet level -HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels -HISTORY_MSG_783;Local - Color Wavelet levels -HISTORY_MSG_784;Local - Mask ΔE -HISTORY_MSG_785;Local - Mask Scope ΔE -HISTORY_MSG_786;Local - SH method -HISTORY_MSG_787;Local - Equalizer multiplier -HISTORY_MSG_788;Local - Equalizer detail -HISTORY_MSG_789;Local - SH mask amount -HISTORY_MSG_790;Local - SH mask anchor -HISTORY_MSG_791;Local - Mask Short L curves -HISTORY_MSG_792;Local - Mask Luminance Background -HISTORY_MSG_793;Local - SH TRC gamma -HISTORY_MSG_794;Local - SH TRC slope -HISTORY_MSG_795;Local - Mask save restore image -HISTORY_MSG_796;Local - Recursive references -HISTORY_MSG_797;Local - Merge Original method -HISTORY_MSG_798;Local - Opacity -HISTORY_MSG_799;Local - Color RGB ToneCurve -HISTORY_MSG_800;Local - Color ToneCurve Method -HISTORY_MSG_801;Local - Color ToneCurve Special -HISTORY_MSG_802;Local - Contrast threshold -HISTORY_MSG_803;Local - Color Merge -HISTORY_MSG_804;Local - Color mask Structure -HISTORY_MSG_805;Local - Blur Noise mask Structure -HISTORY_MSG_806;Local - Color mask Structure as tool -HISTORY_MSG_807;Local - Blur Noise mask Structure as tool -HISTORY_MSG_808;Local - Color mask curve H(H) -HISTORY_MSG_809;Local - Vib mask curve C(C) -HISTORY_MSG_810;Local - Vib mask curve L(L) -HISTORY_MSG_811;Local - Vib mask curve LC(H) -HISTORY_MSG_813;Local - Use Vib mask -HISTORY_MSG_814;Local - Vib mask Blend -HISTORY_MSG_815;Local - Vib mask radius -HISTORY_MSG_816;Local - Vib mask chroma -HISTORY_MSG_817;Local - Vib mask gamma -HISTORY_MSG_818;Local - Vib mask slope -HISTORY_MSG_819;Local - Vib mask laplacian -HISTORY_MSG_820;Local - Vib mask contrast curve -HISTORY_MSG_821;Local - color grid background -HISTORY_MSG_822;Local - color background merge -HISTORY_MSG_823;Local - color background luminance -HISTORY_MSG_824;Local - Exp gradient mask strength -HISTORY_MSG_825;Local - Exp gradient mask angle -HISTORY_MSG_826;Local - Exp gradient strength -HISTORY_MSG_827;Local - Exp gradient angle -HISTORY_MSG_828;Local - SH gradient strength -HISTORY_MSG_829;Local - SH gradient angle -HISTORY_MSG_830;Local - Color gradient strength L -HISTORY_MSG_831;Local - Color gradient angle -HISTORY_MSG_832;Local - Color gradient strength C -HISTORY_MSG_833;Local - Gradient feather -HISTORY_MSG_834;Local - Color gradient strength H -HISTORY_MSG_835;Local - Vib gradient strength L -HISTORY_MSG_836;Local - Vib gradient angle -HISTORY_MSG_837;Local - Vib gradient strength C -HISTORY_MSG_838;Local - Vib gradient strength H -HISTORY_MSG_839;Local - Software complexity -HISTORY_MSG_840;Local - CL Curve -HISTORY_MSG_841;Local - LC curve -HISTORY_MSG_842;Local - Contrast Threshold Blur Mask -HISTORY_MSG_843;Local - Radius blur mask -HISTORY_MSG_844;Local - Color Mask fftw -HISTORY_MSG_845;Local - log encoding -HISTORY_MSG_846;Local - Encoding auto -HISTORY_MSG_847;Local - Source Gray -HISTORY_MSG_848;Local - Source Gray auto -HISTORY_MSG_849;Local - Auto Grayon -HISTORY_MSG_850;Local - Black Ev -HISTORY_MSG_851;Local - White Ev -HISTORY_MSG_852;Local - Target Gray -HISTORY_MSG_853;Local - Local contrast -HISTORY_MSG_854;Local - Scope encoding log -HISTORY_MSG_855;Local - Entire image -HISTORY_MSG_856;Local - Base log -HISTORY_MSG_857;Local - Contrast Blur Residual -HISTORY_MSG_858;Local - Contrast Luminance only -HISTORY_MSG_859;Local - Contrast Maximum Blur levels -HISTORY_MSG_860;Local - Contrast Curve Blur levels -HISTORY_MSG_861;Local - Contrast Curve Contrast levels -HISTORY_MSG_862;Local - Contrast Sigma luminance -HISTORY_MSG_863;Local - Contrast Merge Original -HISTORY_MSG_864;Local - Directional sigma -HISTORY_MSG_865;Local - Directional delta -HISTORY_MSG_866;Local - Contrast Curve Compression -HISTORY_MSG_867;Local - Contrast Amount residual -HISTORY_MSG_868;Local - balance ΔE C-H -HISTORY_MSG_869;Local - denoise curve luminance -HISTORY_MSG_870;Local - LC mask curve LC(H) -HISTORY_MSG_871;Local - LC mask curve C(C) -HISTORY_MSG_872;Local - LC mask curve L(L) -HISTORY_MSG_873;Local - LC mask enable -HISTORY_MSG_875;Local - LC mask blend -HISTORY_MSG_876;Local - LC mask radius -HISTORY_MSG_877;Local - LC mask chroma -HISTORY_MSG_878;Local - LC mask curve contrast -HISTORY_MSG_879;Local - LC Chroma levels -HISTORY_MSG_880;Local - LC Chroma blur levels -HISTORY_MSG_881;Local - Contrast Offset Luminance -HISTORY_MSG_882;Local - Contrast Blur -HISTORY_MSG_883;Local - Contrast By Level -HISTORY_MSG_884;Local - Contrast Dynamic Range Laplacian -HISTORY_MSG_885;Local - Contrast Dynamic Range Wavelet -HISTORY_MSG_886;Local - Contrast Wavelet Curve Compression -HISTORY_MSG_887;Local - Contrast Wavelet Compression Residual -HISTORY_MSG_888;Local - Contrast Wavelet Balance threshold -HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength -HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle -HISTORY_MSG_891;Local - Contrast Wavelet Graduated -HISTORY_MSG_892;Local - Log Encoding Graduated Strength -HISTORY_MSG_893;Local - Log Encoding Graduated angle -HISTORY_MSG_894;Local - Color Preview dE -HISTORY_MSG_897;Local - Contrast Wavelet ES strength -HISTORY_MSG_898;Local - Contrast Wavelet ES radius -HISTORY_MSG_899;Local - Contrast Wavelet ES detail -HISTORY_MSG_900;Local - Contrast Wavelet ES gradient -HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low -HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high -HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast -HISTORY_MSG_904;Local - Contrast Wavelet ES first level -HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness -HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity -HISTORY_MSG_907;Local - Contrast Wavelet ES amplification -HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring -HISTORY_MSG_909;Local - Contrast Wavelet ES show -HISTORY_MSG_910;Local - Wavelet Edge performance -HISTORY_MSG_911;Local - Blur Chroma Luma -HISTORY_MSG_912;Local - Blur Guide filter strength -HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR -HISTORY_MSG_914;Local - Blur Wavelet Sigma BL -HISTORY_MSG_915;Local - Edge Wavelet Sigma ED -HISTORY_MSG_916;Local - Residual wavelet shadows -HISTORY_MSG_917;Local - Residual wavelet shadows threshold -HISTORY_MSG_918;Local - Residual wavelet highlights -HISTORY_MSG_919;Local - Residual wavelet highlights threshold -HISTORY_MSG_920;Local - Wavelet sigma LC -HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 -HISTORY_MSG_922;Local - changes In Black and White -HISTORY_MSG_923;Local - Tool complexity mode -HISTORY_MSG_924;Local - Tool complexity mode -HISTORY_MSG_925;Local - Scope color tools -HISTORY_MSG_926;Local - Show mask type -HISTORY_MSG_927;Local - Shadow mask -HISTORY_MSG_928;Local - Common color mask -HISTORY_MSG_929;Local - Mask common scope -HISTORY_MSG_930;Local - Mask Common blend luma -HISTORY_MSG_931;Local - Mask Common enable -HISTORY_MSG_932;Local - Mask Common radius soft -HISTORY_MSG_933;Local - Mask Common laplacian -HISTORY_MSG_934;Local - Mask Common chroma -HISTORY_MSG_935;Local - Mask Common gamma -HISTORY_MSG_936;Local - Mask Common slope -HISTORY_MSG_937;Local - Mask Common curve C(C) -HISTORY_MSG_938;Local - Mask Common curve L(L) -HISTORY_MSG_939;Local - Mask Common curve LC(H) -HISTORY_MSG_940;Local - Mask Common structure as tool -HISTORY_MSG_941;Local - Mask Common structure strength -HISTORY_MSG_942;Local - Mask Common H(H) curve -HISTORY_MSG_943;Local - Mask Common FFT -HISTORY_MSG_944;Local - Mask Common Blur radius -HISTORY_MSG_945;Local - Mask Common contrast threshold -HISTORY_MSG_946;Local - Mask Common shadows -HISTORY_MSG_947;Local - Mask Common Contrast curve -HISTORY_MSG_948;Local - Mask Common Wavelet curve -HISTORY_MSG_949;Local - Mask Common Threshold levels -HISTORY_MSG_950;Local - Mask Common GF strength -HISTORY_MSG_951;Local - Mask Common GF angle -HISTORY_MSG_952;Local - Mask Common soft radius -HISTORY_MSG_953;Local - Mask Common blend chroma -HISTORY_MSG_954;Local - Show-hide tools -HISTORY_MSG_955;Local - Enable Spot -HISTORY_MSG_956;Local - CH Curve -HISTORY_MSG_957;Local - GF local contrast threshold -HISTORY_MSG_958;Local - GF Local contrast Hue equalizer -HISTORY_MSG_959;Local - GF Local contrast levels -HISTORY_MSG_960;Local - GF Local contrast threshold high -HISTORY_MSG_961;Local - Denoise mode -HISTORY_MSG_962;Local - Equalizer hue -HISTORY_MSG_964;Local - Threshold mask denoise -HISTORY_MSG_966;Local - denoise use mask -HISTORY_MSG_967;Local - Spot settings show hide -HISTORY_MSG_BLSHAPE;Blur by level -HISTORY_MSG_BLURCWAV;Blur chroma -HISTORY_MSG_BLURWAV;Blur luminance -HISTORY_MSG_BLUWAV;Attenuation response -HISTORY_MSG_CAT02PRESET;Cat02 automatic preset -HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors -HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction -HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel -HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask -HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask -HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness -HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask -HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List -HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region blur mask -HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset -HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power -HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation -HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask -HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope -HISTORY_MSG_COMPLEX;Wavelet complexity -HISTORY_MSG_COMPLEXRETI;Retinex complexity -HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth -HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only -HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map -HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength -HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold -HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold -HISTORY_MSG_EDGEFFECT;Edge Attenuation response -HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative -HISTORY_MSG_FILMNEGATIVE_FILMBASE;Film base color -HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values -HISTORY_MSG_HISTMATCHING;Auto-matched tone curve -HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries -HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D -HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type -HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma -HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope -HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method -HISTORY_MSG_ILLUM;Illuminant -HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount -HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness -HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast -HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness -HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius -HISTORY_MSG_METADATA_MODE;Metadata copy mode -HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold -HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold -HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius -HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations -HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations -HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius -HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera -HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera -HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera -HISTORY_MSG_PERSP_METHOD;Perspective - Method -HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery -HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation -HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA -HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion -HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction -HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode -HISTORY_MSG_PROTAB;Protection -HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold -HISTORY_MSG_RANGEAB;Range ab -HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations -HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift -HISTORY_MSG_RAW_BORDER;Raw border -HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling -HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius -HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold -HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace -HISTORY_MSG_SIGMACOL;Chroma Attenuation response -HISTORY_MSG_SIGMADIR;Dir Attenuation response -HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response -HISTORY_MSG_SIGMATON;Toning Attenuation response -HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light -HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength -HISTORY_MSG_TEMPOUT;CAM02 automatic temperature -HISTORY_MSG_THRESWAV;Balance threshold -HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor -HISTORY_MSG_TRANS_Method;Geometry - Method -HISTORY_MSG_WAVBALCHROM;Equalizer chrominance -HISTORY_MSG_WAVBALLUM;Equalizer luminance -HISTORY_MSG_WAVBL;Blur levels -HISTORY_MSG_WAVCHROMCO;Coarse chroma -HISTORY_MSG_WAVCHROMFI;Fine chroma -HISTORY_MSG_WAVCLARI;Clarity -HISTORY_MSG_WAVDENLH;Level 5 -HISTORY_MSG_WAVDENOISE;Local contrast -HISTORY_MSG_WAVDENOISEH;High level Local contrast -HISTORY_MSG_WAVDENMET;Local equalizer -HISTORY_MSG_WAVDETEND;Details soft -HISTORY_MSG_WAVEDGS;Edge stopping -HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer -HISTORY_MSG_WAVHUE;Equalizer hue -HISTORY_MSG_WAVLEVDEN;High level local contrast -HISTORY_MSG_WAVLEVSIGM;Radius -HISTORY_MSG_WAVLIMDEN;Interaction 56 14 -HISTORY_MSG_WAVLOWTHR;Threshold low contrast -HISTORY_MSG_WAVMERGEC;Merge C -HISTORY_MSG_WAVMERGEL;Merge L -HISTORY_MSG_WAVMIXMET;Reference local contrast -HISTORY_MSG_WAVOFFSET;Offset -HISTORY_MSG_WAVOLDSH;Old algorithm -HISTORY_MSG_WAVQUAMET;Denoise mode -HISTORY_MSG_WAVRADIUS;Radius shadows-highlights -HISTORY_MSG_WAVSCALE;Scale -HISTORY_MSG_WAVSHOWMASK;Show wavelet mask -HISTORY_MSG_WAVSIGMA;Attenuation response -HISTORY_MSG_WAVSIGM;Sigma -HISTORY_MSG_WAVSOFTRAD;Soft radius clarity -HISTORY_MSG_WAVSOFTRADEND;Soft radius final -HISTORY_MSG_WAVSLIMET;Method -HISTORY_MSG_WAVTHRDEN;Threshold local contrast -HISTORY_MSG_WAVTHREND;Threshold local contrast -HISTORY_MSG_WAVSTREND;Strength soft -HISTORY_MSG_WAVUSHAMET;Clarity method -HISTORY_NEWSNAPSHOT;Add -HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s -HISTORY_SNAPSHOT;Snapshot -HISTORY_SNAPSHOTS;Snapshots -ICCPROFCREATOR_COPYRIGHT;Copyright: -ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" -ICCPROFCREATOR_CUSTOM;Custom -ICCPROFCREATOR_DESCRIPTION;Description: -ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description -ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. -ICCPROFCREATOR_GAMMA;Gamma -ICCPROFCREATOR_ICCVERSION;ICC version: -ICCPROFCREATOR_ILL;Illuminant: -ICCPROFCREATOR_ILL_41;D41 -ICCPROFCREATOR_ILL_50;D50 -ICCPROFCREATOR_ILL_55;D55 -ICCPROFCREATOR_ILL_60;D60 -ICCPROFCREATOR_ILL_65;D65 -ICCPROFCREATOR_ILL_80;D80 -ICCPROFCREATOR_ILL_DEF;Default -ICCPROFCREATOR_ILL_INC;StdA 2856K -ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. -ICCPROFCREATOR_PRIMARIES;Primaries: -ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 -ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 -ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) -ICCPROFCREATOR_PRIM_BEST;BestRGB -ICCPROFCREATOR_PRIM_BETA;BetaRGB -ICCPROFCREATOR_PRIM_BLUX;Blue X -ICCPROFCREATOR_PRIM_BLUY;Blue Y -ICCPROFCREATOR_PRIM_BRUCE;BruceRGB -ICCPROFCREATOR_PRIM_GREX;Green X -ICCPROFCREATOR_PRIM_GREY;Green Y -ICCPROFCREATOR_PRIM_PROPH;Prophoto -ICCPROFCREATOR_PRIM_REC2020;Rec2020 -ICCPROFCREATOR_PRIM_REDX;Red X -ICCPROFCREATOR_PRIM_REDY;Red Y -ICCPROFCREATOR_PRIM_SRGB;sRGB -ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. -ICCPROFCREATOR_PRIM_WIDEG;Widegamut -ICCPROFCREATOR_PROF_V2;ICC v2 -ICCPROFCREATOR_PROF_V4;ICC v4 -ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... -ICCPROFCREATOR_SLOPE;Slope -ICCPROFCREATOR_TRC_PRESET;Tone response curve: -IPTCPANEL_CATEGORY;Category -IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. -IPTCPANEL_CITY;City -IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. -IPTCPANEL_COPYHINT;Copy IPTC settings to clipboard. -IPTCPANEL_COPYRIGHT;Copyright notice -IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as ©2008 Jane Doe. -IPTCPANEL_COUNTRY;Country -IPTCPANEL_COUNTRYHINT;Enter the name of the country pictured in this image. -IPTCPANEL_CREATOR;Creator -IPTCPANEL_CREATORHINT;Enter the name of the person that created this image. -IPTCPANEL_CREATORJOBTITLE;Creator's job title -IPTCPANEL_CREATORJOBTITLEHINT;Enter the Job Title of the person listed in the Creator field. -IPTCPANEL_CREDIT;Credit line -IPTCPANEL_CREDITHINT;Enter who should be credited when this image is published. -IPTCPANEL_DATECREATED;Date created -IPTCPANEL_DATECREATEDHINT;Enter the Date the image was taken. -IPTCPANEL_DESCRIPTION;Description -IPTCPANEL_DESCRIPTIONHINT;Enter a "caption" describing the who, what, and why of what is happening in this image, this might include names of people, and/or their role in the action that is taking place within the image. -IPTCPANEL_DESCRIPTIONWRITER;Description writer -IPTCPANEL_DESCRIPTIONWRITERHINT;Enter the name of the person involved in writing, editing or correcting the description of the image. -IPTCPANEL_EMBEDDED;Embedded -IPTCPANEL_EMBEDDEDHINT;Reset to IPTC data embedded in the image file. -IPTCPANEL_HEADLINE;Headline -IPTCPANEL_HEADLINEHINT;Enter a brief publishable synopsis or summary of the contents of the image. -IPTCPANEL_INSTRUCTIONS;Instructions -IPTCPANEL_INSTRUCTIONSHINT;Enter information about embargoes, or other restrictions not covered by the Copyright field. -IPTCPANEL_KEYWORDS;Keywords -IPTCPANEL_KEYWORDSHINT;Enter any number of keywords, terms or phrases used to express the subject matter in the image. -IPTCPANEL_PASTEHINT;Paste IPTC settings from clipboard. -IPTCPANEL_PROVINCE;Province or state -IPTCPANEL_PROVINCEHINT;Enter the name of the province or state pictured in this image. -IPTCPANEL_RESET;Reset -IPTCPANEL_RESETHINT;Reset to profile default. -IPTCPANEL_SOURCE;Source -IPTCPANEL_SOURCEHINT;Enter or edit the name of a person or party who has a role in the content supply chain, such as a person or entity from whom you received this image from. -IPTCPANEL_SUPPCATEGORIES;Supplemental categories -IPTCPANEL_SUPPCATEGORIESHINT;Further refines the subject of the image. -IPTCPANEL_TITLE;Title -IPTCPANEL_TITLEHINT;Enter a short verbal and human readable name for the image, this may be the file name. -IPTCPANEL_TRANSREFERENCE;Job ID -IPTCPANEL_TRANSREFERENCEHINT;Enter a number or identifier needed for workflow control or tracking. -MAIN_BUTTON_FULLSCREEN;Fullscreen -MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator -MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 -MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 -MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). -MAIN_BUTTON_PREFERENCES;Preferences -MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s -MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor -MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e -MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m -MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen -MAIN_FRAME_EDITOR;Editor -MAIN_FRAME_EDITOR_TOOLTIP;Editor.\nShortcut: Ctrl-F4 -MAIN_FRAME_FILEBROWSER;File Browser -MAIN_FRAME_FILEBROWSER_TOOLTIP;File browser.\nShortcut: Ctrl-F2 -MAIN_FRAME_PLACES;Places -MAIN_FRAME_PLACES_ADD;Add -MAIN_FRAME_PLACES_DEL;Remove -MAIN_FRAME_QUEUE;Queue -MAIN_FRAME_QUEUE_TOOLTIP;Processing queue.\nShortcut: Ctrl-F3 -MAIN_FRAME_RECENT;Recent Folders -MAIN_MSG_ALREADYEXISTS;File already exists. -MAIN_MSG_CANNOTLOAD;Cannot load image -MAIN_MSG_CANNOTSAVE;File saving error -MAIN_MSG_CANNOTSTARTEDITOR;Cannot start editor. -MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Please set the correct path in Preferences. -MAIN_MSG_EMPTYFILENAME;Filename unspecified! -MAIN_MSG_IMAGEUNPROCESSED;This command requires all selected images to be queue-processed first. -MAIN_MSG_NAVIGATOR;Navigator -MAIN_MSG_OPERATIONCANCELLED;Operation cancelled -MAIN_MSG_PATHDOESNTEXIST;The path\n\n%1\n\ndoes not exist. Please set a correct path in Preferences. -MAIN_MSG_QOVERWRITE;Do you want to overwrite it? -MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! -MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. -MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. -MAIN_TAB_ADVANCED;Advanced -MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a -MAIN_TAB_COLOR;Color -MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c -MAIN_TAB_DETAIL;Detail -MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d -MAIN_TAB_DEVELOP; Batch Edit -MAIN_TAB_EXIF;Exif -MAIN_TAB_EXPORT; Fast Export -MAIN_TAB_EXPOSURE;Exposure -MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e -MAIN_TAB_FAVORITES;Favorites -MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u -MAIN_TAB_FILTER; Filter -MAIN_TAB_INSPECT; Inspect -MAIN_TAB_IPTC;IPTC -MAIN_TAB_LOCALLAB;Local -MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o -MAIN_TAB_METADATA;Metadata -MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m -MAIN_TAB_RAW;Raw -MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r -MAIN_TAB_TRANSFORM;Transform -MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: theme-based\nShortcut: 9 -MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: black\nShortcut: 9 -MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: white\nShortcut: 9 -MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 -MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool. -MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: l -MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: > -MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: < -MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b -MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. -MAIN_TOOLTIP_PREVIEWG;Preview the green channel.\nShortcut: g -MAIN_TOOLTIP_PREVIEWL;Preview the luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B -MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r -MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. -MAIN_TOOLTIP_QINFO;Quick info on the image.\nShortcut: i -MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l -MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l -MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l -MAIN_TOOLTIP_THRESHOLD;Threshold -MAIN_TOOLTIP_TOGGLE;Toggle the Before/After view.\nShortcut: Shift-b -MONITOR_PROFILE_SYSTEM;System default -NAVIGATOR_B;B: -NAVIGATOR_G;G: -NAVIGATOR_H;H: -NAVIGATOR_LAB_A;a*: -NAVIGATOR_LAB_B;b*: -NAVIGATOR_LAB_L;L*: -NAVIGATOR_NA; -- -NAVIGATOR_R;R: -NAVIGATOR_S;S: -NAVIGATOR_V;V: -NAVIGATOR_XY_FULL;Width: %1, Height: %2 -NAVIGATOR_XY_NA;x: --, y: -- -OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. -OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. -OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. -PARTIALPASTE_ADVANCEDGROUP;Advanced Settings -PARTIALPASTE_BASICGROUP;Basic Settings -PARTIALPASTE_CACORRECTION;Chromatic aberration correction -PARTIALPASTE_CHANNELMIXER;Channel mixer -PARTIALPASTE_CHANNELMIXERBW;Black-and-white -PARTIALPASTE_COARSETRANS;Coarse rotation/flipping -PARTIALPASTE_COLORAPP;CIECAM02 -PARTIALPASTE_COLORGROUP;Color Related Settings -PARTIALPASTE_COLORTONING;Color toning -PARTIALPASTE_COMMONTRANSFORMPARAMS;Auto-fill -PARTIALPASTE_COMPOSITIONGROUP;Composition Settings -PARTIALPASTE_CROP;Crop -PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection -PARTIALPASTE_DARKFRAMEFILE;Dark-frame file -PARTIALPASTE_DEFRINGE;Defringe -PARTIALPASTE_DEHAZE;Haze removal -PARTIALPASTE_DETAILGROUP;Detail Settings -PARTIALPASTE_DIALOGLABEL;Partial paste processing profile -PARTIALPASTE_DIRPYRDENOISE;Noise reduction -PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels -PARTIALPASTE_DISTORTION;Distortion correction -PARTIALPASTE_EPD;Tone mapping -PARTIALPASTE_EQUALIZER;Wavelet levels -PARTIALPASTE_EVERYTHING;Everything -PARTIALPASTE_EXIFCHANGES;Exif -PARTIALPASTE_EXPOSURE;Exposure -PARTIALPASTE_FILMNEGATIVE;Film Negative -PARTIALPASTE_FILMSIMULATION;Film simulation -PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field auto-selection -PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field blur radius -PARTIALPASTE_FLATFIELDBLURTYPE;Flat-field blur type -PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control -PARTIALPASTE_FLATFIELDFILE;Flat-field file -PARTIALPASTE_GRADIENT;Graduated filter -PARTIALPASTE_HSVEQUALIZER;HSV equalizer -PARTIALPASTE_ICMSETTINGS;Color management settings -PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction -PARTIALPASTE_IPTCINFO;IPTC -PARTIALPASTE_LABCURVE;L*a*b* adjustments -PARTIALPASTE_LENSGROUP;Lens Related Settings -PARTIALPASTE_LENSPROFILE;Profiled lens correction -PARTIALPASTE_LOCALCONTRAST;Local contrast -PARTIALPASTE_LOCALLAB;Local Adjustments -PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings -PARTIALPASTE_LOCGROUP;Local -PARTIALPASTE_METADATA;Metadata mode -PARTIALPASTE_METAGROUP;Metadata settings -PARTIALPASTE_PCVIGNETTE;Vignette filter -PARTIALPASTE_PERSPECTIVE;Perspective -PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter -PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration -PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter -PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter -PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -PARTIALPASTE_PREPROCWB;Preprocess White Balance -PARTIALPASTE_PRSHARPENING;Post-resize sharpening -PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction -PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift -PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue -PARTIALPASTE_RAWEXPOS_BLACK;Black levels -PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -PARTIALPASTE_RAWGROUP;Raw Settings -PARTIALPASTE_RAW_BORDER;Raw border -PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement -PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations -PARTIALPASTE_RAW_DMETHOD;Demosaic method -PARTIALPASTE_RAW_FALSECOLOR;False color suppression -PARTIALPASTE_RAW_IMAGENUM;Sub-image -PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift -PARTIALPASTE_RESIZE;Resize -PARTIALPASTE_RETINEX;Retinex -PARTIALPASTE_RGBCURVES;RGB curves -PARTIALPASTE_ROTATION;Rotation -PARTIALPASTE_SHADOWSHIGHLIGHTS;Shadows/highlights -PARTIALPASTE_SHARPENEDGE;Edges -PARTIALPASTE_SHARPENING;Sharpening (USM/RL) -PARTIALPASTE_SHARPENMICRO;Microcontrast -PARTIALPASTE_SOFTLIGHT;Soft light -PARTIALPASTE_TM_FATTAL;Dynamic range compression -PARTIALPASTE_VIBRANCE;Vibrance -PARTIALPASTE_VIGNETTING;Vignetting correction -PARTIALPASTE_WHITEBALANCE;White balance -PREFERENCES_ADD;Add -PREFERENCES_APPEARANCE;Appearance -PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font -PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color -PREFERENCES_APPEARANCE_MAINFONT;Main font -PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color -PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode -PREFERENCES_APPEARANCE_THEME;Theme -PREFERENCES_APPLNEXTSTARTUP;restart required -PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit -PREFERENCES_BATCH_PROCESSING;Batch Processing -PREFERENCES_BEHADDALL;All to 'Add' -PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. -PREFERENCES_BEHAVIOR;Behavior -PREFERENCES_BEHSETALL;All to 'Set' -PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. -PREFERENCES_CACHECLEAR;Clear -PREFERENCES_CACHECLEAR_ALL;Clear all cached files: -PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: -PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: -PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. -PREFERENCES_CACHEMAXENTRIES;Maximum number of cache entries -PREFERENCES_CACHEOPTS;Cache Options -PREFERENCES_CACHETHUMBHEIGHT;Maximum thumbnail height -PREFERENCES_CHUNKSIZES;Tiles per thread -PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaic -PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA correction -PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic -PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic -PREFERENCES_CHUNKSIZE_RGB;RGB processing -PREFERENCES_CLIPPINGIND;Clipping Indication -PREFERENCES_CLUTSCACHE;HaldCLUT Cache -PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs -PREFERENCES_CLUTSDIR;HaldCLUT directory -PREFERENCES_CMMBPC;Black point compensation -PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments -PREFERENCES_COMPLEXITY_EXP;Advanced -PREFERENCES_COMPLEXITY_NORM;Standard -PREFERENCES_COMPLEXITY_SIMP;Basic -PREFERENCES_CROP;Crop Editing -PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop -PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop -PREFERENCES_CROP_GUIDES_FRAME;Frame -PREFERENCES_CROP_GUIDES_FULL;Original -PREFERENCES_CROP_GUIDES_NONE;None -PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons -PREFERENCES_CURVEBBOXPOS_ABOVE;Above -PREFERENCES_CURVEBBOXPOS_BELOW;Below -PREFERENCES_CURVEBBOXPOS_LEFT;Left -PREFERENCES_CURVEBBOXPOS_RIGHT;Right -PREFERENCES_CUSTPROFBUILD;Custom Processing Profile Builder -PREFERENCES_CUSTPROFBUILDHINT;Executable (or script) file called when a new initial processing profile should be generated for an image.\n\nThe path of the communication file (*.ini style, a.k.a. "Keyfile") is added as a command line parameter. It contains various parameters required for the scripts and image Exif to allow a rules-based processing profile generation.\n\nWARNING: You are responsible for using double quotes where necessary if you're using paths containing spaces. -PREFERENCES_CUSTPROFBUILDKEYFORMAT;Keys format -PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name -PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID -PREFERENCES_CUSTPROFBUILDPATH;Executable path -PREFERENCES_DARKFRAMEFOUND;Found -PREFERENCES_DARKFRAMESHOTS;shots -PREFERENCES_DARKFRAMETEMPLATES;templates -PREFERENCES_DATEFORMAT;Date format -PREFERENCES_DATEFORMATHINT;You can use the following formatting strings:\n%y - year\n%m - month\n%d - day\n\nFor example, the ISO 8601 standard dictates the date format as follows:\n%y-%m-%d -PREFERENCES_DIRDARKFRAMES;Dark-frames directory -PREFERENCES_DIRECTORIES;Directories -PREFERENCES_DIRHOME;Home directory -PREFERENCES_DIRLAST;Last visited directory -PREFERENCES_DIROTHER;Other -PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... -PREFERENCES_DIRSOFTWARE;Installation directory -PREFERENCES_EDITORCMDLINE;Custom command line -PREFERENCES_EDITORLAYOUT;Editor layout -PREFERENCES_EXTERNALEDITOR;External Editor -PREFERENCES_FBROWSEROPTS;File Browser / Thumbnail Options -PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser -PREFERENCES_FLATFIELDFOUND;Found -PREFERENCES_FLATFIELDSDIR;Flat-fields directory -PREFERENCES_FLATFIELDSHOTS;shots -PREFERENCES_FLATFIELDTEMPLATES;templates -PREFERENCES_FORIMAGE;For non-raw photos -PREFERENCES_FORRAW;For raw photos -PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser -PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser. -PREFERENCES_GIMPPATH;GIMP installation directory -PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogram in left panel -PREFERENCES_HISTOGRAM_TOOLTIP;If enabled, the working profile is used for rendering the main histogram and the Navigator panel, otherwise the gamma-corrected output profile is used. -PREFERENCES_HLTHRESHOLD;Threshold for clipped highlights -PREFERENCES_ICCDIR;Directory containing color profiles -PREFERENCES_IMPROCPARAMS;Default Processing Profile -PREFERENCES_INSPECT_LABEL;Inspect -PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Maximum number of cached images -PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Set the maximum number of images stored in cache when hovering over them in the File Browser; systems with little RAM (2GB) should keep this value set to 1 or 2. -PREFERENCES_INTENT_ABSOLUTE;Absolute Colorimetric -PREFERENCES_INTENT_PERCEPTUAL;Perceptual -PREFERENCES_INTENT_RELATIVE;Relative Colorimetric -PREFERENCES_INTENT_SATURATION;Saturation -PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited -PREFERENCES_LANG;Language -PREFERENCES_LANGAUTODETECT;Use system language -PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" -PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" -PREFERENCES_MENUGROUPLABEL;Group "Color label" -PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing profile operations" -PREFERENCES_MENUGROUPRANK;Group "Rank" -PREFERENCES_MENUOPTIONS;Context Menu Options -PREFERENCES_MONINTENT;Default rendering intent -PREFERENCES_MONITOR;Monitor -PREFERENCES_MONPROFILE;Default color profile -PREFERENCES_MONPROFILE_WARNOSX;Due to MacOS limitations, only sRGB is supported. -PREFERENCES_MULTITAB;Multiple Editor Tabs Mode -PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -PREFERENCES_NAVIGATIONFRAME;Navigation -PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser -PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel -PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files -PREFERENCES_PANFACTORLABEL;Pan rate amplification -PREFERENCES_PARSEDEXT;Parsed Extensions -PREFERENCES_PARSEDEXTADD;Add extension -PREFERENCES_PARSEDEXTADDHINT;Add entered extension to the list. -PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list. -PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. -PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. -PREFERENCES_PERFORMANCE_MEASURE;Measure -PREFERENCES_PERFORMANCE_MEASURE_HINT;Logs processing times in console -PREFERENCES_PERFORMANCE_THREADS;Threads -PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) -PREFERENCES_PREVDEMO;Preview Demosaic Method -PREFERENCES_PREVDEMO_FAST;Fast -PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: -PREFERENCES_PREVDEMO_SIDECAR;As in PP3 -PREFERENCES_PRINTER;Printer (Soft-Proofing) -PREFERENCES_PROFILEHANDLING;Processing Profile Handling -PREFERENCES_PROFILELOADPR;Processing profile loading priority -PREFERENCES_PROFILEPRCACHE;Profile in cache -PREFERENCES_PROFILEPRFILE;Profile next to the input file -PREFERENCES_PROFILESAVEBOTH;Save processing profile both to the cache and next to the input file -PREFERENCES_PROFILESAVECACHE;Save processing profile to the cache -PREFERENCES_PROFILESAVEINPUT;Save processing profile next to the input file -PREFERENCES_PROFILESAVELOCATION;Processing profile saving location -PREFERENCES_PROFILE_NONE;None -PREFERENCES_PROPERTY;Property -PREFERENCES_PRTINTENT;Rendering intent -PREFERENCES_PRTPROFILE;Color profile -PREFERENCES_PSPATH;Adobe Photoshop installation directory -PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset -PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now -PREFERENCES_SELECTLANG;Select language -PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings -PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files -PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. -PREFERENCES_SET;Set -PREFERENCES_SHOWBASICEXIF;Show basic Exif info -PREFERENCES_SHOWDATETIME;Show date and time -PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar -PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips -PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows -PREFERENCES_SINGLETAB;Single Editor Tab Mode -PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. -PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -PREFERENCES_SND_QUEUEDONE;Queue processing done -PREFERENCES_SND_THRESHOLDSECS;After seconds -PREFERENCES_STARTUPIMDIR;Image Directory at Startup -PREFERENCES_TAB_BROWSER;File Browser -PREFERENCES_TAB_COLORMGR;Color Management -PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -PREFERENCES_TAB_GENERAL;General -PREFERENCES_TAB_IMPROC;Image Processing -PREFERENCES_TAB_PERFORMANCE;Performance -PREFERENCES_TAB_SOUND;Sounds -PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview -PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show -PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering -PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise -PREFERENCES_TP_LABEL;Tool panel: -PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar -PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles -PREFERENCES_WORKFLOW;Layout -PROFILEPANEL_COPYPPASTE;Parameters to copy -PROFILEPANEL_GLOBALPROFILES;Bundled profiles -PROFILEPANEL_LABEL;Processing Profiles -PROFILEPANEL_LOADDLGLABEL;Load Processing Parameters... -PROFILEPANEL_LOADPPASTE;Parameters to load -PROFILEPANEL_MODE_TIP;Processing profile fill mode.\n\nButton pressed: partial profiles will be converted to full profiles; the missing values will be replaced with hard-coded defaults.\n\nButton released: profiles will be applied as they are, altering only those values which they contain. -PROFILEPANEL_MYPROFILES;My profiles -PROFILEPANEL_PASTEPPASTE;Parameters to paste -PROFILEPANEL_PCUSTOM;Custom -PROFILEPANEL_PDYNAMIC;Dynamic -PROFILEPANEL_PFILE;From file -PROFILEPANEL_PINTERNAL;Neutral -PROFILEPANEL_PLASTSAVED;Last Saved -PROFILEPANEL_SAVEDLGLABEL;Save Processing Parameters... -PROFILEPANEL_SAVEPPASTE;Parameters to save -PROFILEPANEL_TOOLTIPCOPY;Copy current processing profile to clipboard.\nCtrl-click to select the parameters to copy. -PROFILEPANEL_TOOLTIPLOAD;Load a profile from file.\nCtrl-click to select the parameters to load. -PROFILEPANEL_TOOLTIPPASTE;Paste profile from clipboard.\nCtrl-click to select the parameters to paste. -PROFILEPANEL_TOOLTIPSAVE;Save current profile.\nCtrl-click to select the parameters to save. -PROGRESSBAR_DECODING;Decoding... -PROGRESSBAR_GREENEQUIL;Green equilibration... -PROGRESSBAR_HLREC;Highlight reconstruction... -PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... -PROGRESSBAR_LINEDENOISE;Line noise filter... -PROGRESSBAR_LOADING;Loading image... -PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... -PROGRESSBAR_LOADJPEG;Loading JPEG file... -PROGRESSBAR_LOADPNG;Loading PNG file... -PROGRESSBAR_LOADTIFF;Loading TIFF file... -PROGRESSBAR_NOIMAGES;No images found -PROGRESSBAR_PROCESSING;Processing image... -PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved -PROGRESSBAR_RAWCACORR;Raw CA correction... -PROGRESSBAR_READY;Ready -PROGRESSBAR_SAVEJPEG;Saving JPEG file... -PROGRESSBAR_SAVEPNG;Saving PNG file... -PROGRESSBAR_SAVETIFF;Saving TIFF file... -PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added -PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser -QINFO_FRAMECOUNT;%2 frames -QINFO_HDR;HDR / %2 frame(s) -QINFO_ISO;ISO -QINFO_NOEXIF;Exif data not available. -QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) -QUEUE_AUTOSTART;Auto-start -QUEUE_AUTOSTART_TOOLTIP;Start processing automatically when a new job arrives. -QUEUE_DESTFILENAME;Path and file name -QUEUE_FORMAT_TITLE;File Format -QUEUE_LOCATION_FOLDER;Save to folder -QUEUE_LOCATION_TEMPLATE;Use template -QUEUE_LOCATION_TEMPLATE_TOOLTIP;Specify the output location based on the source photo's location, rank, trash status or position in the queue.\n\nUsing the following pathname as an example:\n/home/tom/photos/2010-10-31/photo1.raw\nthe meaning of the formatting strings follows:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = photo1\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\n%r will be replaced by the photo's rank. If the photo is unranked, '0' is used. If the photo is in the trash, 'x' is used.\n\n%s1, ..., %s9 will be replaced by the photo's initial position in the queue at the time the queue is started. The number specifies the padding, e.g. %s3 results in '001'.\n\nIf you want to save the output image alongside the source image, write:\n%p1/%f\n\nIf you want to save the output image in a folder named 'converted' located in the source photo's folder, write:\n%p1/converted/%f\n\nIf you want to save the output image in\n'/home/tom/photos/converted/2010-10-31', write:\n%p2/converted/%d1/%f -QUEUE_LOCATION_TITLE;Output Location -QUEUE_STARTSTOP_TOOLTIP;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s -SAMPLEFORMAT_0;Unknown data format -SAMPLEFORMAT_1;8-bit unsigned -SAMPLEFORMAT_2;16-bit unsigned -SAMPLEFORMAT_4;24-bit LogLuv -SAMPLEFORMAT_8;32-bit LogLuv -SAMPLEFORMAT_16;16-bit floating-point -SAMPLEFORMAT_32;24-bit floating-point -SAMPLEFORMAT_64;32-bit floating-point -SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists -SAVEDLG_FILEFORMAT;File format -SAVEDLG_FILEFORMAT_FLOAT; floating-point -SAVEDLG_FORCEFORMATOPTS;Force saving options -SAVEDLG_JPEGQUAL;JPEG quality -SAVEDLG_PUTTOQUEUE;Put into processing queue -SAVEDLG_PUTTOQUEUEHEAD;Put to the head of the processing queue -SAVEDLG_PUTTOQUEUETAIL;Put to the end of the processing queue -SAVEDLG_SAVEIMMEDIATELY;Save immediately -SAVEDLG_SAVESPP;Save processing parameters with image -SAVEDLG_SUBSAMP;Subsampling -SAVEDLG_SUBSAMP_1;Best compression -SAVEDLG_SUBSAMP_2;Balanced -SAVEDLG_SUBSAMP_3;Best quality -SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. -SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF -SAVEDLG_WARNFILENAME;File will be named -SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. -SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. -THRESHOLDSELECTOR_B;Bottom -THRESHOLDSELECTOR_BL;Bottom-left -THRESHOLDSELECTOR_BR;Bottom-right -THRESHOLDSELECTOR_HINT;Hold the Shift key to move individual control points. -THRESHOLDSELECTOR_T;Top -THRESHOLDSELECTOR_TL;Top-left -THRESHOLDSELECTOR_TR;Top-right -TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. -TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop using Shift+mouse drag. -TOOLBAR_TOOLTIP_HAND;Hand tool.\nShortcut: h -TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image preview. Angle of rotation will be shown next to the guide line. Center of rotation is the geometrical center of the image. -TOOLBAR_TOOLTIP_WB;Spot white balance.\nShortcut: w -TP_BWMIX_ALGO;Algorithm OYCPM -TP_BWMIX_ALGO_LI;Linear -TP_BWMIX_ALGO_SP;Special effects -TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. -TP_BWMIX_AUTOCH;Auto -TP_BWMIX_CC_ENABLED;Adjust complementary color -TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. -TP_BWMIX_CHANNEL;Luminance equalizer -TP_BWMIX_CURVEEDITOR1;'Before' curve -TP_BWMIX_CURVEEDITOR2;'After' curve -TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Tone curve, after B&W conversion, at the end of treatment. -TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Tone curve, just before B&W conversion.\nMay take into account the color components. -TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H).\nPay attention to extreme values as they may cause artifacts. -TP_BWMIX_FILTER;Color Filter -TP_BWMIX_FILTER_BLUE;Blue -TP_BWMIX_FILTER_BLUEGREEN;Blue-Green -TP_BWMIX_FILTER_GREEN;Green -TP_BWMIX_FILTER_GREENYELLOW;Green-Yellow -TP_BWMIX_FILTER_NONE;None -TP_BWMIX_FILTER_PURPLE;Purple -TP_BWMIX_FILTER_RED;Red -TP_BWMIX_FILTER_REDYELLOW;Red-Yellow -TP_BWMIX_FILTER_TOOLTIP;The color filter simulates shots taken with a colored filter placed in front of the lens. Colored filters reduce the transmission of specific color ranges and therefore affect their lightness. E.g. a red filter darkens blue skies. -TP_BWMIX_FILTER_YELLOW;Yellow -TP_BWMIX_GAMMA;Gamma Correction -TP_BWMIX_GAM_TOOLTIP;Correct gamma for each RGB channel. -TP_BWMIX_LABEL;Black-and-White -TP_BWMIX_MET;Method -TP_BWMIX_MET_CHANMIX;Channel Mixer -TP_BWMIX_MET_DESAT;Desaturation -TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -TP_BWMIX_MIXC;Channel Mixer -TP_BWMIX_NEUTRAL;Reset -TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% -TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. -TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. -TP_BWMIX_SETTING;Presets -TP_BWMIX_SETTING_TOOLTIP;Different presets (film, landscape, etc.) or manual Channel Mixer settings. -TP_BWMIX_SET_HIGHCONTAST;High contrast -TP_BWMIX_SET_HIGHSENSIT;High Sensitivity -TP_BWMIX_SET_HYPERPANCHRO;Hyper Panchromatic -TP_BWMIX_SET_INFRARED;Infrared -TP_BWMIX_SET_LANDSCAPE;Landscape -TP_BWMIX_SET_LOWSENSIT;Low Sensitivity -TP_BWMIX_SET_LUMINANCE;Luminance -TP_BWMIX_SET_NORMCONTAST;Normal Contrast -TP_BWMIX_SET_ORTHOCHRO;Orthochromatic -TP_BWMIX_SET_PANCHRO;Panchromatic -TP_BWMIX_SET_PORTRAIT;Portrait -TP_BWMIX_SET_RGBABS;Absolute RGB -TP_BWMIX_SET_RGBREL;Relative RGB -TP_BWMIX_SET_ROYGCBPMABS;Absolute ROYGCBPM -TP_BWMIX_SET_ROYGCBPMREL;Relative ROYGCBPM -TP_BWMIX_TCMODE_FILMLIKE;B&W Film-like -TP_BWMIX_TCMODE_SATANDVALBLENDING;B&W Saturation and Value Blending -TP_BWMIX_TCMODE_STANDARD;B&W Standard -TP_BWMIX_TCMODE_WEIGHTEDSTD;B&W Weighted Standard -TP_BWMIX_VAL;L -TP_CACORRECTION_BLUE;Blue -TP_CACORRECTION_LABEL;Chromatic Aberration Correction -TP_CACORRECTION_RED;Red -TP_CBDL_AFT;After Black-and-White -TP_CBDL_BEF;Before Black-and-White -TP_CBDL_METHOD;Process located -TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. -TP_CHMIXER_BLUE;Blue channel -TP_CHMIXER_GREEN;Green channel -TP_CHMIXER_LABEL;Channel Mixer -TP_CHMIXER_RED;Red channel -TP_COARSETRAF_TOOLTIP_HFLIP;Flip horizontally. -TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Editor Tabs Mode,\nAlt-[ - Single Editor Tab Mode. -TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode. -TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically. -TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance -TP_COLORAPP_ALGO;Algorithm -TP_COLORAPP_ALGO_ALL;All -TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) -TP_COLORAPP_ALGO_JS;Lightness + Saturation (JS) -TP_COLORAPP_ALGO_QM;Brightness + Colorfulness (QM) -TP_COLORAPP_ALGO_TOOLTIP;Lets you choose between parameter subsets or all parameters. -TP_COLORAPP_BADPIXSL;Hot/bad pixel filter -TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. -TP_COLORAPP_BRIGHT;Brightness (Q) -TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. -TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. -TP_COLORAPP_CHROMA;Chroma (C) -TP_COLORAPP_CHROMA_M;Colorfulness (M) -TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. -TP_COLORAPP_CHROMA_S;Saturation (S) -TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. -TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 differs from L*a*b* and RGB chroma. -TP_COLORAPP_CIECAT_DEGREE;CAT02 adaptation -TP_COLORAPP_CONTRAST;Contrast (J) -TP_COLORAPP_CONTRAST_Q;Contrast (Q) -TP_COLORAPP_CONTRAST_Q_TOOLTIP;Differs from L*a*b* and RGB contrast. -TP_COLORAPP_CONTRAST_TOOLTIP;Differs from L*a*b* and RGB contrast. -TP_COLORAPP_CURVEEDITOR1;Tone curve 1 -TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of J or Q after CIECAM02.\n\nJ and Q are not shown in the main histogram panel.\n\nFor final output refer to the main histogram panel. -TP_COLORAPP_CURVEEDITOR2;Tone curve 2 -TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Same usage as with the second exposure tone curve. -TP_COLORAPP_CURVEEDITOR3;Color curve -TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. -TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves -TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] -TP_COLORAPP_GAMUT;Gamut control (L*a*b*) -TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. -TP_COLORAPP_HUE;Hue (h) -TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. -TP_COLORAPP_IL41;D41 -TP_COLORAPP_IL50;D50 -TP_COLORAPP_IL55;D55 -TP_COLORAPP_IL60;D60 -TP_COLORAPP_IL65;D65 -TP_COLORAPP_IL75;D75 -TP_COLORAPP_ILA;Incandescent StdA 2856K -TP_COLORAPP_ILFREE;Free -TP_COLORAPP_ILLUM;Illuminant -TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and lattitude. -TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 -TP_COLORAPP_LABEL_CAM02;Image Adjustments -TP_COLORAPP_LABEL_SCENE;Scene Conditions -TP_COLORAPP_LABEL_VIEWING;Viewing Conditions -TP_COLORAPP_LIGHT;Lightness (J) -TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. -TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) -TP_COLORAPP_MODEL;WP Model -TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. -TP_COLORAPP_NEUTRAL;Reset -TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -TP_COLORAPP_PRESETCAT02;Preset cat02 automatic -TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou can change illuminant shooting conditions.\nYou must change Cat02 adaptation Viewing conditions if need.\nYou can change Temperature and Tint Viewing conditions if need, and other settings if need. -TP_COLORAPP_RSTPRO;Red & skin-tones protection -TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -TP_COLORAPP_SURROUND;Surround -TP_COLORAPP_SURROUND_AVER;Average -TP_COLORAPP_SURROUND_DARK;Dark -TP_COLORAPP_SURROUND_DIM;Dim -TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) -TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. -TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness -TP_COLORAPP_TCMODE_CHROMA;Chroma -TP_COLORAPP_TCMODE_COLORF;Colorfulness -TP_COLORAPP_TCMODE_LABEL1;Curve mode 1 -TP_COLORAPP_TCMODE_LABEL2;Curve mode 2 -TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode -TP_COLORAPP_TCMODE_LIGHTNESS;Lightness -TP_COLORAPP_TCMODE_SATUR;Saturation -TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 -TP_COLORAPP_TEMPOUT_TOOLTIP;Disable to change temperature and tint -TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 -TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 -TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. -TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). -TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] -TP_COLORAPP_WBRT;WB [RT] + [output] -TP_COLORTONING_AB;o C/L -TP_COLORTONING_AUTOSAT;Automatic -TP_COLORTONING_BALANCE;Balance -TP_COLORTONING_BY;o C/L -TP_COLORTONING_CHROMAC;Opacity -TP_COLORTONING_COLOR;Color -TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Chroma opacity as a function of luminance oC=f(L) -TP_COLORTONING_HIGHLIGHT;Highlights -TP_COLORTONING_HUE;Hue -TP_COLORTONING_LAB;L*a*b* blending -TP_COLORTONING_LABEL;Color Toning -TP_COLORTONING_LABGRID;L*a*b* color correction grid -TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 -TP_COLORTONING_LABREGIONS;Color correction regions -TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 -TP_COLORTONING_LABREGION_CHANNEL;Channel -TP_COLORTONING_LABREGION_CHANNEL_ALL;All -TP_COLORTONING_LABREGION_CHANNEL_B;Blue -TP_COLORTONING_LABREGION_CHANNEL_G;Green -TP_COLORTONING_LABREGION_CHANNEL_R;Red -TP_COLORTONING_LABREGION_CHROMATICITYMASK;C -TP_COLORTONING_LABREGION_HUEMASK;H -TP_COLORTONING_LABREGION_LIGHTNESS;Lightness -TP_COLORTONING_LABREGION_LIGHTNESSMASK;L -TP_COLORTONING_LABREGION_LIST_TITLE;Correction -TP_COLORTONING_LABREGION_MASK;Mask -TP_COLORTONING_LABREGION_MASKBLUR;Blur Mask -TP_COLORTONING_LABREGION_OFFSET;Offset -TP_COLORTONING_LABREGION_POWER;Power -TP_COLORTONING_LABREGION_SATURATION;Saturation -TP_COLORTONING_LABREGION_SHOWMASK;Show mask -TP_COLORTONING_LABREGION_SLOPE;Slope -TP_COLORTONING_LUMA;Luminance -TP_COLORTONING_LUMAMODE;Preserve luminance -TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. -TP_COLORTONING_METHOD;Method -TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* blending", "RGB sliders" and "RGB curves" use interpolated color blending.\n"Color balance (Shadows/Midtones/Highlights)" and "Saturation 2 colors" use direct colors.\n\nThe Black-and-White tool can be enabled when using any color toning method, which allows for color toning. -TP_COLORTONING_MIDTONES;Midtones -TP_COLORTONING_NEUTRAL;Reset sliders -TP_COLORTONING_NEUTRAL_TIP;Reset all values (Shadows, Midtones, Highlights) to default. -TP_COLORTONING_OPACITY;Opacity -TP_COLORTONING_RGBCURVES;RGB - Curves -TP_COLORTONING_RGBSLIDERS;RGB - Sliders -TP_COLORTONING_SA;Saturation Protection -TP_COLORTONING_SATURATEDOPACITY;Strength -TP_COLORTONING_SATURATIONTHRESHOLD;Threshold -TP_COLORTONING_SHADOWS;Shadows -TP_COLORTONING_SPLITCO;Shadows/Midtones/Highlights -TP_COLORTONING_SPLITCOCO;Color Balance Shadows/Midtones/Highlights -TP_COLORTONING_SPLITLR;Saturation 2 colors -TP_COLORTONING_STR;Strength -TP_COLORTONING_STRENGTH;Strength -TP_COLORTONING_TWO2;Special chroma '2 colors' -TP_COLORTONING_TWOALL;Special chroma -TP_COLORTONING_TWOBY;Special a* and b* -TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. -TP_COLORTONING_TWOSTD;Standard chroma -TP_CROP_FIXRATIO;Lock ratio -TP_CROP_GTDIAGONALS;Rule of Diagonals -TP_CROP_GTEPASSPORT;Biometric Passport -TP_CROP_GTFRAME;Frame -TP_CROP_GTGRID;Grid -TP_CROP_GTHARMMEANS;Harmonic Means -TP_CROP_GTNONE;None -TP_CROP_GTRULETHIRDS;Rule of Thirds -TP_CROP_GTTRIANGLE1;Golden Triangles 1 -TP_CROP_GTTRIANGLE2;Golden Triangles 2 -TP_CROP_GUIDETYPE;Guide type: -TP_CROP_H;Height -TP_CROP_LABEL;Crop -TP_CROP_PPI;PPI -TP_CROP_RESETCROP;Reset -TP_CROP_SELECTCROP;Select -TP_CROP_W;Width -TP_CROP_X;Left -TP_CROP_Y;Top -TP_DARKFRAME_AUTOSELECT;Auto-selection -TP_DARKFRAME_LABEL;Dark-Frame -TP_DEFRINGE_LABEL;Defringe -TP_DEFRINGE_RADIUS;Radius -TP_DEFRINGE_THRESHOLD;Threshold -TP_DEHAZE_DEPTH;Depth -TP_DEHAZE_LABEL;Haze Removal -TP_DEHAZE_LUMINANCE;Luminance only -TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map -TP_DEHAZE_STRENGTH;Strength -TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones -TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global -TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow -TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve -TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance -TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual -TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master -TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method -TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 -TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green -TP_DIRPYRDENOISE_LABEL;Noise Reduction -TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control -TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve -TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery -TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance -TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance -TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space -TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* -TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB -TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma -TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -TP_DIRPYRDENOISE_MAIN_MODE;Mode -TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive -TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative -TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. -TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method -TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only -TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* -TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter -TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only -TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB -TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) -TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations -TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type -TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -TP_DIRPYRDENOISE_TYPE_3X3;3×3 -TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft -TP_DIRPYRDENOISE_TYPE_5X5;5×5 -TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft -TP_DIRPYRDENOISE_TYPE_7X7;7×7 -TP_DIRPYRDENOISE_TYPE_9X9;9×9 -TP_DIRPYREQUALIZER_ALGO;Skin Color Range -TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. -TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts -TP_DIRPYREQUALIZER_HUESKIN;Skin hue -TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;This pyramid is for the upper part, so far as the algorithm at its maximum efficiency.\nTo the lower part, the transition zones.\nIf you need to move the area significantly to the left or right - or if there are artifacts: the white balance is incorrect\nYou can slightly reduce the zone to prevent the rest of the image is affected. -TP_DIRPYREQUALIZER_LABEL;Contrast by Detail Levels -TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest -TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast - -TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast + -TP_DIRPYREQUALIZER_LUMAFINEST;Finest -TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral -TP_DIRPYREQUALIZER_SKIN;Skin targetting/protection -TP_DIRPYREQUALIZER_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. -TP_DIRPYREQUALIZER_THRESHOLD;Threshold -TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colors (hue, chroma, luma) and the rest of the image. -TP_DISTORTION_AMOUNT;Amount -TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. -TP_DISTORTION_LABEL;Distortion Correction -TP_EPD_EDGESTOPPING;Edge stopping -TP_EPD_GAMMA;Gamma -TP_EPD_LABEL;Tone Mapping -TP_EPD_REWEIGHTINGITERATES;Reweighting iterates -TP_EPD_SCALE;Scale -TP_EPD_STRENGTH;Strength -TP_EXPOSURE_AUTOLEVELS;Auto Levels -TP_EXPOSURE_AUTOLEVELS_TIP;Toggles execution of Auto Levels to automatically set Exposure slider values based on an image analysis.\nEnables Highlight Reconstruction if necessary. -TP_EXPOSURE_BLACKLEVEL;Black -TP_EXPOSURE_BRIGHTNESS;Lightness -TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors -TP_EXPOSURE_CLIP;Clip % -TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. -TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight compression -TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold -TP_EXPOSURE_COMPRSHADOWS;Shadow compression -TP_EXPOSURE_CONTRAST;Contrast -TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 -TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 -TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. -TP_EXPOSURE_EXPCOMP;Exposure compensation -TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve -TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. -TP_EXPOSURE_LABEL;Exposure -TP_EXPOSURE_SATURATION;Saturation -TP_EXPOSURE_TCMODE_FILMLIKE;Film-like -TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 -TP_EXPOSURE_TCMODE_LABEL2;Curve mode 2 -TP_EXPOSURE_TCMODE_LUMINANCE;Luminance -TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual -TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Saturation and Value Blending -TP_EXPOSURE_TCMODE_STANDARD;Standard -TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard -TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points -TP_EXPOS_WHITEPOINT_LABEL;Raw White Points -TP_FILMNEGATIVE_BLUE;Blue ratio -TP_FILMNEGATIVE_FILMBASE_PICK;Pick film base color -TP_FILMNEGATIVE_FILMBASE_TOOLTIP;Pick a spot of unexposed film (eg. the border between frames), to get the actual film base color values, and save them in the processing profile.\nThis makes it easy to get a more consistent color balance when batch-processing multiple pictures from the same roll.\nAlso use this when the converted image is extremely dark, bright, or color-unbalanced. -TP_FILMNEGATIVE_FILMBASE_VALUES;Film base RGB: -TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. -TP_FILMNEGATIVE_LABEL;Film Negative -TP_FILMNEGATIVE_PICK;Pick neutral spots -TP_FILMNEGATIVE_RED;Red ratio -TP_FILMSIMULATION_LABEL;Film Simulation -TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? -TP_FILMSIMULATION_STRENGTH;Strength -TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences -TP_FLATFIELD_AUTOSELECT;Auto-selection -TP_FLATFIELD_BLURRADIUS;Blur radius -TP_FLATFIELD_BLURTYPE;Blur type -TP_FLATFIELD_BT_AREA;Area -TP_FLATFIELD_BT_HORIZONTAL;Horizontal -TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal -TP_FLATFIELD_BT_VERTICAL;Vertical -TP_FLATFIELD_CLIPCONTROL;Clip control -TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. -TP_FLATFIELD_LABEL;Flat-Field -TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. -TP_GRADIENT_CENTER;Center -TP_GRADIENT_CENTER_X;Center X -TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values). -TP_GRADIENT_CENTER_Y;Center Y -TP_GRADIENT_CENTER_Y_TOOLTIP;Shift gradient up (negative values) or down (positive values). -TP_GRADIENT_DEGREE;Angle -TP_GRADIENT_DEGREE_TOOLTIP;Rotation angle in degrees. -TP_GRADIENT_FEATHER;Feather -TP_GRADIENT_FEATHER_TOOLTIP;Gradient width in percent of the image diagonal. -TP_GRADIENT_LABEL;Graduated Filter -TP_GRADIENT_STRENGTH;Strength -TP_GRADIENT_STRENGTH_TOOLTIP;Filter strength in stops. -TP_HLREC_BLEND;Blend -TP_HLREC_CIELAB;CIELab Blending -TP_HLREC_COLOR;Color Propagation -TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels. -TP_HLREC_LABEL;Highlight reconstruction -TP_HLREC_LUMINANCE;Luminance Recovery -TP_HLREC_METHOD;Method: -TP_HSVEQUALIZER_CHANNEL;Channel -TP_HSVEQUALIZER_HUE;H -TP_HSVEQUALIZER_LABEL;HSV Equalizer -TP_HSVEQUALIZER_SAT;S -TP_HSVEQUALIZER_VAL;V -TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure -TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. -TP_ICM_APPLYHUESATMAP;Base table -TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only available if the selected DCP has one. -TP_ICM_APPLYLOOKTABLE;Look table -TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only available if the selected DCP has one. -TP_ICM_BPC;Black Point Compensation -TP_ICM_DCPILLUMINANT;Illuminant -TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolated -TP_ICM_DCPILLUMINANT_TOOLTIP;Select which embedded DCP illuminant to employ. Default is "interpolated" which is a mix between the two based on white balance. The setting is only available if a dual-illuminant DCP with interpolation support is selected. -TP_ICM_INPUTCAMERA;Camera standard -TP_ICM_INPUTCAMERAICC;Auto-matched camera profile -TP_ICM_INPUTCAMERAICC_TOOLTIP;Use RawTherapee's camera-specific DCP or ICC input color profiles. These profiles are more precise than simpler matrix ones. They are not available for all cameras. These profiles are stored in the /iccprofiles/input and /dcpprofiles folders and are automatically retrieved based on a file name matching to the exact model name of the camera. -TP_ICM_INPUTCAMERA_TOOLTIP;Use a simple color matrix from dcraw, an enhanced RawTherapee version (whichever is available based on camera model) or one embedded in the DNG. -TP_ICM_INPUTCUSTOM;Custom -TP_ICM_INPUTCUSTOM_TOOLTIP;Select your own DCP/ICC color profile file for the camera. -TP_ICM_INPUTDLGLABEL;Select Input DCP/ICC Profile... -TP_ICM_INPUTEMBEDDED;Use embedded, if possible -TP_ICM_INPUTEMBEDDED_TOOLTIP;Use color profile embedded in non-raw files. -TP_ICM_INPUTNONE;No profile -TP_ICM_INPUTNONE_TOOLTIP;Use no input color profile at all.\nUse only in special cases. -TP_ICM_INPUTPROFILE;Input Profile -TP_ICM_LABEL;Color Management -TP_ICM_NOICM;No ICM: sRGB Output -TP_ICM_OUTPUTPROFILE;Output Profile -TP_ICM_PROFILEINTENT;Rendering Intent -TP_ICM_SAVEREFERENCE;Save Reference Image -TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance -TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. -TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. -TP_ICM_TONECURVE;Tone curve -TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. -TP_ICM_WORKINGPROFILE;Working Profile -TP_ICM_WORKING_TRC;Tone response curve: -TP_ICM_WORKING_TRC_CUSTOM;Custom -TP_ICM_WORKING_TRC_GAMMA;Gamma -TP_ICM_WORKING_TRC_NONE;None -TP_ICM_WORKING_TRC_SLOPE;Slope -TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. -TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction -TP_IMPULSEDENOISE_THRESH;Threshold -TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction. -TP_LABCURVE_BRIGHTNESS;Lightness -TP_LABCURVE_CHROMATICITY;Chromaticity -TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100. -TP_LABCURVE_CONTRAST;Contrast -TP_LABCURVE_CURVEEDITOR;Luminance Curve -TP_LABCURVE_CURVEEDITOR_A_RANGE1;Green Saturated -TP_LABCURVE_CURVEEDITOR_A_RANGE2;Green Pastel -TP_LABCURVE_CURVEEDITOR_A_RANGE3;Red Pastel -TP_LABCURVE_CURVEEDITOR_A_RANGE4;Red Saturated -TP_LABCURVE_CURVEEDITOR_B_RANGE1;Blue Saturated -TP_LABCURVE_CURVEEDITOR_B_RANGE2;Blue Pastel -TP_LABCURVE_CURVEEDITOR_B_RANGE3;Yellow Pastel -TP_LABCURVE_CURVEEDITOR_B_RANGE4;Yellow Saturated -TP_LABCURVE_CURVEEDITOR_CC;CC -TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutral -TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Dull -TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel -TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturated -TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Chromaticity according to chromaticity C=f(C) -TP_LABCURVE_CURVEEDITOR_CH;CH -TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Chromaticity according to hue C=f(H) -TP_LABCURVE_CURVEEDITOR_CL;CL -TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Chromaticity according to luminance C=f(L) -TP_LABCURVE_CURVEEDITOR_HH;HH -TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Hue according to hue H=f(H) -TP_LABCURVE_CURVEEDITOR_LC;LC -TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminance according to chromaticity L=f(C) -TP_LABCURVE_CURVEEDITOR_LH;LH -TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H) -TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminance according to luminance L=f(L) -TP_LABCURVE_LABEL;L*a*b* Adjustments -TP_LABCURVE_LCREDSK;Restrict LC to red and skin-tones -TP_LABCURVE_LCREDSK_TIP;If enabled, the LC Curve affects only red and skin-tones.\nIf disabled, it applies to all tones. -TP_LABCURVE_RSTPROTECTION;Red and skin-tones protection -TP_LABCURVE_RSTPRO_TOOLTIP;Works on the Chromaticity slider and the CC curve. -TP_LENSGEOM_AUTOCROP;Auto-Crop -TP_LENSGEOM_FILL;Auto-fill -TP_LENSGEOM_LABEL;Lens / Geometry -TP_LENSGEOM_LIN;Linear -TP_LENSGEOM_LOG;Logarithmic -TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected -TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file -TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected -TP_LENSPROFILE_LABEL;Profiled Lens Correction -TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. -TP_LENSPROFILE_MODE_HEADER;Lens Profile -TP_LENSPROFILE_USE_CA;Chromatic aberration -TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion -TP_LENSPROFILE_USE_HEADER;Correct -TP_LENSPROFILE_USE_VIGNETTING;Vignetting -TP_LOCALCONTRAST_AMOUNT;Amount -TP_LOCALCONTRAST_DARKNESS;Darkness level -TP_LOCALCONTRAST_LABEL;Local Contrast -TP_LOCALCONTRAST_LIGHTNESS;Lightness level -TP_LOCALCONTRAST_RADIUS;Radius -TP_LOCALLAB_ACTIV;Luminance only -TP_LOCALLAB_ACTIVSPOT;Enable Spot -TP_LOCALLAB_ADJ;Equalizer Blue-yellow Red-green -TP_LOCALLAB_ALL;All rubrics -TP_LOCALLAB_AMOUNT;Amount -TP_LOCALLAB_ARTIF;Shape detection -//TP_LOCALLAB_ARTIF_TOOLTIP;Threshold deltaE-scope increase the range of scope-deltaE - high values are for very wide gamut images.\nIncrease deltaE decay improve shape detection, but can reduce the scope of detection. -TP_LOCALLAB_ARTIF_TOOLTIP;ΔE-scope threshold increases the range of deltaE scope. High values are for very wide gamut images.\nIncreasing deltaE decay can improve shape detection, but can also reduce the scope. -TP_LOCALLAB_AUTOGRAY;Automatic -TP_LOCALLAB_AVOID;Avoid color shift -TP_LOCALLAB_BALAN;ab-L balance (ΔE) -TP_LOCALLAB_BALANEXP;Laplacian balance -TP_LOCALLAB_BALANH;C-H balance (ΔE) -//TP_LOCALLAB_BALAN_TOOLTIP;Change algorithm ΔE parameter.\nMore or less ab-L, more or less C - H.\nNot for Denoise -TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less ab-L, or more or less C - H.\nNot for Denoise -TP_LOCALLAB_BASELOG;Logarithm base -TP_LOCALLAB_BILATERAL;Bilateral filter -TP_LOCALLAB_BLACK_EV;Black Ev -TP_LOCALLAB_BLCO;Chrominance only -TP_LOCALLAB_BLENDMASKCOL;Blend -TP_LOCALLAB_BLENDMASKMASK;Add / subtract luminance mask -TP_LOCALLAB_BLENDMASKMASKAB;Add / subtract chrominance mask -TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image -TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image -TP_LOCALLAB_BLGUID;Guided Filter -TP_LOCALLAB_BLINV;Inverse -TP_LOCALLAB_BLLC;Luminance & Chrominance -TP_LOCALLAB_BLLO;Luminance only -TP_LOCALLAB_BLMED;Median -TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - direct blur and noise with all settings.\nInverse blur and noise with all settings. Be careful some results may be curious -TP_LOCALLAB_BLNOI_EXP;Blur & Noise -TP_LOCALLAB_BLNORM;Normal -TP_LOCALLAB_BLSYM;Symmetric -TP_LOCALLAB_BLUFR;Blur/Grain & Denoise -TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n*Blur the background by a RT-spot fully covering the image (high values for scope and transition) - normal or inverse.\n*Isolate the foreground by one or more excluding RT-spot with the tools you want (increse scope).\n\nThis module can be used in additional noise reduction,including "median" and "Guided filter" -TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain -TP_LOCALLAB_BLURCBDL;Blur levels 0-1-2-3-4 -TP_LOCALLAB_BLURCOL;Radius -TP_LOCALLAB_BLURDE;Blur shape detection -TP_LOCALLAB_BLURLC;Luminance Only -TP_LOCALLAB_BLURLEVELFRA;Blur Levels -TP_LOCALLAB_BLURMASK_TOOLTIP;Generate a blur mask, take into account the structure with the contrast threshold Blur Mask slider. -TP_LOCALLAB_BLURRESIDFRA;Blur Residual -TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise - 1 -TP_LOCALLAB_BLWH;All changes forced in Black-and-White -//TP_LOCALLAB_BLWH_TOOLTIP;Force color change composante "a" and "b" to zero.\nUsefull when the user chooses black and white processes, or film. -TP_LOCALLAB_BLWH_TOOLTIP;Force color components "a" and "b" to zero.\nUseful for black and white processing, or film simulation. -TP_LOCALLAB_BUTTON_ADD;Add -TP_LOCALLAB_BUTTON_DEL;Delete -TP_LOCALLAB_BUTTON_DUPL;Duplicate -TP_LOCALLAB_BUTTON_REN;Rename -TP_LOCALLAB_BUTTON_VIS;Show/Hide -TP_LOCALLAB_CBDL;Contrast by detail levels -TP_LOCALLAB_CBDLCLARI_TOOLTIP;Takes the midtones and enhance them. -TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Acts as a wavelet tools.\nThe first level (0) acts on 2x2 details.\nThe last level (5) acts on 64x64 details. -TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevent the sharpening of noise -TP_LOCALLAB_CBDL_TOOLNAME;CBDL - 2 -TP_LOCALLAB_CENTER_X;Center X -TP_LOCALLAB_CENTER_Y;Center Y -TP_LOCALLAB_CH;Curves CL - LC -TP_LOCALLAB_CHROMA;Chrominance -TP_LOCALLAB_CHROMABLU;Chroma levels -TP_LOCALLAB_CHROMABLU_TOOLTIP;Acts as an amplifier-reducer action compare to settings of luma.\nUnder 1 reduce, above 1 amplifie -TP_LOCALLAB_CHROMACBDL;Chroma -TP_LOCALLAB_CHROMACB_TOOLTIP;Acts as an amplifier-reducer action compare to sliders of luminance.\nUnder 100 reduce, above 100 amplifie -TP_LOCALLAB_CHROMALEV;Chroma levels -TP_LOCALLAB_CHROMASKCOL;Chroma -TP_LOCALLAB_CHROMASK_TOOLTIP;You can use this slider to desaturated background (inverse mask - curve near 0).\nAlso to attenuate or enhance the action of a mask on the chroma -TP_LOCALLAB_CHRRT;Chroma -TP_LOCALLAB_CIRCRADIUS;Spot size -TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for treating foliage.\nHigh values may be useful for treating skin -TP_LOCALLAB_CLARICRES;Merge chroma -TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask - Blend & Soft images -TP_LOCALLAB_CLARILRES;Merge luma -TP_LOCALLAB_CLARISOFT;Soft radius -TP_LOCALLAB_CLARISOFT_TOOLTIP;Enabled for Clarity and Sharp mask if Merge Luma different from zero.\n\nEnabled for all wavelets pyramid modules.\nDisabled if Soft radius = 0 -TP_LOCALLAB_CLARITYML;Clarity -TP_LOCALLAB_CLARI_TOOLTIP;Under or equal level wavelet 4, 'Sharp mask' is enabled.\nAbove level wavelet 5 'Clarity' is enabled.\nUsefull if you use 'Level dynamic Range Compression' -TP_LOCALLAB_CLIPTM;Clip restored data (gain) -TP_LOCALLAB_COFR;Color & Light -TP_LOCALLAB_COLORDE;ΔE preview color - intensity -//TP_LOCALLAB_COLORDEPREV_TOOLTIP;Button Preview ΔE needs that only one tool is enabled (expander).\nTo be able to have an Preview ΔE with several enable tools use Mask and modifications - Preview ΔE -TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in "Add tool to current spot" menu\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE -//TP_LOCALLAB_COLORDE_TOOLTIP;Show preview selection ΔE in blue if negative and in green if positive.\n\nMask and modifications (show modifications without mask): show real modifications if positive, show enhanced modifications (only luminance) with blue and yellow if negative. -TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color-preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modifications without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. -TP_LOCALLAB_COLORSCOPE;Scope (color tools) -//TP_LOCALLAB_COLORSCOPE_TOOLTIP;Use a common Scope for Color and light, Shadows highlight, Vibrance.\nOthers tools have their specific scope. -TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows & Highlights, Vibrance.\nOther tools have their own scope controls. -TP_LOCALLAB_COLOR_TOOLNAME;Color & Light - 11 -TP_LOCALLAB_COL_NAME;Name -TP_LOCALLAB_COL_VIS;Status -TP_LOCALLAB_COMPFRA;Directional Contrast -TP_LOCALLAB_COMPFRAME_TOOLTIP;Allows special effects. You can reduce artifacts with 'Clarity & Sharp mask - Blend & Soft Images".\nUses a lot of resources -TP_LOCALLAB_COMPLEX_METHOD;Software Complexity -TP_LOCALLAB_COMPLEX_TOOLTIP; Allow user to select Local adjustments rubrics. -TP_LOCALLAB_COMPREFRA;Wavelet level tone-mapping -TP_LOCALLAB_COMPRESS_TOOLTIP;Use if necessary the module 'Clarity & Sharp mask and Blend & Soft Images' by adjusting 'Soft radius' to reduce artifacts. -TP_LOCALLAB_CONTCOL;Contrast threshold -TP_LOCALLAB_CONTFRA;Contrast by Level -TP_LOCALLAB_CONTRAST;Contrast -TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Main mask contrast control. -TP_LOCALLAB_CONTRESID;Contrast -TP_LOCALLAB_CONTTHR;Contrast Threshold -TP_LOCALLAB_CONTWFRA;Local contrast -TP_LOCALLAB_CSTHRESHOLD;Ψ Wavelets Levels -TP_LOCALLAB_CSTHRESHOLDBLUR;Ψ Wavelet level selection -TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance "Super" -TP_LOCALLAB_CURVCURR;Normal -TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nIt is recommended (not required) to position the top of the curves on the gray transition line which represents the references (chroma, luma, hue). -TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nThe gray transition line which represents the references (chroma, luma, hue).\nYou can choose or not to position the top of the curves on this transition. -TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To be active, you must enable combobox 'Curve type' -TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve -TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light -TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) has the same algorithm than slider lightness.\n'Super' the curve L=f(L) has an new improved algorithm, which can leeds in some cases to artifacts. -TP_LOCALLAB_CURVENCONTRAST;Super+Contrast threshold (experimental) -TP_LOCALLAB_CURVENH;Super -TP_LOCALLAB_CURVENHSU;Combined HueChroma (experimental) -TP_LOCALLAB_CURVENSOB2;Combined HueChroma + Contrast threshold (experimental) -TP_LOCALLAB_CURVNONE;Disable curves -TP_LOCALLAB_DARKRETI;Darkness -TP_LOCALLAB_DEHAFRA;Dehaze -TP_LOCALLAB_DEHAZ;Strength -TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values adds haze -TP_LOCALLAB_DELTAD;Delta balance -TP_LOCALLAB_DELTAEC;ΔE Image Mask -TP_LOCALLAB_DENOIS;Ψ Denoise -TP_LOCALLAB_DENOIS;Ψ Denoise -TP_LOCALLAB_DENOI_EXP;Denoise -TP_LOCALLAB_DENOI1_EXP;Denoise using local contrast mask -TP_LOCALLAB_DENOI_TOOLTIP;This module can be used alone (at the end of process), or in complement of main denoise (at the beginning).\nScope allows to differentiate the action according to the color (deltaE).\nYou can complete the action with "median" or "Guided Filter" (Smooth Blur...).\nYou can complete the action with "Blur levels" "Wavelet pyramid" -TP_LOCALLAB_DEPTH;Depth -TP_LOCALLAB_DETAIL;Local contrast -TP_LOCALLAB_DETAILSH;Details -TP_LOCALLAB_DETAILTHR;Luminance & Chroma detail threshold (DCT ƒ) -TP_LOCALLAB_DUPLSPOTNAME;Copy -TP_LOCALLAB_EDGFRA;Edge Sharpness -TP_LOCALLAB_EDGSHOW;Show all tolls -TP_LOCALLAB_ELI;Ellipse -TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping -TP_LOCALLAB_ENABLE_MASK;Enable mask -TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure -TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled Mask uses Restored Datas after Transmission Map instead of Original datas -TP_LOCALLAB_ENH;Enhanced -TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise -TP_LOCALLAB_EPSBL;Detail -TP_LOCALLAB_EQUIL;Normalize Luminance -TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance in such a way that the mean and the variance of the output image is identical to that of the original. -TP_LOCALLAB_ESTOP;Edge stopping -TP_LOCALLAB_EV_DUPL;Copy of -TP_LOCALLAB_EV_NVIS;Hide -TP_LOCALLAB_EV_NVIS_ALL;Hide all -TP_LOCALLAB_EV_VIS;Show -TP_LOCALLAB_EV_VIS_ALL;Show all -TP_LOCALLAB_EXCLUF;Excluding -TP_LOCALLAB_EXCLUF_TOOLTIP;Can be used to exclude this part of datas - move Scope to extend color.\n You can apply all settings to this RT-spot. -TP_LOCALLAB_EXCLUTYPE;Spot method -//TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot use recursive data.\n\nExcluding spot reinitialize data to origin.\nCan be used to totally or partially cancel a previous action or to perform a inverse mode -TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in inverted mode -TP_LOCALLAB_EXECLU;Excluding spot -TP_LOCALLAB_EXNORM;Normal spot -//TP_LOCALLAB_EXPCBDL_TOOLTIP;In the case of contaminated sensor (type "grease"), and when the area is important or for a series of small defects.\n\na) Put the selection spot on a pronounced default (adapting its size if necessary), use a large spot enough to allow wavelet; b) choose a wide selection area to cover most of the area affected by the defects; c) Select a transition value (low) and transition decay (high value); d) act on levels 2, 3, 4 or 5 or lower by reducing the contrast (values below 100) and by acting on the chroma slider if necessary. e)possibly act on "scope" to reduce the extent of the action.\n\nYou can also complete with Blur levels and Gaussian blur (Smooth Blur and noise) -TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens. -TP_LOCALLAB_EXPCHROMA;Chroma compensation -TP_LOCALLAB_EXPCHROMA_TOOLTIP;Only in association with exposure compensation and PDE Ipol.\nAvoids desaturation of colors -//TP_LOCALLAB_EXPCOLOR_TOOLTIP;In the case of small defects.\n\nRed-eyes : red-centered circular selector, spot delimiters close to the eye, weak scope, "lightness" -100, "chrominance" -100.\n\nSpotIR :Circular selector centered on the defect, spot delimiters close to the default - reduce "chrominance", possibly act on "scope" to reduce the extent of the action.\n\nDust - grease (small) :Circular selector centered on the defect (adapt the size of the spot), spot delimiters not too close to the defect to allow an inconspicuous transition. a) "Transition" (low values) and "Transition weak" (high values); b) act on "lightness" and possibly on "chrominance" or "Color correction grid - direct" to approach the rendering of the polluted zone to that of the healthy zone; c) act moderately on "scope" to modulate the desired action.\n\nYou can also complete with Gaussian blur (Smooth Blur and noise) -TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. -TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ -TP_LOCALLAB_EXPCOMPINV;Exposure compensation -TP_LOCALLAB_EXPCOMP_TOOLTIP;For portrait or images with low color gradient, you can change "Shape detection" in "settings":\n\nIncrease 'Threshold ΔE scope'\nReduce 'ΔE decay'\nIncrease 'Balance ΔE ab-L' -TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation of wavelet levels.\nHowever there are some differences: more tools and closer to the details.\nEx: Tone mapping for wavelet levels. -TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small(< 32x32 pixels).\nUse low transition values and high decay transition values and scope to simulate small RT-spot and deal wth defects.\nUse if necessary the module 'Clarity & Sharp mask and Blend images' by adjusting 'Soft radius' to reduce artifacts. -TP_LOCALLAB_EXPCURV;Curves -TP_LOCALLAB_EXPGRAD;Graduated Filter -TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Balances the action between the original image and the Laplace transform. -TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Apply a gamma before and after Laplace transform -TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Add linear exposure component before application Laplace transform -TP_LOCALLAB_EXPLAP_TOOLTIP;The more you act on this threshold slider, the greater the action of reducing contrast. -TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows various possibilities to blend image (as layers in Photoshop (c)) : difference, multiply, soft light, overlay...with opacity...\nOriginal Image : merge current RT-spot with Original.\nPrevious spot : merge current Rt-spot with previous - if there is only one spot previous = original.\nBackground : merge current RT-spot with a color and luminance background (less possibilties) -TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : use an algorithm similar as main Exposure but in L*a*b* and taking account of deltaE.\n\nContrast attenuator : use another algorithm also with deltaE and with Poisson equation to solve Laplacian in Fourier space.\nContrast attenuator, Dynamic range compression and Standard can be combined.\nFFTW Fourier Transform is optimized in size to reduce processing time.\nReduce artifacts and noise. -TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Apply a median before Laplace transform to prevent artifacts (noise).\nYou can also use "Denoise" tool. -TP_LOCALLAB_EXPOSE;Dynamic Range Compr. & Exposure -//TP_LOCALLAB_EXPOSURE_TOOLTIP;In some cases (strong shadows ..) you can use others modules "Shadows Highlights", "Tone equalizer", "TRC", "Log Encoding"... -TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. -TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools -TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high decay transition values and scope to simulate small RT-spot. -TP_LOCALLAB_EXPTOOL;Exposure tools -TP_LOCALLAB_EXPTRC;Tone Response Curve - TRC -TP_LOCALLAB_EXP_TOOLNAME;Contrast Attenuator/Dynamic Range Compression & Exposure- 10 -TP_LOCALLAB_FATAMOUNT;Amount -TP_LOCALLAB_FATANCHOR;Anchor -TP_LOCALLAB_FATANCHORA;Offset -TP_LOCALLAB_FATDETAIL;Detail -TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ -TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal - use Fattal Tone mapping algorithm. -TP_LOCALLAB_FATLEVEL;Sigma -TP_LOCALLAB_FATRES;Amount Residual Image -TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ -//TP_LOCALLAB_FEATH_TOOLTIP;Gradient width in percent of the Spot diagonal\nUsed by all Graduated filter in all tools.\nNo action if Graduated Filter are not used. -TP_LOCALLAB_FEATH_TOOLTIP;Gradient width in percent of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn’t been activated. -TP_LOCALLAB_FEATVALUE;Feather gradient (Graduated Filters) -TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ -TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform -TP_LOCALLAB_FFTW2;ƒ - Use Fast Fourier Transform (TIF, JPG,..) -TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform -//TP_LOCALLAB_FULLIMAGE;Calculate DarkEv - WhiteEv - Value on the entire image -TP_LOCALLAB_FULLIMAGE;Calculate dark-Ev/white-Ev value on the entire image -TP_LOCALLAB_GAM;Gamma -TP_LOCALLAB_GAMFRA;Tone response curve (TRC) -TP_LOCALLAB_GAMM;Gamma -TP_LOCALLAB_GAMMASKCOL;Gamma -TP_LOCALLAB_GAMSH;Gamma -TP_LOCALLAB_GRADANG;Gradient angle -TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees : -180 0 +180 -TP_LOCALLAB_GRADFRA;Graduated Filter Mask -TP_LOCALLAB_GRADGEN_TOOLTIP;Graduated filter is supplied with Color and Light & merge file, Exposure & mask, Shadows Highlight, Vibrance, Log Encoding.\n\nVibrance, Color and Light & merge file, are provided with GF luminance, chrominance, Hue.\nFeather is located in settings. -TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance -TP_LOCALLAB_GRADSTR;Gradient strength -TP_LOCALLAB_GRADSTRAB_TOOLTIP;Filter chroma strength -TP_LOCALLAB_GRADSTRCHRO;Chrominance gradient strength -TP_LOCALLAB_GRADSTRHUE;Hue gradient strength -TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength -TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Filter Hue strength -TP_LOCALLAB_GRADSTRLUM;Luminance gradient strength -TP_LOCALLAB_GRADSTR_TOOLTIP;Filter strength in stops -TP_LOCALLAB_GRAINFRA;Film Grain 1:1 -TP_LOCALLAB_GRALWFRA;Graduated Filter Local contrast -TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use small spot and adapt transition and transition decay\nOnly mode NORMAL and eventually Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE) -TP_LOCALLAB_GRIDONE;Color Toning -TP_LOCALLAB_GRIDTWO;Direct -TP_LOCALLAB_GUIDBL;Soft radius -TP_LOCALLAB_GUIDFILTER;Guided filter radius -TP_LOCALLAB_GUIDFILTER_TOOLTIP;Adapt this values according to images - can reduce or increase artifacts. -TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. -TP_LOCALLAB_HIGHMASKCOL;Highlights -TP_LOCALLAB_HLH;Curves H -TP_LOCALLAB_IND;Independent (mouse) -TP_LOCALLAB_INDSL;Independent (mouse + sliders) -TP_LOCALLAB_INVERS;Inverse -TP_LOCALLAB_INVERS_TOOLTIP;If selected (inverse) less possibilities.\n\nAlternative\nFirst Spot:\n full image - delimiter outside preview\n Shape RT-spot area : rectangle. Transition 100\n\nSecond spot : Excluding spot -TP_LOCALLAB_ISOGR;Coarseness (ISO) -TP_LOCALLAB_LABBLURM;Blur Mask -TP_LOCALLAB_LABEL;Local Adjustments -TP_LOCALLAB_LABGRID;Color correction grid -TP_LOCALLAB_LABGRIDMERG;Background -TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 -TP_LOCALLAB_LABSTRUM;Structure Mask -TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE -TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE -TP_LOCALLAB_LAPLACEXP;Laplacian threshold -TP_LOCALLAB_LAPMASKCOL;Laplacian threshold -TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using Radius and Laplace Threshold (advanced) simultaneously.\nLaplacian threshold reduce contrast, artifacts, smooth result. -TP_LOCALLAB_LAP_MASK_TOOLTIP;Solve PDE for all Laplacian masks.\nIf enabled Laplacian threshold mask reduce artifacts and smooth result.\nIf disabled linear response. -TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated.\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\n -TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets - 7 -TP_LOCALLAB_LCTHR;Guided threshold by details levels -TP_LOCALLAB_LEVELBLUR;Maximum Blur levels -TP_LOCALLAB_LEVELLOCCONTRAST_TOOLTIP;On the abscissa local contrast (near concept luminance). On the ordinate, amplification or reduction local contrast. -TP_LOCALLAB_LEVELHIGH;Radius 57 -TP_LOCALLAB_LEVELLOW;Radius 14 -TP_LOCALLAB_LEVELWAV;Ψ Wavelets Levels -TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4 -TP_LOCALLAB_LEVFRA;Levels -TP_LOCALLAB_LIGHTNESS;Lightness -TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 force luminance to zero -TP_LOCALLAB_LIGHTRETI;Lightness -TP_LOCALLAB_LIMDEN;Interaction levels 57 on level 14 -TP_LOCALLAB_LINEAR;Linearity -TP_LOCALLAB_LIST_NAME;Add tool to current spot... -TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard & Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing -TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Give priority to action on midtones and high lights and by choosing the concerned wavelet levels -TP_LOCALLAB_LMASK_LL_TOOLTIP;Give priority to action on midtones and high lights -TP_LOCALLAB_LOCCONT;Unsharp Mask -TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets -TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pyramid 1: -TP_LOCALLAB_LOC_CONTRASTPYR2;Ψ Pyramid 2: -TP_LOCALLAB_LOC_CONTRASTPYR2LAB;Contrast by Level - Tone Mapping - Dir.Contrast -TP_LOCALLAB_LOC_CONTRASTPYRLAB;Graduated Filter - Edge Sharpness - Blur -TP_LOCALLAB_LOC_RESIDPYR;Residual Image (Main) -TP_LOCALLAB_LOG;Log Encoding -TP_LOCALLAB_LOGAUTO;Automatic -TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will bring an evaluation of dynamic range and Source Gray point (if "Automatic" Source gray enabled).\nTo be able to touch up the automatic values, press the button again -TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm, the shadows are darker, the highlights are brighter.\nValues greater than 2 change the action of the algorithm, the shadows are grayer the highlights are more washed out -TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of Dynamic Range - Black Ev and White Ev -TP_LOCALLAB_LOGENCOD_TOOLTIP;Allows Tone Mapping with Logarithm encoding (ACES).\nUsefull for underexposed pictures, or with high dynamic range.\n\nTwo steps in the process : 1) Calculate Dynamic Range 2) User adaptation -TP_LOCALLAB_LOGFRA;Source Gray Point -TP_LOCALLAB_LOGFRAME_TOOLTIP;Calculate or use Exposure levels of the image early in the process:\n Black Ev, White Ev and Source Gray point.\n Take into account main exposure compensation. -TP_LOCALLAB_LOGLIN;Logarithm mode -TP_LOCALLAB_LOGPFRA;Relative Exposure Levels -TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estimated gray point value of the image, early in the process -TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can change this value to adapt it to your taste. -TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 -TP_LOCALLAB_LUM;Curves LL - CC -TP_LOCALLAB_LUMADARKEST;Darkest -TP_LOCALLAB_LUMASK;Background color for luminance and color masks -//TP_LOCALLAB_LUMASK_TOOLTIP;Adjust the gray and the color of the mask background in Show Mask (Mask and modifications) -TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications) -TP_LOCALLAB_LUMAWHITESEST;Whiteest -TP_LOCALLAB_LUMFRA;L*a*b* standard -TP_LOCALLAB_LUMONLY;Luminance only -TP_LOCALLAB_MASKCOM;Common Color Mask -TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. -//These masks works as all tools, they take into account scope color.\nThey are different from others masks which complete a tool (Color and Light, Exposure...) -TP_LOCALLAB_MASFRAME;Mask and Merge -//TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and curves contrast , levels contrasts, and blur mask, structure(if enabled tool) are used.\nDisabled in Inverse -TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the deltaE image to avoid modifying the selection area when the following sliders are used: gamma mask, slope mask, chroma mask and curve contrast , level contrasts, and blur mask, structure (if tool enabled ) .\nDisabled when Inverse mode is used -TP_LOCALLAB_MASK;Mask -TP_LOCALLAB_MASK2;Contrast curve -TP_LOCALLAB_MASKCOL;Mask Curves -TP_LOCALLAB_MASKH;Hue curve -TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a single tool, this requires activating another tool (but without using the tool : sliders to 0,...) where is the mask you want to activate.\n\nYou can also duplicate the RT-spot and place it right next to each other,variations of references allow fine work on images. -TP_LOCALLAB_MASKLCTHR;Threshold luminance mask -TP_LOCALLAB_THRESMASKHIGH;Highlights -TP_LOCALLAB_THRESMASKLOW;Shadows - -TP_LOCALLAB_MED;Medium -TP_LOCALLAB_MEDIAN;Median Low -TP_LOCALLAB_MEDNONE;None -TP_LOCALLAB_MERCOL;Color -TP_LOCALLAB_MERDCOL;Merge background (ΔE) -TP_LOCALLAB_MERELE;Lighten only -TP_LOCALLAB_MERFIV;Addition -TP_LOCALLAB_MERFOR;Color Dodge -TP_LOCALLAB_MERFOU;Multiply -TP_LOCALLAB_MERGE1COLFRA;Merge with Original or Previous or Background -TP_LOCALLAB_MERGECOLFRA;Mask: LCH & Structure -TP_LOCALLAB_MERGEFIV;Previous Spot(Mask 7) + Mask LCH -TP_LOCALLAB_MERGEFOU;Previous Spot(Mask 7) -TP_LOCALLAB_MERGEMER_TOOLTIP;Take into account ΔE to merge files (equivalent of scope for this use) -TP_LOCALLAB_MERGENONE;None -TP_LOCALLAB_MERGEONE;Short Curves 'L' Mask -TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity merge % current Spot with original or previous Spot.\nContrast threshold : adjust result in function of Original contrast -TP_LOCALLAB_MERGETHR;Original(Mask 7) + Mask LCH -TP_LOCALLAB_MERGETWO;Original(Mask 7) -TP_LOCALLAB_MERGETYPE;Merge image and mask -TP_LOCALLAB_MERGETYPE_TOOLTIP;None, use all mask in LCH mode.\nShort curves 'L' mask, use a short circuit for mask 2, 3, 4, 6, 7.\nOriginal mask 8, blend current image with original -TP_LOCALLAB_MERHEI;Overlay -TP_LOCALLAB_MERHUE;Hue -TP_LOCALLAB_MERLUCOL;Luminance -TP_LOCALLAB_MERLUM;Luminosity -TP_LOCALLAB_MERNIN;Screen -TP_LOCALLAB_MERONE;Normal -TP_LOCALLAB_MERSAT;Saturation -TP_LOCALLAB_MERSEV;Soft Light (legacy) -TP_LOCALLAB_MERSEV0;Soft Light Illusion -TP_LOCALLAB_MERSEV1;Soft Light W3C -TP_LOCALLAB_MERSEV2;Hard Light -TP_LOCALLAB_MERSIX;Divide -TP_LOCALLAB_MERTEN;Darken only -TP_LOCALLAB_MERTHI;Color Burn -TP_LOCALLAB_MERTHR;Difference -TP_LOCALLAB_MERTWE;Exclusion -TP_LOCALLAB_MERTWO;Subtract -TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. -TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 (Clip - Offset) -TP_LOCALLAB_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible.\nYou can act on Clip Restored datas and Offset to normalize.\n\nRestored image with no mixture. -TP_LOCALLAB_MODE_EXPERT;Advanced -TP_LOCALLAB_MODE_NORMAL;Standard -TP_LOCALLAB_MODE_SIMPLE;Basic -TP_LOCALLAB_MRFIV;Background -TP_LOCALLAB_MRFOU;Previous Spot -TP_LOCALLAB_MRONE;None -TP_LOCALLAB_MRTHR;Original Image -TP_LOCALLAB_MRTWO;Short Curves 'L' Mask -TP_LOCALLAB_MULTIPL_TOOLTIP;Allows the retouching of tones over a very wide range : -18EV +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts light tones up to 4EV -TP_LOCALLAB_NEIGH;Radius -TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) -TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02 -TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery (DCT ƒ) -TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) -TP_LOCALLAB_NOISEDETAIL_TOOLTIP;Disabled if slider = 100 -TP_LOCALLAB_NOISELEQUAL;Equalizer white-black -TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) -TP_LOCALLAB_NOISELUMDETAIL;Luminance detail recovery (DCT ƒ) -TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) -TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) -TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) -TP_LOCALLAB_NOISEMETH;Denoise -TP_LOCALLAB_NONENOISE;None -TP_LOCALLAB_OFFS;Offset -TP_LOCALLAB_OFFSETWAV;Offset -TP_LOCALLAB_OPACOL;Opacity -TP_LOCALLAB_ORIGLC;Merge only with original image -TP_LOCALLAB_ORRETILAP_TOOLTIP;Acts on a second Laplacian threshold, to take into account ΔE to differentiate the action especially with the background (different from Scope) -TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced -TP_LOCALLAB_PASTELS2;Vibrance -TP_LOCALLAB_PDE;Contrast Attenuator/Dynamic Range compression -TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ -TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL - personal algorithm adapted from IPOL to Rawtherapee: lead to very different results and needs differents settings that Standard (negative black, gamma < 1,...)\nMay be usefull for low exposure or high dynamic range.\n -TP_LOCALLAB_PREVIEW;Preview ΔE -TP_LOCALLAB_PREVHIDE;Hide additional settings -TP_LOCALLAB_PREVSHOW;Show additional settings -TP_LOCALLAB_PROXI;ΔE decay -TP_LOCALLAB_QUALCURV_METHOD;Curve type -TP_LOCALLAB_QUAL_METHOD;Global quality -TP_LOCALLAB_RADIUS;Radius -TP_LOCALLAB_RADIUS_TOOLTIP;Above Radius 30 Use Fast Fourier Transform -TP_LOCALLAB_RADMASKCOL;Smooth radius -TP_LOCALLAB_RECT;Rectangle -TP_LOCALLAB_RECURS;Recursive references -TP_LOCALLAB_RECURS_TOOLTIP;Recalculate references for hue, luma, chroma after each module and after each RT-spot.\nAlso useful for working with masks. -TP_LOCALLAB_REFLABEL;Ref. (0..1) Chroma=%1 Luma=%2 Hue=%3 -TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name -TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot -TP_LOCALLAB_RESETSHOW;Reset All Show Modifications -TP_LOCALLAB_RESID;Residual Image -TP_LOCALLAB_RESIDBLUR;Blur Residual Image -TP_LOCALLAB_RESIDCHRO;Residual image Chroma -TP_LOCALLAB_RESIDCOMP;Compress residual image -TP_LOCALLAB_RESIDCONT;Residual image Contrast -TP_LOCALLAB_RESIDHI;Highlights -TP_LOCALLAB_RESIDHITHR;Highlights threshold -TP_LOCALLAB_RESIDSHA;Shadows -TP_LOCALLAB_RESIDSHATHR;Shadows threshold -TP_LOCALLAB_RETI;Dehaze - Retinex -TP_LOCALLAB_RETIFRA;Retinex -TP_LOCALLAB_RETIM;Original Retinex -TP_LOCALLAB_RETITOOLFRA;Retinex Tools -TP_LOCALLAB_RETI_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated\nThe treatment time depends on the value of scale (be carefull to high values).\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\nOptimization not used in Preview -TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Have no effect when the value "Lightness = 1" or "Darkness =2" is chosen.\nIn other cases, the last step of "Multiple scale Retinex" is applied an algorithm close to "local contrast", these 2 cursors, associated with "Strength" will allow to play upstream on the local contrast. -TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Play on internal parameters to optimize response.\nLook at the "restored datas" indicators "near" min=0 and max=32768 (log mode), but others values are possible. -TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm allows differenciation for haze or normal.\nLogarithm brings more contrast but will generate more halo. -TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;Adapt these values according to images - if misty images and depending on whether you want to act on the front or the background -TP_LOCALLAB_RETI_SCALE_TOOLTIP;If scale=1, retinex behaves like local contrast with many more possibilities.\nThe greater the scale, the more intense the recursive action, the longer the calculation times -TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex - 9 -TP_LOCALLAB_REWEI;Reweighting iterates -TP_LOCALLAB_RGB;RGB Tone Curve -TP_LOCALLAB_ROW_NVIS;Not visible -TP_LOCALLAB_ROW_VIS;Visible -TP_LOCALLAB_SATUR;Saturation -TP_LOCALLAB_SAVREST;Save - Restore Current Image -TP_LOCALLAB_SCALEGR;Scale -TP_LOCALLAB_SCALERETI;Scale -TP_LOCALLAB_SCALTM;Scale -TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) -//TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if Mask DeltaE Image is enabled.\nLow values avoid retouching selected area -TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if DeltaE Image Mask is enabled.\nLow values avoid retouching selected area -TP_LOCALLAB_SENSI;Scope -TP_LOCALLAB_SENSIBN;Scope -TP_LOCALLAB_SENSICB;Scope -TP_LOCALLAB_SENSIDEN;Scope -TP_LOCALLAB_SENSIEXCLU;Scope -TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust color to include in exclusion! -TP_LOCALLAB_SENSIH;Scope -TP_LOCALLAB_SENSIH_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors. -TP_LOCALLAB_SENSILOG;Scope -TP_LOCALLAB_SENSIS;Scope -TP_LOCALLAB_SENSIS_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm. -TP_LOCALLAB_SENSI_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm. -TP_LOCALLAB_SENSIMASK_TOOLTIP;Adjust scope of action for this common mask tool.\nActs on the gap between the original image and the mask.\nThe references (luma, chroma, hue) are those of the center of the RT-spot\n\nYou can also act on deltaE internal to the mask with 'Scope Mask deltaE image' in 'Settings' -TP_LOCALLAB_SETTINGS;Settings -TP_LOCALLAB_SH1;Shadows Highlights -TP_LOCALLAB_SH2;Equalizer -TP_LOCALLAB_SHADEX;Shadows -TP_LOCALLAB_SHADEXCOMP;Shadows compression & tonal width -TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone equalizer -TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows & highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. -//Can be used instead - or in complement - of exposure module in difficult cases.\nThe use of Denoise may be necessary : lightening the shadows.\n\nCan be used as graduated filter (increase Scope) -TP_LOCALLAB_SHAMASKCOL;Shadows -TP_LOCALLAB_SHAPETYPE;RT-spot shape -TP_LOCALLAB_SHAPE_TOOLTIP;Elipse is normal mode.\nRectangle can be used in some cases, for example to work in full image in conjonction with delimiters outside preview, transition = 100.\n\nPolygone - Beziers are waiting for GUI... -TP_LOCALLAB_SHARAMOUNT;Amount -TP_LOCALLAB_SHARBLUR;Blur radius -TP_LOCALLAB_SHARDAMPING;Damping -TP_LOCALLAB_SHARFRAME;Modifications -TP_LOCALLAB_SHARITER;Iterations -TP_LOCALLAB_SHARP;Sharpening -TP_LOCALLAB_SHARP_TOOLNAME;Sharpening - 8 -TP_LOCALLAB_SHARRADIUS;Radius -TP_LOCALLAB_SHORTC;Short Curves 'L' Mask -TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7 -TP_LOCALLAB_SHOWC;Mask and modifications -TP_LOCALLAB_SHOWC1;Merge file -TP_LOCALLAB_SHOWCB;Mask and modifications -TP_LOCALLAB_SHOWDCT;Show process Fourier ƒ -TP_LOCALLAB_SHOWE;Mask and modifications -TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) -TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) -TP_LOCALLAB_SHOWLC;Mask and modifications -TP_LOCALLAB_SHOWMASK;Show mask -TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Display mask modifications.\nBeware, you can only view one tool mask at the same time.\nShow modified image: Shows the modified image including any adjustments and masks\n\nNote: Use Mask is before algorihtm shape detection. -TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Show process Fourier:\nShows the different stages of the process.\nLaplace - builds the second derivative according to the threshold (first step).\nFourier -shows the transformed Laplacian with DCT.\nPoisson - show solution of Poisson DCE.\nNormalize - show result without normalization luminance. -TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise -TP_LOCALLAB_SHOWMASKTYP2;Denoise -TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise -TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Mask and modifications can be chosen.\nBlur and noise : in this case it is not used for 'denoise'.\nDenoise : in this case it is not used for 'blur and noise'.\n\nBlur and noise + denoise : mask is shared, be carefull to 'show modifications' and 'scope' -TP_LOCALLAB_SHOWMNONE;Show modified image -TP_LOCALLAB_SHOWMODIF;Show modifications without mask -TP_LOCALLAB_SHOWMODIFMASK;Show modifications with mask -TP_LOCALLAB_SHOWNORMAL;Normalize luminance (no) -TP_LOCALLAB_SHOWPLUS;Mask and modifications - Blur/Grain & Denoise -TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) -TP_LOCALLAB_SHOWR;Mask and modifications -TP_LOCALLAB_SHOWREF;Preview ΔE -TP_LOCALLAB_SHOWS;Mask and modifications -TP_LOCALLAB_SHOWSTRUC;Show spot structure (advanced) -TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(advanced) -TP_LOCALLAB_SHOWT;Mask and modifications -TP_LOCALLAB_SHOWVI;Mask and modifications -TP_LOCALLAB_SHRESFRA;Shadows/Highlights -TP_LOCALLAB_SHTRC_TOOLTIP;Modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones -TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer - 5 -TP_LOCALLAB_SIGMAWAV;Attenuation response -TP_LOCALLAB_SIM;Simple -TP_LOCALLAB_SLOMASKCOL;Slope -TP_LOCALLAB_SLOSH;Slope -TP_LOCALLAB_SOFT;Soft Light - Original Retinex -TP_LOCALLAB_SOFTM;Soft Light -//TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Original Retinex is very different from others Retinex method.\nIts acts on grey and balance luminance.\nIt is an emulation of "Dodge" and "Burn" -TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. -TP_LOCALLAB_SOFTRADIUSCOL;Soft radius -TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts -TP_LOCALLAB_SOFTRETI_TOOLTIP;Take into account deltaE to improve Transmission map -TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 -TP_LOCALLAB_SOURCE_GRAY;Value -TP_LOCALLAB_SPECCASE;Specific cases -TP_LOCALLAB_SPECIAL;Special use of RGB curves -TP_LOCALLAB_SPECIAL_TOOLTIP;Only for this RGB curve, disabled (or reduce effects) of Scope, mask...for example, if you want to have a negative effect. -TP_LOCALLAB_SPOTNAME;New Spot -TP_LOCALLAB_STD;Standard -TP_LOCALLAB_STR;Strength -TP_LOCALLAB_STRBL;Strength -TP_LOCALLAB_STREN;Compression Strength -TP_LOCALLAB_STRENG;Strength -TP_LOCALLAB_STRENGR;Strength -TP_LOCALLAB_STRENGTH;Noise -TP_LOCALLAB_STRGRID;Strength -TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\nif Strength Retinex >= 0.1 Dehaze is in luminance mode. -TP_LOCALLAB_STRUC;Structure -TP_LOCALLAB_STRUCCOL;Structure -TP_LOCALLAB_STRUCCOL1;Spot structure -TP_LOCALLAB_STRUCT_TOOLTIP;Use Sobel algorithm to take into account structure in shape detection.\nyou can have a preview by activating "mask and modifications - Show structure spot".\n\nCan be used in conjunction with masks (advanced) structure, blur, wavelet to improve edge detection.\n\nNeeds maskless adjustments to be activated (lightness, exposure...) -TP_LOCALLAB_STRUMASKCOL;Structure mask strength -TP_LOCALLAB_STRUMASK_TOOLTIP;Generate a structure mask with difference between surface areas and reliefs.\nIf structure mask as tool is enabled, this mask is used in addition to the other tools (gamma, slope, contrast curve ...) -TP_LOCALLAB_STYPE;Shape method -TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. -TP_LOCALLAB_SYM;Symmetrical (mouse) -TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) -TP_LOCALLAB_TARGET_GRAY;Target gray point -TP_LOCALLAB_THRES;Threshold structure -TP_LOCALLAB_THRESDELTAE;ΔE-scope threshold -TP_LOCALLAB_THRESRETI;Threshold -TP_LOCALLAB_THRESWAV;Balance threshold -TP_LOCALLAB_TLABEL;TM Data Min=%1 Max=%2 Mean=%3 Sigma=%4 (Threshold) -TP_LOCALLAB_TLABEL2;TM Effective Tm=%1 TM=%2 -TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize -TP_LOCALLAB_TM;Tone Mapping - Texture -TP_LOCALLAB_TM_MASK;Use transmission map -TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This parameter affects sensitivity to edges.\n The greater it is the more likely an illumination change is to be considered an "edge".\n If set to zero tone mapping will have an effect similar to unsharp masking. -TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Gamma moves the action of tone-mapping to shadows or highlights. -TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. -TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main menu tool must be de-activated if this tool is used. -//Tone Mapping - main menu must be disabled -TP_LOCALLAB_TONEMASCALE_TOOLTIP;This control gives meaning to the difference between "local" and "global" contrast.\nThe greater it is the larger a detail needs to be in order to be boosted -TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 -TP_LOCALLAB_TOOLCOL;Structure mask as tool -TP_LOCALLAB_TOOLMASK;Mask Tools -TP_LOCALLAB_THREND;Local contrast threshold -TP_LOCALLAB_THRENDSIG;Local contrast threshold High levels -TP_LOCALLAB_THRENDLEV;Levels -TP_LOCALLAB_THRESLOW;Guided threshold 14 -TP_LOCALLAB_THRESHIGH;Guided threshold 57 -TP_LOCALLAB_TRANSIT;Transition Gradient -TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY -TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Changes the transition of the abscissa to that of the ordinate -TP_LOCALLAB_TRANSITVALUE;Transition value -TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) -//TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay : change smoothness process - 1 linear - 2 parabolic - 3 cubic - ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelet, Color & Light) -TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light) -TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas, as a percentage of the "radius" -TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain -TP_LOCALLAB_TRANSMISSIONMAP;Transmission map -TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.\nYou can act on this curve to change Transmission and reduce the artifacts -TP_LOCALLAB_USEMASK;Use mask -TP_LOCALLAB_VART;Variance (contrast) -TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool -TP_LOCALLAB_VIBRA_TOOLTIP;Adjust vibrance (essentially the same as the global adjustment).\nCarry out the equivalent of a white-balance adjustment using a CIECAM algorithm. -TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool - 3 -TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 -TP_LOCALLAB_BLUR_TOOLNAME;Smooth Blur/Grain & Denoise - 1 -TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 -TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex - 9 -TP_LOCALLAB_SHARP_TOOLNAME;Sharpening - 8 -TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelet - 7 -TP_LOCALLAB_CBDL_TOOLNAME;CBDL - 2 -TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 -TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask - 13 -TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. -TP_LOCALLAB_WAMASKCOL;Ψ Mask Wavelet level -TP_LOCALLAB_WARM;Warm - Cool & Color artifacts -TP_LOCALLAB_WARM_TOOLTIP;This slider use Ciecam algorithm and acts as White Balance, it can warm or cool the area selected.\nIt can also in some cases reduce color artifacts. -TP_LOCALLAB_WASDEN_TOOLTIP;Denoise luminance for the 4 first levels (fine).\nThe right limit of the curve correspond to coarse : level 4 and beyond (6) -TP_LOCALLAB_WAV;Level local contrast -TP_LOCALLAB_WAVBLUR_TOOLTIP;Performs a blur for each level of decomposition, as well as the residual image. -TP_LOCALLAB_WAVCOMP;Compression by Level -TP_LOCALLAB_WAVCOMPRE;(un)Compression by Level -TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Achieve a Tone-mapping or reduction local contrast by level.\nOn abscissa levels -TP_LOCALLAB_WAVCOMP_TOOLTIP;Achive local contrast in function of the direction wavelet decomposition : horizontal, vertical, diagonal -TP_LOCALLAB_WAVCON;Contrast by Level -TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels : on abscissa levels. -TP_LOCALLAB_WAVDEN;Luminance denoise by level (1 2 3 4 .. 6) -TP_LOCALLAB_WAVE;Ψ Wavelet -TP_LOCALLAB_WAVEDG;Local contrast -TP_LOCALLAB_WAVEEDG_TOOLTIP;Achieves a sharpness taking into account the notion of edges wavelet.\nRequires that at least the first 4 levels are usable -TP_LOCALLAB_WAVGRAD_TOOLTIP;Graduated filter for Local contrast "luminance" -TP_LOCALLAB_WAVHIGH;Ψ Wavelet high -TP_LOCALLAB_WAVLEV;Blur by Level -TP_LOCALLAB_WAVLOW;Ψ Wavelet low -TP_LOCALLAB_WAVMASK;Ψ Local contrast (by wavelet level) -TP_LOCALLAB_WAVMASK_TOOLTIP;Allows fine work on mask levels contrasts (structure) -TP_LOCALLAB_WAVMED;Ψ Wavelet normal -TP_LOCALLAB_WEDIANHI;Median Hi -TP_LOCALLAB_WHITE_EV;White Ev -TP_LOCAL_HEIGHT;Bottom -TP_LOCAL_HEIGHT_T;Top -TP_LOCAL_WIDTH;Right -TP_LOCAL_WIDTH_L;Left -TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\n -TP_METADATA_EDIT;Apply modifications -TP_METADATA_MODE;Metadata copy mode -TP_METADATA_STRIP;Strip all metadata -TP_METADATA_TUNNEL;Copy unchanged -TP_NEUTRAL;Reset -TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. -TP_PCVIGNETTE_FEATHER;Feather -TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. -TP_PCVIGNETTE_LABEL;Vignette Filter -TP_PCVIGNETTE_ROUNDNESS;Roundness -TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. -TP_PCVIGNETTE_STRENGTH;Strength -TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). -TP_PDSHARPENING_LABEL;Capture Sharpening -TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor -TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length -TP_PERSPECTIVE_CAMERA_FRAME;Correction -TP_PERSPECTIVE_CAMERA_PITCH;Vertical -TP_PERSPECTIVE_CAMERA_ROLL;Rotation -TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift -TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift -TP_PERSPECTIVE_CAMERA_YAW;Horizontal -TP_PERSPECTIVE_HORIZONTAL;Horizontal -TP_PERSPECTIVE_LABEL;Perspective -TP_PERSPECTIVE_METHOD;Method -TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based -TP_PERSPECTIVE_METHOD_SIMPLE;Simple -TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment -TP_PERSPECTIVE_PROJECTION_PITCH;Vertical -TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation -TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift -TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift -TP_PERSPECTIVE_PROJECTION_YAW;Horizontal -TP_PERSPECTIVE_RECOVERY_FRAME;Recovery -TP_PERSPECTIVE_VERTICAL;Vertical -TP_PFCURVE_CURVEEDITOR_CH;Hue -TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. -TP_PREPROCESS_DEADPIXFILT;Dead pixel filter -TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. -TP_PREPROCESS_GREENEQUIL;Green equilibration -TP_PREPROCESS_HOTPIXFILT;Hot pixel filter -TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. -TP_PREPROCESS_LABEL;Preprocessing -TP_PREPROCESS_LINEDENOISE;Line noise filter -TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction -TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both -TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal -TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows -TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical -TP_PREPROCESS_NO_FOUND;None found -TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -TP_PREPROCWB_LABEL;Preprocess White Balance -TP_PREPROCWB_MODE;Mode -TP_PREPROCWB_MODE_AUTO;Auto -TP_PREPROCWB_MODE_CAMERA;Camera -TP_PRSHARPENING_LABEL;Post-Resize Sharpening -TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. -TP_RAWCACORR_AUTO;Auto-correction -TP_RAWCACORR_AUTOIT;Iterations -TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. -TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift -TP_RAWCACORR_CABLUE;Blue -TP_RAWCACORR_CARED;Red -TP_RAWCACORR_LABEL;Chromatic Aberration Correction -TP_RAWEXPOS_BLACK_0;Green 1 (lead) -TP_RAWEXPOS_BLACK_1;Red -TP_RAWEXPOS_BLACK_2;Blue -TP_RAWEXPOS_BLACK_3;Green 2 -TP_RAWEXPOS_BLACK_BLUE;Blue -TP_RAWEXPOS_BLACK_GREEN;Green -TP_RAWEXPOS_BLACK_RED;Red -TP_RAWEXPOS_LINEAR;White-point correction -TP_RAWEXPOS_RGB;Red, Green, Blue -TP_RAWEXPOS_TWOGREEN;Link greens -TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) -TP_RAW_2PASS;1-pass+fast -TP_RAW_3PASSBEST;3-pass (Markesteijn) -TP_RAW_4PASS;3-pass+fast -TP_RAW_AHD;AHD -TP_RAW_AMAZE;AMaZE -TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear -TP_RAW_AMAZEVNG4;AMaZE+VNG4 -TP_RAW_BORDER;Border -TP_RAW_DCB;DCB -TP_RAW_DCBENHANCE;DCB enhancement -TP_RAW_DCBITERATIONS;Number of DCB iterations -TP_RAW_DCBBILINEAR;DCB+Bilinear -TP_RAW_DCBVNG4;DCB+VNG4 -TP_RAW_DMETHOD;Method -TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... -TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. -TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold -TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). -TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold -TP_RAW_EAHD;EAHD -TP_RAW_FALSECOLOR;False color suppression steps -TP_RAW_FAST;Fast -TP_RAW_HD;Threshold -TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear. -TP_RAW_HPHD;HPHD -TP_RAW_IGV;IGV -TP_RAW_IMAGENUM;Sub-image -TP_RAW_IMAGENUM_SN;SN mode -TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. -TP_RAW_LABEL;Demosaicing -TP_RAW_LMMSE;LMMSE -TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps -TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (steps 5-6) to reduce artifacts and improve the signal-to-noise ratio. -TP_RAW_MONO;Mono -TP_RAW_NONE;None (Shows sensor pattern) -TP_RAW_PIXELSHIFT;Pixel Shift -TP_RAW_PIXELSHIFTBLUR;Blur motion mask -TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion -TP_RAW_PIXELSHIFTEPERISO;Sensitivity -TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. -TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames -TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equalize per channel -TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Enabled: Equalize the RGB channels individually.\nDisabled: Use same equalization factor for all channels. -TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. -TP_RAW_PIXELSHIFTGREEN;Check green channel for motion -TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask -TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask -TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. -TP_RAW_PIXELSHIFTMM_AUTO;Automatic -TP_RAW_PIXELSHIFTMM_CUSTOM;Custom -TP_RAW_PIXELSHIFTMM_OFF;Off -TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction -TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask -TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask -TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. -TP_RAW_PIXELSHIFTSIGMA;Blur radius -TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. -TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions -TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -TP_RAW_RCD;RCD -TP_RAW_RCDBILINEAR;RCD+Bilinear -TP_RAW_RCDVNG4;RCD+VNG4 -TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix -TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.\n+fast gives less artifacts in flat areas -TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix -TP_RAW_VNG4;VNG4 -TP_RAW_XTRANS;X-Trans -TP_RAW_XTRANSFAST;Fast X-Trans -TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling -TP_RESIZE_APPLIESTO;Applies to: -TP_RESIZE_CROPPEDAREA;Cropped Area -TP_RESIZE_FITBOX;Bounding Box -TP_RESIZE_FULLIMAGE;Full Image -TP_RESIZE_H;Height: -TP_RESIZE_HEIGHT;Height -TP_RESIZE_LABEL;Resize -TP_RESIZE_LANCZOS;Lanczos -TP_RESIZE_METHOD;Method: -TP_RESIZE_NEAREST;Nearest -TP_RESIZE_SCALE;Scale -TP_RESIZE_SPECIFY;Specify: -TP_RESIZE_W;Width: -TP_RESIZE_WIDTH;Width -TP_RETINEX_CONTEDIT_HSL;HSL histogram -TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram -TP_RETINEX_CONTEDIT_LH;Hue -TP_RETINEX_CONTEDIT_MAP;Equalizer -TP_RETINEX_CURVEEDITOR_CD;L=f(L) -TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts. -TP_RETINEX_CURVEEDITOR_LH;Strength=f(H) -TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. -TP_RETINEX_CURVEEDITOR_MAP;L=f(L) -TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! -TP_RETINEX_EQUAL;Equalizer -TP_RETINEX_FREEGAMMA;Free gamma -TP_RETINEX_GAIN;Gain -TP_RETINEX_GAINOFFS;Gain and Offset (brightness) -TP_RETINEX_GAINTRANSMISSION;Gain transmission -TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. -TP_RETINEX_GAMMA;Gamma -TP_RETINEX_GAMMA_FREE;Free -TP_RETINEX_GAMMA_HIGH;High -TP_RETINEX_GAMMA_LOW;Low -TP_RETINEX_GAMMA_MID;Middle -TP_RETINEX_GAMMA_NONE;None -TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.). -TP_RETINEX_GRAD;Transmission gradient -TP_RETINEX_GRADS;Strength gradient -TP_RETINEX_GRADS_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Strength is reduced when iterations increase, and conversely. -TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Variance and Threshold are reduced when iterations increase, and conversely. -TP_RETINEX_HIGH;High -TP_RETINEX_HIGHLIG;Highlight -TP_RETINEX_HIGHLIGHT;Highlight threshold -TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool. -TP_RETINEX_HSLSPACE_LIN;HSL-Linear -TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic -TP_RETINEX_ITER;Iterations (Tone-mapping) -TP_RETINEX_ITERF;Tone mapping -TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. -TP_RETINEX_LABEL;Retinex -TP_RETINEX_LABEL_MASK;Mask -TP_RETINEX_LABSPACE;L*a*b* -TP_RETINEX_LOW;Low -TP_RETINEX_MAP;Method -TP_RETINEX_MAP_GAUS;Gaussian mask -TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) -TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) -TP_RETINEX_MAP_METHOD_TOOLTIP;Use the mask generated by the Gaussian function above (Radius, Method) to reduce halos and artifacts.\n\nCurve only: apply a diagonal contrast curve on the mask.\nBeware of artifacts!\n\nGaussian mask: generate and use a Gaussian blur of the original mask.\nQuick.\n\nSharp mask: generate and use a wavelet on the original mask.\nSlow. -TP_RETINEX_MAP_NONE;None -TP_RETINEX_MEDIAN;Transmission median filter -TP_RETINEX_METHOD;Method -TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\nHighlights = Remove magenta in highlights. -TP_RETINEX_MLABEL;Restored data Min=%1 Max=%2 -TP_RETINEX_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible\nRestored image with no mixture. -TP_RETINEX_NEIGHBOR;Radius -TP_RETINEX_NEUTRAL;Reset -TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -TP_RETINEX_OFFSET;Offset (brightness) -TP_RETINEX_SCALES;Gaussian gradient -TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. -TP_RETINEX_SETTINGS;Settings -TP_RETINEX_SKAL;Scale -TP_RETINEX_SLOPE;Free gamma slope -TP_RETINEX_STRENGTH;Strength -TP_RETINEX_THRESHOLD;Threshold -TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss. -TP_RETINEX_TLABEL;TM Data Min=%1 Max=%2 Mean=%3 Sigma=%4 -TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 -TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map. -TP_RETINEX_TRANF;Transmission -TP_RETINEX_TRANSMISSION;Transmission map -TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. -TP_RETINEX_UNIFORM;Uniform -TP_RETINEX_VARIANCE;Contrast -TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts. -TP_RETINEX_VIEW;Process -TP_RETINEX_VIEW_MASK;Mask -TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Normal display.\nMask - Displays the mask.\nUnsharp mask - Displays the image with a high radius unsharp mask.\nTransmission - Auto/Fixed - Displays the file transmission-map, before any action on contrast and brightness.\n\nAttention: the mask does not correspond to reality, but is amplified to make it more visible. -TP_RETINEX_VIEW_NONE;Standard -TP_RETINEX_VIEW_TRAN;Transmission - Auto -TP_RETINEX_VIEW_TRAN2;Transmission - Fixed -TP_RETINEX_VIEW_UNSHARP;Unsharp mask -TP_RGBCURVES_BLUE;B -TP_RGBCURVES_CHANNEL;Channel -TP_RGBCURVES_GREEN;G -TP_RGBCURVES_LABEL;RGB Curves -TP_RGBCURVES_LUMAMODE;Luminosity mode -TP_RGBCURVES_LUMAMODE_TOOLTIP;Luminosity mode allows to vary the contribution of R, G and B channels to the luminosity of the image, without altering image color. -TP_RGBCURVES_RED;R -TP_ROTATE_DEGREE;Degree -TP_ROTATE_LABEL;Rotate -TP_ROTATE_SELECTLINE;Select Straight Line -TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter -TP_SHADOWSHLIGHTS_HIGHLIGHTS;Highlights -TP_SHADOWSHLIGHTS_HLTONALW;Highlights tonal width -TP_SHADOWSHLIGHTS_LABEL;Shadows/Highlights -TP_SHADOWSHLIGHTS_RADIUS;Radius -TP_SHADOWSHLIGHTS_SHADOWS;Shadows -TP_SHADOWSHLIGHTS_SHTONALW;Shadows tonal width -TP_SHARPENEDGE_AMOUNT;Quantity -TP_SHARPENEDGE_LABEL;Edges -TP_SHARPENEDGE_PASSES;Iterations -TP_SHARPENEDGE_THREE;Luminance only -TP_SHARPENING_AMOUNT;Amount -TP_SHARPENING_BLUR;Blur radius -TP_SHARPENING_CONTRAST;Contrast threshold -TP_SHARPENING_EDRADIUS;Radius -TP_SHARPENING_EDTOLERANCE;Edge tolerance -TP_SHARPENING_HALOCONTROL;Halo control -TP_SHARPENING_HCAMOUNT;Amount -TP_SHARPENING_ITERCHECK;Auto limit iterations -TP_SHARPENING_LABEL;Sharpening -TP_SHARPENING_METHOD;Method -TP_SHARPENING_ONLYEDGES;Sharpen only edges -TP_SHARPENING_RADIUS;Radius -TP_SHARPENING_RADIUS_BOOST;Corner radius boost -TP_SHARPENING_RLD;RL Deconvolution -TP_SHARPENING_RLD_AMOUNT;Amount -TP_SHARPENING_RLD_DAMPING;Damping -TP_SHARPENING_RLD_ITERATIONS;Iterations -TP_SHARPENING_THRESHOLD;Threshold -TP_SHARPENING_USM;Unsharp Mask -TP_SHARPENMICRO_AMOUNT;Quantity -TP_SHARPENMICRO_CONTRAST;Contrast threshold -TP_SHARPENMICRO_LABEL;Microcontrast -TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 -TP_SHARPENMICRO_UNIFORMITY;Uniformity -TP_SOFTLIGHT_LABEL;Soft Light -TP_SOFTLIGHT_STRENGTH;Strength -TP_TM_FATTAL_AMOUNT;Amount -TP_TM_FATTAL_ANCHOR;Anchor -TP_TM_FATTAL_LABEL;Dynamic Range Compression -TP_TM_FATTAL_THRESHOLD;Detail -TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift -TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH -TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones -TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple -TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Red -TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Red/Yellow -TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Yellow -TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H) -TP_VIBRANCE_LABEL;Vibrance -TP_VIBRANCE_PASTELS;Pastel tones -TP_VIBRANCE_PASTSATTOG;Link pastel and saturated tones -TP_VIBRANCE_PROTECTSKINS;Protect skin-tones -TP_VIBRANCE_PSTHRESHOLD;Pastel/saturated tones threshold -TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Saturation threshold -TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;The vertical axis represents pastel tones at the bottom and saturated tones at the top.\nThe horizontal axis represents the saturation range. -TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Pastel/saturated transition's weighting -TP_VIBRANCE_SATURATED;Saturated Tones -TP_VIGNETTING_AMOUNT;Amount -TP_VIGNETTING_CENTER;Center -TP_VIGNETTING_CENTER_X;Center X -TP_VIGNETTING_CENTER_Y;Center Y -TP_VIGNETTING_LABEL;Vignetting Correction -TP_VIGNETTING_RADIUS;Radius -TP_VIGNETTING_STRENGTH;Strength -TP_WAVELET_1;Level 1 -TP_WAVELET_2;Level 2 -TP_WAVELET_3;Level 3 -TP_WAVELET_4;Level 4 -TP_WAVELET_5;Level 5 -TP_WAVELET_6;Level 6 -TP_WAVELET_7;Level 7 -TP_WAVELET_8;Level 8 -TP_WAVELET_9;Level 9 -TP_WAVELET_APPLYTO;Apply to -TP_WAVELET_AVOID;Avoid color shift -TP_WAVELET_B0;Black -TP_WAVELET_B1;Gray -TP_WAVELET_B2;Residual -TP_WAVELET_BACKGROUND;Background -TP_WAVELET_BACUR;Curve -TP_WAVELET_BALANCE;Contrast balance d/v-h -TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified. -TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the vertical, horizontal and diagonal wavelet directions: .\nActivating contrast, chroma or residual tone mapping amplifies the effect due to balance -TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. -TP_WAVELET_BALCHROM;Denoise equalizer Blue-Yellow Red-Green -TP_WAVELET_BALLUM;Denoise equalizer White-Black -TP_WAVELET_BANONE;None -TP_WAVELET_BASLI;Slider -TP_WAVELET_BATYPE;Contrast balance method -TP_WAVELET_BL;Blur levels -TP_WAVELET_BLCURVE;Blur by levels -TP_WAVELET_BLURFRAME;Blur -TP_WAVELET_BLUWAV;Attenuation response -TP_WAVELET_CBENAB;Toning and Color balance -TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance -TP_WAVELET_CCURVE;Local contrast -TP_WAVELET_CH1;Whole chroma range -TP_WAVELET_CH2;Saturated/pastel -TP_WAVELET_CH3;Link contrast levels -TP_WAVELET_CHCU;Curve -TP_WAVELET_CHR;Chroma-contrast link strength -TP_WAVELET_CHRO;Saturated/pastel threshold -TP_WAVELET_CHROFRAME;Denoise chrominance -TP_WAVELET_CHROMAFRAME;Chroma -TP_WAVELET_CHROMCO;Coarse chroma -TP_WAVELET_CHROMFI;Fine Chroma -TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored. -TP_WAVELET_CHRWAV;Blur chroma -TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" -TP_WAVELET_CHSL;Sliders -TP_WAVELET_CHTYPE;Chrominance method -TP_WAVELET_CLA;Clarity -TP_WAVELET_CLARI;Sharp-mask and Clarity -TP_WAVELET_COLORT;Opacity red-green -TP_WAVELET_COMPCONT;Contrast -TP_WAVELET_COMPGAMMA;Compression gamma -TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram. -TP_WAVELET_COMPLEXLAB;Complexity -TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations -TP_WAVELET_COMPNORMAL;Standard -TP_WAVELET_COMPEXPERT;Advanced -TP_WAVELET_COMPTM;Tone mapping -TP_WAVELET_CONTEDIT;'After' contrast curve -TP_WAVELET_CONTFRAME;Contrast - Compression -TP_WAVELET_CONTR;Gamut -TP_WAVELET_CONTRA;Contrast -TP_WAVELET_CONTRASTEDIT;Finer - Coarser levels -TP_WAVELET_CONTRAST_MINUS;Contrast - -TP_WAVELET_CONTRAST_PLUS;Contrast + -TP_WAVELET_CONTRA_TOOLTIP;Changes the residual image contrast. -TP_WAVELET_CTYPE;Chrominance control -TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300% -TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000). -TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue) -TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero. -TP_WAVELET_CURVEEDITOR_CL;L -TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. -TP_WAVELET_CURVEEDITOR_HH;HH -TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. -TP_WAVELET_DALL;All directions -TP_WAVELET_DAUB;Edge performance -TP_WAVELET_DAUB2;D2 - low -TP_WAVELET_DAUB4;D4 - standard -TP_WAVELET_DAUB6;D6 - standard plus -TP_WAVELET_DAUB10;D10 - medium -TP_WAVELET_DAUB14;D14 - high -TP_WAVELET_DAUBLOCAL;Wavelet Edge performance -TP_WAVELET_DAUB_TOOLTIP;Changes Daubechies coefficients:\nD4 = Standard,\nD14 = Often best performance, 10% more time-intensive.\n\nAffects edge detection as well as the general quality of the first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. -TP_WAVELET_DENOISE;Guide curve based on Local contrast -TP_WAVELET_DENOISEGUID;Guided threshold based on hue -TP_WAVELET_DENOISEH;High levels Curve Local contrast -TP_WAVELET_DENOISEHUE;Denoise equalizer Hue -TP_WAVELET_DENCONTRAST;Local contrast Equalizer -TP_WAVELET_DENEQUAL;1 2 3 4 Equal -TP_WAVELET_DEN14PLUS;1 4 High -TP_WAVELET_DEN14LOW;1 4 Low -TP_WAVELET_DEN12PLUS;1 2 High -TP_WAVELET_DEN12LOW;1 2 Low -TP_WAVELET_DEN5THR;Guided threshold -//TP_WAVELET_DENH;Low levels (1234)- Finest details -//TP_WAVELET_DENLH;Guided threshold by detail levels 1-4 -//TP_WAVELET_DENL;High levels - Coarsest details -TP_WAVELET_DENH;Threshold -TP_WAVELET_DENLH;Guided threshold by detail levels 1-4 -TP_WAVELET_DENL;Correction structure -TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained -TP_WAVELET_DENMIX_TOOLTIP;Balances the action of the guide taking into account the original image and the denoised image -TP_WAVELET_DENQUA;Mode -TP_WAVELET_DENSLILAB;Method -TP_WAVELET_DENSLI;Slider -TP_WAVELET_DENCURV;Curve -TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide -TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color -TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter -TP_WAVELET_DETEND;Details -TP_WAVELET_DIRFRAME;Directional contrast -TP_WAVELET_DONE;Vertical -TP_WAVELET_DTHR;Diagonal -TP_WAVELET_DTWO;Horizontal -TP_WAVELET_EDCU;Curve -TP_WAVELET_EDEFFECT;Attenuation response -TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment -TP_WAVELET_EDGCONT;Local contrast -TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+std. dev. and maxima. -TP_WAVELET_EDGE;Edge Sharpness -TP_WAVELET_EDGEAMPLI;Base amplification -TP_WAVELET_EDGEDETECT;Gradient sensitivity -TP_WAVELET_EDGEDETECTTHR;Threshold low (noise) -TP_WAVELET_EDGEDETECTTHR2;Edge enhancement -TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge -TP_WAVELET_EDGEDETECT_TOOLTIP;Moving the slider to the right increases edge sensitivity. This affects local contrast, edge settings and noise. -TP_WAVELET_EDGESENSI;Edge sensitivity -TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. -TP_WAVELET_EDGTHRESH;Detail -TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. -TP_WAVELET_EDRAD;Radius -TP_WAVELET_EDRAD_TOOLTIP;This adjustment controls the local enhancement. A value of zero still has an effect -TP_WAVELET_EDSL;Threshold sliders -TP_WAVELET_EDTYPE;Local contrast method -TP_WAVELET_EDVAL;Strength -TP_WAVELET_FINAL;Final Touchup -TP_WAVELET_FINCFRAME;Final local contrast -TP_WAVELET_FINCOAR_TOOLTIP;The left (positive) part of the curve acts on the finer levels (increase).\nThe 2 points on the abscissa represent the respective action limits of finer and coarser levels 5 and 6 (default).\nThe right (negative) part of the curve acts on the coarser levels (increase).\nAvoid moving the left part of the curve with negative values. Avoid moving the right part of the curve with positives values -TP_WAVELET_FINEST;Finest -TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter -TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) -TP_WAVELET_HIGHLIGHT;Finer levels luminance range -TP_WAVELET_HS1;Whole luminance range -TP_WAVELET_HS2;Selective luminance range -TP_WAVELET_HUESKIN;Skin hue -TP_WAVELET_HUESKIN_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. -TP_WAVELET_HUESKY;Hue range -TP_WAVELET_HUESKY_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. -TP_WAVELET_ITER;Delta balance levels -TP_WAVELET_ITER_TOOLTIP;Left: increase low levels and reduce high levels,\nRight: reduce low levels and increase high levels. -TP_WAVELET_LABEL;Wavelet Levels -TP_WAVELET_LARGEST;Coarsest -TP_WAVELET_LEVCH;Chroma -TP_WAVELET_LEVDEN;Level 5-6 denoise -TP_WAVELET_LEVDIR_ALL;All levels, in all directions -TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level -TP_WAVELET_LEVDIR_ONE;One level -TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level -TP_WAVELET_LEVELS;Wavelet levels -TP_WAVELET_LEVELLOW;Radius 1-4 -TP_WAVELET_LEVELHIGH;Radius 5-6 -TP_WAVELET_LEVELSIGM;Radius -TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. -TP_WAVELET_LEVF;Contrast -TP_WAVELET_LEVLABEL;Preview maximum possible levels = %1 -TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold -TP_WAVELET_LEVONE;Level 2 -TP_WAVELET_LEVTHRE;Level 4 -TP_WAVELET_LEVTWO;Level 3 -TP_WAVELET_LEVZERO;Level 1 -TP_WAVELET_LIMDEN;Interaction levels 56 on levels 14 -TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength -TP_WAVELET_LIPST;Enhanced algoritm -TP_WAVELET_LOWLIGHT;Coarser levels luminance range -TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise -TP_WAVELET_MEDGREINF;First level -TP_WAVELET_MEDI;Reduce artifacts in blue sky -TP_WAVELET_MEDILEV;Edge detection -TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine. -TP_WAVELET_MERGEC;Merge chroma -TP_WAVELET_MERGEL;Merge luma -TP_WAVELET_NEUTRAL;Neutral -TP_WAVELET_MIXCONTRAST;Reference local contrast -TP_WAVELET_MIXDENOISE;Denoise -TP_WAVELET_MIXNOISE;Noise -TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise -TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise -TP_WAVELET_NOIS;Denoise -TP_WAVELET_NOISE;Denoise and Refine -TP_WAVELET_NOISE_TOOLTIP;If level 4 luminance denoise superior to 50, mode Agressive is used.\nIf chrominance coarse superior to 20, mode Agressive is used. -TP_WAVELET_NPHIGH;High -TP_WAVELET_NPLOW;Low -TP_WAVELET_NPNONE;None -TP_WAVELET_NPTYPE;Neighboring pixels -TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced. -TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. -TP_WAVELET_OLDSH;Algorithm using negatives values -TP_WAVELET_OPACITY;Opacity blue-yellow -TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -TP_WAVELET_OPACITYWL;Local contrast -TP_WAVELET_OPACITYWL_TOOLTIP;Modify the final local contrast at the end of the wavelet treatment.\n\nThe left side represents the smallest local contrast, progressing to the largest local contrast on the right. -TP_WAVELET_PASTEL;Pastel chroma -TP_WAVELET_PROC;Process -TP_WAVELET_PROTAB;Protection -TP_WAVELET_QUAAGRES;Agressive -TP_WAVELET_QUACONSER;Conservative -TP_WAVELET_RADIUS;Radius shadows - highlight -TP_WAVELET_RANGEAB;Range a and b % -TP_WAVELET_RE1;Reinforced -TP_WAVELET_RE2;Unchanged -TP_WAVELET_RE3;Reduced -TP_WAVELET_RESBLUR;Blur luminance -TP_WAVELET_RESBLURC;Blur chroma -TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500% -TP_WAVELET_RESCHRO;Strength -TP_WAVELET_RESCON;Shadows -TP_WAVELET_RESCONH;Highlights -TP_WAVELET_RESID;Residual Image -TP_WAVELET_SAT;Saturated chroma -TP_WAVELET_SETTINGS;Wavelet Settings -TP_WAVELET_SHA;Sharp mask -TP_WAVELET_SHFRAME;Shadows/Highlights -TP_WAVELET_SHOWMASK;Show wavelet 'mask' -TP_WAVELET_SIGMA;Attenuation response -TP_WAVELET_SIGM;Radius -TP_WAVELET_SIGMAFIN;Attenuation response -TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values -TP_WAVELET_SKIN;Skin targetting/protection -TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. -TP_WAVELET_SKY;Hue targetting/protection -TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. -TP_WAVELET_SOFTRAD;Soft radius -TP_WAVELET_STREN;Refine -TP_WAVELET_STREND;Strength -TP_WAVELET_STRENGTH;Strength -TP_WAVELET_SUPE;Extra -TP_WAVELET_THR;Shadows threshold -TP_WAVELET_THREND;Local contrast threshold -TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained -//TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped denoise curve based on local contrast.\nReduces noise in uniform areas and preserves image structure -TP_WAVELET_THRESHOLD;Finer levels -TP_WAVELET_THRESHOLD2;Coarser levels -TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of ‘wavelet levels’ will be affected by the Shadow luminance range. -TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. -TP_WAVELET_THRESWAV;Balance threshold -TP_WAVELET_THRH;Highlights threshold -TP_WAVELET_TILESBIG;Tiles -TP_WAVELET_TILESFULL;Full image -TP_WAVELET_TILESIZE;Tiling method -TP_WAVELET_TILESLIT;Little tiles -TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements. -TP_WAVELET_TMEDGS;Edge stopping -TP_WAVELET_TMSCALE;Scale -TP_WAVELET_TMSTRENGTH;Compression strength -TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. -TP_WAVELET_TMTYPE;Compression method -TP_WAVELET_TON;Toning -TP_WAVELET_TONFRAME;Excluded colors -TP_WAVELET_USH;None -TP_WAVELET_USHARP;Clarity method -TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\nWavelet : the source file is the file including wavelet threatment -TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. -TP_WAVELET_WAVLOWTHR;Low contrast threshold -TP_WAVELET_WAVOFFSET;Offset -TP_WBALANCE_AUTO;Auto -TP_WBALANCE_AUTOITCGREEN;Temperature correlation -TP_WBALANCE_AUTOOLD;RGB grey -TP_WBALANCE_AUTO_HEADER;Automatic -TP_WBALANCE_CAMERA;Camera -TP_WBALANCE_CLOUDY;Cloudy -TP_WBALANCE_CUSTOM;Custom -TP_WBALANCE_DAYLIGHT;Daylight (sunny) -TP_WBALANCE_EQBLUERED;Blue/Red equalizer -TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behavior of "white balance" by modulating the blue/red balance.\nThis can be useful when shooting conditions:\na) are far from the standard illuminant (e.g. underwater),\nb) are far from conditions where calibrations were performed,\nc) where the matrices or ICC profiles are unsuitable. -TP_WBALANCE_FLASH55;Leica -TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus -TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta -TP_WBALANCE_FLASH_HEADER;Flash -TP_WBALANCE_FLUO1;F1 - Daylight -TP_WBALANCE_FLUO2;F2 - Cool White -TP_WBALANCE_FLUO3;F3 - White -TP_WBALANCE_FLUO4;F4 - Warm White -TP_WBALANCE_FLUO5;F5 - Daylight -TP_WBALANCE_FLUO6;F6 - Lite White -TP_WBALANCE_FLUO7;F7 - D65 Daylight Simulator -TP_WBALANCE_FLUO8;F8 - D50 / Sylvania F40 Design -TP_WBALANCE_FLUO9;F9 - Cool White Deluxe -TP_WBALANCE_FLUO10;F10 - Philips TL85 -TP_WBALANCE_FLUO11;F11 - Philips TL84 -TP_WBALANCE_FLUO12;F12 - Philips TL83 -TP_WBALANCE_FLUO_HEADER;Fluorescent -TP_WBALANCE_GREEN;Tint -TP_WBALANCE_GTI;GTI -TP_WBALANCE_HMI;HMI -TP_WBALANCE_JUDGEIII;JudgeIII -TP_WBALANCE_LABEL;White Balance -TP_WBALANCE_LAMP_HEADER;Lamp -TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 -TP_WBALANCE_LED_HEADER;LED -TP_WBALANCE_LED_LSI;LSI Lumelex 2040 -TP_WBALANCE_METHOD;Method -TP_WBALANCE_PICKER;Pick -TP_WBALANCE_SHADE;Shade -TP_WBALANCE_SIZE;Size: -TP_WBALANCE_SOLUX35;Solux 3500K -TP_WBALANCE_SOLUX41;Solux 4100K -TP_WBALANCE_SOLUX47;Solux 4700K (vendor) -TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) -TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. -TP_WBALANCE_STUDLABEL;Correlation factor: %1 -TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. -TP_WBALANCE_TEMPBIAS;AWB temperature bias -TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". -TP_WBALANCE_TEMPERATURE;Temperature -TP_WBALANCE_TUNGSTEN;Tungsten -TP_WBALANCE_WATER1;UnderWater 1 -TP_WBALANCE_WATER2;UnderWater 2 -TP_WBALANCE_WATER_HEADER;UnderWater -ZOOMPANEL_100;(100%) -ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window -ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f -ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f -ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + -ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - - -#00 default translation file -#01 Developers should add translations to this file and then run the 'generateTranslationDiffs' Bash script to update other locales. -#02 Translators please append a comment here with the current date and your name(s) as used in the RawTherapee forum or GitHub page, e.g.: -#03 2525-12-24 Zager and Evans - -ABOUT_TAB_BUILD;Version -ABOUT_TAB_CREDITS;Credits -ABOUT_TAB_LICENSE;License -ABOUT_TAB_RELEASENOTES;Release Notes -ABOUT_TAB_SPLASH;Splash -ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. -BATCH_PROCESSING;Batch Processing -CURVEEDITOR_AXIS_IN;I: -CURVEEDITOR_AXIS_LEFT_TAN;LT: -CURVEEDITOR_AXIS_OUT;O: -CURVEEDITOR_AXIS_RIGHT_TAN;RT: -CURVEEDITOR_CATMULLROM;Flexible -CURVEEDITOR_CURVE;Curve -CURVEEDITOR_CURVES;Curves -CURVEEDITOR_CUSTOM;Standard -CURVEEDITOR_DARKS;Darks -CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node. -CURVEEDITOR_HIGHLIGHTS;Highlights -CURVEEDITOR_LIGHTS;Lights -CURVEEDITOR_LINEAR;Linear -CURVEEDITOR_LOADDLGLABEL;Load curve -CURVEEDITOR_MINMAXCPOINTS;Equalizer -CURVEEDITOR_NURBS;Control cage -CURVEEDITOR_PARAMETRIC;Parametric -CURVEEDITOR_SAVEDLGLABEL;Save curve... -CURVEEDITOR_SHADOWS;Shadows -CURVEEDITOR_TOOLTIPCOPY;Copy current curve to clipboard. -CURVEEDITOR_TOOLTIPLINEAR;Reset curve to linear. -CURVEEDITOR_TOOLTIPLOAD;Load a curve from file. -CURVEEDITOR_TOOLTIPPASTE;Paste curve from clipboard. -CURVEEDITOR_TOOLTIPSAVE;Save current curve. -CURVEEDITOR_TYPE;Type: -DIRBROWSER_FOLDERS;Folders -DONT_SHOW_AGAIN;Don't show this message again. -DYNPROFILEEDITOR_DELETE;Delete -DYNPROFILEEDITOR_EDIT;Edit -DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule -DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. -DYNPROFILEEDITOR_IMGTYPE_ANY;Any -DYNPROFILEEDITOR_IMGTYPE_HDR;HDR -DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift -DYNPROFILEEDITOR_IMGTYPE_STD;Standard -DYNPROFILEEDITOR_MOVE_DOWN;Move Down -DYNPROFILEEDITOR_MOVE_UP;Move Up -DYNPROFILEEDITOR_NEW;New -DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule -DYNPROFILEEDITOR_PROFILE;Processing Profile -EDITWINDOW_TITLE;Image Edit -EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. -EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. -EXIFFILTER_APERTURE;Aperture -EXIFFILTER_CAMERA;Camera -EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) -EXIFFILTER_FILETYPE;File type -EXIFFILTER_FOCALLEN;Focal length -EXIFFILTER_IMAGETYPE;Image type -EXIFFILTER_ISO;ISO -EXIFFILTER_LENS;Lens -EXIFFILTER_METADATAFILTER;Enable metadata filters -EXIFFILTER_SHUTTER;Shutter -EXIFPANEL_ADDEDIT;Add/Edit -EXIFPANEL_ADDEDITHINT;Add new tag or edit tag. -EXIFPANEL_ADDTAGDLG_ENTERVALUE;Enter value -EXIFPANEL_ADDTAGDLG_SELECTTAG;Select tag -EXIFPANEL_ADDTAGDLG_TITLE;Add/Edit Tag -EXIFPANEL_KEEP;Keep -EXIFPANEL_KEEPHINT;Keep the selected tags when writing output file. -EXIFPANEL_REMOVE;Remove -EXIFPANEL_REMOVEHINT;Remove the selected tags when writing output file. -EXIFPANEL_RESET;Reset -EXIFPANEL_RESETALL;Reset All -EXIFPANEL_RESETALLHINT;Reset all tags to their original values. -EXIFPANEL_RESETHINT;Reset the selected tags to their original values. -EXIFPANEL_SHOWALL;Show all -EXIFPANEL_SUBDIRECTORY;Subdirectory -EXPORT_BYPASS;Processing steps to bypass -EXPORT_BYPASS_ALL;Select / Unselect All -EXPORT_BYPASS_DEFRINGE;Bypass Defringe -EXPORT_BYPASS_DIRPYRDENOISE;Bypass Noise Reduction -EXPORT_BYPASS_DIRPYREQUALIZER;Bypass Contrast by Detail Levels -EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels -EXPORT_BYPASS_RAW_CA;Bypass [raw] Chromatic Aberration Correction -EXPORT_BYPASS_RAW_CCSTEPS;Bypass [raw] False Color Suppression -EXPORT_BYPASS_RAW_DCB_ENHANCE;Bypass [raw] DCB Enhancement Steps -EXPORT_BYPASS_RAW_DCB_ITERATIONS;Bypass [raw] DCB Iterations -EXPORT_BYPASS_RAW_DF;Bypass [raw] Dark-Frame -EXPORT_BYPASS_RAW_FF;Bypass [raw] Flat-Field -EXPORT_BYPASS_RAW_GREENTHRESH;Bypass [raw] Green Equilibration -EXPORT_BYPASS_RAW_LINENOISE;Bypass [raw] Line Noise Filter -EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Bypass [raw] LMMSE Enhancement Steps -EXPORT_BYPASS_SHARPENEDGE;Bypass Edge Sharpening -EXPORT_BYPASS_SHARPENING;Bypass Sharpening -EXPORT_BYPASS_SHARPENMICRO;Bypass Microcontrast -EXPORT_FASTEXPORTOPTIONS;Fast Export Options -EXPORT_INSTRUCTIONS;Fast Export options provide overrides to bypass time and resource consuming development settings and to run queue processing using the fast export settings instead. This method is recommended for quicker generation of lower resolution images when speed is a priority or when resized output is desired for one or many images without making modifications to their saved development parameters. -EXPORT_MAXHEIGHT;Maximum height: -EXPORT_MAXWIDTH;Maximum width: -EXPORT_PIPELINE;Processing pipeline -EXPORT_PUTTOQUEUEFAST; Put to queue for fast export -EXPORT_RAW_DMETHOD;Demosaic method -EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) -EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. -EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) -EXTPROGTARGET_1;raw -EXTPROGTARGET_2;queue-processed -FILEBROWSER_APPLYPROFILE;Apply -FILEBROWSER_APPLYPROFILE_PARTIAL;Apply - partial -FILEBROWSER_AUTODARKFRAME;Auto dark-frame -FILEBROWSER_AUTOFLATFIELD;Auto flat-field -FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. -FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory -FILEBROWSER_CACHE;Cache -FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles -FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles -FILEBROWSER_CLEARPROFILE;Clear -FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple -FILEBROWSER_COPYPROFILE;Copy -FILEBROWSER_CURRENT_NAME;Current name: -FILEBROWSER_DARKFRAME;Dark-frame -FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? -FILEBROWSER_DELETEDIALOG_HEADER;File delete confirmation: -FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? -FILEBROWSER_EMPTYTRASH;Empty trash -FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. -FILEBROWSER_EXTPROGMENU;Open with -FILEBROWSER_FLATFIELD;Flat-Field -FILEBROWSER_MOVETODARKFDIR;Move to dark-frames directory -FILEBROWSER_MOVETOFLATFIELDDIR;Move to flat-fields directory -FILEBROWSER_NEW_NAME;New name: -FILEBROWSER_OPENDEFAULTVIEWER;Windows default viewer (queue-processed) -FILEBROWSER_PARTIALPASTEPROFILE;Paste - partial -FILEBROWSER_PASTEPROFILE;Paste -FILEBROWSER_POPUPCANCELJOB;Cancel job -FILEBROWSER_POPUPCOLORLABEL;Color label -FILEBROWSER_POPUPCOLORLABEL0;Label: None -FILEBROWSER_POPUPCOLORLABEL1;Label: Red -FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow -FILEBROWSER_POPUPCOLORLABEL3;Label: Green -FILEBROWSER_POPUPCOLORLABEL4;Label: Blue -FILEBROWSER_POPUPCOLORLABEL5;Label: Purple -FILEBROWSER_POPUPCOPYTO;Copy to... -FILEBROWSER_POPUPFILEOPERATIONS;File operations -FILEBROWSER_POPUPMOVEEND;Move to end of queue -FILEBROWSER_POPUPMOVEHEAD;Move to head of queue -FILEBROWSER_POPUPMOVETO;Move to... -FILEBROWSER_POPUPOPEN;Open -FILEBROWSER_POPUPOPENINEDITOR;Open in Editor -FILEBROWSER_POPUPPROCESS;Put to queue -FILEBROWSER_POPUPPROCESSFAST;Put to queue (Fast export) -FILEBROWSER_POPUPPROFILEOPERATIONS;Processing profile operations -FILEBROWSER_POPUPRANK;Rank -FILEBROWSER_POPUPRANK0;Unrank -FILEBROWSER_POPUPRANK1;Rank 1 * -FILEBROWSER_POPUPRANK2;Rank 2 ** -FILEBROWSER_POPUPRANK3;Rank 3 *** -FILEBROWSER_POPUPRANK4;Rank 4 **** -FILEBROWSER_POPUPRANK5;Rank 5 ***** -FILEBROWSER_POPUPREMOVE;Delete permanently -FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version -FILEBROWSER_POPUPRENAME;Rename -FILEBROWSER_POPUPSELECTALL;Select all -FILEBROWSER_POPUPTRASH;Move to trash -FILEBROWSER_POPUPUNRANK;Unrank -FILEBROWSER_POPUPUNTRASH;Remove from trash -FILEBROWSER_QUERYBUTTONHINT;Clear the Find query -FILEBROWSER_QUERYHINT;Type filenames to search for. Supports partial filenames. Separate the search terms using commas, e.g.\n1001,1004,1199\n\nExclude search terms by prefixing them with !=\ne.g.\n!=1001,1004,1199\n\nShortcuts:\nCtrl-f - focus the Find box,\nEnter - search,\nEsc - clear the Find box,\nShift-Esc - defocus the Find box. -FILEBROWSER_QUERYLABEL; Find: -FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nShortcut: Shift-1 -FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nShortcut: Shift-2 -FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nShortcut: Shift-3 -FILEBROWSER_RANK4_TOOLTIP;Rank 4 *\nShortcut: Shift-4 -FILEBROWSER_RANK5_TOOLTIP;Rank 5 *\nShortcut: Shift-5 -FILEBROWSER_RENAMEDLGLABEL;Rename file -FILEBROWSER_RESETDEFAULTPROFILE;Reset to default -FILEBROWSER_SELECTDARKFRAME;Select dark-frame... -FILEBROWSER_SELECTFLATFIELD;Select flat-field... -FILEBROWSER_SHOWCOLORLABEL1HINT;Show images labeled Red.\nShortcut: Alt-1 -FILEBROWSER_SHOWCOLORLABEL2HINT;Show images labeled Yellow.\nShortcut: Alt-2 -FILEBROWSER_SHOWCOLORLABEL3HINT;Show images labeled Green.\nShortcut: Alt-3 -FILEBROWSER_SHOWCOLORLABEL4HINT;Show images labeled Blue.\nShortcut: Alt-4 -FILEBROWSER_SHOWCOLORLABEL5HINT;Show images labeled Purple.\nShortcut: Alt-5 -FILEBROWSER_SHOWDIRHINT;Clear all filters.\nShortcut: d -FILEBROWSER_SHOWEDITEDHINT;Show edited images.\nShortcut: 7 -FILEBROWSER_SHOWEDITEDNOTHINT;Show not edited images.\nShortcut: 6 -FILEBROWSER_SHOWEXIFINFO;Show Exif info.\n\nShortcuts:\ni - Multiple Editor Tabs Mode,\nAlt-i - Single Editor Tab Mode. -FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. -FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. -FILEBROWSER_SHOWRANK1HINT;Show images ranked as 1-star.\nShortcut: 1 -FILEBROWSER_SHOWRANK2HINT;Show images ranked as 2-star.\nShortcut: 2 -FILEBROWSER_SHOWRANK3HINT;Show images ranked as 3-star.\nShortcut: 3 -FILEBROWSER_SHOWRANK4HINT;Show images ranked as 4-star.\nShortcut: 4 -FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5-star.\nShortcut: 5 -FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 -FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 -FILEBROWSER_SHOWTRASHHINT;Show contents of trash.\nShortcut: Ctrl-t -FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -FILEBROWSER_SHOWUNRANKHINT;Show unranked images.\nShortcut: 0 -FILEBROWSER_THUMBSIZE;Thumbnail size -FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 -FILEBROWSER_ZOOMINHINT;Increase thumbnail size.\n\nShortcuts:\n+ - Multiple Editor Tabs Mode,\nAlt-+ - Single Editor Tab Mode. -FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size.\n\nShortcuts:\n- - Multiple Editor Tabs Mode,\nAlt-- - Single Editor Tab Mode. -FILECHOOSER_FILTER_ANY;All files -FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) -FILECHOOSER_FILTER_CURVE;Curve files -FILECHOOSER_FILTER_LCP;Lens correction profiles -FILECHOOSER_FILTER_PP;Processing profiles -FILECHOOSER_FILTER_SAME;Same format as current photo -FILECHOOSER_FILTER_TIFF;TIFF files -GENERAL_ABOUT;About -GENERAL_AFTER;After -GENERAL_APPLY;Apply -GENERAL_ASIMAGE;As Image -GENERAL_AUTO;Automatic -GENERAL_BEFORE;Before -GENERAL_CANCEL;Cancel -GENERAL_CLOSE;Close -GENERAL_CURRENT;Current -GENERAL_DISABLE;Disable -GENERAL_DISABLED;Disabled -GENERAL_ENABLE;Enable -GENERAL_ENABLED;Enabled -GENERAL_FILE;File -GENERAL_HELP;Help -GENERAL_LANDSCAPE;Landscape -GENERAL_NA;n/a -GENERAL_NO;No -GENERAL_NONE;None -GENERAL_OK;OK -GENERAL_OPEN;Open -GENERAL_PORTRAIT;Portrait -GENERAL_RESET;Reset -GENERAL_SAVE;Save -GENERAL_SAVE_AS;Save as... -GENERAL_SLIDER;Slider -GENERAL_UNCHANGED;(Unchanged) -GENERAL_WARNING;Warning -GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. -HISTOGRAM_TOOLTIP_B;Show/Hide blue histogram. -HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. -HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -HISTOGRAM_TOOLTIP_G;Show/Hide green histogram. -HISTOGRAM_TOOLTIP_L;Show/Hide CIELab luminance histogram. -HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. -HISTOGRAM_TOOLTIP_R;Show/Hide red histogram. -HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. -HISTORY_CHANGED;Changed -HISTORY_CUSTOMCURVE;Custom curve -HISTORY_FROMCLIPBOARD;From clipboard -HISTORY_LABEL;History -HISTORY_MSG_1;Photo loaded -HISTORY_MSG_2;PP3 loaded -HISTORY_MSG_3;PP3 changed -HISTORY_MSG_4;History browsing -HISTORY_MSG_5;Exposure - Lightness -HISTORY_MSG_6;Exposure - Contrast -HISTORY_MSG_7;Exposure - Black -HISTORY_MSG_8;Exposure - Compensation -HISTORY_MSG_9;Exposure - Highlight compression -HISTORY_MSG_10;Exposure - Shadow compression -HISTORY_MSG_11;Exposure - Tone curve 1 -HISTORY_MSG_12;Exposure - Auto levels -HISTORY_MSG_13;Exposure - Clip -HISTORY_MSG_14;L*a*b* - Lightness -HISTORY_MSG_15;L*a*b* - Contrast -HISTORY_MSG_16;- -HISTORY_MSG_17;- -HISTORY_MSG_18;- -HISTORY_MSG_19;L*a*b* - L* curve -HISTORY_MSG_20;Sharpening -HISTORY_MSG_21;USM - Radius -HISTORY_MSG_22;USM - Amount -HISTORY_MSG_23;USM - Threshold -HISTORY_MSG_24;USM - Sharpen only edges -HISTORY_MSG_25;USM - Edge detection radius -HISTORY_MSG_26;USM - Edge tolerance -HISTORY_MSG_27;USM - Halo control -HISTORY_MSG_28;USM - Halo control amount -HISTORY_MSG_29;Sharpening - Method -HISTORY_MSG_30;RLD - Radius -HISTORY_MSG_31;RLD - Amount -HISTORY_MSG_32;RLD - Damping -HISTORY_MSG_33;RLD - Iterations -HISTORY_MSG_34;Lens Correction - Distortion -HISTORY_MSG_35;Lens Correction - Vignetting -HISTORY_MSG_36;Lens Correction - CA -HISTORY_MSG_37;Exposure - Auto levels -HISTORY_MSG_38;White Balance - Method -HISTORY_MSG_39;WB - Temperature -HISTORY_MSG_40;WB - Tint -HISTORY_MSG_41;Exposure - Tone curve 1 mode -HISTORY_MSG_42;Exposure - Tone curve 2 -HISTORY_MSG_43;Exposure - Tone curve 2 mode -HISTORY_MSG_44;Lum. denoising radius -HISTORY_MSG_45;Lum. denoising edge tolerance -HISTORY_MSG_46;Color denoising -HISTORY_MSG_47;Blend ICC highlights with matrix -HISTORY_MSG_48;DCP - Tone curve -HISTORY_MSG_49;DCP illuminant -HISTORY_MSG_50;Shadows/Highlights -HISTORY_MSG_51;S/H - Highlights -HISTORY_MSG_52;S/H - Shadows -HISTORY_MSG_53;S/H - Highlights tonal width -HISTORY_MSG_54;S/H - Shadows tonal width -HISTORY_MSG_55;S/H - Local contrast -HISTORY_MSG_56;S/H - Radius -HISTORY_MSG_57;Coarse rotation -HISTORY_MSG_58;Horizontal flipping -HISTORY_MSG_59;Vertical flipping -HISTORY_MSG_60;Rotation -HISTORY_MSG_61;Auto-fill -HISTORY_MSG_62;Distortion correction -HISTORY_MSG_63;Snapshot selected -HISTORY_MSG_64;Crop -HISTORY_MSG_65;CA correction -HISTORY_MSG_66;Exposure - Highlight reconstruction -HISTORY_MSG_67;Exposure - HLR amount -HISTORY_MSG_68;Exposure - HLR method -HISTORY_MSG_69;Working color space -HISTORY_MSG_70;Output color space -HISTORY_MSG_71;Input color space -HISTORY_MSG_72;VC - Amount -HISTORY_MSG_73;Channel Mixer -HISTORY_MSG_74;Resize - Scale -HISTORY_MSG_75;Resize - Method -HISTORY_MSG_76;Exif metadata -HISTORY_MSG_77;IPTC metadata -HISTORY_MSG_78;- -HISTORY_MSG_79;Resize - Width -HISTORY_MSG_80;Resize - Height -HISTORY_MSG_81;Resize -HISTORY_MSG_82;Profile changed -HISTORY_MSG_83;S/H - Sharp mask -HISTORY_MSG_84;Perspective correction -HISTORY_MSG_85;Lens Correction - LCP file -HISTORY_MSG_86;RGB Curves - Luminosity mode -HISTORY_MSG_87;Impulse Noise Reduction -HISTORY_MSG_88;Impulse NR threshold -HISTORY_MSG_89;Noise Reduction -HISTORY_MSG_90;NR - Luminance -HISTORY_MSG_91;NR - Chrominance master -HISTORY_MSG_92;NR - Gamma -HISTORY_MSG_93;CbDL - Value -HISTORY_MSG_94;Contrast by Detail Levels -HISTORY_MSG_95;L*a*b* - Chromaticity -HISTORY_MSG_96;L*a*b* - a* curve -HISTORY_MSG_97;L*a*b* - b* curve -HISTORY_MSG_98;Demosaicing method -HISTORY_MSG_99;Hot pixel filter -HISTORY_MSG_100;Exposure - Saturation -HISTORY_MSG_101;HSV - Hue -HISTORY_MSG_102;HSV - Saturation -HISTORY_MSG_103;HSV - Value -HISTORY_MSG_104;HSV Equalizer -HISTORY_MSG_105;Defringe -HISTORY_MSG_106;Defringe - Radius -HISTORY_MSG_107;Defringe - Threshold -HISTORY_MSG_108;Exposure - HLC threshold -HISTORY_MSG_109;Resize - Bounding box -HISTORY_MSG_110;Resize - Applies to -HISTORY_MSG_111;L*a*b* - Avoid color shift -HISTORY_MSG_112;--unused-- -HISTORY_MSG_113;L*a*b* - Red/skin prot. -HISTORY_MSG_114;DCB iterations -HISTORY_MSG_115;False color suppression -HISTORY_MSG_116;DCB enhancement -HISTORY_MSG_117;Raw CA correction - Red -HISTORY_MSG_118;Raw CA correction - Blue -HISTORY_MSG_119;Line noise filter -HISTORY_MSG_120;Green equilibration -HISTORY_MSG_121;Raw CA Correction - Auto -HISTORY_MSG_122;Dark-Frame - Auto-selection -HISTORY_MSG_123;Dark-Frame - File -HISTORY_MSG_124;White point correction -HISTORY_MSG_126;Flat-Field - File -HISTORY_MSG_127;Flat-Field - Auto-selection -HISTORY_MSG_128;Flat-Field - Blur radius -HISTORY_MSG_129;Flat-Field - Blur type -HISTORY_MSG_130;Auto distortion correction -HISTORY_MSG_131;NR - Luma -HISTORY_MSG_132;NR - Chroma -HISTORY_MSG_133;Output gamma -HISTORY_MSG_134;Free gamma -HISTORY_MSG_135;Free gamma -HISTORY_MSG_136;Free gamma slope -HISTORY_MSG_137;Black level - Green 1 -HISTORY_MSG_138;Black level - Red -HISTORY_MSG_139;Black level - Blue -HISTORY_MSG_140;Black level - Green 2 -HISTORY_MSG_141;Black level - Link greens -HISTORY_MSG_142;ES - Iterations -HISTORY_MSG_143;ES - Quantity -HISTORY_MSG_144;Microcontrast - Quantity -HISTORY_MSG_145;Microcontrast - Uniformity -HISTORY_MSG_146;Edge sharpening -HISTORY_MSG_147;ES - Luminance only -HISTORY_MSG_148;Microcontrast -HISTORY_MSG_149;Microcontrast - 3×3 matrix -HISTORY_MSG_150;Post-demosaic artifact/noise red. -HISTORY_MSG_151;Vibrance -HISTORY_MSG_152;Vib - Pastel tones -HISTORY_MSG_153;Vib - Saturated tones -HISTORY_MSG_154;Vib - Protect skin-tones -HISTORY_MSG_155;Vib - Avoid color shift -HISTORY_MSG_156;Vib - Link pastel/saturated -HISTORY_MSG_157;Vib - P/S threshold -HISTORY_MSG_158;TM - Strength -HISTORY_MSG_159;TM - Edge stopping -HISTORY_MSG_160;TM - Scale -HISTORY_MSG_161;TM - Reweighting iterates -HISTORY_MSG_162;Tone Mapping -HISTORY_MSG_163;RGB Curves - Red -HISTORY_MSG_164;RGB Curves - Green -HISTORY_MSG_165;RGB Curves - Blue -HISTORY_MSG_166;Exposure - Reset -HISTORY_MSG_167;Demosaicing method -HISTORY_MSG_168;L*a*b* - CC curve -HISTORY_MSG_169;L*a*b* - CH curve -HISTORY_MSG_170;Vibrance - HH curve -HISTORY_MSG_171;L*a*b* - LC curve -HISTORY_MSG_172;L*a*b* - Restrict LC -HISTORY_MSG_173;NR - Detail recovery -HISTORY_MSG_174;CIECAM02 -HISTORY_MSG_175;CAM02 - CAT02 adaptation -HISTORY_MSG_176;CAM02 - Viewing surround -HISTORY_MSG_177;CAM02 - Scene luminosity -HISTORY_MSG_178;CAM02 - Viewing luminosity -HISTORY_MSG_179;CAM02 - White-point model -HISTORY_MSG_180;CAM02 - Lightness (J) -HISTORY_MSG_181;CAM02 - Chroma (C) -HISTORY_MSG_182;CAM02 - Automatic CAT02 -HISTORY_MSG_183;CAM02 - Contrast (J) -HISTORY_MSG_184;CAM02 - Scene surround -HISTORY_MSG_185;CAM02 - Gamut control -HISTORY_MSG_186;CAM02 - Algorithm -HISTORY_MSG_187;CAM02 - Red/skin prot. -HISTORY_MSG_188;CAM02 - Brightness (Q) -HISTORY_MSG_189;CAM02 - Contrast (Q) -HISTORY_MSG_190;CAM02 - Saturation (S) -HISTORY_MSG_191;CAM02 - Colorfulness (M) -HISTORY_MSG_192;CAM02 - Hue (h) -HISTORY_MSG_193;CAM02 - Tone curve 1 -HISTORY_MSG_194;CAM02 - Tone curve 2 -HISTORY_MSG_195;CAM02 - Tone curve 1 -HISTORY_MSG_196;CAM02 - Tone curve 2 -HISTORY_MSG_197;CAM02 - Color curve -HISTORY_MSG_198;CAM02 - Color curve -HISTORY_MSG_199;CAM02 - Output histograms -HISTORY_MSG_200;CAM02 - Tone mapping -HISTORY_MSG_201;NR - Chrominance - R&G -HISTORY_MSG_202;NR - Chrominance - B&Y -HISTORY_MSG_203;NR - Color space -HISTORY_MSG_204;LMMSE enhancement steps -HISTORY_MSG_205;CAM02 - Hot/bad pixel filter -HISTORY_MSG_206;CAT02 - Auto scene luminosity -HISTORY_MSG_207;Defringe - Hue curve -HISTORY_MSG_208;WB - B/R equalizer -HISTORY_MSG_210;GF - Angle -HISTORY_MSG_211;Graduated Filter -HISTORY_MSG_212;VF - Strength -HISTORY_MSG_213;Vignette Filter -HISTORY_MSG_214;Black-and-White -HISTORY_MSG_215;B&W - CM - Red -HISTORY_MSG_216;B&W - CM - Green -HISTORY_MSG_217;B&W - CM - Blue -HISTORY_MSG_218;B&W - Gamma - Red -HISTORY_MSG_219;B&W - Gamma - Green -HISTORY_MSG_220;B&W - Gamma - Blue -HISTORY_MSG_221;B&W - Color filter -HISTORY_MSG_222;B&W - Presets -HISTORY_MSG_223;B&W - CM - Orange -HISTORY_MSG_224;B&W - CM - Yellow -HISTORY_MSG_225;B&W - CM - Cyan -HISTORY_MSG_226;B&W - CM - Magenta -HISTORY_MSG_227;B&W - CM - Purple -HISTORY_MSG_228;B&W - Luminance equalizer -HISTORY_MSG_229;B&W - Luminance equalizer -HISTORY_MSG_230;B&W - Mode -HISTORY_MSG_231;B&W - 'Before' curve -HISTORY_MSG_232;B&W - 'Before' curve type -HISTORY_MSG_233;B&W - 'After' curve -HISTORY_MSG_234;B&W - 'After' curve type -HISTORY_MSG_235;B&W - CM - Auto -HISTORY_MSG_236;--unused-- -HISTORY_MSG_237;B&W - CM -HISTORY_MSG_238;GF - Feather -HISTORY_MSG_239;GF - Strength -HISTORY_MSG_240;GF - Center -HISTORY_MSG_241;VF - Feather -HISTORY_MSG_242;VF - Roundness -HISTORY_MSG_243;VC - Radius -HISTORY_MSG_244;VC - Strength -HISTORY_MSG_245;VC - Center -HISTORY_MSG_246;L*a*b* - CL curve -HISTORY_MSG_247;L*a*b* - LH curve -HISTORY_MSG_248;L*a*b* - HH curve -HISTORY_MSG_249;CbDL - Threshold -HISTORY_MSG_250;NR - Enhanced -HISTORY_MSG_251;B&W - Algorithm -HISTORY_MSG_252;CbDL - Skin tar/prot -HISTORY_MSG_253;CbDL - Reduce artifacts -HISTORY_MSG_254;CbDL - Skin hue -HISTORY_MSG_255;NR - Median filter -HISTORY_MSG_256;NR - Median - Type -HISTORY_MSG_257;Color Toning -HISTORY_MSG_258;CT - Color curve -HISTORY_MSG_259;CT - Opacity curve -HISTORY_MSG_260;CT - a*[b*] opacity -HISTORY_MSG_261;CT - Method -HISTORY_MSG_262;CT - b* opacity -HISTORY_MSG_263;CT - Shadows - Red -HISTORY_MSG_264;CT - Shadows - Green -HISTORY_MSG_265;CT - Shadows - Blue -HISTORY_MSG_266;CT - Mid - Red -HISTORY_MSG_267;CT - Mid - Green -HISTORY_MSG_268;CT - Mid - Blue -HISTORY_MSG_269;CT - High - Red -HISTORY_MSG_270;CT - High - Green -HISTORY_MSG_271;CT - High - Blue -HISTORY_MSG_272;CT - Balance -HISTORY_MSG_273;CT - Color Balance SMH -HISTORY_MSG_274;CT - Sat. Shadows -HISTORY_MSG_275;CT - Sat. Highlights -HISTORY_MSG_276;CT - Opacity -HISTORY_MSG_277;--unused-- -HISTORY_MSG_278;CT - Preserve luminance -HISTORY_MSG_279;CT - Shadows -HISTORY_MSG_280;CT - Highlights -HISTORY_MSG_281;CT - Sat. strength -HISTORY_MSG_282;CT - Sat. threshold -HISTORY_MSG_283;CT - Strength -HISTORY_MSG_284;CT - Auto sat. protection -HISTORY_MSG_285;NR - Median - Method -HISTORY_MSG_286;NR - Median - Type -HISTORY_MSG_287;NR - Median - Iterations -HISTORY_MSG_288;Flat-Field - Clip control -HISTORY_MSG_289;Flat-Field - Clip control - Auto -HISTORY_MSG_290;Black Level - Red -HISTORY_MSG_291;Black Level - Green -HISTORY_MSG_292;Black Level - Blue -HISTORY_MSG_293;Film Simulation -HISTORY_MSG_294;Film Simulation - Strength -HISTORY_MSG_295;Film Simulation - Film -HISTORY_MSG_296;NR - Luminance curve -HISTORY_MSG_297;NR - Mode -HISTORY_MSG_298;Dead pixel filter -HISTORY_MSG_299;NR - Chrominance curve -HISTORY_MSG_300;- -HISTORY_MSG_301;NR - Luma control -HISTORY_MSG_302;NR - Chroma method -HISTORY_MSG_303;NR - Chroma method -HISTORY_MSG_304;W - Contrast levels -HISTORY_MSG_305;Wavelet Levels -HISTORY_MSG_306;W - Process -HISTORY_MSG_307;W - Process -HISTORY_MSG_308;W - Process direction -HISTORY_MSG_309;W - ES - Detail -HISTORY_MSG_310;W - Residual - Sky tar/prot -HISTORY_MSG_311;W - Wavelet levels -HISTORY_MSG_312;W - Residual - Shadows threshold -HISTORY_MSG_313;W - Chroma - Sat/past -HISTORY_MSG_314;W - Gamut - Reduce artifacts -HISTORY_MSG_315;W - Residual - Contrast -HISTORY_MSG_316;W - Gamut - Skin tar/prot -HISTORY_MSG_317;W - Gamut - Skin hue -HISTORY_MSG_318;W - Contrast - Finer levels -HISTORY_MSG_319;W - Contrast - Finer range -HISTORY_MSG_320;W - Contrast - Coarser range -HISTORY_MSG_321;W - Contrast - Coarser levels -HISTORY_MSG_322;W - Gamut - Avoid color shift -HISTORY_MSG_323;W - ES - Local contrast -HISTORY_MSG_324;W - Chroma - Pastel -HISTORY_MSG_325;W - Chroma - Saturated -HISTORY_MSG_326;W - Chroma - Method -HISTORY_MSG_327;W - Contrast - Apply to -HISTORY_MSG_328;W - Chroma - Link strength -HISTORY_MSG_329;W - Toning - Opacity RG -HISTORY_MSG_330;W - Toning - Opacity BY -HISTORY_MSG_331;W - Contrast levels - Extra -HISTORY_MSG_332;W - Tiling method -HISTORY_MSG_333;W - Residual - Shadows -HISTORY_MSG_334;W - Residual - Chroma -HISTORY_MSG_335;W - Residual - Highlights -HISTORY_MSG_336;W - Residual - Highlights threshold -HISTORY_MSG_337;W - Residual - Sky hue -HISTORY_MSG_338;W - ES - Radius -HISTORY_MSG_339;W - ES - Strength -HISTORY_MSG_340;W - Strength -HISTORY_MSG_341;W - Edge performance -HISTORY_MSG_342;W - ES - First level -HISTORY_MSG_343;W - Chroma levels -HISTORY_MSG_344;W - Meth chroma sl/cur -HISTORY_MSG_345;W - ES - Local contrast -HISTORY_MSG_346;W - ES - Local contrast method -HISTORY_MSG_347;W - Denoise - Level 1 -HISTORY_MSG_348;W - Denoise - Level 2 -HISTORY_MSG_349;W - Denoise - Level 3 -HISTORY_MSG_350;W - ES - Edge detection -HISTORY_MSG_351;W - Residual - HH curve -HISTORY_MSG_352;W - Background -HISTORY_MSG_353;W - ES - Gradient sensitivity -HISTORY_MSG_354;W - ES - Enhanced -HISTORY_MSG_355;W - ES - Threshold low -HISTORY_MSG_356;W - ES - Threshold high -HISTORY_MSG_357;W - Denoise - Link with ES -HISTORY_MSG_358;W - Gamut - CH -HISTORY_MSG_359;Hot/Dead - Threshold -HISTORY_MSG_360;TM - Gamma -HISTORY_MSG_361;W - Final - Chroma balance -HISTORY_MSG_362;W - Residual - Compression method -HISTORY_MSG_363;W - Residual - Compression strength -HISTORY_MSG_364;W - Final - Contrast balance -HISTORY_MSG_365;W - Final - Delta balance -HISTORY_MSG_366;W - Residual - Compression gamma -HISTORY_MSG_367;W - Final - 'After' contrast curve -HISTORY_MSG_368;W - Final - Contrast balance -HISTORY_MSG_369;W - Final - Balance method -HISTORY_MSG_370;W - Final - Local contrast curve -HISTORY_MSG_371;Post-Resize Sharpening -HISTORY_MSG_372;PRS USM - Radius -HISTORY_MSG_373;PRS USM - Amount -HISTORY_MSG_374;PRS USM - Threshold -HISTORY_MSG_375;PRS USM - Sharpen only edges -HISTORY_MSG_376;PRS USM - Edge detection radius -HISTORY_MSG_377;PRS USM - Edge tolerance -HISTORY_MSG_378;PRS USM - Halo control -HISTORY_MSG_379;PRS USM - Halo control amount -HISTORY_MSG_380;PRS - Method -HISTORY_MSG_381;PRS RLD - Radius -HISTORY_MSG_382;PRS RLD - Amount -HISTORY_MSG_383;PRS RLD - Damping -HISTORY_MSG_384;PRS RLD - Iterations -HISTORY_MSG_385;W - Residual - Color balance -HISTORY_MSG_386;W - Residual - CB green high -HISTORY_MSG_387;W - Residual - CB blue high -HISTORY_MSG_388;W - Residual - CB green mid -HISTORY_MSG_389;W - Residual - CB blue mid -HISTORY_MSG_390;W - Residual - CB green low -HISTORY_MSG_391;W - Residual - CB blue low -HISTORY_MSG_392;W - Residual - Color balance -HISTORY_MSG_393;DCP - Look table -HISTORY_MSG_394;DCP - Baseline exposure -HISTORY_MSG_395;DCP - Base table -HISTORY_MSG_396;W - Contrast sub-tool -HISTORY_MSG_397;W - Chroma sub-tool -HISTORY_MSG_398;W - ES sub-tool -HISTORY_MSG_399;W - Residual sub-tool -HISTORY_MSG_400;W - Final sub-tool -HISTORY_MSG_401;W - Toning sub-tool -HISTORY_MSG_402;W - Denoise sub-tool -HISTORY_MSG_403;W - ES - Edge sensitivity -HISTORY_MSG_404;W - ES - Base amplification -HISTORY_MSG_405;W - Denoise - Level 4 -HISTORY_MSG_406;W - ES - Neighboring pixels -HISTORY_MSG_407;Retinex - Method -HISTORY_MSG_408;Retinex - Radius -HISTORY_MSG_409;Retinex - Contrast -HISTORY_MSG_410;Retinex - Offset -HISTORY_MSG_411;Retinex - Strength -HISTORY_MSG_412;Retinex - Gaussian gradient -HISTORY_MSG_413;Retinex - Contrast -HISTORY_MSG_414;Retinex - Histogram - Lab -HISTORY_MSG_415;Retinex - Transmission -HISTORY_MSG_416;Retinex -HISTORY_MSG_417;Retinex - Transmission median -HISTORY_MSG_418;Retinex - Threshold -HISTORY_MSG_419;Retinex - Color space -HISTORY_MSG_420;Retinex - Histogram - HSL -HISTORY_MSG_421;Retinex - Gamma -HISTORY_MSG_422;Retinex - Gamma -HISTORY_MSG_423;Retinex - Gamma slope -HISTORY_MSG_424;Retinex - HL threshold -HISTORY_MSG_425;Retinex - Log base -HISTORY_MSG_426;Retinex - Hue equalizer -HISTORY_MSG_427;Output rendering intent -HISTORY_MSG_428;Monitor rendering intent -HISTORY_MSG_429;Retinex - Iterations -HISTORY_MSG_430;Retinex - Transmission gradient -HISTORY_MSG_431;Retinex - Strength gradient -HISTORY_MSG_432;Retinex - M - Highlights -HISTORY_MSG_433;Retinex - M - Highlights TW -HISTORY_MSG_434;Retinex - M - Shadows -HISTORY_MSG_435;Retinex - M - Shadows TW -HISTORY_MSG_436;Retinex - M - Radius -HISTORY_MSG_437;Retinex - M - Method -HISTORY_MSG_438;Retinex - M - Equalizer -HISTORY_MSG_439;Retinex - Process -HISTORY_MSG_440;CbDL - Method -HISTORY_MSG_441;Retinex - Gain transmission -HISTORY_MSG_442;Retinex - Scale -HISTORY_MSG_443;Output black point compensation -HISTORY_MSG_444;WB - Temp bias -HISTORY_MSG_445;Raw Sub-Image -HISTORY_MSG_446;EvPixelShiftMotion -HISTORY_MSG_447;EvPixelShiftMotionCorrection -HISTORY_MSG_448;EvPixelShiftStddevFactorGreen -HISTORY_MSG_449;PS ISO adaption -HISTORY_MSG_450;EvPixelShiftNreadIso -HISTORY_MSG_451;EvPixelShiftPrnu -HISTORY_MSG_452;PS Show motion -HISTORY_MSG_453;PS Show mask only -HISTORY_MSG_454;EvPixelShiftAutomatic -HISTORY_MSG_455;EvPixelShiftNonGreenHorizontal -HISTORY_MSG_456;EvPixelShiftNonGreenVertical -HISTORY_MSG_457;PS Check red/blue -HISTORY_MSG_458;EvPixelShiftStddevFactorRed -HISTORY_MSG_459;EvPixelShiftStddevFactorBlue -HISTORY_MSG_460;EvPixelShiftGreenAmaze -HISTORY_MSG_461;EvPixelShiftNonGreenAmaze -HISTORY_MSG_462;PS Check green -HISTORY_MSG_463;EvPixelShiftRedBlueWeight -HISTORY_MSG_464;PS Blur motion mask -HISTORY_MSG_465;PS Blur radius -HISTORY_MSG_466;EvPixelShiftSum -HISTORY_MSG_467;EvPixelShiftExp0 -HISTORY_MSG_468;PS Fill holes -HISTORY_MSG_469;PS Median -HISTORY_MSG_470;EvPixelShiftMedian3 -HISTORY_MSG_471;PS Motion correction -HISTORY_MSG_472;PS Smooth transitions -HISTORY_MSG_473;PS Use lmmse -HISTORY_MSG_474;PS Equalize -HISTORY_MSG_475;PS Equalize channel -HISTORY_MSG_476;CAM02 - Temp out -HISTORY_MSG_477;CAM02 - Green out -HISTORY_MSG_478;CAM02 - Yb out -HISTORY_MSG_479;CAM02 - CAT02 adaptation out -HISTORY_MSG_480;CAM02 - Automatic CAT02 out -HISTORY_MSG_481;CAM02 - Temp scene -HISTORY_MSG_482;CAM02 - Green scene -HISTORY_MSG_483;CAM02 - Yb scene -HISTORY_MSG_484;CAM02 - Auto Yb scene -HISTORY_MSG_485;Lens Correction -HISTORY_MSG_486;Lens Correction - Camera -HISTORY_MSG_487;Lens Correction - Lens -HISTORY_MSG_488;Dynamic Range Compression -HISTORY_MSG_489;DRC - Detail -HISTORY_MSG_490;DRC - Amount -HISTORY_MSG_491;White Balance -HISTORY_MSG_492;RGB Curves -HISTORY_MSG_493;Local Adjustments -HISTORY_MSG_494;Capture Sharpening -HISTORY_MSG_496;Local Spot deleted -HISTORY_MSG_497;Local Spot selected -HISTORY_MSG_498;Local Spot name -HISTORY_MSG_499;Local Spot visibility -HISTORY_MSG_500;Local Spot shape -HISTORY_MSG_501;Local Spot method -HISTORY_MSG_502;Local Spot shape method -HISTORY_MSG_503;Local Spot locX -HISTORY_MSG_504;Local Spot locXL -HISTORY_MSG_505;Local Spot locY -HISTORY_MSG_506;Local Spot locYT -HISTORY_MSG_507;Local Spot center -HISTORY_MSG_508;Local Spot circrad -HISTORY_MSG_509;Local Spot quality method -HISTORY_MSG_510;Local Spot transition -HISTORY_MSG_511;Local Spot thresh -HISTORY_MSG_512;Local Spot ΔE -decay -HISTORY_MSG_513;Local Spot scope -HISTORY_MSG_514;Local Spot structure -HISTORY_MSG_515;Local Adjustments -HISTORY_MSG_516;Local - Color and light -HISTORY_MSG_517;Local - Enable super -HISTORY_MSG_518;Local - Lightness -HISTORY_MSG_519;Local - Contrast -HISTORY_MSG_520;Local - Chrominance -HISTORY_MSG_521;Local - Scope -HISTORY_MSG_522;Local - curve method -HISTORY_MSG_523;Local - LL Curve -HISTORY_MSG_524;Local - CC curve -HISTORY_MSG_525;Local - LH Curve -HISTORY_MSG_526;Local - H curve -HISTORY_MSG_527;Local - Color Inverse -HISTORY_MSG_528;Local - Exposure -HISTORY_MSG_529;Local - Exp Compensation -HISTORY_MSG_530;Local - Exp Hlcompr -HISTORY_MSG_531;Local - Exp hlcomprthresh -HISTORY_MSG_532;Local - Exp black -HISTORY_MSG_533;Local - Exp Shcompr -HISTORY_MSG_534;Local - Warm Cool -HISTORY_MSG_535;Local - Exp Scope -HISTORY_MSG_536;Local - Exp Contrast curve -HISTORY_MSG_537;Local - Vibrance -HISTORY_MSG_538;Local - Vib Saturated -HISTORY_MSG_539;Local - Vib Pastel -HISTORY_MSG_540;Local - Vib Threshold -HISTORY_MSG_541;Local - Vib Protect skin tones -HISTORY_MSG_542;Local - Vib avoid colorshift -HISTORY_MSG_543;Local - Vib link -HISTORY_MSG_544;Local - Vib Scope -HISTORY_MSG_545;Local - Vib H curve -HISTORY_MSG_546;Local - Blur and noise -HISTORY_MSG_547;Local - Radius -HISTORY_MSG_548;Local - Noise -HISTORY_MSG_549;Local - Blur scope -HISTORY_MSG_550;Local - Blur method -HISTORY_MSG_551;Local - Blur Luminance only -HISTORY_MSG_552;Local - Tone mapping -HISTORY_MSG_553;Local - TM compression strength -HISTORY_MSG_554;Local - TM gamma -HISTORY_MSG_555;Local - TM edge stopping -HISTORY_MSG_556;Local - TM scale -HISTORY_MSG_557;Local - TM Reweighting -HISTORY_MSG_558;Local - TM scope -HISTORY_MSG_559;Local - Retinex -HISTORY_MSG_560;Local - Retinex method -HISTORY_MSG_561;Local - Retinex strength -HISTORY_MSG_562;Local - Retinex chroma -HISTORY_MSG_563;Local - Retinex radius -HISTORY_MSG_564;Local - Retinex contrast -HISTORY_MSG_565;Local - scope -HISTORY_MSG_566;Local - Retinex Gain curve -HISTORY_MSG_567;Local - Retinex Inverse -HISTORY_MSG_568;Local - Sharpening -HISTORY_MSG_569;Local - Sh Radius -HISTORY_MSG_570;Local - Sh Amount -HISTORY_MSG_571;Local - Sh Damping -HISTORY_MSG_572;Local - Sh Iterations -HISTORY_MSG_573;Local - Sh Scope -HISTORY_MSG_574;Local - Sh Inverse -HISTORY_MSG_575;Local - CBDL -HISTORY_MSG_576;Local - cbdl mult -HISTORY_MSG_577;Local - cbdl chroma -HISTORY_MSG_578;Local - cbdl threshold -HISTORY_MSG_579;Local - cbdl scope -HISTORY_MSG_580;Local - Denoise -HISTORY_MSG_581;Local - deNoise lum f 1 -HISTORY_MSG_582;Local - deNoise lum c -HISTORY_MSG_583;Local - deNoise lum detail -HISTORY_MSG_584;Local - deNoise equalizer White-Black -HISTORY_MSG_585;Local - deNoise chro f -HISTORY_MSG_586;Local - deNoise chro c -HISTORY_MSG_587;Local - deNoise chro detail -HISTORY_MSG_588;Local - deNoise equalizer Blue-Red -HISTORY_MSG_589;Local - deNoise bilateral -HISTORY_MSG_590;Local - deNoise Scope -HISTORY_MSG_591;Local - Avoid color shift -HISTORY_MSG_592;Local - Sh Contrast -HISTORY_MSG_593;Local - Local contrast -HISTORY_MSG_594;Local - Local contrast radius -HISTORY_MSG_595;Local - Local contrast amount -HISTORY_MSG_596;Local - Local contrast darkness -HISTORY_MSG_597;Local - Local contrast lightness -HISTORY_MSG_598;Local - Local contrast scope -HISTORY_MSG_599;Local - Retinex dehaze -HISTORY_MSG_600;Local - Soft Light enable -HISTORY_MSG_601;Local - Soft Light strength -HISTORY_MSG_602;Local - Soft Light scope -HISTORY_MSG_603;Local - Sh Blur radius -HISTORY_MSG_605;Local - Mask preview choice -HISTORY_MSG_606;Local Spot selected -HISTORY_MSG_607;Local - Color Mask C -HISTORY_MSG_608;Local - Color Mask L -HISTORY_MSG_609;Local - Exp Mask C -HISTORY_MSG_610;Local - Exp Mask L -HISTORY_MSG_611;Local - Color Mask H -HISTORY_MSG_612;Local - Color Structure -HISTORY_MSG_613;Local - Exp Structure -HISTORY_MSG_614;Local - Exp Mask H -HISTORY_MSG_615;Local - Blend color -HISTORY_MSG_616;Local - Blend Exp -HISTORY_MSG_617;Local - Blur Exp -HISTORY_MSG_618;Local - Use Color Mask -HISTORY_MSG_619;Local - Use Exp Mask -HISTORY_MSG_620;Local - Blur col -HISTORY_MSG_621;Local - Exp inverse -HISTORY_MSG_622;Local - Exclude structure -HISTORY_MSG_623;Local - Exp Chroma compensation -HISTORY_MSG_624;Local - Color correction grid -HISTORY_MSG_625;Local - Color correction strength -HISTORY_MSG_626;Local - Color correction Method -HISTORY_MSG_627;Local - Shadow Highlight -HISTORY_MSG_628;Local - SH Highlight -HISTORY_MSG_629;Local - SH H tonalwidth -HISTORY_MSG_630;Local - SH Shadows -HISTORY_MSG_631;Local - SH S tonalwidth -HISTORY_MSG_632;Local - SH radius -HISTORY_MSG_633;Local - SH Scope -HISTORY_MSG_634;Local - radius color -HISTORY_MSG_635;Local - radius Exp -HISTORY_MSG_636;Local - Tool added -HISTORY_MSG_637;Local - SH Mask C -HISTORY_MSG_638;Local - SH Mask L -HISTORY_MSG_639;Local - SH Mask H -HISTORY_MSG_640;Local - SH blend -HISTORY_MSG_641;Local - Use SH mask -HISTORY_MSG_642;Local - radius SH -HISTORY_MSG_643;Local - Blur SH -HISTORY_MSG_644;Local - inverse SH -HISTORY_MSG_645;Local - balance ΔE ab-L -HISTORY_MSG_646;Local - Exp mask chroma -HISTORY_MSG_647;Local - Exp mask gamma -HISTORY_MSG_648;Local - Exp mask slope -HISTORY_MSG_649;Local - Exp soft radius -HISTORY_MSG_650;Local - Color mask chroma -HISTORY_MSG_651;Local - Color mask gamma -HISTORY_MSG_652;Local - Color mask slope -HISTORY_MSG_653;Local - SH mask chroma -HISTORY_MSG_654;Local - SH mask gamma -HISTORY_MSG_655;Local - SH mask slope -HISTORY_MSG_656;Local - Color soft radius -HISTORY_MSG_657;Local - Retinex Reduce artifacts -HISTORY_MSG_658;Local - CBDL soft radius -HISTORY_MSG_659;Local Spot transition-decay -HISTORY_MSG_660;Local - cbdl clarity -HISTORY_MSG_661;Local - cbdl contrast residual -HISTORY_MSG_662;Local - deNoise lum f 0 -HISTORY_MSG_663;Local - deNoise lum f 2 -HISTORY_MSG_664;Local - cbdl Blur -HISTORY_MSG_665;Local - cbdl mask Blend -HISTORY_MSG_666;Local - cbdl mask radius -HISTORY_MSG_667;Local - cbdl mask chroma -HISTORY_MSG_668;Local - cbdl mask gamma -HISTORY_MSG_669;Local - cbdl mask slope -HISTORY_MSG_670;Local - cbdl mask C -HISTORY_MSG_671;Local - cbdl mask L -HISTORY_MSG_672;Local - cbdl mask CL -HISTORY_MSG_673;Local - Use cbdl mask -HISTORY_MSG_674;Local - Tool removed -HISTORY_MSG_675;Local - TM soft radius -HISTORY_MSG_676;Local Spot transition-differentiation -HISTORY_MSG_677;Local - TM amount -HISTORY_MSG_678;Local - TM saturation -HISTORY_MSG_679;Local - Retinex mask C -HISTORY_MSG_680;Local - Retinex mask L -HISTORY_MSG_681;Local - Retinex mask CL -HISTORY_MSG_682;Local - Retinex mask -HISTORY_MSG_683;Local - Retinex mask Blend -HISTORY_MSG_684;Local - Retinex mask radius -HISTORY_MSG_685;Local - Retinex mask chroma -HISTORY_MSG_686;Local - Retinex mask gamma -HISTORY_MSG_687;Local - Retinex mask slope -HISTORY_MSG_688;Local - Tool removed -HISTORY_MSG_689;Local - Retinex mask transmission map -HISTORY_MSG_690;Local - Retinex scale -HISTORY_MSG_691;Local - Retinex darkness -HISTORY_MSG_692;Local - Retinex lightness -HISTORY_MSG_693;Local - Retinex threshold -HISTORY_MSG_694;Local - Retinex Laplacian threshold -HISTORY_MSG_695;Local - Soft method -HISTORY_MSG_696;Local - Retinex Normalize -HISTORY_MSG_697;Local - TM Normalize -HISTORY_MSG_698;Local - Local contrast Fast Fourier -HISTORY_MSG_699;Local - Retinex Fast Fourier -HISTORY_MSG_701;Local - Exp Shadows -HISTORY_MSG_702;Local - Exp Method -HISTORY_MSG_703;Local - Exp Laplacian threshold -HISTORY_MSG_704;Local - Exp PDE balance -HISTORY_MSG_705;Local - Exp linearity -HISTORY_MSG_706;Local - TM mask C -HISTORY_MSG_707;Local - TM mask L -HISTORY_MSG_708;Local - TM mask CL -HISTORY_MSG_709;Local - use TM mask -HISTORY_MSG_710;Local - TM mask Blend -HISTORY_MSG_711;Local - TM mask radius -HISTORY_MSG_712;Local - TM mask chroma -HISTORY_MSG_713;Local - TM mask gamma -HISTORY_MSG_714;Local - TM mask slope -HISTORY_MSG_716;Local - Local method -HISTORY_MSG_717;Local - Local contrast -HISTORY_MSG_718;Local - Local contrast levels -HISTORY_MSG_719;Local - Local contrast residual L -HISTORY_MSG_720;Local - Blur mask C -HISTORY_MSG_721;Local - Blur mask L -HISTORY_MSG_722;Local - Blur mask CL -HISTORY_MSG_723;Local - use Blur mask -HISTORY_MSG_725;Local - Blur mask Blend -HISTORY_MSG_726;Local - Blur mask radius -HISTORY_MSG_727;Local - Blur mask chroma -HISTORY_MSG_728;Local - Blur mask gamma -HISTORY_MSG_729;Local - Blur mask slope -HISTORY_MSG_730;Local - Blur method -HISTORY_MSG_731;Local - median method -HISTORY_MSG_732;Local - median iterations -HISTORY_MSG_733;Local - soft radius -HISTORY_MSG_734;Local - detail -HISTORY_MSG_738;Local - Local contrast Merge L -HISTORY_MSG_739;Local - Local contrast Soft radius -HISTORY_MSG_740;Local - Local contrast Merge C -HISTORY_MSG_741;Local - Local contrast Residual C -HISTORY_MSG_742;Local - Exp Laplacian gamma -HISTORY_MSG_743;Local - Exp Fattal Amount -HISTORY_MSG_744;Local - Exp Fattal Detail -HISTORY_MSG_745;Local - Exp Fattal Offset -HISTORY_MSG_746;Local - Exp Fattal Sigma -HISTORY_MSG_747;Local Spot created -HISTORY_MSG_748;Local - Exp Denoise -HISTORY_MSG_749;Local - Reti Depth -HISTORY_MSG_750;Local - Reti Mode log - lin -HISTORY_MSG_751;Local - Reti Dehaze luminance -HISTORY_MSG_752;Local - Reti Offset -HISTORY_MSG_753;Local - Reti Transmission map -HISTORY_MSG_754;Local - Reti Clip -HISTORY_MSG_755;Local - TM use tm mask -HISTORY_MSG_756;Local - Exp use algo exposure mask -HISTORY_MSG_757;Local - Exp Laplacian mask -HISTORY_MSG_758;Local - Reti Laplacian mask -HISTORY_MSG_759;Local - Exp Laplacian mask -HISTORY_MSG_760;Local - Color Laplacian mask -HISTORY_MSG_761;Local - SH Laplacian mask -HISTORY_MSG_762;Local - cbdl Laplacian mask -HISTORY_MSG_763;Local - Blur Laplacian mask -HISTORY_MSG_764;Local - Solve PDE Laplacian mask -HISTORY_MSG_765;Local - deNoise Detail threshold -HISTORY_MSG_766;Local - Blur Fast Fourier -HISTORY_MSG_767;Local - Grain Iso -HISTORY_MSG_768;Local - Grain Strength -HISTORY_MSG_769;Local - Grain Scale -HISTORY_MSG_770;Local - Color Mask contrast curve -HISTORY_MSG_771;Local - Exp Mask contrast curve -HISTORY_MSG_772;Local - SH Mask contrast curve -HISTORY_MSG_773;Local - TM Mask contrast curve -HISTORY_MSG_774;Local - Reti Mask contrast curve -HISTORY_MSG_775;Local - CBDL Mask contrast curve -HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve -HISTORY_MSG_777;Local - Blur Mask local contrast curve -HISTORY_MSG_778;Local - Mask highlights -HISTORY_MSG_779;Local - Color Mask local contrast curve -HISTORY_MSG_780;Local - Color Mask shadows -HISTORY_MSG_781;Local - Contrast Mask Wavelet level -HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels -HISTORY_MSG_783;Local - Color Wavelet levels -HISTORY_MSG_784;Local - Mask ΔE -HISTORY_MSG_785;Local - Mask Scope ΔE -HISTORY_MSG_786;Local - SH method -HISTORY_MSG_787;Local - Equalizer multiplier -HISTORY_MSG_788;Local - Equalizer detail -HISTORY_MSG_789;Local - SH mask amount -HISTORY_MSG_790;Local - SH mask anchor -HISTORY_MSG_791;Local - Mask Short L curves -HISTORY_MSG_792;Local - Mask Luminance Background -HISTORY_MSG_793;Local - SH TRC gamma -HISTORY_MSG_794;Local - SH TRC slope -HISTORY_MSG_795;Local - Mask save restore image -HISTORY_MSG_796;Local - Recursive references -HISTORY_MSG_797;Local - Merge Original method -HISTORY_MSG_798;Local - Opacity -HISTORY_MSG_799;Local - Color RGB ToneCurve -HISTORY_MSG_800;Local - Color ToneCurve Method -HISTORY_MSG_801;Local - Color ToneCurve Special -HISTORY_MSG_802;Local - Contrast threshold -HISTORY_MSG_803;Local - Color Merge -HISTORY_MSG_804;Local - Color mask Structure -HISTORY_MSG_805;Local - Blur Noise mask Structure -HISTORY_MSG_806;Local - Color mask Structure as tool -HISTORY_MSG_807;Local - Blur Noise mask Structure as tool -HISTORY_MSG_808;Local - Color mask curve H(H) -HISTORY_MSG_809;Local - Vib mask curve C(C) -HISTORY_MSG_810;Local - Vib mask curve L(L) -HISTORY_MSG_811;Local - Vib mask curve LC(H) -HISTORY_MSG_813;Local - Use Vib mask -HISTORY_MSG_814;Local - Vib mask Blend -HISTORY_MSG_815;Local - Vib mask radius -HISTORY_MSG_816;Local - Vib mask chroma -HISTORY_MSG_817;Local - Vib mask gamma -HISTORY_MSG_818;Local - Vib mask slope -HISTORY_MSG_819;Local - Vib mask laplacian -HISTORY_MSG_820;Local - Vib mask contrast curve -HISTORY_MSG_821;Local - color grid background -HISTORY_MSG_822;Local - color background merge -HISTORY_MSG_823;Local - color background luminance -HISTORY_MSG_824;Local - Exp gradient mask strength -HISTORY_MSG_825;Local - Exp gradient mask angle -HISTORY_MSG_826;Local - Exp gradient strength -HISTORY_MSG_827;Local - Exp gradient angle -HISTORY_MSG_828;Local - SH gradient strength -HISTORY_MSG_829;Local - SH gradient angle -HISTORY_MSG_830;Local - Color gradient strength L -HISTORY_MSG_831;Local - Color gradient angle -HISTORY_MSG_832;Local - Color gradient strength C -HISTORY_MSG_833;Local - Gradient feather -HISTORY_MSG_834;Local - Color gradient strength H -HISTORY_MSG_835;Local - Vib gradient strength L -HISTORY_MSG_836;Local - Vib gradient angle -HISTORY_MSG_837;Local - Vib gradient strength C -HISTORY_MSG_838;Local - Vib gradient strength H -HISTORY_MSG_839;Local - Software complexity -HISTORY_MSG_840;Local - CL Curve -HISTORY_MSG_841;Local - LC curve HISTORY_MSG_842;Local - Contrast Threshold Mask blur HISTORY_MSG_843;Local - Radius Mask blur HISTORY_MSG_844;Local - Color Mask fftw From beb944ceed542d0ea07a350905e388b8e9bb8f52 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 19 Sep 2020 07:33:44 +0200 Subject: [PATCH 103/185] Restore language default locallab --- rtdata/languages/default | 106 +++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index b4dade718..35afada51 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2369,8 +2369,8 @@ TP_LOCALLAB_BILATERAL;Bilateral filter TP_LOCALLAB_BLACK_EV;Black Ev TP_LOCALLAB_BLCO;Chrominance only TP_LOCALLAB_BLENDMASKCOL;Blend -TP_LOCALLAB_BLENDMASKMASK;Add / substract mask Luminance -TP_LOCALLAB_BLENDMASKMASKAB;Add / substract mask Chrominance +TP_LOCALLAB_BLENDMASKMASK;Add/substract luminance mask +TP_LOCALLAB_BLENDMASKMASKAB;Add/substract chrominance mask TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image TP_LOCALLAB_BLGUID;Guided Filter @@ -2382,18 +2382,18 @@ TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - direct blur and noise with all settings.\n TP_LOCALLAB_BLNOI_EXP;Blur & Noise TP_LOCALLAB_BLNORM;Normal TP_LOCALLAB_BLSYM;Symmetric -TP_LOCALLAB_BLUFR;Blur - Grain & Denoise +TP_LOCALLAB_BLUFR;Blur/Grain & Denoise TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n*Blur the background by a RT-spot fully covering the image (high values for scope and transition) - normal or inverse.\n*Isolate the foreground by one or more excluding RT-spot with the tools you want (increse scope).\n\nThis module can be used in additional noise reduction,including "median" and "Guided filter" TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain TP_LOCALLAB_BLURCBDL;Blur levels 0-1-2-3-4 -TP_LOCALLAB_BLURCOL;Radius Mask Blur +TP_LOCALLAB_BLURCOL;Radius TP_LOCALLAB_BLURDE;Blur Shape detection TP_LOCALLAB_BLURLC;Luminance Only TP_LOCALLAB_BLURLEVELFRA;Blur Levels TP_LOCALLAB_BLURMASK_TOOLTIP;Generate a blur mask, take into account the structure with the contrast threshold Mask Blur slider. TP_LOCALLAB_BLURRESIDFRA;Blur Residual -TP_LOCALLAB_BLUR_TOOLNAME;Blur Grain & Denoise - 1 -TP_LOCALLAB_BLWH;All changes forced in Black and White +TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise - 1 +TP_LOCALLAB_BLWH;All changes forced in Black-and-White TP_LOCALLAB_BLWH_TOOLTIP;Force color change composante "a" and "b" to zero.\nUsefull when the user chooses black and white processes, or film. TP_LOCALLAB_BUTTON_ADD;Add TP_LOCALLAB_BUTTON_DEL;Delete @@ -2414,24 +2414,24 @@ TP_LOCALLAB_CHROMABLU_TOOLTIP;Acts as an amplifier-reducer action compare to set TP_LOCALLAB_CHROMACBDL;Chroma TP_LOCALLAB_CHROMACB_TOOLTIP;Acts as an amplifier-reducer action compare to sliders of luminance.\nUnder 100 reduce, above 100 amplifie TP_LOCALLAB_CHROMALEV;Chroma levels -TP_LOCALLAB_CHROMASKCOL;Chroma mask +TP_LOCALLAB_CHROMASKCOL;Chroma TP_LOCALLAB_CHROMASK_TOOLTIP;You can use this slider to desaturated background (inverse mask - curve near 0).\nAlso to attenuate or enhance the action of a mask on the chroma TP_LOCALLAB_CHRRT;Chroma TP_LOCALLAB_CIRCRADIUS;Spot size TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for treating foliage.\nHigh values may be useful for treating skin -TP_LOCALLAB_CLARICRES;Merge Chroma +TP_LOCALLAB_CLARICRES;Merge chroma TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask - Blend & Soft images TP_LOCALLAB_CLARILRES;Merge Luma TP_LOCALLAB_CLARISOFT;Soft radius TP_LOCALLAB_CLARISOFT_TOOLTIP;Enabled for Clarity and Sharp mask if Merge Luma different from zero.\n\nEnabled for all wavelets pyramid modules.\nDisabled if Soft radius = 0 TP_LOCALLAB_CLARITYML;Clarity TP_LOCALLAB_CLARI_TOOLTIP;Under or equal level wavelet 4, 'Sharp mask' is enabled.\nAbove level wavelet 5 'Clarity' is enabled.\nUsefull if you use 'Level dynamic Range Compression' -TP_LOCALLAB_CLIPTM;Clip Restored datas (gain) +TP_LOCALLAB_CLIPTM;Clip restored datas (gain) TP_LOCALLAB_COFR;Color & Light TP_LOCALLAB_COLORDE;Color preview selection ΔE - Intensity TP_LOCALLAB_COLORDEPREV_TOOLTIP;Button Preview ΔE needs that only one tool is enabled (expander).\nTo be able to have an Preview ΔE with several enable tools use Mask and modifications - Preview ΔE TP_LOCALLAB_COLORDE_TOOLTIP;Show preview selection ΔE in blue if negative and in green if positive.\n\nMask and modifications (show modifications without mask): show real modifications if positive, show enhanced modifications (only luminance) with blue and yellow if negative. -TP_LOCALLAB_COLORSCOPE;Scope Color Tools +TP_LOCALLAB_COLORSCOPE;Scope (color tools) TP_LOCALLAB_COLORSCOPE_TOOLTIP;Use a common Scope for Color and light, Shadows highlight, Vibrance.\nOthers tools have their specific scope. TP_LOCALLAB_COLOR_TOOLNAME;Color & Light - 11 TP_LOCALLAB_COL_NAME;Name @@ -2442,7 +2442,7 @@ TP_LOCALLAB_COMPLEX_METHOD;Software Complexity TP_LOCALLAB_COMPLEX_TOOLTIP; Allow user to select Local adjustments rubrics. TP_LOCALLAB_COMPREFRA;Levels Dynamic Wavelet Range (un)Compression TP_LOCALLAB_COMPRESS_TOOLTIP;Use if necessary the module 'Clarity & Sharp mask and Blend & Soft Images' by adjusting 'Soft radius' to reduce artifacts. -TP_LOCALLAB_CONTCOL;Contrast threshold Mask Blur +TP_LOCALLAB_CONTCOL;Contrast threshold TP_LOCALLAB_CONTFRA;Contrast by Level TP_LOCALLAB_CONTRAST;Contrast TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Main mask contrast control. @@ -2450,7 +2450,7 @@ TP_LOCALLAB_CONTRESID;Contrast TP_LOCALLAB_CONTTHR;Contrast Threshold TP_LOCALLAB_CONTWFRA;Local contrast TP_LOCALLAB_CSTHRESHOLD;Ψ Wavelets Levels -TP_LOCALLAB_CSTHRESHOLDBLUR;Ψ Mask Wavelet level +TP_LOCALLAB_CSTHRESHOLDBLUR;Ψ Wavelet level selection TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance "Super" TP_LOCALLAB_CURVCURR;Normal TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nIt is recommended (not required) to position the top of the curves on the gray transition line which represents the references (chroma, luma, hue). @@ -2469,7 +2469,7 @@ TP_LOCALLAB_DEHAFRA;Dehaze TP_LOCALLAB_DEHAZ;Strength TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values adds haze TP_LOCALLAB_DELTAD;Delta balance -TP_LOCALLAB_DELTAEC;Mask ΔE Image +TP_LOCALLAB_DELTAEC;ΔE Image mask TP_LOCALLAB_DENOIS;Ψ Denoise TP_LOCALLAB_DENOI_EXP;Denoise TP_LOCALLAB_DENOI_TOOLTIP;This module can be used alone (at the end of process), or in complement of main denoise (at the beginning).\nScope allows to differentiate the action according to the color (deltaE).\nYou can complete the action with "median" or "Guided Filter" (Smooth Blur...).\nYou can complete the action with "Blur levels" "Wavelet pyramid" @@ -2519,17 +2519,17 @@ TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Balances the action between the original image and TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Apply a gamma before and after Laplace transform TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Add linear exposure component before application Laplace transform TP_LOCALLAB_EXPLAP_TOOLTIP;The more you act on this threshold slider, the greater the action of reducing contrast. -TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows various possibilities to blend image (as layers in Photosshop) : difference, multiply, soft light, overlay...with opacity...\nOriginal Image : merge current RT-spot with Original.\nPrevious spot : merge current Rt-spot with previous - if there is only one spot previous = original.\nBackground : merge current RT-spot with a color and luminance background (less possibilties) +TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows various possibilities to blend image (as layers in Photoshop (c)) : difference, multiply, soft light, overlay...with opacity...\nOriginal Image : merge current RT-spot with Original.\nPrevious spot : merge current Rt-spot with previous - if there is only one spot previous = original.\nBackground : merge current RT-spot with a color and luminance background (less possibilties) TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : use an algorithm similar as main Exposure but in L*a*b* and taking account of deltaE.\n\nContrast attenuator : use another algorithm also with deltaE and with Poisson equation to solve Laplacian in Fourier space.\nContrast attenuator, Dynamic range compression and Standard can be combined.\nFFTW Fourier Transform is optimized in size to reduce processing time.\nReduce artifacts and noise. TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Apply a median before Laplace transform to prevent artifacts (noise).\nYou can also use "Denoise" tool. -TP_LOCALLAB_EXPOSE;Dynamic Range Compr. & Exposure +TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure //TP_LOCALLAB_EXPOSURE_TOOLTIP;In some cases (strong shadows ..) you can use others modules "Shadows Highlights", "Tone equalizer", "TRC", "Log Encoding"... TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high decay transition values and scope to simulate small RT-spot. TP_LOCALLAB_EXPTOOL;Tools exposure TP_LOCALLAB_EXPTRC;Tone Response Curve - TRC -TP_LOCALLAB_EXP_TOOLNAME;Contrast Attenuator -Dynamic Range Compression & Exposure- 10 +TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure - 10 TP_LOCALLAB_FATAMOUNT;Amount TP_LOCALLAB_FATANCHOR;Anchor TP_LOCALLAB_FATANCHORA;Offset @@ -2545,24 +2545,24 @@ TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform TP_LOCALLAB_FFTW2;ƒ - Use Fast Fourier Transform (TIF, JPG,..) TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform -TP_LOCALLAB_FULLIMAGE;Calculate DarkEv - WhiteEv - Value on the entire image +TP_LOCALLAB_FULLIMAGE;Calculate dark-Ev/white-Ev value on the entire image TP_LOCALLAB_GAM;Gamma TP_LOCALLAB_GAMFRA;Tone response curve (TRC) TP_LOCALLAB_GAMM;Gamma -TP_LOCALLAB_GAMMASKCOL;Gamma mask +TP_LOCALLAB_GAMMASKCOL;Gamma TP_LOCALLAB_GAMSH;Gamma TP_LOCALLAB_GRADANG;Gradient angle TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees : -180 0 +180 TP_LOCALLAB_GRADFRA;Graduated Filter Mask TP_LOCALLAB_GRADGEN_TOOLTIP;Graduated filter is supplied with Color and Light & merge file, Exposure & mask, Shadows Highlight, Vibrance, Log Encoding.\n\nVibrance, Color and Light & merge file, are provided with GF luminance, chrominance, Hue.\nFeather is located in settings. -TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +TP_LOCALLAB_GRADLOGFRA;Luminance graduated Filter TP_LOCALLAB_GRADSTR;Gradient strength TP_LOCALLAB_GRADSTRAB_TOOLTIP;Filter chroma strength -TP_LOCALLAB_GRADSTRCHRO;Gradient strength Chrominance -TP_LOCALLAB_GRADSTRHUE;Gradient strength Hue -TP_LOCALLAB_GRADSTRHUE2;Gradient strength Hue +TP_LOCALLAB_GRADSTRCHRO;Chrominance gradient strength +TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Filter Hue strength -TP_LOCALLAB_GRADSTRLUM;Gradient strength Luminance +TP_LOCALLAB_GRADSTRLUM;Luminance gradient strength TP_LOCALLAB_GRADSTR_TOOLTIP;Filter strength in stops TP_LOCALLAB_GRAINFRA;Film Grain 1:1 TP_LOCALLAB_GRALWFRA;Graduated Filter Local contrast @@ -2573,23 +2573,23 @@ TP_LOCALLAB_GUIDBL;Soft radius TP_LOCALLAB_GUIDFILTER;Guided filter radius TP_LOCALLAB_GUIDFILTER_TOOLTIP;Adapt this values according to images - can reduce or increase artifacts. TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. -TP_LOCALLAB_HIGHMASKCOL;Highlights mask +TP_LOCALLAB_HIGHMASKCOL;Highlights TP_LOCALLAB_HLH;Curves H TP_LOCALLAB_IND;Independent (mouse) TP_LOCALLAB_INDSL;Independent (mouse + sliders) TP_LOCALLAB_INVERS;Inverse TP_LOCALLAB_INVERS_TOOLTIP;If selected (inverse) less possibilities.\n\nAlternative\nFirst Spot:\n full image - delimiter outside preview\n Shape RT-spot area : rectangle. Transition 100\n\nSecond spot : Excluding spot TP_LOCALLAB_ISOGR;Coarseness (ISO) -TP_LOCALLAB_LABBLURM;Mask Blur +TP_LOCALLAB_LABBLURM;Blur Mask TP_LOCALLAB_LABEL;Local Adjustments TP_LOCALLAB_LABGRID;Color correction grid TP_LOCALLAB_LABGRIDMERG;Background TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 -TP_LOCALLAB_LABSTRUM;Mask Structure +TP_LOCALLAB_LABSTRUM;Structure Mask TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE TP_LOCALLAB_LAPLACEXP;Laplacian threshold -TP_LOCALLAB_LAPMASKCOL;Laplacian threshold mask +TP_LOCALLAB_LAPMASKCOL;Laplacian threshold TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using Radius and Laplace Threshold (advanced) simultaneously.\nLaplacian threshold reduce contrast, artifacts, smooth result. TP_LOCALLAB_LAP_MASK_TOOLTIP;Solve PDE for all Laplacian masks.\nIf enabled Laplacian threshold mask reduce artifacts and smooth result.\nIf disabled linear response. TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated.\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\n @@ -2611,7 +2611,7 @@ TP_LOCALLAB_LOCCONT;Unsharp Mask TP_LOCALLAB_LOC_CONTRAST;Local contrast & Wavelets TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pyramid 1: TP_LOCALLAB_LOC_CONTRASTPYR2;Ψ Pyramid 2: -TP_LOCALLAB_LOC_CONTRASTPYR2LAB;Contrast by Levels- Tone Mapping - Dir.Contrast +TP_LOCALLAB_LOC_CONTRASTPYR2LAB;Contrast by Level- Tone Mapping - Dir.Contrast TP_LOCALLAB_LOC_CONTRASTPYRLAB;Graduated Filter - Edge Sharpness - Blur TP_LOCALLAB_LOC_RESIDPYR;Residual Image (Main) TP_LOCALLAB_LOG;Log Encoding @@ -2629,7 +2629,7 @@ TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can change this value to adapt it to your ta TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 TP_LOCALLAB_LUM;Curves LL - CC TP_LOCALLAB_LUMADARKEST;Darkest -TP_LOCALLAB_LUMASK;Luminance Background Mask +TP_LOCALLAB_LUMASK;Background color for luminance and color masks TP_LOCALLAB_LUMASK_TOOLTIP;Adjust the gray of the mask background in Show Mask (Mask and modifications) TP_LOCALLAB_LUMAWHITESEST;Whiteest TP_LOCALLAB_LUMFRA;L*a*b* standard @@ -2640,9 +2640,9 @@ TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the TP_LOCALLAB_MASFRAME;Mask and Merge TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and curves contrast , levels contrasts, and mask blur, structure(if enabled tool) are used.\nDisabled in Inverse TP_LOCALLAB_MASK;Mask -TP_LOCALLAB_MASK2;Contrast curve mask +TP_LOCALLAB_MASK2;Contrast curve TP_LOCALLAB_MASKCOL;Mask Curves -TP_LOCALLAB_MASKH;Hue curve mask +TP_LOCALLAB_MASKH;Hue curve TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a single tool, this requires activating another tool (but without using the tool : sliders to 0,...) where is the mask you want to activate.\n\nYou can also duplicate the RT-spot and place it right next to each other,variations of references allow fine work on images. TP_LOCALLAB_MED;Medium TP_LOCALLAB_MEDIAN;Median Low @@ -2672,7 +2672,7 @@ TP_LOCALLAB_MERLUM;Luminosity TP_LOCALLAB_MERNIN;Screen TP_LOCALLAB_MERONE;Normal TP_LOCALLAB_MERSAT;Saturation -TP_LOCALLAB_MERSEV;Soft Light Photshop +TP_LOCALLAB_MERSEV;Soft Light (legacy) TP_LOCALLAB_MERSEV0;Soft Light Illusion TP_LOCALLAB_MERSEV1;Soft Light W3C TP_LOCALLAB_MERSEV2;Hard Light @@ -2683,7 +2683,7 @@ TP_LOCALLAB_MERTHR;Difference TP_LOCALLAB_MERTWE;Exclusion TP_LOCALLAB_MERTWO;Substract TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. -TP_LOCALLAB_MLABEL;Restored datas Min=%1 Max=%2 (Clip - Offset) +TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 (Clip - Offset) TP_LOCALLAB_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible.\nYou can act on Clip Restored datas and Offset to normalize.\n\nRestored image with no mixture. TP_LOCALLAB_MODE_EXPERT;Advanced TP_LOCALLAB_MODE_NORMAL;Standard @@ -2726,7 +2726,7 @@ TP_LOCALLAB_QUALCURV_METHOD;Curves type TP_LOCALLAB_QUAL_METHOD;Global quality TP_LOCALLAB_RADIUS;Radius TP_LOCALLAB_RADIUS_TOOLTIP;Above Radius 30 Use Fast Fourier Transform -TP_LOCALLAB_RADMASKCOL;Smooth Radius Mask +TP_LOCALLAB_RADMASKCOL;Smooth radius TP_LOCALLAB_RECT;Rectangle TP_LOCALLAB_RECURS;Recursive references TP_LOCALLAB_RECURS_TOOLTIP;Recalculate references for hue, luma, chroma after each module and after each RT-spot.\nAlso useful for working with masks. @@ -2737,7 +2737,7 @@ TP_LOCALLAB_RESETSHOW;Reset All Show Modifications TP_LOCALLAB_RESID;Residual Image TP_LOCALLAB_RESIDBLUR;Blur Residual Image TP_LOCALLAB_RESIDCHRO;Residual image Chroma -TP_LOCALLAB_RESIDCOMP;Compress Residual image +TP_LOCALLAB_RESIDCOMP;Compress residual image TP_LOCALLAB_RESIDCONT;Residual image Contrast TP_LOCALLAB_RESIDHI;Highlights TP_LOCALLAB_RESIDHITHR;Highlights threshold @@ -2763,7 +2763,7 @@ TP_LOCALLAB_SAVREST;Save - Restore Current Image TP_LOCALLAB_SCALEGR;Scale TP_LOCALLAB_SCALERETI;Scale TP_LOCALLAB_SCALTM;Scale -TP_LOCALLAB_SCOPEMASK;Scope Mask ΔE Image +TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if Mask DeltaE Image is enabled.\nLow values avoid retouching selected area TP_LOCALLAB_SENSI;Scope TP_LOCALLAB_SENSIBN;Scope @@ -2783,11 +2783,11 @@ TP_LOCALLAB_SH1;Shadows Highlights TP_LOCALLAB_SH2;Equalizer TP_LOCALLAB_SHADEX;Shadows TP_LOCALLAB_SHADEXCOMP;Shadows compression & tonal width -TP_LOCALLAB_SHADHIGH;Shadows/Highlights-Tone equalizer +TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone equalizer TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows & highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. //Can be used instead - or in complement - of exposure module in difficult cases.\nThe use of Denoise may be necessary : lightening the shadows.\n\nCan be used as graduated filter (increase Scope) -TP_LOCALLAB_SHAMASKCOL;Shadows mask -TP_LOCALLAB_SHAPETYPE;Shape RT-spot area +TP_LOCALLAB_SHAMASKCOL;Shadows +TP_LOCALLAB_SHAPETYPE;RT-spot shape TP_LOCALLAB_SHAPE_TOOLTIP;Elipse is normal mode.\nRectangle can be used in some cases, for example to work in full image in conjonction with delimiters outside preview, transition = 100.\n\nPolygone - Beziers are waiting for GUI... TP_LOCALLAB_SHARAMOUNT;Amount TP_LOCALLAB_SHARBLUR;Blur radius @@ -2814,7 +2814,7 @@ TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise TP_LOCALLAB_SHOWMASKTYP2;Denoise TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Mask and modifications can be chosen.\nBlur and noise : in this case it is not used for 'denoise'.\nDenoise : in this case it is not used for 'blur and noise'.\n\nBlur and noise + denoise : mask is shared, be carefull to 'show modifications' and 'scope' -TP_LOCALLAB_SHOWMNONE;None +TP_LOCALLAB_SHOWMNONE;Show modified image TP_LOCALLAB_SHOWMODIF;Show modifications without mask TP_LOCALLAB_SHOWMODIFMASK;Show modifications with mask TP_LOCALLAB_SHOWNORMAL;Normalize luminance (no) @@ -2829,17 +2829,17 @@ TP_LOCALLAB_SHOWT;Mask and modifications TP_LOCALLAB_SHOWVI;Mask and modifications TP_LOCALLAB_SHRESFRA;Shadows/Highlights TP_LOCALLAB_SHTRC_TOOLTIP;Modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones -TP_LOCALLAB_SH_TOOLNAME;Shadows Highlights & Tone Equalizer - 5 -TP_LOCALLAB_SIGMAWAV;Attenuation Response +TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer - 5 +TP_LOCALLAB_SIGMAWAV;Attenuation response TP_LOCALLAB_SIM;Simple -TP_LOCALLAB_SLOMASKCOL;Slope mask +TP_LOCALLAB_SLOMASKCOL;Slope TP_LOCALLAB_SLOSH;Slope TP_LOCALLAB_SOFT;Soft Light - Original Retinex TP_LOCALLAB_SOFTM;Soft Light //TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Original Retinex is very different from others Retinex method.\nIts acts on grey and balance luminance.\nIt is an emulation of "Dodge" and "Burn" TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. TP_LOCALLAB_SOFTRADIUSCOL;Soft radius -TP_LOCALLAB_SOFTRETI;Reduce artifact ΔE +TP_LOCALLAB_SOFTRETI;Reduce ΔE artifact TP_LOCALLAB_SOFTRETI_TOOLTIP;Take into account deltaE to improve Transmission map TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 TP_LOCALLAB_SOURCE_GRAY;Value @@ -2866,11 +2866,11 @@ TP_LOCALLAB_STYPE;Shape method TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. TP_LOCALLAB_SYM;Symmetrical (mouse) TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) -TP_LOCALLAB_TARGET_GRAY;Target Gray Point +TP_LOCALLAB_TARGET_GRAY;Target gray point TP_LOCALLAB_THRES;Threshold structure TP_LOCALLAB_THRESDELTAE;Threshold ΔE-scope TP_LOCALLAB_THRESRETI;Threshold -TP_LOCALLAB_THRESWAV;Balance Threshold +TP_LOCALLAB_THRESWAV;Balance threshold TP_LOCALLAB_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 (Threshold) TP_LOCALLAB_TLABEL2;TM Effective Tm=%1 TM=%2 TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize @@ -2897,28 +2897,28 @@ TP_LOCALLAB_TRANSMISSIONMAP;Transmission map TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.\nYou can act on this curve to change Transmission and reduce the artifacts TP_LOCALLAB_USEMASK;Use mask TP_LOCALLAB_VART;Variance (contrast) -TP_LOCALLAB_VIBRANCE;Vibrance - Warm & Cool +TP_LOCALLAB_VIBRANCE;Vibrance - Warm/Cool TP_LOCALLAB_VIBRA_TOOLTIP;Adjust vibrance (essentially the same as the global adjustment).\nCarry out the equivalent of a white-balance adjustment using a CIECAM algorithm. -TP_LOCALLAB_VIB_TOOLNAME;Vibrance - Warm & Cool - 3 +TP_LOCALLAB_VIB_TOOLNAME;Vibrance - Warm/Cool - 3 TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 -TP_LOCALLAB_BLUR_TOOLNAME;Smooth Blur Grain & Denoise - 1 +TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise - 1 TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex - 9 TP_LOCALLAB_SHARP_TOOLNAME;Sharpening - 8 -TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelet - 7 +TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets - 7 TP_LOCALLAB_CBDL_TOOLNAME;CBDL - 2 TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask - 13 TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. TP_LOCALLAB_WAMASKCOL;Ψ Mask Wavelet level -TP_LOCALLAB_WARM;Warm - Cool & Color artifacts +TP_LOCALLAB_WARM;Warm/Cool & Color artifacts TP_LOCALLAB_WARM_TOOLTIP;This slider use Ciecam algorithm and acts as White Balance, it can warm or cool the area selected.\nIt can also in some cases reduce color artifacts. TP_LOCALLAB_WASDEN_TOOLTIP;Denoise luminance for the 3 first levels (fine).\nThe right limit of the curve correspond to coarse : level 3 and beyond TP_LOCALLAB_WAV;Levels local contrast TP_LOCALLAB_WAVBLUR_TOOLTIP;Performs a blur for each level of decomposition, as well as the residual image. TP_LOCALLAB_WAVCOMP;Compression by Level TP_LOCALLAB_WAVCOMPRE;(un)Compression by Level -TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Achieve a Tone-mapping or reduction local contrast by levels.\nOn abscissa levels +TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Achieve a Tone-mapping or reduction local contrast by level.\nOn abscissa levels TP_LOCALLAB_WAVCOMP_TOOLTIP;Achive local contrast in function of the direction wavelet decomposition : horizontal, vertical, diagonal TP_LOCALLAB_WAVCON;Contrast by Level TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels : on abscissa levels. @@ -2930,7 +2930,7 @@ TP_LOCALLAB_WAVGRAD_TOOLTIP;Graduated filter for Local contrast "luminance" TP_LOCALLAB_WAVHIGH;Ψ Wavelet high TP_LOCALLAB_WAVLEV;Blur by Level TP_LOCALLAB_WAVLOW;Ψ Wavelet low -TP_LOCALLAB_WAVMASK;Ψ Mask Levels local contrast +TP_LOCALLAB_WAVMASK;Ψ Local contrast (by wavelet level) TP_LOCALLAB_WAVMASK_TOOLTIP;Allows fine work on mask levels contrasts (structure) TP_LOCALLAB_WAVMED;Ψ Wavelet normal TP_LOCALLAB_WEDIANHI;Median Hi From 5b97e0cde3717268c1974e839099c73dfaeaa48f Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 20 Sep 2020 09:49:56 +0200 Subject: [PATCH 104/185] Local adjustments - Various improvment to GUI - labels - tooltip (#5911) * from localdenoise Change GUI showmask - GUI exposure * from branch localgflc - Change combobox settings hide-show by a checkbox * Fixed bad behavior show Hide settings * Clean default - change labels * Change labels first * Change labels 2 * Change label 3 * Merge with dev - Labels 3 * Label 4 * label 5 * Label 6 * Label 7 - tooltips * Label 8 * Labels 9 * All string set to empty in else case updateAdviceTooltips --- rtdata/languages/default | 149 ++++++++++++++------------------------ rtengine/iplocallab.cc | 20 +++-- rtengine/procevents.h | 1 + rtengine/procparams.cc | 4 + rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 1 + rtgui/controlspotpanel.cc | 69 ++++++++++++++++-- rtgui/controlspotpanel.h | 6 ++ rtgui/locallab.cc | 3 + rtgui/locallabtools.cc | 88 +++++++++++++--------- rtgui/locallabtools.h | 7 +- rtgui/locallabtools2.cc | 22 +++--- rtgui/paramsedited.cc | 7 ++ rtgui/paramsedited.h | 1 + 14 files changed, 223 insertions(+), 156 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 35afada51..2b63be060 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1083,51 +1083,8 @@ HISTORY_MSG_838;Local - Vib gradient strength H HISTORY_MSG_839;Local - Software complexity HISTORY_MSG_840;Local - CL Curve HISTORY_MSG_841;Local - LC curve -HISTORY_MSG_842;Local - Contrast Threshold Mask blur -HISTORY_MSG_843;Local - Radius Mask blur -HISTORY_MSG_844;Local - Color Mask fftw -HISTORY_MSG_845;Local - log encoding -HISTORY_MSG_846;Local - Encoding auto -HISTORY_MSG_847;Local - Source Gray -HISTORY_MSG_848;Local - Source Gray auto -HISTORY_MSG_849;Local - Auto Grayon -HISTORY_MSG_850;Local - Black Ev -HISTORY_MSG_851;Local - White Ev -HISTORY_MSG_852;Local - Target Gray -HISTORY_MSG_853;Local - Local contrast -HISTORY_MSG_854;Local - Scope encoding log -HISTORY_MSG_855;Local - Entire image -HISTORY_MSG_856;Local - Base log -HISTORY_MSG_857;Local - Contrast Blur Residual -HISTORY_MSG_858;Local - Contrast Luminance only -HISTORY_MSG_859;Local - Contrast Maximum Blur levels -HISTORY_MSG_860;Local - Contrast Curve Blur levels -HISTORY_MSG_861;Local - Contrast Curve Contrast levels -HISTORY_MSG_862;Local - Contrast Sigma luminance -HISTORY_MSG_863;Local - Contrast Merge Original -HISTORY_MSG_864;Local - Directional sigma -HISTORY_MSG_865;Local - Directional delta -HISTORY_MSG_866;Local - Contrast Curve Compression -HISTORY_MSG_867;Local - Contrast Amount residual -HISTORY_MSG_868;Local - balance ΔE C-H -HISTORY_MSG_869;Local - denoise curve luminance -HISTORY_MSG_870;Local - LC mask curve LC(H) -HISTORY_MSG_871;Local - LC mask curve C(C) -HISTORY_MSG_872;Local - LC mask curve L(L) -HISTORY_MSG_873;Local - LC mask enable -HISTORY_MSG_875;Local - LC mask blend -HISTORY_MSG_876;Local - LC mask radius -HISTORY_MSG_877;Local - LC mask chroma -HISTORY_MSG_878;Local - LC mask curve contrast -HISTORY_MSG_879;Local - LC Chroma levels -HISTORY_MSG_880;Local - LC Chroma blur levels -HISTORY_MSG_881;Local - Contrast Offset Luminance -HISTORY_MSG_882;Local - Contrast Blur -HISTORY_MSG_883;Local - Contrast By Levels -HISTORY_MSG_884;Local - Contrast Dynamic Range Laplacian -HISTORY_MSG_885;Local - Contrast Dynamic Range Wavelet -HISTORY_MSG_886;Local - Contrast Wavelet Curve Compression -HISTORY_MSG_887;Local - Contrast Wavelet Compression Residual +HISTORY_MSG_842;Local - Contrast Threshold +HISTORY_MSG_843;Local - Radius HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle @@ -1165,7 +1122,7 @@ HISTORY_MSG_923;Local - Tool complexity mode HISTORY_MSG_924;Local - Tool complexity mode HISTORY_MSG_925;Local - Scope color tools HISTORY_MSG_926;Local - Show mask type -HISTORY_MSG_927;Local - Shadow mask +HISTORY_MSG_927;Local - Shadow HISTORY_MSG_928;Local - Common color mask HISTORY_MSG_929;Local - Mask common scope HISTORY_MSG_930;Local - Mask Common blend luma @@ -2353,24 +2310,24 @@ TP_LOCALCONTRAST_LIGHTNESS;Lightness level TP_LOCALCONTRAST_RADIUS;Radius TP_LOCALLAB_ACTIV;Luminance only TP_LOCALLAB_ACTIVSPOT;Enable Spot -TP_LOCALLAB_ADJ;Equalizer Blue-yellow Red-green +TP_LOCALLAB_ADJ;Equalizer Blue-Yellow/Red-Green TP_LOCALLAB_ALL;All rubrics TP_LOCALLAB_AMOUNT;Amount TP_LOCALLAB_ARTIF;Shape detection -TP_LOCALLAB_ARTIF_TOOLTIP;Threshold deltaE-scope increase the range of scope-deltaE - high values are for very wide gamut images.\nIncrease deltaE decay improve shape detection, but can reduce the scope of detection. +TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of deltaE scope. High values are for very wide gamut images.\nIncreasing deltaE decay can improve shape detection, but can also reduce the scope. TP_LOCALLAB_AUTOGRAY;Automatic TP_LOCALLAB_AVOID;Avoid color shift -TP_LOCALLAB_BALAN;Balance ΔE ab-L +TP_LOCALLAB_BALAN;ab-L balance (ΔE) TP_LOCALLAB_BALANEXP;Laplacian balance -TP_LOCALLAB_BALANH;Balance ΔE C-H -TP_LOCALLAB_BALAN_TOOLTIP;Change algorithm ΔE parameter.\nMore or less ab-L, more or less C - H.\nNot for Denoise +TP_LOCALLAB_BALANH;C-H balance (ΔE) +TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less ab-L, or more or less C - H.\nNot for Denoise TP_LOCALLAB_BASELOG;Logarithm base TP_LOCALLAB_BILATERAL;Bilateral filter TP_LOCALLAB_BLACK_EV;Black Ev TP_LOCALLAB_BLCO;Chrominance only TP_LOCALLAB_BLENDMASKCOL;Blend -TP_LOCALLAB_BLENDMASKMASK;Add/substract luminance mask -TP_LOCALLAB_BLENDMASKMASKAB;Add/substract chrominance mask +TP_LOCALLAB_BLENDMASKMASK;Add/subtract luminance mask +TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chrominance mask TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image TP_LOCALLAB_BLGUID;Guided Filter @@ -2387,14 +2344,14 @@ TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground: TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain TP_LOCALLAB_BLURCBDL;Blur levels 0-1-2-3-4 TP_LOCALLAB_BLURCOL;Radius -TP_LOCALLAB_BLURDE;Blur Shape detection +TP_LOCALLAB_BLURDE;Blur shape detection TP_LOCALLAB_BLURLC;Luminance Only TP_LOCALLAB_BLURLEVELFRA;Blur Levels TP_LOCALLAB_BLURMASK_TOOLTIP;Generate a blur mask, take into account the structure with the contrast threshold Mask Blur slider. TP_LOCALLAB_BLURRESIDFRA;Blur Residual TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise - 1 TP_LOCALLAB_BLWH;All changes forced in Black-and-White -TP_LOCALLAB_BLWH_TOOLTIP;Force color change composante "a" and "b" to zero.\nUsefull when the user chooses black and white processes, or film. +TP_LOCALLAB_BLWH_TOOLTIP;Force color components "a" and "b" to zero.\nUseful for black and white processing, or film simulation. TP_LOCALLAB_BUTTON_ADD;Add TP_LOCALLAB_BUTTON_DEL;Delete TP_LOCALLAB_BUTTON_DUPL;Duplicate @@ -2421,26 +2378,26 @@ TP_LOCALLAB_CIRCRADIUS;Spot size TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for treating foliage.\nHigh values may be useful for treating skin TP_LOCALLAB_CLARICRES;Merge chroma TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask - Blend & Soft images -TP_LOCALLAB_CLARILRES;Merge Luma +TP_LOCALLAB_CLARILRES;Merge luma TP_LOCALLAB_CLARISOFT;Soft radius TP_LOCALLAB_CLARISOFT_TOOLTIP;Enabled for Clarity and Sharp mask if Merge Luma different from zero.\n\nEnabled for all wavelets pyramid modules.\nDisabled if Soft radius = 0 TP_LOCALLAB_CLARITYML;Clarity TP_LOCALLAB_CLARI_TOOLTIP;Under or equal level wavelet 4, 'Sharp mask' is enabled.\nAbove level wavelet 5 'Clarity' is enabled.\nUsefull if you use 'Level dynamic Range Compression' -TP_LOCALLAB_CLIPTM;Clip restored datas (gain) +TP_LOCALLAB_CLIPTM;Clip restored data (gain) TP_LOCALLAB_COFR;Color & Light -TP_LOCALLAB_COLORDE;Color preview selection ΔE - Intensity -TP_LOCALLAB_COLORDEPREV_TOOLTIP;Button Preview ΔE needs that only one tool is enabled (expander).\nTo be able to have an Preview ΔE with several enable tools use Mask and modifications - Preview ΔE -TP_LOCALLAB_COLORDE_TOOLTIP;Show preview selection ΔE in blue if negative and in green if positive.\n\nMask and modifications (show modifications without mask): show real modifications if positive, show enhanced modifications (only luminance) with blue and yellow if negative. +TP_LOCALLAB_COLORDE;ΔE preview color - intensity +TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color-preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modifications without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in "Add tool to current spot" menu\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE TP_LOCALLAB_COLORSCOPE;Scope (color tools) -TP_LOCALLAB_COLORSCOPE_TOOLTIP;Use a common Scope for Color and light, Shadows highlight, Vibrance.\nOthers tools have their specific scope. +TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. TP_LOCALLAB_COLOR_TOOLNAME;Color & Light - 11 TP_LOCALLAB_COL_NAME;Name TP_LOCALLAB_COL_VIS;Status -TP_LOCALLAB_COMPFRA;Levels Directional Contrast +TP_LOCALLAB_COMPFRA;Directional Contrast TP_LOCALLAB_COMPFRAME_TOOLTIP;Allows special effects. You can reduce artifacts with 'Clarity & Sharp mask - Blend & Soft Images".\nUses a lot of resources TP_LOCALLAB_COMPLEX_METHOD;Software Complexity TP_LOCALLAB_COMPLEX_TOOLTIP; Allow user to select Local adjustments rubrics. -TP_LOCALLAB_COMPREFRA;Levels Dynamic Wavelet Range (un)Compression +TP_LOCALLAB_COMPREFRA;Wavelet level tone-mapping TP_LOCALLAB_COMPRESS_TOOLTIP;Use if necessary the module 'Clarity & Sharp mask and Blend & Soft Images' by adjusting 'Soft radius' to reduce artifacts. TP_LOCALLAB_CONTCOL;Contrast threshold TP_LOCALLAB_CONTFRA;Contrast by Level @@ -2455,7 +2412,7 @@ TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance "Super" TP_LOCALLAB_CURVCURR;Normal TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nIt is recommended (not required) to position the top of the curves on the gray transition line which represents the references (chroma, luma, hue). TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nThe gray transition line which represents the references (chroma, luma, hue).\nYou can choose or not to position the top of the curves on this transition. -TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To be active, you must enable combobox 'Curves type' +TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To be active, you must enable combobox 'Curve type' TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) has the same algorithm than slider lightness.\n'Super' the curve L=f(L) has an new improved algorithm, which can leeds in some cases to artifacts. @@ -2476,11 +2433,11 @@ TP_LOCALLAB_DENOI_TOOLTIP;This module can be used alone (at the end of process), TP_LOCALLAB_DEPTH;Depth TP_LOCALLAB_DETAIL;Local contrast TP_LOCALLAB_DETAILSH;Details -TP_LOCALLAB_DETAILTHR;Detail threshold Luminance Chroma (DCT ƒ) +TP_LOCALLAB_DETAILTHR;Luminance & Chroma detail threshold (DCT ƒ) TP_LOCALLAB_DUPLSPOTNAME;Copy TP_LOCALLAB_EDGFRA;Edge Sharpness TP_LOCALLAB_EDGSHOW;Show all tolls -TP_LOCALLAB_ELI;Elipse +TP_LOCALLAB_ELI;Ellipse TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping TP_LOCALLAB_ENABLE_MASK;Enable mask TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure @@ -2499,7 +2456,7 @@ TP_LOCALLAB_EV_VIS_ALL;Show all TP_LOCALLAB_EXCLUF;Excluding TP_LOCALLAB_EXCLUF_TOOLTIP;Can be used to exclude this part of datas - move Scope to extend color.\n You can apply all settings to this RT-spot. TP_LOCALLAB_EXCLUTYPE;Spot method -TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot use recursive data.\n\nExcluding spot reinitialize data to origin.\nCan be used to totally or partially cancel a previous action or to perform a inverse mode +TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in inverted mode TP_LOCALLAB_EXECLU;Excluding spot TP_LOCALLAB_EXNORM;Normal spot //TP_LOCALLAB_EXPCBDL_TOOLTIP;In the case of contaminated sensor (type "grease"), and when the area is important or for a series of small defects.\n\na) Put the selection spot on a pronounced default (adapting its size if necessary), use a large spot enough to allow wavelet; b) choose a wide selection area to cover most of the area affected by the defects; c) Select a transition value (low) and transition decay (high value); d) act on levels 2, 3, 4 or 5 or lower by reducing the contrast (values below 100) and by acting on the chroma slider if necessary. e)possibly act on "scope" to reduce the extent of the action.\n\nYou can also complete with Blur levels and Gaussian blur (Smooth Blur and noise) @@ -2527,7 +2484,7 @@ TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high decay transition values and scope to simulate small RT-spot. -TP_LOCALLAB_EXPTOOL;Tools exposure +TP_LOCALLAB_EXPTOOL;Exposure tools TP_LOCALLAB_EXPTRC;Tone Response Curve - TRC TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure - 10 TP_LOCALLAB_FATAMOUNT;Amount @@ -2539,7 +2496,7 @@ TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal - use Fattal Tone mapping algorithm. TP_LOCALLAB_FATLEVEL;Sigma TP_LOCALLAB_FATRES;Amount Residual Image TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ -TP_LOCALLAB_FEATH_TOOLTIP;Gradient width in percent of the Spot diagonal\nUsed by all Graduated filter in all tools.\nNo action if Graduated Filter are not used. +TP_LOCALLAB_FEATH_TOOLTIP;Gradient width in percent of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn’t been activated. TP_LOCALLAB_FEATVALUE;Feather gradient (Graduated Filters) TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform @@ -2555,7 +2512,7 @@ TP_LOCALLAB_GRADANG;Gradient angle TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees : -180 0 +180 TP_LOCALLAB_GRADFRA;Graduated Filter Mask TP_LOCALLAB_GRADGEN_TOOLTIP;Graduated filter is supplied with Color and Light & merge file, Exposure & mask, Shadows Highlight, Vibrance, Log Encoding.\n\nVibrance, Color and Light & merge file, are provided with GF luminance, chrominance, Hue.\nFeather is located in settings. -TP_LOCALLAB_GRADLOGFRA;Luminance graduated Filter +TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance TP_LOCALLAB_GRADSTR;Gradient strength TP_LOCALLAB_GRADSTRAB_TOOLTIP;Filter chroma strength TP_LOCALLAB_GRADSTRCHRO;Chrominance gradient strength @@ -2594,7 +2551,7 @@ TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using Radius and Laplace Threshold (advanced) s TP_LOCALLAB_LAP_MASK_TOOLTIP;Solve PDE for all Laplacian masks.\nIf enabled Laplacian threshold mask reduce artifacts and smooth result.\nIf disabled linear response. TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated.\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\n TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets - 7 -TP_LOCALLAB_LEVELBLUR;Maximum Blur levels +TP_LOCALLAB_LEVELBLUR;Maximum blur levels TP_LOCALLAB_LEVELLOCCONTRAST_TOOLTIP;On the abscissa local contrast (near concept luminance). On the ordinate, amplification or reduction local contrast. TP_LOCALLAB_LEVELWAV;Ψ Wavelets Levels TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4 @@ -2608,7 +2565,7 @@ TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Ba TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Give priority to action on midtones and high lights and by choosing the concerned wavelet levels TP_LOCALLAB_LMASK_LL_TOOLTIP;Give priority to action on midtones and high lights TP_LOCALLAB_LOCCONT;Unsharp Mask -TP_LOCALLAB_LOC_CONTRAST;Local contrast & Wavelets +TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pyramid 1: TP_LOCALLAB_LOC_CONTRASTPYR2;Ψ Pyramid 2: TP_LOCALLAB_LOC_CONTRASTPYR2LAB;Contrast by Level- Tone Mapping - Dir.Contrast @@ -2630,7 +2587,7 @@ TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 TP_LOCALLAB_LUM;Curves LL - CC TP_LOCALLAB_LUMADARKEST;Darkest TP_LOCALLAB_LUMASK;Background color for luminance and color masks -TP_LOCALLAB_LUMASK_TOOLTIP;Adjust the gray of the mask background in Show Mask (Mask and modifications) +TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications) TP_LOCALLAB_LUMAWHITESEST;Whiteest TP_LOCALLAB_LUMFRA;L*a*b* standard TP_LOCALLAB_LUMONLY;Luminance only @@ -2638,7 +2595,7 @@ TP_LOCALLAB_MASKCOM;Common Color Mask TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. //These masks works as all tools, they take into account scope color.\nThey are different from others masks which complete a tool (Color and Light, Exposure...) TP_LOCALLAB_MASFRAME;Mask and Merge -TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and curves contrast , levels contrasts, and mask blur, structure(if enabled tool) are used.\nDisabled in Inverse +TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the deltaE image to avoid modifying the selection area when the following sliders are used: gamma mask, slope mask, chroma mask and curve contrast , level contrasts, and mask blur, structure (if tool enabled ) .\nDisabled when Inverse mode is used TP_LOCALLAB_MASK;Mask TP_LOCALLAB_MASK2;Contrast curve TP_LOCALLAB_MASKCOL;Mask Curves @@ -2681,7 +2638,7 @@ TP_LOCALLAB_MERTEN;Darken only TP_LOCALLAB_MERTHI;Color Burn TP_LOCALLAB_MERTHR;Difference TP_LOCALLAB_MERTWE;Exclusion -TP_LOCALLAB_MERTWO;Substract +TP_LOCALLAB_MERTWO;Subtract TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 (Clip - Offset) TP_LOCALLAB_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible.\nYou can act on Clip Restored datas and Offset to normalize.\n\nRestored image with no mixture. @@ -2695,10 +2652,10 @@ TP_LOCALLAB_MRTHR;Original Image TP_LOCALLAB_MRTWO;Short Curves 'L' Mask TP_LOCALLAB_MULTIPL_TOOLTIP;Allows the retouching of tones over a very wide range : -18EV +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts light tones up to 4EV TP_LOCALLAB_NEIGH;Radius -TP_LOCALLAB_NOISECHROCOARSE;Chroma coarse (Wav) +TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02 TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery (DCT ƒ) -TP_LOCALLAB_NOISECHROFINE;Chroma fine (Wav) +TP_LOCALLAB_NOISECHROFINE;Fine chroma(Wav) TP_LOCALLAB_NOISEDETAIL_TOOLTIP;Disabled if slider = 100 TP_LOCALLAB_NOISELEQUAL;Equalizer white-black TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) @@ -2722,7 +2679,7 @@ TP_LOCALLAB_PREVIEW;Preview ΔE TP_LOCALLAB_PREVHIDE;Hide additional settings TP_LOCALLAB_PREVSHOW;Show additional settings TP_LOCALLAB_PROXI;ΔE decay -TP_LOCALLAB_QUALCURV_METHOD;Curves type +TP_LOCALLAB_QUALCURV_METHOD;Curve type TP_LOCALLAB_QUAL_METHOD;Global quality TP_LOCALLAB_RADIUS;Radius TP_LOCALLAB_RADIUS_TOOLTIP;Above Radius 30 Use Fast Fourier Transform @@ -2735,7 +2692,7 @@ TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot TP_LOCALLAB_RESETSHOW;Reset All Show Modifications TP_LOCALLAB_RESID;Residual Image -TP_LOCALLAB_RESIDBLUR;Blur Residual Image +TP_LOCALLAB_RESIDBLUR;Blur residual image TP_LOCALLAB_RESIDCHRO;Residual image Chroma TP_LOCALLAB_RESIDCOMP;Compress residual image TP_LOCALLAB_RESIDCONT;Residual image Contrast @@ -2743,7 +2700,7 @@ TP_LOCALLAB_RESIDHI;Highlights TP_LOCALLAB_RESIDHITHR;Highlights threshold TP_LOCALLAB_RESIDSHA;Shadows TP_LOCALLAB_RESIDSHATHR;Shadows threshold -TP_LOCALLAB_RETI;Dehaze - Retinex +TP_LOCALLAB_RETI;Dehaze & Retinex TP_LOCALLAB_RETIFRA;Retinex TP_LOCALLAB_RETIM;Original Retinex TP_LOCALLAB_RETITOOLFRA;Retinex Tools @@ -2764,7 +2721,7 @@ TP_LOCALLAB_SCALEGR;Scale TP_LOCALLAB_SCALERETI;Scale TP_LOCALLAB_SCALTM;Scale TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) -TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if Mask DeltaE Image is enabled.\nLow values avoid retouching selected area +TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if DeltaE Image Mask is enabled.\nLow values avoid retouching selected area TP_LOCALLAB_SENSI;Scope TP_LOCALLAB_SENSIBN;Scope TP_LOCALLAB_SENSICB;Scope @@ -2802,7 +2759,7 @@ TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows TP_LOCALLAB_SHOWC;Mask and modifications TP_LOCALLAB_SHOWC1;Merge file TP_LOCALLAB_SHOWCB;Mask and modifications -TP_LOCALLAB_SHOWDCT;Show process Fourier ƒ +TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process TP_LOCALLAB_SHOWE;Mask and modifications TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) @@ -2818,7 +2775,7 @@ TP_LOCALLAB_SHOWMNONE;Show modified image TP_LOCALLAB_SHOWMODIF;Show modifications without mask TP_LOCALLAB_SHOWMODIFMASK;Show modifications with mask TP_LOCALLAB_SHOWNORMAL;Normalize luminance (no) -TP_LOCALLAB_SHOWPLUS;Mask and modifications - Smooth-Blur & Denoise +TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) TP_LOCALLAB_SHOWR;Mask and modifications TP_LOCALLAB_SHOWREF;Preview ΔE @@ -2834,12 +2791,12 @@ TP_LOCALLAB_SIGMAWAV;Attenuation response TP_LOCALLAB_SIM;Simple TP_LOCALLAB_SLOMASKCOL;Slope TP_LOCALLAB_SLOSH;Slope -TP_LOCALLAB_SOFT;Soft Light - Original Retinex +TP_LOCALLAB_SOFT;Soft Light & Original Retinex TP_LOCALLAB_SOFTM;Soft Light //TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Original Retinex is very different from others Retinex method.\nIts acts on grey and balance luminance.\nIt is an emulation of "Dodge" and "Burn" TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. TP_LOCALLAB_SOFTRADIUSCOL;Soft radius -TP_LOCALLAB_SOFTRETI;Reduce ΔE artifact +TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts TP_LOCALLAB_SOFTRETI_TOOLTIP;Take into account deltaE to improve Transmission map TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 TP_LOCALLAB_SOURCE_GRAY;Value @@ -2868,13 +2825,13 @@ TP_LOCALLAB_SYM;Symmetrical (mouse) TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) TP_LOCALLAB_TARGET_GRAY;Target gray point TP_LOCALLAB_THRES;Threshold structure -TP_LOCALLAB_THRESDELTAE;Threshold ΔE-scope +TP_LOCALLAB_THRESDELTAE;ΔE scope threshold TP_LOCALLAB_THRESRETI;Threshold TP_LOCALLAB_THRESWAV;Balance threshold -TP_LOCALLAB_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 (Threshold) +TP_LOCALLAB_TLABEL;TM Data Min=%1 Max=%2 Mean=%3 Sigma=%4 (Threshold) TP_LOCALLAB_TLABEL2;TM Effective Tm=%1 TM=%2 TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize -TP_LOCALLAB_TM;Tone Mapping - Texture +TP_LOCALLAB_TM;Tone Mapping TP_LOCALLAB_TM_MASK;Use transmission map TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This parameter affects sensitivity to edges.\n The greater it is the more likely an illumination change is to be considered an "edge".\n If set to zero tone mapping will have an effect similar to unsharp masking. TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Gamma moves the action of tone-mapping to shadows or highlights. @@ -2884,22 +2841,22 @@ TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe TP_LOCALLAB_TONEMASCALE_TOOLTIP;This control gives meaning to the difference between "local" and "global" contrast.\nThe greater it is the larger a detail needs to be in order to be boosted TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 TP_LOCALLAB_TOOLCOL;Structure mask as tool -TP_LOCALLAB_TOOLMASK;Tools +TP_LOCALLAB_TOOLMASK;Mask Tools TP_LOCALLAB_TRANSIT;Transition Gradient TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Changes the transition of the abscissa to that of the ordinate TP_LOCALLAB_TRANSITVALUE;Transition value TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) -TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay : change smoothness process - 1 linear - 2 parabolic - 3 cubic - ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelet, Color & Light) +TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light) TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas, as a percentage of the "radius" TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain TP_LOCALLAB_TRANSMISSIONMAP;Transmission map TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.\nYou can act on this curve to change Transmission and reduce the artifacts TP_LOCALLAB_USEMASK;Use mask TP_LOCALLAB_VART;Variance (contrast) -TP_LOCALLAB_VIBRANCE;Vibrance - Warm/Cool +TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool TP_LOCALLAB_VIBRA_TOOLTIP;Adjust vibrance (essentially the same as the global adjustment).\nCarry out the equivalent of a white-balance adjustment using a CIECAM algorithm. -TP_LOCALLAB_VIB_TOOLNAME;Vibrance - Warm/Cool - 3 +TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool - 3 TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise - 1 TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 @@ -2914,7 +2871,7 @@ TP_LOCALLAB_WAMASKCOL;Ψ Mask Wavelet level TP_LOCALLAB_WARM;Warm/Cool & Color artifacts TP_LOCALLAB_WARM_TOOLTIP;This slider use Ciecam algorithm and acts as White Balance, it can warm or cool the area selected.\nIt can also in some cases reduce color artifacts. TP_LOCALLAB_WASDEN_TOOLTIP;Denoise luminance for the 3 first levels (fine).\nThe right limit of the curve correspond to coarse : level 3 and beyond -TP_LOCALLAB_WAV;Levels local contrast +TP_LOCALLAB_WAV;Local contrast by level TP_LOCALLAB_WAVBLUR_TOOLTIP;Performs a blur for each level of decomposition, as well as the residual image. TP_LOCALLAB_WAVCOMP;Compression by Level TP_LOCALLAB_WAVCOMPRE;(un)Compression by Level @@ -3241,7 +3198,7 @@ TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Red/Yellow TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Yellow TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H) TP_VIBRANCE_LABEL;Vibrance -TP_VIBRANCE_PASTELS;Pastel Tones +TP_VIBRANCE_PASTELS;Pastel tones TP_VIBRANCE_PASTSATTOG;Link pastel and saturated tones TP_VIBRANCE_PROTECTSKINS;Protect skin-tones TP_VIBRANCE_PSTHRESHOLD;Pastel/saturated tones threshold @@ -3276,7 +3233,7 @@ TP_WAVELET_BALANCE;Contrast balance d/v-h TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified. TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the vertical, horizontal and diagonal wavelet directions: .\nActivating contrast, chroma or residual tone mapping amplifies the effect due to balance TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. -TP_WAVELET_BALCHROM;Denoise equalizer Blue-Yellow Red-Green +TP_WAVELET_BALCHROM;Denoise equalizer Blue-Yellow/Red-Green TP_WAVELET_BALLUM;Denoise equalizer White-Black TP_WAVELET_BANONE;None TP_WAVELET_BASLI;Slider @@ -3437,7 +3394,7 @@ TP_WAVELET_MEDI;Reduce artifacts in blue sky TP_WAVELET_MEDILEV;Edge detection TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine. TP_WAVELET_MERGEC;Merge chroma -TP_WAVELET_MERGEL;Merge Luma +TP_WAVELET_MERGEL;Merge luma TP_WAVELET_NEUTRAL;Neutral TP_WAVELET_MIXCONTRAST;Reference local contrast TP_WAVELET_MIXDENOISE;Denoise diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index b70ddee6e..67d754dbb 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -709,12 +709,14 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall } else if (locallab.spots.at(sp).gridMethod == "two") { lp.gridmet = 1; } - +/* if (locallab.spots.at(sp).expMethod == "std") { lp.expmet = 0; } else if (locallab.spots.at(sp).expMethod == "pde") { lp.expmet = 1; } +*/ + lp.expmet = 1; if (locallab.spots.at(sp).localcontMethod == "loc") { lp.locmet = 0; @@ -3401,6 +3403,13 @@ void ImProcFunctions::deltaEforMask(float **rdE, int bfw, int bfh, LabImage* buf static void showmask(int lumask, const local_params& lp, int xstart, int ystart, int cx, int cy, int bfw, int bfh, LabImage* bufexporig, LabImage* transformed, LabImage* bufmaskorigSH, int inv) { + float lum = fabs(lumask * 400.f); + float colo = 0.f; + if(lumask < 0.f) { + lum *= 1.4f; + colo = 30000.f + 12.f * lum; + } + #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif @@ -3421,17 +3430,18 @@ static void showmask(int lumask, const local_params& lp, int xstart, int ystart, if (inv == 0) { if (zone > 0) {//normal - transformed->L[y + ystart][x + xstart] = (lumask * 400.f) + clipLoc(bufmaskorigSH->L[y][x]); + transformed->L[y + ystart][x + xstart] = (lum) + clipLoc(bufmaskorigSH->L[y][x]); transformed->a[y + ystart][x + xstart] = bufexporig->a[y][x] * bufmaskorigSH->a[y][x]; - transformed->b[y + ystart][x + xstart] = bufexporig->b[y][x] * bufmaskorigSH->b[y][x]; + transformed->b[y + ystart][x + xstart] = (colo) + bufexporig->b[y][x] * bufmaskorigSH->b[y][x]; } } else if (inv == 1) { //inverse if (zone == 0) { - transformed->L[y + ystart][x + xstart] = (lumask * 400.f) + clipLoc(bufmaskorigSH->L[y][x]); + transformed->L[y + ystart][x + xstart] = (lum) + clipLoc(bufmaskorigSH->L[y][x]); transformed->a[y + ystart][x + xstart] = bufexporig->a[y][x] * bufmaskorigSH->a[y][x]; - transformed->b[y + ystart][x + xstart] = bufexporig->b[y][x] * bufmaskorigSH->b[y][x]; + transformed->b[y + ystart][x + xstart] = (colo) + bufexporig->b[y][x] * bufmaskorigSH->b[y][x]; } } + } } } diff --git a/rtengine/procevents.h b/rtengine/procevents.h index b64748d22..730689192 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -979,6 +979,7 @@ enum ProcEventCode { EvLocallabSpotprevMethod = 953, Evlocallabactiv = 954, EvlocallabCHshape = 955, + Evlocallabhishow = 956, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 235a20e9b..5ebd2ec48 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2713,6 +2713,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : colorscope(30.0), transitweak(1.0), transitgrad(0.0), + hishow(false), activ(true), avoid(false), blwh(false), @@ -3970,6 +3971,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && colorscope == other.colorscope && transitweak == other.transitweak && transitgrad == other.transitgrad + && hishow == other.hishow && activ == other.activ && avoid == other.avoid && blwh == other.blwh @@ -5496,6 +5498,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->colorscope, "Locallab", "Colorscope_" + index_str, spot.colorscope, keyFile); saveToKeyfile(!pedited || spot_edited->transitweak, "Locallab", "Transitweak_" + index_str, spot.transitweak, keyFile); saveToKeyfile(!pedited || spot_edited->transitgrad, "Locallab", "Transitgrad_" + index_str, spot.transitgrad, keyFile); + saveToKeyfile(!pedited || spot_edited->hishow, "Locallab", "Hishow_" + index_str, spot.hishow, keyFile); saveToKeyfile(!pedited || spot_edited->activ, "Locallab", "Activ_" + index_str, spot.activ, keyFile); saveToKeyfile(!pedited || spot_edited->avoid, "Locallab", "Avoid_" + index_str, spot.avoid, keyFile); saveToKeyfile(!pedited || spot_edited->blwh, "Locallab", "Blwh_" + index_str, spot.blwh, keyFile); @@ -7182,6 +7185,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Colorscope_" + index_str, pedited, spot.colorscope, spotEdited.colorscope); assignFromKeyfile(keyFile, "Locallab", "Transitweak_" + index_str, pedited, spot.transitweak, spotEdited.transitweak); assignFromKeyfile(keyFile, "Locallab", "Transitgrad_" + index_str, pedited, spot.transitgrad, spotEdited.transitgrad); + assignFromKeyfile(keyFile, "Locallab", "Hishow_" + index_str, pedited, spot.hishow, spotEdited.hishow); assignFromKeyfile(keyFile, "Locallab", "Activ_" + index_str, pedited, spot.activ, spotEdited.activ); assignFromKeyfile(keyFile, "Locallab", "Avoid_" + index_str, pedited, spot.avoid, spotEdited.avoid); assignFromKeyfile(keyFile, "Locallab", "Blwh_" + index_str, pedited, spot.blwh, spotEdited.blwh); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index c435e317a..44747bbab 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1002,6 +1002,7 @@ struct LocallabParams { double colorscope; double transitweak; double transitgrad; + bool hishow; bool activ; bool avoid; bool blwh; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 1be81a7de..0b0f6fb3c 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -983,6 +983,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // EvLocallabSpotprevMethod LUMINANCECURVE, // Evlocallabactiv LUMINANCECURVE, // EvlocallabCHshape + LUMINANCECURVE //Evlocallabhishow }; diff --git a/rtgui/controlspotpanel.cc b/rtgui/controlspotpanel.cc index 0b66eb986..9ed4c95ee 100644 --- a/rtgui/controlspotpanel.cc +++ b/rtgui/controlspotpanel.cc @@ -77,8 +77,9 @@ ControlSpotPanel::ControlSpotPanel(): colorde_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_COLORDE"), -15, 15, 2, 5, Gtk::manage(new RTImage("circle-blue-yellow-small.png")), Gtk::manage(new RTImage("circle-gray-green-small.png"))))), colorscope_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_COLORSCOPE"), 0., 100.0, 1., 30.))), scopemask_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCOPEMASK"), 0, 100, 1, 60))), - lumask_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LUMASK"), 0, 30, 1, 10))), + lumask_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LUMASK"), -50, 30, 1, 10, Gtk::manage(new RTImage("circle-yellow-small.png")), Gtk::manage(new RTImage("circle-gray-small.png")) ))), + hishow_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_PREVSHOW")))), activ_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ACTIVSPOT")))), avoid_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AVOID")))), blwh_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_BLWH")))), @@ -108,6 +109,7 @@ ControlSpotPanel::ControlSpotPanel(): maskPrevActive(false) { const bool showtooltip = options.showtooltip; + pack_start(*hishow_); Gtk::HBox* const ctboxprevmethod = Gtk::manage(new Gtk::HBox()); prevMethod_->append(M("TP_LOCALLAB_PREVHIDE")); @@ -117,7 +119,7 @@ ControlSpotPanel::ControlSpotPanel(): sigc::mem_fun( *this, &ControlSpotPanel::prevMethodChanged)); - ctboxprevmethod->pack_start(*prevMethod_); +// ctboxprevmethod->pack_start(*prevMethod_); pack_start(*ctboxprevmethod); @@ -380,6 +382,9 @@ ControlSpotPanel::ControlSpotPanel(): pack_start(*artifBox2); ToolParamBlock* const specCaseBox = Gtk::manage(new ToolParamBlock()); + hishowconn_ = hishow_->signal_toggled().connect( + sigc::mem_fun(*this, &ControlSpotPanel::hishowChanged)); + activConn_ = activ_->signal_toggled().connect( sigc::mem_fun(*this, &ControlSpotPanel::activChanged)); @@ -819,6 +824,7 @@ void ControlSpotPanel::load_ControlSpot_param() balanh_->setValue((double)row[spots_.balanh]); colorde_->setValue((double)row[spots_.colorde]); colorscope_->setValue((double)row[spots_.colorscope]); + hishow_->set_active(row[spots_.hishow]); activ_->set_active(row[spots_.activ]); avoid_->set_active(row[spots_.avoid]); blwh_->set_active(row[spots_.blwh]); @@ -899,7 +905,7 @@ void ControlSpotPanel::prevMethodChanged() Gtk::TreeModel::Row row = *iter; row[spots_.prevMethod] = prevMethod_->get_active_row_number(); - +/* // Update Control Spot GUI according to spotMethod_ combobox state (to be compliant with updateParamVisibility function) if (multiImage && prevMethod_->get_active_text() == M("GENERAL_UNCHANGED")) { expTransGrad_->show(); @@ -925,10 +931,10 @@ void ControlSpotPanel::prevMethodChanged() circrad_->show(); ctboxshape->show(); } - +*/ // Raise event if (listener) { - listener->panelChanged(EvLocallabSpotprevMethod, prevMethod_->get_active_text()); +// listener->panelChanged(EvLocallabSpotprevMethod, prevMethod_->get_active_text()); } } @@ -1179,7 +1185,7 @@ void ControlSpotPanel::updateParamVisibility() excluFrame->show(); } - +/* if (multiImage && prevMethod_->get_active_text() == M("GENERAL_UNCHANGED")) { expTransGrad_->show(); expShapeDetect_->show(); @@ -1188,6 +1194,8 @@ void ControlSpotPanel::updateParamVisibility() circrad_->show(); ctboxshape->show(); } else if (prevMethod_->get_active_row_number() == 0) { // Normal case + */ + if (!hishow_->get_active()) { // Normal case expTransGrad_->hide(); expShapeDetect_->hide(); expSpecCases_->hide(); @@ -1432,6 +1440,50 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } } +void ControlSpotPanel::hishowChanged() +{ + // printf("avoidChanged\n"); + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + row[spots_.hishow] = hishow_->get_active(); + + + + if (!hishow_->get_active()) { // Normal case + expTransGrad_->hide(); + expShapeDetect_->hide(); + expSpecCases_->hide(); + expMaskMerge_->hide(); + circrad_->hide(); + ctboxshape->hide(); + shapeMethod_->set_active(0); + + } else { // Excluding case + expTransGrad_->show(); + expShapeDetect_->show(); + expSpecCases_->show(); + expMaskMerge_->show(); + circrad_->show(); + ctboxshape->show(); + } + + // Raise event + if (listener) { + if (hishow_->get_active()) { + listener->panelChanged(Evlocallabhishow, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(Evlocallabhishow, M("GENERAL_DISABLED")); + } + } +} @@ -1677,6 +1729,7 @@ void ControlSpotPanel::disableParamlistener(bool cond) balanh_->block(cond); colorde_->block(cond); colorscope_->block(cond); + hishowconn_.block(cond); activConn_.block(cond); avoidConn_.block(cond); blwhConn_.block(cond); @@ -1720,6 +1773,7 @@ void ControlSpotPanel::setParamEditable(bool cond) balanh_->set_sensitive(cond); colorde_->set_sensitive(cond); colorscope_->set_sensitive(cond); + hishow_->set_sensitive(cond); activ_->set_sensitive(cond); avoid_->set_sensitive(cond); blwh_->set_sensitive(cond); @@ -2401,6 +2455,7 @@ ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(const int index) r->transitgrad = row[spots_.transitgrad]; r->scopemask = row[spots_.scopemask]; r->lumask = row[spots_.lumask]; + r->hishow = row[spots_.hishow]; r->activ = row[spots_.activ]; r->avoid = row[spots_.avoid]; r->blwh = row[spots_.blwh]; @@ -2531,6 +2586,7 @@ void ControlSpotPanel::addControlSpot(SpotRow* newSpot) row[spots_.balanh] = newSpot->balanh; row[spots_.colorde] = newSpot->colorde; row[spots_.colorscope] = newSpot->colorscope; + row[spots_.hishow] = newSpot->hishow; row[spots_.activ] = newSpot->activ; row[spots_.avoid] = newSpot->avoid; row[spots_.blwh] = newSpot->blwh; @@ -2645,6 +2701,7 @@ ControlSpotPanel::ControlSpots::ControlSpots() add(balanh); add(colorde); add(colorscope); + add(hishow); add(activ); add(avoid); add(blwh); diff --git a/rtgui/controlspotpanel.h b/rtgui/controlspotpanel.h index 720bdf0c1..f8ef41dc0 100644 --- a/rtgui/controlspotpanel.h +++ b/rtgui/controlspotpanel.h @@ -75,6 +75,7 @@ public: double balanh; double colorde; double colorscope; + bool hishow; bool activ; bool avoid; bool blwh; @@ -245,6 +246,7 @@ private: void adjusterChanged(Adjuster* a, double newval) override; + void hishowChanged(); void activChanged(); void avoidChanged(); void blwhChanged(); @@ -305,6 +307,7 @@ private: Gtk::TreeModelColumn balanh; Gtk::TreeModelColumn colorde; Gtk::TreeModelColumn colorscope; + Gtk::TreeModelColumn hishow; Gtk::TreeModelColumn activ; Gtk::TreeModelColumn avoid; Gtk::TreeModelColumn blwh; @@ -355,6 +358,7 @@ private: Gtk::Button* const button_visibility_; sigc::connection buttonvisibilityconn_; + MyComboBoxText* const prevMethod_; sigc::connection prevMethodconn_; MyComboBoxText* const shape_; @@ -393,6 +397,8 @@ private: Adjuster* const scopemask_; Adjuster* const lumask_; + Gtk::CheckButton* const hishow_; + sigc::connection hishowconn_; Gtk::CheckButton* const activ_; sigc::connection activConn_; Gtk::CheckButton* const avoid_; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 883ef9aa2..1710a060f 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -311,6 +311,7 @@ void Locallab::read(const rtengine::procparams::ProcParams* pp, const ParamsEdit r->balanh = pp->locallab.spots.at(i).balanh; r->colorde = pp->locallab.spots.at(i).colorde; r->colorscope = pp->locallab.spots.at(i).colorscope; + r->hishow = pp->locallab.spots.at(i).hishow; r->activ = pp->locallab.spots.at(i).activ; r->avoid = pp->locallab.spots.at(i).avoid; r->blwh = pp->locallab.spots.at(i).blwh; @@ -486,6 +487,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited r->balanh = newSpot->balanh; r->colorde = newSpot->colorde; r->colorscope = newSpot->colorscope; + r->hishow = newSpot->hishow; r->activ = newSpot->activ; r->avoid = newSpot->avoid; r->blwh = newSpot->blwh; @@ -918,6 +920,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited pp->locallab.spots.at(pp->locallab.selspot).balanh = r->balanh; pp->locallab.spots.at(pp->locallab.selspot).colorde = r->colorde; pp->locallab.spots.at(pp->locallab.selspot).colorscope = r->colorscope; + pp->locallab.spots.at(pp->locallab.selspot).hishow = r->hishow; pp->locallab.spots.at(pp->locallab.selspot).activ = r->activ; pp->locallab.spots.at(pp->locallab.selspot).avoid = r->avoid; pp->locallab.spots.at(pp->locallab.selspot).blwh = r->blwh; diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index 42574d15c..1a64d2722 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -951,14 +951,14 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips) structcol->set_tooltip_text(""); strcol->set_tooltip_text(""); angcol->set_tooltip_text(""); - qualitycurveMethod->set_tooltip_text(""); + qualitycurveMethod->set_tooltip_markup(""); special->set_tooltip_text(""); expmaskcol1->set_tooltip_text(""); mercol->set_tooltip_text(""); opacol->set_tooltip_text(""); conthrcol->set_tooltip_text(""); gridmerFrame->set_tooltip_text(""); - expmaskcol->set_tooltip_text(""); + expmaskcol->set_tooltip_markup(""); CCmaskshape->setTooltip(""); LLmaskshape->setTooltip(""); HHmaskshape->setTooltip(""); @@ -2311,13 +2311,15 @@ LocallabExposure::LocallabExposure(): // Exposure specific widgets expMethod(Gtk::manage(new MyComboBoxText())), - pdeFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_PDEFRA")))), +// pdeFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_PDEFRA")))), + exppde(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_PDEFRA")))), laplacexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPLACEXP"), 0.0, 100.0, 0.1, 0.))), linear(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LINEAR"), 0., 1., 0.01, 0.05))), balanexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BALANEXP"), 0.5, 1.5, 0.01, 1.0))), gamm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMM"), 0.2, 1.3, 0.01, 0.4))), exnoiseMethod(Gtk::manage(new MyComboBoxText())), - fatFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_FATFRA")))), +// fatFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_FATFRA")))), + expfat(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_FATFRA")))), fatamount(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATAMOUNT"), 1., 100., 1., 1.))), fatdetail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATDETAIL"), -100., 300., 1., 0.))), fatlevel(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATLEVEL"), 0.25, 2.5, 0.05, 1.))), @@ -2369,7 +2371,9 @@ LocallabExposure::LocallabExposure(): expMethod->set_active(0); expMethodConn = expMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabExposure::expMethodChanged)); - pdeFrame->set_label_align(0.025, 0.5); +// pdeFrame->set_label_align(0.025, 0.5); + setExpandAlignProperties(exppde, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + setExpandAlignProperties(expfat, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); laplacexp->setAdjusterListener(this); @@ -2385,7 +2389,7 @@ LocallabExposure::LocallabExposure(): exnoiseMethod->set_active(0); exnoiseMethodConn = exnoiseMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabExposure::exnoiseMethodChanged)); - fatFrame->set_label_align(0.025, 0.5); + // fatFrame->set_label_align(0.025, 0.5); fatamount->setAdjusterListener(this); @@ -2505,7 +2509,7 @@ LocallabExposure::LocallabExposure(): mask2expCurveEditorG->curveListComplete(); // Add Color & Light specific widgets to GUI - pack_start(*expMethod); +// pack_start(*expMethod); ToolParamBlock* const pdeBox = Gtk::manage(new ToolParamBlock()); pdeBox->pack_start(*laplacexp); pdeBox->pack_start(*linear); @@ -2516,15 +2520,19 @@ LocallabExposure::LocallabExposure(): ctboxexpmethod->pack_start(*labelexpmethod, Gtk::PACK_SHRINK, 4); ctboxexpmethod->pack_start(*exnoiseMethod); pdeBox->pack_start(*ctboxexpmethod); - pdeFrame->add(*pdeBox); - pack_start(*pdeFrame); + exppde->add(*pdeBox, false); +// pdeFrame->add(*pdeBox); +// pack_start(*pdeFrame); + pack_start(*exppde); ToolParamBlock* const fatBox = Gtk::manage(new ToolParamBlock()); fatBox->pack_start(*fatamount); fatBox->pack_start(*fatdetail); fatBox->pack_start(*fatlevel); fatBox->pack_start(*fatanchor); - fatFrame->add(*fatBox); - pack_start(*fatFrame); +// fatFrame->add(*fatBox); + expfat->add(*fatBox, false); +// pack_start(*fatFrame); + pack_start(*expfat); pack_start(*expcomp); pack_start(*sensiex); pack_start(*structexp); @@ -2602,14 +2610,16 @@ void LocallabExposure::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { exp->set_tooltip_text(M("TP_LOCALLAB_EXPOSURE_TOOLTIP")); - expMethod->set_tooltip_text(M("TP_LOCALLAB_EXPMETHOD_TOOLTIP")); - pdeFrame->set_tooltip_text(M("TP_LOCALLAB_PDEFRAME_TOOLTIP")); +// expMethod->set_tooltip_text(M("TP_LOCALLAB_EXPMETHOD_TOOLTIP")); +// pdeFrame->set_tooltip_text(M("TP_LOCALLAB_PDEFRAME_TOOLTIP")); + exppde->set_tooltip_text(M("TP_LOCALLAB_PDEFRAME_TOOLTIP")); laplacexp->set_tooltip_text(M("TP_LOCALLAB_EXPLAP_TOOLTIP")); linear->set_tooltip_text(M("TP_LOCALLAB_EXPLAPLIN_TOOLTIP")); balanexp->set_tooltip_text(M("TP_LOCALLAB_EXPLAPBAL_TOOLTIP")); gamm->set_tooltip_text(M("TP_LOCALLAB_EXPLAPGAMM_TOOLTIP")); exnoiseMethod->set_tooltip_text(M("TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP")); - fatFrame->set_tooltip_text(M("TP_LOCALLAB_FATFRAME_TOOLTIP")); +// fatFrame->set_tooltip_text(M("TP_LOCALLAB_FATFRAME_TOOLTIP")); + expfat->set_tooltip_text(M("TP_LOCALLAB_FATFRAME_TOOLTIP")); expcomp->set_tooltip_text(M("TP_LOCALLAB_EXPCOMP_TOOLTIP")); sensiex->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); structexp->set_tooltip_text(M("TP_LOCALLAB_STRUCT_TOOLTIP")); @@ -2628,21 +2638,20 @@ void LocallabExposure::updateAdviceTooltips(const bool showTooltips) Lmaskexpshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); } else { exp->set_tooltip_text(""); - expMethod->set_tooltip_text(""); - pdeFrame->set_tooltip_text(""); + exppde->set_tooltip_text(""); laplacexp->set_tooltip_text(""); linear->set_tooltip_text(""); balanexp->set_tooltip_text(""); gamm->set_tooltip_text(""); exnoiseMethod->set_tooltip_text(""); - fatFrame->set_tooltip_text(""); + expfat->set_tooltip_text(""); expcomp->set_tooltip_text(""); sensiex->set_tooltip_text(""); structexp->set_tooltip_text(""); expchroma->set_tooltip_text(""); shapeexpos->setTooltip(""); strexp->set_tooltip_text(""); - expmaskexp->set_tooltip_text(""); + expmaskexp->set_tooltip_markup(""); CCmaskexpshape->setTooltip(""); LLmaskexpshape->setTooltip(""); HHmaskexpshape->setTooltip(""); @@ -2658,6 +2667,8 @@ void LocallabExposure::updateAdviceTooltips(const bool showTooltips) void LocallabExposure::setDefaultExpanderVisibility() { exptoolexp->set_expanded(false); + exppde->set_expanded(false); + expfat->set_expanded(false); expgradexp->set_expanded(false); expmaskexp->set_expanded(false); } @@ -2704,13 +2715,13 @@ void LocallabExposure::read(const rtengine::procparams::ProcParams* pp, const Pa exp->set_visible(spot.visiexpose); exp->setEnabled(spot.expexpose); complexity->set_active(spot.complexexpose); - +/* if (spot.expMethod == "std") { expMethod->set_active(0); } else if (spot.expMethod == "pde") { expMethod->set_active(1); } - +*/ laplacexp->setValue(spot.laplacexp); linear->setValue(spot.linear); balanexp->setValue(spot.balanexp); @@ -2787,13 +2798,13 @@ void LocallabExposure::write(rtengine::procparams::ProcParams* pp, ParamsEdited* spot.expexpose = exp->getEnabled(); spot.visiexpose = exp->get_visible(); spot.complexexpose = complexity->get_active_row_number(); - +/* if (expMethod->get_active_row_number() == 0) { spot.expMethod = "std"; } else if (expMethod->get_active_row_number() == 1) { spot.expMethod = "pde"; } - +*/ spot.laplacexp = laplacexp->getValue(); spot.linear = linear->getValue(); spot.balanexp = balanexp->getValue(); @@ -3395,19 +3406,24 @@ void LocallabExposure::updateExposureGUI1() } void LocallabExposure::updateExposureGUI2() -{ +{ /* // Update exposure GUI according to expMethod value if (expMethod->get_active_row_number() == 0) { - pdeFrame->hide(); - fatFrame->hide(); +// pdeFrame->hide(); +// fatFrame->hide(); + exppde->hide(); + expfat->hide(); softradiusexp->set_sensitive(true); sensiex->set_sensitive(true); } else if (expMethod->get_active_row_number() == 1) { - pdeFrame->show(); - fatFrame->show(); + // pdeFrame->show(); + // fatFrame->show(); + exppde->show(); + expfat->show(); softradiusexp->set_sensitive(false); sensiex->set_sensitive(true); } + */ } void LocallabExposure::updateExposureGUI3() @@ -3723,11 +3739,10 @@ void LocallabShadow::updateAdviceTooltips(const bool showTooltips) for (const auto multiplier : multipliersh) { multiplier->set_tooltip_text(""); } - gamSH->set_tooltip_text(""); sloSH->set_tooltip_text(""); strSH->set_tooltip_text(""); - expmasksh->set_tooltip_text(""); + expmasksh->set_tooltip_markup(""); CCmaskSHshape->setTooltip(""); LLmaskSHshape->setTooltip(""); HHmaskSHshape->setTooltip(""); @@ -3736,6 +3751,7 @@ void LocallabShadow::updateAdviceTooltips(const bool showTooltips) lapmaskSH->set_tooltip_text(""); mask2SHCurveEditorG->set_tooltip_text(""); LmaskSHshape->setTooltip(""); + } } @@ -4613,7 +4629,7 @@ void LocallabVibrance::updateAdviceTooltips(const bool showTooltips) exp->set_tooltip_text(""); warm->set_tooltip_text(""); strvib->set_tooltip_text(""); - expmaskvib->set_tooltip_text(""); + expmaskvib->set_tooltip_markup(""); CCmaskvibshape->setTooltip(""); LLmaskvibshape->setTooltip(""); HHmaskvibshape->setTooltip(""); @@ -5280,7 +5296,7 @@ void LocallabSoft::updateAdviceTooltips(const bool showTooltips) laplace->set_tooltip_text(M("TP_LOCALLAB_ORRETILAP_TOOLTIP")); } else { exp->set_tooltip_text(""); - showmasksoftMethod->set_tooltip_text(""); + showmasksoftMethod->set_tooltip_markup(""); streng->set_tooltip_text(""); laplace->set_tooltip_text(""); } @@ -5942,15 +5958,15 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) Lmaskblshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); LLmaskblshapewav->setTooltip(M("TP_LOCALLAB_LMASK_LEVEL_TOOLTIP")); } else { - expblnoise->set_tooltip_text(""); + expblnoise->set_tooltip_markup(""); radius->set_tooltip_text(""); sensibn->set_tooltip_text(""); - blurMethod->set_tooltip_text(""); - expdenoise->set_tooltip_text(""); + blurMethod->set_tooltip_markup(""); + expdenoise->set_tooltip_markup(""); wavshapeden->setTooltip(""); noiselumc->set_tooltip_text(""); - expmaskbl->set_tooltip_text(""); - showmaskblMethodtyp->set_tooltip_text(""); + expmaskbl->set_tooltip_markup(""); + showmaskblMethodtyp->set_tooltip_markup(""); CCmaskblshape->setTooltip(""); LLmaskblshape->setTooltip(""); HHmaskblshape->setTooltip(""); diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index 8b5152968..9d0e21779 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -317,13 +317,15 @@ class LocallabExposure: private: // Exposure specific widgets MyComboBoxText* const expMethod; - Gtk::Frame* const pdeFrame; +// Gtk::Frame* const pdeFrame; + MyExpander* const exppde; Adjuster* const laplacexp; Adjuster* const linear; Adjuster* const balanexp; Adjuster* const gamm; MyComboBoxText* const exnoiseMethod; - Gtk::Frame* const fatFrame; +// Gtk::Frame* const fatFrame; + MyExpander* const expfat; Adjuster* const fatamount; Adjuster* const fatdetail; Adjuster* const fatlevel; @@ -409,6 +411,7 @@ private: void updateExposureGUI3(); }; + /* ==== LocallabShadow ==== */ class LocallabShadow: public Gtk::VBox, diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index fd67f181f..015b5b183 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -297,7 +297,7 @@ void LocallabTone::updateAdviceTooltips(const bool showTooltips) scaltm->set_tooltip_text(""); rewei->set_tooltip_text(""); sensitm->set_tooltip_text(""); - expmasktm->set_tooltip_text(""); + expmasktm->set_tooltip_markup(""); CCmasktmshape->setTooltip(""); LLmasktmshape->setTooltip(""); HHmasktmshape->setTooltip(""); @@ -1006,11 +1006,11 @@ void LocallabRetinex::updateAdviceTooltips(const bool showTooltips) cliptm->set_tooltip_text(""); softradiusret->set_tooltip_text(""); cTtransshape->setTooltip(""); - mMLabels->set_tooltip_text(""); - transLabels->set_tooltip_text(""); + mMLabels->set_tooltip_markup(""); + transLabels->set_tooltip_markup(""); cTgainshape->setTooltip(""); - expmaskreti->set_tooltip_text(""); - enaretiMasktmap->set_tooltip_text(""); + expmaskreti->set_tooltip_markup(""); + enaretiMasktmap->set_tooltip_markup(""); CCmaskretishape->setTooltip(""); LLmaskretishape->setTooltip(""); HHmaskretishape->setTooltip(""); @@ -2626,10 +2626,10 @@ void LocallabContrast::updateAdviceTooltips(const bool showTooltips) Lmasklcshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); } else { contFrame->set_tooltip_text(""); - LocalcurveEditorwav->set_tooltip_text(""); - levelwav->set_tooltip_text(""); - clariFrame->set_tooltip_text(""); - clarisoft->set_tooltip_text(""); + LocalcurveEditorwav->set_tooltip_markup(""); + levelwav->set_tooltip_markup(""); + clariFrame->set_tooltip_markup(""); + clarisoft->set_tooltip_markup(""); expcontrastpyr->set_tooltip_text(""); wavgradl->set_tooltip_text(""); wavedg->set_tooltip_text(""); @@ -2641,7 +2641,7 @@ void LocallabContrast::updateAdviceTooltips(const bool showTooltips) wavcompre->set_tooltip_text(""); wavcomp->set_tooltip_text(""); fftwlc->set_tooltip_text(""); - expmasklc->set_tooltip_text(""); + expmasklc->set_tooltip_markup(""); CCmasklcshape->setTooltip(""); LLmasklcshape->setTooltip(""); HHmasklcshape->setTooltip(""); @@ -4076,7 +4076,7 @@ void LocallabCBDL::updateAdviceTooltips(const bool showTooltips) threshold->set_tooltip_text(""); clarityml->set_tooltip_text(""); sensicb->set_tooltip_text(""); - expmaskcb->set_tooltip_text(""); + expmaskcb->set_tooltip_markup(""); CCmaskcbshape->setTooltip(""); LLmaskcbshape->setTooltip(""); HHmaskcbshape->setTooltip(""); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 5b8188f80..162146681 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1068,6 +1068,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).colorscope = locallab.spots.at(j).colorscope && pSpot.colorscope == otherSpot.colorscope; locallab.spots.at(j).transitweak = locallab.spots.at(j).transitweak && pSpot.transitweak == otherSpot.transitweak; locallab.spots.at(j).transitgrad = locallab.spots.at(j).transitgrad && pSpot.transitgrad == otherSpot.transitgrad; + locallab.spots.at(j).hishow = locallab.spots.at(j).hishow && pSpot.hishow == otherSpot.hishow; locallab.spots.at(j).activ = locallab.spots.at(j).activ && pSpot.activ == otherSpot.activ; locallab.spots.at(j).avoid = locallab.spots.at(j).avoid && pSpot.avoid == otherSpot.avoid; locallab.spots.at(j).blwh = locallab.spots.at(j).blwh && pSpot.blwh == otherSpot.blwh; @@ -3202,6 +3203,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).transitgrad = mods.locallab.spots.at(i).transitgrad; } + if (locallab.spots.at(i).hishow) { + toEdit.locallab.spots.at(i).hishow = mods.locallab.spots.at(i).hishow; + } + if (locallab.spots.at(i).activ) { toEdit.locallab.spots.at(i).activ = mods.locallab.spots.at(i).activ; } @@ -6196,6 +6201,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : colorscope(v), transitweak(v), transitgrad(v), + hishow(v), activ(v), avoid(v), blwh(v), @@ -6680,6 +6686,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) colorscope = v; transitweak = v; transitgrad = v; + hishow = v; activ = v; avoid = v; blwh = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index f0ef04b1c..bd32e7f81 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -415,6 +415,7 @@ public: bool colorscope; bool transitweak; bool transitgrad; + bool hishow; bool activ; bool avoid; bool blwh; From cd63427eca6569d31a9c2e3179d3f05153e86622 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 20 Sep 2020 15:07:14 +0200 Subject: [PATCH 105/185] calcBlendFactor(): templated, also a small speedup be reordering instructions --- rtengine/rt_algo.cc | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/rtengine/rt_algo.cc b/rtengine/rt_algo.cc index a5b48af95..81121f58c 100644 --- a/rtengine/rt_algo.cc +++ b/rtengine/rt_algo.cc @@ -34,23 +34,14 @@ #include "sleef.h" namespace { -float calcBlendFactor(float val, float threshold) { - // sigmoid function - // result is in ]0;1] range - // inflexion point is at (x, y) (threshold, 0.5) - return 1.f / (1.f + xexpf(16.f - 16.f * val / threshold)); -} -#ifdef __SSE2__ -vfloat calcBlendFactor(vfloat valv, vfloat thresholdv) { +template +T calcBlendFactor(T val, T threshold) { // sigmoid function // result is in ]0;1] range // inflexion point is at (x, y) (threshold, 0.5) - const vfloat onev = F2V(1.f); - const vfloat c16v = F2V(16.f); - return onev / (onev + xexpf(c16v - c16v * valv / thresholdv)); + return 1.f / (1.f + xexpf(16.f - (16.f / threshold) * val)); } -#endif float tileAverage(const float * const *data, size_t tileY, size_t tileX, size_t tilesize) { From a5ec8dd426357e3ddf36226856b4d6d0f3ff3609 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 20 Sep 2020 17:49:46 +0200 Subject: [PATCH 106/185] DCP filename capitalization of new Canon profiles --- rtdata/dcpprofiles/CANON EOS R.dcp | Bin 65350 -> 0 bytes rtdata/dcpprofiles/CANON EOS R5.dcp | Bin 65358 -> 0 bytes rtdata/dcpprofiles/CANON EOS R6.dcp | Bin 65358 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 rtdata/dcpprofiles/CANON EOS R.dcp delete mode 100644 rtdata/dcpprofiles/CANON EOS R5.dcp delete mode 100644 rtdata/dcpprofiles/CANON EOS R6.dcp diff --git a/rtdata/dcpprofiles/CANON EOS R.dcp b/rtdata/dcpprofiles/CANON EOS R.dcp deleted file mode 100644 index 6ea5302e290637ef5fb806575782f07b7d344e80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65350 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 AWdHyG diff --git a/rtdata/dcpprofiles/CANON EOS R5.dcp b/rtdata/dcpprofiles/CANON EOS R5.dcp deleted file mode 100644 index 88f94620d81db7082a8a0ca694b40482addd2612..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65358 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 Hudn|P*ZbOi diff --git a/rtdata/dcpprofiles/CANON EOS R6.dcp b/rtdata/dcpprofiles/CANON EOS R6.dcp deleted file mode 100644 index 7aaa04ab2ae26c27255035db864c1ab65ca15283..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65358 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 Tul#ZU?{gIYyQ-@G{`!9ap7K-9 From 94ec1bbd45ae0a1d36ac8125cb4c6c63645a8caa Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 21 Sep 2020 09:44:23 +0200 Subject: [PATCH 107/185] Local adjustments - various change to labels history GUI combobox denoise (#5914) * from localdenoise Change GUI showmask - GUI exposure * from branch localgflc - Change combobox settings hide-show by a checkbox * Fixed bad behavior show Hide settings * Clean default - change labels * Change labels first * Change labels 2 * Change label 3 * Merge with dev - Labels 3 * Label 4 * label 5 * Label 6 * Label 7 - tooltips * Label 8 * Labels 9 * All string set to empty in else case updateAdviceTooltips * From localgflc combobox quamethod denoise * Change labels and history message --- rtdata/languages/default | 11 ++++++----- rtengine/iplocallab.cc | 15 +++++++++++---- rtengine/procevents.h | 3 ++- rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 1 + rtgui/locallabtools.cc | 36 ++++++++++++++++++++++++++++++++++++ rtgui/locallabtools.h | 5 ++++- rtgui/paramsedited.cc | 7 +++++++ rtgui/paramsedited.h | 1 + 10 files changed, 73 insertions(+), 11 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 2b63be060..5a85773f0 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1152,7 +1152,8 @@ HISTORY_MSG_953;Local - Mask Common blend chroma HISTORY_MSG_954;Local - Show-hide tools HISTORY_MSG_955;Local - Enable Spot HISTORY_MSG_956;Local - CH Curve -HISTORY_MSG_957;Local - Tool complexity mode +HISTORY_MSG_957;Local - Denoise mode +HISTORY_MSG_958;Local - Show/hide settings HISTORY_MSG_BLSHAPE;Blur by level HISTORY_MSG_BLURCWAV;Blur chroma HISTORY_MSG_BLURWAV;Blur luminance @@ -2780,8 +2781,8 @@ TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) TP_LOCALLAB_SHOWR;Mask and modifications TP_LOCALLAB_SHOWREF;Preview ΔE TP_LOCALLAB_SHOWS;Mask and modifications -TP_LOCALLAB_SHOWSTRUC;Show structure Spot(advanced) -TP_LOCALLAB_SHOWSTRUCEX;Show structure Spot(advanced) +TP_LOCALLAB_SHOWSTRUC;Show spot structure(advanced) +TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(advanced) TP_LOCALLAB_SHOWT;Mask and modifications TP_LOCALLAB_SHOWVI;Mask and modifications TP_LOCALLAB_SHRESFRA;Shadows/Highlights @@ -2815,8 +2816,8 @@ TP_LOCALLAB_STRGRID;Strength TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\nif Strength Retinex >= 0.1 Dehaze is in luminance mode. TP_LOCALLAB_STRUC;Structure TP_LOCALLAB_STRUCCOL;Structure -TP_LOCALLAB_STRUCCOL1;Structure Spot -TP_LOCALLAB_STRUCT_TOOLTIP;Use Sobel algorithm to take into account structure in shape detection.\nyou can have a preview by activating "mask and modifications - Show structure spot".\n\nCan be used in conjunction with masks (advanced) structure, blur, wavelet to improve edge detection.\n\nNeeds maskless adjustments to be activated (lightness, exposure...) +TP_LOCALLAB_STRUCCOL1;Spot Structure +TP_LOCALLAB_STRUCT_TOOLTIP;Use Sobel algorithm to take into account structure in shape detection.\nyou can have a preview by activating "mask and modifications - Show spot structure".\n\nCan be used in conjunction with masks (advanced) structure, blur, wavelet to improve edge detection.\n\nNeeds maskless adjustments to be activated (lightness, exposure...) TP_LOCALLAB_STRUMASKCOL;Structure mask strength TP_LOCALLAB_STRUMASK_TOOLTIP;Generate a structure mask with difference between surface areas and reliefs.\nIf structure mask as tool is enabled, this mask is used in addition to the other tools (gamma, slope, contrast curve ...) TP_LOCALLAB_STYPE;Shape method diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 67d754dbb..3fc2c667f 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -539,6 +539,7 @@ struct local_params { int blmet; int smasktyp; int chromet; + int quamet; int shmeth; int medmet; int locmet; @@ -786,6 +787,12 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall lp.chromet = 2; } + if (locallab.spots.at(sp).quamethod == "cons") { + lp.quamet = 0; + } else if (locallab.spots.at(sp).quamethod == "agre") { + lp.quamet = 1; + } + if (locallab.spots.at(sp).shMethod == "std") { lp.shmeth = 0; } else if (locallab.spots.at(sp).shMethod == "tone") { @@ -8394,7 +8401,7 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f } } - if ((lp.noiselc < 0.02f && aut == 0) || (mxsl < 1.f && (aut == 1 || aut == 2))) { + if ((lp.quamet == 0 && aut == 0) || (mxsl < 1.f && (aut == 1 || aut == 2))) { WaveletDenoiseAllL(Ldecomp, noisevarlum, madL, vari, edge, numThreads); } else { @@ -8684,7 +8691,7 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f float noisevarab_r = 100.f; //SQR(lp.noisecc / 10.0); - if ((lp.noisecc < 2.f && aut == 0) || (maxccoarse < 0.1f && (aut == 1 || aut == 2))) { + if ((lp.quamet == 0 && aut == 0) || (maxccoarse < 0.1f && (aut == 1 || aut == 2))) { WaveletDenoiseAllAB(Ldecomp, adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, numThreads); WaveletDenoiseAllAB(Ldecomp, bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, numThreads); } else { @@ -8945,7 +8952,7 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f } - if ((lp.noiselc < 0.02f && aut == 0) || (mxsl < 1.f && (aut == 1 || aut == 2))) { + if ((lp.quamet == 0 && aut == 0) || (mxsl < 1.f && (aut == 1 || aut == 2))) { WaveletDenoiseAllL(Ldecomp, noisevarlum, madL, vari, edge, numThreads); } else { WaveletDenoiseAll_BiShrinkL(Ldecomp, noisevarlum, madL, vari, edge, numThreads); @@ -9231,7 +9238,7 @@ void ImProcFunctions::DeNoise(int call, int del, float * slidL, float * slida, f float noisevarab_r = 100.f; //SQR(lp.noisecc / 10.0); - if ((lp.noisecc < 0.02f && aut == 0) || (maxccoarse < 0.1f && (aut == 1 || aut == 2))) { + if ((lp.quamet == 0 && aut == 0) || (maxccoarse < 0.1f && (aut == 1 || aut == 2))) { WaveletDenoiseAllAB(Ldecomp, adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, numThreads); WaveletDenoiseAllAB(Ldecomp, bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, numThreads); } else { diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 730689192..0cc199b89 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -979,7 +979,8 @@ enum ProcEventCode { EvLocallabSpotprevMethod = 953, Evlocallabactiv = 954, EvlocallabCHshape = 955, - Evlocallabhishow = 956, + EvlocallabquaMethod = 956, + Evlocallabhishow = 957, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 5ebd2ec48..0a3cb6c6b 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -3246,6 +3246,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : epsbl(0), blMethod("blur"), chroMethod("lum"), + quamethod("cons"), blurMethod("norm"), medMethod("33"), activlum(true), @@ -4181,6 +4182,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && epsbl == other.epsbl && blMethod == other.blMethod && chroMethod == other.chroMethod + && quamethod == other.quamethod && blurMethod == other.blurMethod && medMethod == other.medMethod && activlum == other.activlum @@ -5708,6 +5710,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->epsbl, "Locallab", "Epsbl_" + index_str, spot.epsbl, keyFile); saveToKeyfile(!pedited || spot_edited->blMethod, "Locallab", "BlMethod_" + index_str, spot.blMethod, keyFile); saveToKeyfile(!pedited || spot_edited->chroMethod, "Locallab", "ChroMethod_" + index_str, spot.chroMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->quamethod, "Locallab", "QuaMethod_" + index_str, spot.quamethod, keyFile); saveToKeyfile(!pedited || spot_edited->blurMethod, "Locallab", "BlurMethod_" + index_str, spot.blurMethod, keyFile); saveToKeyfile(!pedited || spot_edited->medMethod, "Locallab", "MedMethod_" + index_str, spot.medMethod, keyFile); saveToKeyfile(!pedited || spot_edited->activlum, "Locallab", "activlum_" + index_str, spot.activlum, keyFile); @@ -7436,6 +7439,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Epsbl_" + index_str, pedited, spot.epsbl, spotEdited.epsbl); assignFromKeyfile(keyFile, "Locallab", "BlMethod_" + index_str, pedited, spot.blMethod, spotEdited.blMethod); assignFromKeyfile(keyFile, "Locallab", "ChroMethod_" + index_str, pedited, spot.chroMethod, spotEdited.chroMethod); + assignFromKeyfile(keyFile, "Locallab", "QuaMethod_" + index_str, pedited, spot.quamethod, spotEdited.quamethod); assignFromKeyfile(keyFile, "Locallab", "BlurMethod_" + index_str, pedited, spot.blurMethod, spotEdited.blurMethod); assignFromKeyfile(keyFile, "Locallab", "MedMethod_" + index_str, pedited, spot.medMethod, spotEdited.medMethod); assignFromKeyfile(keyFile, "Locallab", "activlum_" + index_str, pedited, spot.activlum, spotEdited.activlum); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 44747bbab..af79aec95 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1204,6 +1204,7 @@ struct LocallabParams { int epsbl; Glib::ustring blMethod; // blur, med, guid Glib::ustring chroMethod; // lum, chr, all + Glib::ustring quamethod; // cons agre Glib::ustring blurMethod; // norm, inv Glib::ustring medMethod; // none, 33, 55, 77, 99 bool activlum; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 0b0f6fb3c..446e6e4fe 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -983,6 +983,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // EvLocallabSpotprevMethod LUMINANCECURVE, // Evlocallabactiv LUMINANCECURVE, // EvlocallabCHshape + LUMINANCECURVE, //EvlocallabquaMethod LUMINANCECURVE //Evlocallabhishow }; diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index 1a64d2722..fc9242bcd 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -5635,6 +5635,7 @@ LocallabBlur::LocallabBlur(): chroMethod(Gtk::manage(new MyComboBoxText())), activlum(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ACTIV")))), expdenoise(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI_EXP")))), + quamethod(Gtk::manage(new MyComboBoxText())), LocalcurveEditorwavden(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVDEN"))), wavshapeden(static_cast(LocalcurveEditorwavden->addCurve(CT_Flat, "", nullptr, false, false))), noiselumf0(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMFINEZERO"), MINCHRO, MAXCHRO, 0.01, 0.))), @@ -5672,6 +5673,7 @@ LocallabBlur::LocallabBlur(): Lmaskblshape(static_cast(mask2blCurveEditorG->addCurve(CT_Diagonal, "L(L)"))), mask2blCurveEditorGwav(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVMASK"))), LLmaskblshapewav(static_cast(mask2blCurveEditorGwav->addCurve(CT_Flat, "L(L)", nullptr, false, false))), + quaHBox(Gtk::manage(new Gtk::HBox())), csThresholdblur(Gtk::manage(new ThresholdAdjuster(M("TP_LOCALLAB_CSTHRESHOLDBLUR"), 0, 9, 0, 0, 6, 5, 0, false))) { const LocallabParams::LocallabSpot defSpot; @@ -5733,6 +5735,14 @@ LocallabBlur::LocallabBlur(): setExpandAlignProperties(expdenoise, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + quamethod->append(M("TP_WAVELET_QUACONSER")); + quamethod->append(M("TP_WAVELET_QUAAGRES")); + quamethodconn = quamethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabBlur::quamethodChanged)); + Gtk::Label* const quaLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_DENQUA") + ":")); + quaHBox->pack_start(*quaLabel, Gtk::PACK_SHRINK, 4); + quaHBox->pack_start(*quamethod); + LocalcurveEditorwavden->setCurveListener(this); wavshapeden->setIdentityValue(0.); @@ -5865,6 +5875,7 @@ LocallabBlur::LocallabBlur(): ToolParamBlock* const denoisebox = Gtk::manage(new ToolParamBlock()); Gtk::Frame* const wavFrame = Gtk::manage(new Gtk::Frame()); ToolParamBlock* const wavBox = Gtk::manage(new ToolParamBlock()); + wavBox->pack_start(*quaHBox); wavBox->pack_start(*LocalcurveEditorwavden, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor // wavBox->pack_start(*noiselumf0); // wavBox->pack_start(*noiselumf); @@ -5994,6 +6005,7 @@ void LocallabBlur::disableListener() medMethodConn.block(true); blurMethodConn.block(true); chroMethodConn.block(true); + quamethodconn.block(true); activlumConn.block(true); showmaskblMethodConn.block(true); showmaskblMethodtypConn.block(true); @@ -6010,6 +6022,7 @@ void LocallabBlur::enableListener() medMethodConn.block(false); blurMethodConn.block(false); chroMethodConn.block(false); + quamethodconn.block(false); activlumConn.block(false); showmaskblMethodConn.block(false); showmaskblMethodtypConn.block(false); @@ -6081,6 +6094,12 @@ void LocallabBlur::read(const rtengine::procparams::ProcParams* pp, const Params chroMethod->set_active(2); } + if (spot.quamethod == "cons") { + quamethod->set_active(0); + } else if (spot.quamethod == "agre") { + quamethod->set_active(1); + } + activlum->set_active(spot.activlum); wavshapeden->setCurve(spot.locwavcurveden); noiselumf0->setValue(spot.noiselumf0); @@ -6194,6 +6213,12 @@ void LocallabBlur::write(rtengine::procparams::ProcParams* pp, ParamsEdited* ped spot.chroMethod = "all"; } + if (quamethod->get_active_row_number() == 0) { + spot.quamethod = "cons"; + } else if (quamethod->get_active_row_number() == 1) { + spot.quamethod = "agre"; + } + spot.activlum = activlum->get_active(); spot.locwavcurveden = wavshapeden->getCurve(); spot.noiselumf0 = noiselumf0->getValue(); @@ -6760,6 +6785,17 @@ void LocallabBlur::chroMethodChanged() } } +void LocallabBlur::quamethodChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabquaMethod, + quamethod->get_active_text() + " (" + escapeHtmlChars(spotName) + ")"); + } + } +} + + void LocallabBlur::activlumChanged() { if (isLocActivated && exp->getEnabled()) { diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index 9d0e21779..4d26e2915 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -652,6 +652,7 @@ private: MyComboBoxText* const chroMethod; Gtk::CheckButton* const activlum; MyExpander* const expdenoise; + MyComboBoxText* const quamethod; CurveEditorGroup* const LocalcurveEditorwavden; FlatCurveEditor* const wavshapeden; Adjuster* const noiselumf0; @@ -689,10 +690,11 @@ private: DiagonalCurveEditor* const Lmaskblshape; CurveEditorGroup* const mask2blCurveEditorGwav; FlatCurveEditor* const LLmaskblshapewav; + Gtk::HBox* const quaHBox; ThresholdAdjuster* const csThresholdblur; sigc::connection blMethodConn, fftwblConn, medMethodConn, blurMethodConn, chroMethodConn, activlumConn, showmaskblMethodConn, showmaskblMethodtypConn, enablMaskConn, toolblConn; - + sigc::connection quamethodconn; public: LocallabBlur(); ~LocallabBlur(); @@ -735,6 +737,7 @@ private: void showmaskblMethodtypChanged(); void enablMaskChanged(); void toolblChanged(); + void quamethodChanged(); void updateBlurGUI(); }; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 162146681..95036b063 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1274,6 +1274,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).epsbl = locallab.spots.at(j).epsbl && pSpot.epsbl == otherSpot.epsbl; locallab.spots.at(j).blMethod = locallab.spots.at(j).blMethod && pSpot.blMethod == otherSpot.blMethod; locallab.spots.at(j).chroMethod = locallab.spots.at(j).chroMethod && pSpot.chroMethod == otherSpot.chroMethod; + locallab.spots.at(j).quamethod = locallab.spots.at(j).quamethod && pSpot.quamethod == otherSpot.quamethod; locallab.spots.at(j).blurMethod = locallab.spots.at(j).blurMethod && pSpot.blurMethod == otherSpot.blurMethod; locallab.spots.at(j).medMethod = locallab.spots.at(j).medMethod && pSpot.medMethod == otherSpot.medMethod; locallab.spots.at(j).activlum = locallab.spots.at(j).activlum && pSpot.activlum == otherSpot.activlum; @@ -3995,6 +3996,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).chroMethod = mods.locallab.spots.at(i).chroMethod; } + if (locallab.spots.at(i).quamethod) { + toEdit.locallab.spots.at(i).quamethod = mods.locallab.spots.at(i).quamethod; + } + if (locallab.spots.at(i).blurMethod) { toEdit.locallab.spots.at(i).blurMethod = mods.locallab.spots.at(i).blurMethod; } @@ -6403,6 +6408,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : epsbl(v), blMethod(v), chroMethod(v), + quamethod(v), blurMethod(v), medMethod(v), activlum(v), @@ -6892,6 +6898,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) epsbl = v; blMethod = v; chroMethod = v; + quamethod = v; blurMethod = v; medMethod = v; activlum = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index bd32e7f81..c589aa96f 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -617,6 +617,7 @@ public: bool epsbl; bool blMethod; bool chroMethod; + bool quamethod; bool blurMethod; bool medMethod; bool activlum; From 8cf8b853af458275376ea22f7007cea55fdc2f8d Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 22 Sep 2020 13:44:57 +0200 Subject: [PATCH 108/185] Added Patrick Lopatto for his idea to use R-L deconv. in linear color space, which resulted in the implementation of Capture Sharpening --- AUTHORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.txt b/AUTHORS.txt index 9d1309026..ec40f75e1 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -60,6 +60,7 @@ Other contributors (profiles, ideas, mockups, testing, forum activity, translati Oscar de Lama Lebarhon Karl Loncarek + Patrick Lopatto Jie Luo Paul Matthijsse Wim ter Meer From a07638e1a6974de5b4654c14aee725acc4aa93f6 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 22 Sep 2020 17:43:56 +0200 Subject: [PATCH 109/185] Local adjustments - Change label - fixed bad behavior contrast attenuator (#5916) * Change label Structure exposure * Fixed bad behavior contrast attenuator --- rtdata/languages/default | 2 +- rtengine/iplocallab.cc | 10 +++++++--- rtgui/locallabtools.cc | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5a85773f0..bc20c9c17 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2815,7 +2815,7 @@ TP_LOCALLAB_STRENGTH;Noise TP_LOCALLAB_STRGRID;Strength TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\nif Strength Retinex >= 0.1 Dehaze is in luminance mode. TP_LOCALLAB_STRUC;Structure -TP_LOCALLAB_STRUCCOL;Structure +TP_LOCALLAB_STRUCCOL;Spot Structure TP_LOCALLAB_STRUCCOL1;Spot Structure TP_LOCALLAB_STRUCT_TOOLTIP;Use Sobel algorithm to take into account structure in shape detection.\nyou can have a preview by activating "mask and modifications - Show spot structure".\n\nCan be used in conjunction with masks (advanced) structure, blur, wavelet to improve edge detection.\n\nNeeds maskless adjustments to be activated (lightness, exposure...) TP_LOCALLAB_STRUMASKCOL;Structure mask strength diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 3fc2c667f..e7bf6d167 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -2422,6 +2422,10 @@ void ImProcFunctions::exlabLocal(local_params& lp, int bfh, int bfw, int bfhr, i //exposure local constexpr float maxran = 65536.f; + if(lp.laplacexp == 0.f) { + lp.linear = 0.f; + } + const float linear = lp.linear; int bw = bfw; int bh = bfh; @@ -2430,7 +2434,7 @@ void ImProcFunctions::exlabLocal(local_params& lp, int bfh, int bfw, int bfhr, i } const bool exec = (lp.expmet == 1 && linear > 0.f && lp.laplacexp > 0.1f); - if(exec) {//for standard exposure + if(!exec) {//for standard exposure const float cexp_scale = std::pow(2.f, lp.expcomp); const float ccomp = (rtengine::max(0.f, lp.expcomp) + 1.f) * lp.hlcomp / 100.f; const float cshoulder = ((maxran / rtengine::max(1.0f, cexp_scale)) * (lp.hlcompthr / 200.f)) + 0.1f; @@ -12765,14 +12769,14 @@ void ImProcFunctions::Lab_Local( } if (lp.expcomp == 0.f) { - lp.expcomp = 0.001f; // to enabled + lp.expcomp = 0.001f;// to enabled } ImProcFunctions::exlabLocal(lp, bfh, bfw, bfhr, bfwr, bufexpfin.get(), bufexpfin.get(), hltonecurveloc, shtonecurveloc, tonecurveloc, hueref, lumaref, chromaref); } else { - if (lp.expcomp != 0.f) { + if (lp.expcomp != 0.f || lp.laplacexp > 0.1f) { ImProcFunctions::exlabLocal(lp, bfh, bfw, bfhr, bfwr, bufexporig.get(), bufexpfin.get(), hltonecurveloc, shtonecurveloc, tonecurveloc, hueref, lumaref, chromaref); } } diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index fc9242bcd..f47f28447 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -2314,7 +2314,7 @@ LocallabExposure::LocallabExposure(): // pdeFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_PDEFRA")))), exppde(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_PDEFRA")))), laplacexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPLACEXP"), 0.0, 100.0, 0.1, 0.))), - linear(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LINEAR"), 0., 1., 0.01, 0.05))), + linear(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LINEAR"), 0.01, 1., 0.01, 0.05))), balanexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BALANEXP"), 0.5, 1.5, 0.01, 1.0))), gamm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMM"), 0.2, 1.3, 0.01, 0.4))), exnoiseMethod(Gtk::manage(new MyComboBoxText())), From 98ae27f60ed9766d68e78ac1493661ec42e397c0 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 22 Sep 2020 21:32:49 -0700 Subject: [PATCH 110/185] Fix initialization of vectorscope pointer --- rtgui/histogrampanel.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 41605d638..070d6bf41 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1062,7 +1062,7 @@ HistogramArea::HistogramArea (DrawModeListener *fml) : needRed(options.histogramRed), needGreen(options.histogramGreen), needBlue(options.histogramBlue), needLuma(options.histogramLuma), needChroma(options.histogramChroma), isPressed(false), movingPosition(0.0), - needPointer(false), + needPointer(options.histogramBar), pointer_red(-1), pointer_green(-1), pointer_blue(-1), pointer_a(0), pointer_b(0) { From 79e79321ecf6c4d8d96979de82f59df9f44bf4df Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 22 Sep 2020 21:35:08 -0700 Subject: [PATCH 111/185] Remove spacing around vectorscope lines --- rtgui/histogrampanel.cc | 53 +++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 070d6bf41..a0acaebc9 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1555,8 +1555,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in const float o_y = (h - scope_scale * vect_height) / 2; const double s = RTScalable::getScale(); auto orig_matrix = cr->get_matrix(); - const double line_spacing = 4.0 * s; - const double line_length = scope_size / 2.0 - 2.0 * line_spacing; + const double line_length = scope_size / 2.0; std::valarray ch_ds(1); cr->translate(w / 2.0, h / 2.0); @@ -1569,21 +1568,23 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in cr->set_line_width (2.0 * s); constexpr double color_labels[6][3] = { {1, 0, 0}, // R - {1, 1, 0}, // Y {0, 1, 0}, // G - {0, 1, 1}, // C {0, 0, 1}, // B + {0, 1, 1}, // C {1, 0, 1}, // M + {1, 1, 0}, // Y }; - for (int i = 0; i < 6; i++) { - auto gradient = Cairo::LinearGradient::create(0, 0, scope_size / 2.0, 0); - const double (&color)[3] = color_labels[i]; + for (int i = 0; i < 3; i++) { + auto gradient = Cairo::LinearGradient::create(-line_length, 0, line_length, 0); + const double (&color_1)[3] = color_labels[i]; + const double (&color_2)[3] = color_labels[i + 3]; cr->set_source(gradient); - gradient->add_color_stop_rgba(0, 1, 1, 1, 0.25); - gradient->add_color_stop_rgba(1, color[0], color[1], color[2], 0.5); - cr->move_to(line_spacing, 0); - cr->line_to(line_spacing + line_length, 0); - cr->rotate_degrees(-60); + gradient->add_color_stop_rgba(0, color_2[0], color_2[1], color_2[2], 0.5); + gradient->add_color_stop_rgba(0.5, 1, 1, 1, 0.25); + gradient->add_color_stop_rgba(1, color_1[0], color_1[1], color_1[2], 0.5); + cr->move_to(-line_length, 0); + cr->line_to(line_length, 0); + cr->rotate_degrees(-120); cr->stroke(); } cr->set_line_width (1.0 * s); @@ -1599,33 +1600,33 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in } // HSV skin tone line derived from -I axis of YIQ. cr->rotate(-0.134900 * RT_PI); - cr->move_to(line_spacing, 0); - cr->line_to(line_spacing + line_length, 0); + cr->move_to(0, 0); + cr->line_to(line_length, 0); cr->stroke(); cr->unset_dash(); } else if (scopeType == ScopeType::VECTORSCOPE_HC) { // Hue-Chroma. // a and b axes. Cairo::RefPtr gradient; cr->set_line_width (2.0 * s); - gradient = Cairo::LinearGradient::create(0, -scope_size / 2.0, 0, scope_size / 2.0); + gradient = Cairo::LinearGradient::create(0, -line_length, 0, line_length); cr->set_source(gradient); gradient->add_color_stop_rgba(0, 1, 1, 0, 0.5); // "yellow" gradient->add_color_stop_rgba(0.5, 1, 1, 1, 0.25); // neutral gradient->add_color_stop_rgba(1, 0, 0, 1, 0.5); // "blue" - cr->move_to(0, line_spacing); - cr->line_to(0, line_spacing + line_length); - cr->move_to(0, -line_spacing); - cr->line_to(0, -line_spacing - line_length); + cr->move_to(0, 0); + cr->line_to(0, line_length); + cr->move_to(0, 0); + cr->line_to(0, -line_length); cr->stroke(); - gradient = Cairo::LinearGradient::create(-scope_size / 2.0, 0, scope_size / 2.0, 0); + gradient = Cairo::LinearGradient::create(-line_length, 0, line_length, 0); cr->set_source(gradient); gradient->add_color_stop_rgba(0, 0, 1, 0, 0.5); // "green" gradient->add_color_stop_rgba(0.5, 1, 1, 1, 0.25); // neutral gradient->add_color_stop_rgba(1, 1, 0, 1, 0.5); // "magenta" - cr->move_to(line_spacing, 0); - cr->line_to(line_spacing + line_length, 0); - cr->move_to(-line_spacing, 0); - cr->line_to(-line_spacing - line_length, 0); + cr->move_to(0, 0); + cr->line_to(line_length, 0); + cr->move_to(0, 0); + cr->line_to(-line_length, 0); cr->stroke(); cr->set_source_rgba (1, 1, 1, 0.25); cr->set_line_width (1.0 * s); @@ -1638,8 +1639,8 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in // CIELAB skin tone line, approximated by 50% saturation and // value along the HSV skin tone line. cr->rotate(-0.321713 * RT_PI); - cr->move_to(line_spacing, 0); - cr->line_to(line_spacing + line_length, 0); + cr->move_to(0, 0); + cr->line_to(line_length, 0); cr->stroke(); cr->unset_dash(); } From 6e7185081a16a29437b816776ca84e9a61be7180 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Tue, 22 Sep 2020 22:10:57 -0700 Subject: [PATCH 112/185] Fix scaling of H-C vectorscope --- rtengine/improccoordinator.cc | 5 +++-- rtgui/histogrampanel.cc | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 339cdfa07..72dfb0cd3 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1875,6 +1875,7 @@ bool ImProcCoordinator::updateVectorscopeHC() params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); constexpr int size = VECTORSCOPE_SIZE; + constexpr float norm_factor = size / (128.f * 655.36f); vectorscope_hc.fill(0); vectorscopeScale = (x2 - x1) * (y2 - y1); @@ -1893,8 +1894,8 @@ bool ImProcCoordinator::updateVectorscopeHC() #endif for (int i = y1; i < y2; ++i) { for (int j = x1, ofs_lab = (i - y1) * (x2 - x1); j < x2; ++j, ++ofs_lab) { - const int col = (size / 96000.f) * a[ofs_lab] + size / 2; - const int row = (size / 96000.f) * b[ofs_lab] + size / 2; + const int col = norm_factor * a[ofs_lab] + size / 2 + 0.5f; + const int row = norm_factor * b[ofs_lab] + size / 2 + 0.5f; if (col >= 0 && col < size && row >= 0 && row < size) { vectorscopeThr[row][col]++; } diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index a0acaebc9..b79262426 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1666,7 +1666,7 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in cx = (w + scope_size * S * std::cos(H * 2 * RT_PI_F)) / 2; cy = (h - scope_size * S * std::sin(H * 2 * RT_PI_F)) / 2; } else { - constexpr float ab_factor = 327.68f / 96000.f; + constexpr float ab_factor = 1.f / 256.f; cx = w / 2.f + scope_size * pointer_a * ab_factor; cy = h / 2.f - scope_size * pointer_b * ab_factor; } From 8d2754575a35e8ad84377440e160a79de9930c3d Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 23 Sep 2020 18:17:15 +0200 Subject: [PATCH 113/185] remove call to fomerly removed function --- rtengine/improcfun.cc | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 7e13fd214..47f95a852 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -5739,31 +5739,21 @@ void ImProcFunctions::rgb2lab(const Image8 &src, int x, int y, int w, int h, flo Glib::ustring profile; - bool standard_gamma; + cmsHPROFILE oprof = nullptr; if (settings->HistogramWorking && consider_histogram_settings) { profile = icm.workingProfile; - standard_gamma = true; } else { profile = icm.outputProfile; if (icm.outputProfile.empty() || icm.outputProfile == ColorManagementParams::NoICMString) { profile = "sRGB"; } - - standard_gamma = false; + oprof = ICCStore::getInstance()->getProfile(profile); } - cmsHPROFILE oprof = ICCStore::getInstance()->getProfile(profile); - if (oprof) { - cmsHPROFILE oprofG = oprof; - - if (standard_gamma) { - oprofG = ICCStore::makeStdGammaProfile(oprof); - } - - cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; + cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; // NOCACHE is important for thread safety if (icm.outputBPC) { flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; @@ -5771,7 +5761,7 @@ void ImProcFunctions::rgb2lab(const Image8 &src, int x, int y, int w, int h, flo lcmsMutex->lock(); cmsHPROFILE LabIProf = cmsCreateLab4Profile(nullptr); - cmsHTRANSFORM hTransform = cmsCreateTransform (oprofG, TYPE_RGB_8, LabIProf, TYPE_Lab_FLT, icm.outputIntent, flags); // NOCACHE is important for thread safety + cmsHTRANSFORM hTransform = cmsCreateTransform (oprof, TYPE_RGB_8, LabIProf, TYPE_Lab_FLT, icm.outputIntent, flags); cmsCloseProfile(LabIProf); lcmsMutex->unlock(); @@ -5806,10 +5796,6 @@ void ImProcFunctions::rgb2lab(const Image8 &src, int x, int y, int w, int h, flo } // End of parallelization cmsDeleteTransform(hTransform); - - if (oprofG != oprof) { - cmsCloseProfile(oprofG); - } } else { TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(profile); const float wp[3][3] = { From ea156df1a8e340d723b7c0842d7de1e43d59b3c0 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 24 Sep 2020 08:08:00 +0200 Subject: [PATCH 114/185] Loca - Fixed update histogram Shadqows-highlight and local contrast wavelet --- rtengine/iplocallab.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index e7bf6d167..94806e93c 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -11047,7 +11047,7 @@ void ImProcFunctions::Lab_Local( tonecurv = true; } - if (! lp.invsh && (lp.highlihs > 0.f || lp.shadowhs > 0.f || tonequ || tonecurv || lp.strSH != 0.f || lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 3 || lp.showmaskSHmet == 4 || lp.prevdE) && call < 3 && lp.hsena) { + if (! lp.invsh && (lp.highlihs > 0.f || lp.shadowhs > 0.f || tonequ || tonecurv || lp.strSH != 0.f || lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 3 || lp.showmaskSHmet == 4 || lp.prevdE) && call <= 3 && lp.hsena) { const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); const int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); @@ -11442,7 +11442,7 @@ void ImProcFunctions::Lab_Local( } } - if ((lp.lcamount > 0.f || wavcurve || lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 3 || lp.showmasklcmet == 4 || lp.prevdE || lp.strwav != 0.f || wavcurvelev || wavcurvecon || wavcurvecomp || wavcurvecompre || lp.edgwena || params->locallab.spots.at(sp).residblur > 0.f || params->locallab.spots.at(sp).levelblur > 0.f || params->locallab.spots.at(sp).residcont != 0.f || params->locallab.spots.at(sp).clarilres != 0.f || params->locallab.spots.at(sp).claricres != 0.f) && call < 3 && lp.lcena) { + if ((lp.lcamount > 0.f || wavcurve || lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 3 || lp.showmasklcmet == 4 || lp.prevdE || lp.strwav != 0.f || wavcurvelev || wavcurvecon || wavcurvecomp || wavcurvecompre || lp.edgwena || params->locallab.spots.at(sp).residblur > 0.f || params->locallab.spots.at(sp).levelblur > 0.f || params->locallab.spots.at(sp).residcont != 0.f || params->locallab.spots.at(sp).clarilres != 0.f || params->locallab.spots.at(sp).claricres != 0.f) && call <= 3 && lp.lcena) { int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); From e3568e86d4678c56cfe50fb913bd2920b29fcb3c Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 25 Sep 2020 17:30:42 +0200 Subject: [PATCH 115/185] Add Final touchup to enable wavelet decomposition --- rtdata/languages/default | 1 + rtengine/ipwavelet.cc | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index bc20c9c17..9a34abcc9 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -3233,6 +3233,7 @@ TP_WAVELET_BACUR;Curve TP_WAVELET_BALANCE;Contrast balance d/v-h TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified. TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the vertical, horizontal and diagonal wavelet directions: .\nActivating contrast, chroma or residual tone mapping amplifies the effect due to balance +TP_WAVELET_BALCHRO;Chroma balance TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. TP_WAVELET_BALCHROM;Denoise equalizer Blue-Yellow/Red-Green TP_WAVELET_BALLUM;Denoise equalizer White-Black diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 90edc9510..8eb387789 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1023,7 +1023,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } - if (!exblurL && cp.contrast == 0.f && cp.blurres == 0.f && !cp.tonemap && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels + if (!exblurL && cp.contrast == 0.f && cp.blurres == 0.f && !cp.tonemap && !cp.finena && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels while (levwavL > 0 && cp.mul[levwavL - 1] == 0.f) { // cp.mul[level] == 0.f means no changes to level levwavL--; } From bc3cd93e70cf0892c82fd84a4d2f6e32bc474068 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 25 Sep 2020 17:59:32 +0200 Subject: [PATCH 116/185] Added directional contrast to final touchup alone --- rtengine/ipwavelet.cc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 8eb387789..8fbb03b18 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1022,8 +1022,15 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.mul[0] = 0.01f;//to always enable WaveletcontAllL if no contrast is needed } } - - if (!exblurL && cp.contrast == 0.f && cp.blurres == 0.f && !cp.tonemap && !cp.finena && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels + + if (cp.BAmet != 0) { + if (cp.mul[0] == 0.f) { + cp.mul[0] = 0.01f; + } + } + + + if (!exblurL && cp.contrast == 0.f && cp.blurres == 0.f && !cp.tonemap && !cp.finena && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels while (levwavL > 0 && cp.mul[levwavL - 1] == 0.f) { // cp.mul[level] == 0.f means no changes to level levwavL--; } From a495c3f018eaea7760af18d3e35364c7839e1405 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 26 Sep 2020 13:14:35 +0200 Subject: [PATCH 117/185] Local adjustemnts - various change tooltips settings, color and light, masks (#5918) * Change tooltip settings * Change colo and light tooltip * Change mask color and light tooltip * Others change to tooltip mask * Another change to tooltip color and light * Change all mask in locallabtolls.cc * Change all masks in locallabtools2.cc * Change tooltip shape detection --- rtdata/languages/default | 75 ++++++++++++++++++--------- rtgui/locallabtools.cc | 106 ++++++++++++++++++++++++++++++++++++--- rtgui/locallabtools.h | 3 ++ rtgui/locallabtools2.cc | 73 ++++++++++++++++++++++++--- 4 files changed, 219 insertions(+), 38 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 9a34abcc9..459032912 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2321,7 +2321,7 @@ TP_LOCALLAB_AVOID;Avoid color shift TP_LOCALLAB_BALAN;ab-L balance (ΔE) TP_LOCALLAB_BALANEXP;Laplacian balance TP_LOCALLAB_BALANH;C-H balance (ΔE) -TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less ab-L, or more or less C - H.\nNot for Denoise +TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise TP_LOCALLAB_BASELOG;Logarithm base TP_LOCALLAB_BILATERAL;Bilateral filter TP_LOCALLAB_BLACK_EV;Black Ev @@ -2345,10 +2345,12 @@ TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground: TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain TP_LOCALLAB_BLURCBDL;Blur levels 0-1-2-3-4 TP_LOCALLAB_BLURCOL;Radius +TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. TP_LOCALLAB_BLURDE;Blur shape detection TP_LOCALLAB_BLURLC;Luminance Only TP_LOCALLAB_BLURLEVELFRA;Blur Levels -TP_LOCALLAB_BLURMASK_TOOLTIP;Generate a blur mask, take into account the structure with the contrast threshold Mask Blur slider. +TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the "radius" of the Gaussian blur (0 to 500) TP_LOCALLAB_BLURRESIDFRA;Blur Residual TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise - 1 TP_LOCALLAB_BLWH;All changes forced in Black-and-White @@ -2373,6 +2375,7 @@ TP_LOCALLAB_CHROMACBDL;Chroma TP_LOCALLAB_CHROMACB_TOOLTIP;Acts as an amplifier-reducer action compare to sliders of luminance.\nUnder 100 reduce, above 100 amplifie TP_LOCALLAB_CHROMALEV;Chroma levels TP_LOCALLAB_CHROMASKCOL;Chroma +TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). TP_LOCALLAB_CHROMASK_TOOLTIP;You can use this slider to desaturated background (inverse mask - curve near 0).\nAlso to attenuate or enhance the action of a mask on the chroma TP_LOCALLAB_CHRRT;Chroma TP_LOCALLAB_CIRCRADIUS;Spot size @@ -2402,8 +2405,9 @@ TP_LOCALLAB_COMPREFRA;Wavelet level tone-mapping TP_LOCALLAB_COMPRESS_TOOLTIP;Use if necessary the module 'Clarity & Sharp mask and Blend & Soft Images' by adjusting 'Soft radius' to reduce artifacts. TP_LOCALLAB_CONTCOL;Contrast threshold TP_LOCALLAB_CONTFRA;Contrast by Level +TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted depending on the texture. TP_LOCALLAB_CONTRAST;Contrast -TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Main mask contrast control. +TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely modify the contrast of the mask (gamma & slope), instead of using a continuous & progressive curve. However it can create artifacts that have to be dealt with using the “Smooth radius” or “Laplacian threshold sliders”. TP_LOCALLAB_CONTRESID;Contrast TP_LOCALLAB_CONTTHR;Contrast Threshold TP_LOCALLAB_CONTWFRA;Local contrast @@ -2411,12 +2415,12 @@ TP_LOCALLAB_CSTHRESHOLD;Ψ Wavelets Levels TP_LOCALLAB_CSTHRESHOLDBLUR;Ψ Wavelet level selection TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance "Super" TP_LOCALLAB_CURVCURR;Normal -TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nIt is recommended (not required) to position the top of the curves on the gray transition line which represents the references (chroma, luma, hue). +TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nThe gray transition line which represents the references (chroma, luma, hue).\nYou can choose or not to position the top of the curves on this transition. TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To be active, you must enable combobox 'Curve type' TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light -TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) has the same algorithm than slider lightness.\n'Super' the curve L=f(L) has an new improved algorithm, which can leeds in some cases to artifacts. +TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. TP_LOCALLAB_CURVENCONTRAST;Super+Contrast threshold (experimental) TP_LOCALLAB_CURVENH;Super TP_LOCALLAB_CURVENHSU;Combined HueChroma (experimental) @@ -2457,6 +2461,7 @@ TP_LOCALLAB_EV_VIS_ALL;Show all TP_LOCALLAB_EXCLUF;Excluding TP_LOCALLAB_EXCLUF_TOOLTIP;Can be used to exclude this part of datas - move Scope to extend color.\n You can apply all settings to this RT-spot. TP_LOCALLAB_EXCLUTYPE;Spot method +//TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in inverted mode TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in inverted mode TP_LOCALLAB_EXECLU;Excluding spot TP_LOCALLAB_EXNORM;Normal spot @@ -2473,11 +2478,12 @@ TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation of wavelet levels.\nHow TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small(< 32x32 pixels).\nUse low transition values and high decay transition values and scope to simulate small RT-spot and deal wth defects.\nUse if necessary the module 'Clarity & Sharp mask and Blend images' by adjusting 'Soft radius' to reduce artifacts. TP_LOCALLAB_EXPCURV;Curves TP_LOCALLAB_EXPGRAD;Graduated Filter +TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and "Merge file") Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Balances the action between the original image and the Laplace transform. TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Apply a gamma before and after Laplace transform TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Add linear exposure component before application Laplace transform TP_LOCALLAB_EXPLAP_TOOLTIP;The more you act on this threshold slider, the greater the action of reducing contrast. -TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows various possibilities to blend image (as layers in Photoshop (c)) : difference, multiply, soft light, overlay...with opacity...\nOriginal Image : merge current RT-spot with Original.\nPrevious spot : merge current Rt-spot with previous - if there is only one spot previous = original.\nBackground : merge current RT-spot with a color and luminance background (less possibilties) +TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control\nOriginal Image : merge current RT-spot with Original.\nPrevious spot : merge current Rt-spot with previous - if there is only one spot previous = original.\nBackground : merge current RT-spot with a color and luminance background (fewer possibilties) TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : use an algorithm similar as main Exposure but in L*a*b* and taking account of deltaE.\n\nContrast attenuator : use another algorithm also with deltaE and with Poisson equation to solve Laplacian in Fourier space.\nContrast attenuator, Dynamic range compression and Standard can be combined.\nFFTW Fourier Transform is optimized in size to reduce processing time.\nReduce artifacts and noise. TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Apply a median before Laplace transform to prevent artifacts (noise).\nYou can also use "Denoise" tool. TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure @@ -2497,29 +2503,32 @@ TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal - use Fattal Tone mapping algorithm. TP_LOCALLAB_FATLEVEL;Sigma TP_LOCALLAB_FATRES;Amount Residual Image TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ -TP_LOCALLAB_FEATH_TOOLTIP;Gradient width in percent of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn’t been activated. +TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn’t been activated. TP_LOCALLAB_FEATVALUE;Feather gradient (Graduated Filters) TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform TP_LOCALLAB_FFTW2;ƒ - Use Fast Fourier Transform (TIF, JPG,..) +TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements) TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform TP_LOCALLAB_FULLIMAGE;Calculate dark-Ev/white-Ev value on the entire image TP_LOCALLAB_GAM;Gamma TP_LOCALLAB_GAMFRA;Tone response curve (TRC) TP_LOCALLAB_GAMM;Gamma TP_LOCALLAB_GAMMASKCOL;Gamma +TP_LOCALLAB_GAMMASK_TOOLTIP;Gamma and Slope allow a soft and artifact-free transformation of the mask by progressively modifying “L” to avoid any discontinuities. TP_LOCALLAB_GAMSH;Gamma TP_LOCALLAB_GRADANG;Gradient angle TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees : -180 0 +180 TP_LOCALLAB_GRADFRA;Graduated Filter Mask -TP_LOCALLAB_GRADGEN_TOOLTIP;Graduated filter is supplied with Color and Light & merge file, Exposure & mask, Shadows Highlight, Vibrance, Log Encoding.\n\nVibrance, Color and Light & merge file, are provided with GF luminance, chrominance, Hue.\nFeather is located in settings. +//TP_LOCALLAB_GRADGEN_TOOLTIP;Graduated filter is supplied with Color and Light & merge file, Exposure & mask, Shadows Highlight, Vibrance, Log Encoding.\n\nVibrance, Color and Light & merge file, are provided with GF luminance, chrominance, Hue.\nFeather is located in settings. +TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance TP_LOCALLAB_GRADSTR;Gradient strength -TP_LOCALLAB_GRADSTRAB_TOOLTIP;Filter chroma strength +TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength TP_LOCALLAB_GRADSTRCHRO;Chrominance gradient strength TP_LOCALLAB_GRADSTRHUE;Hue gradient strength TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength -TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Filter Hue strength +TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength TP_LOCALLAB_GRADSTRLUM;Luminance gradient strength TP_LOCALLAB_GRADSTR_TOOLTIP;Filter strength in stops TP_LOCALLAB_GRAINFRA;Film Grain 1:1 @@ -2527,6 +2536,7 @@ TP_LOCALLAB_GRALWFRA;Graduated Filter Local contrast TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use small spot and adapt transition and transition decay\nOnly mode NORMAL and eventually Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE) TP_LOCALLAB_GRIDONE;Color Toning TP_LOCALLAB_GRIDTWO;Direct +TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma -Equivalent to H=f(H) if the "white dot" on the grid remains at zero and you only vary the "black dot"-Equivalent to "Color toning" if you vary the 2 dots.\n\nDirect: acts directly on the chroma TP_LOCALLAB_GUIDBL;Soft radius TP_LOCALLAB_GUIDFILTER;Guided filter radius TP_LOCALLAB_GUIDFILTER_TOOLTIP;Adapt this values according to images - can reduce or increase artifacts. @@ -2536,7 +2546,8 @@ TP_LOCALLAB_HLH;Curves H TP_LOCALLAB_IND;Independent (mouse) TP_LOCALLAB_INDSL;Independent (mouse + sliders) TP_LOCALLAB_INVERS;Inverse -TP_LOCALLAB_INVERS_TOOLTIP;If selected (inverse) less possibilities.\n\nAlternative\nFirst Spot:\n full image - delimiter outside preview\n Shape RT-spot area : rectangle. Transition 100\n\nSecond spot : Excluding spot +//TP_LOCALLAB_INVERS_TOOLTIP;If selected (inverse) less possibilities.\n\nAlternative\nFirst Spot:\n full image - delimiter outside preview\n Shape RT-spot area : rectangle. Transition 100\n\nSecond spot : Excluding spot +TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n full image - delimiter outside preview\n RT-spot shape: rectangle. Transition 100\n\nSecond spot : Excluding spot TP_LOCALLAB_ISOGR;Coarseness (ISO) TP_LOCALLAB_LABBLURM;Blur Mask TP_LOCALLAB_LABEL;Local Adjustments @@ -2548,7 +2559,9 @@ TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE TP_LOCALLAB_LAPLACEXP;Laplacian threshold TP_LOCALLAB_LAPMASKCOL;Laplacian threshold -TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using Radius and Laplace Threshold (advanced) simultaneously.\nLaplacian threshold reduce contrast, artifacts, smooth result. +TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using “Smooth radius” and “Laplacian threshold” (advanced) together.\nSmooth radius uses a guided filter to decrease artifacts and smooth out the transition +TP_LOCALLAB_LAPRAD1_TOOLTIP;Avoid using “Smooth radius” and “Laplacian threshold” (advanced) together.\nTransforms the mask to eliminate values lower than the threshold. +Reduces artifacts and noise, and allows local contrast to be modified. TP_LOCALLAB_LAP_MASK_TOOLTIP;Solve PDE for all Laplacian masks.\nIf enabled Laplacian threshold mask reduce artifacts and smooth result.\nIf disabled linear response. TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated.\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\n TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets - 7 @@ -2600,8 +2613,10 @@ TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the deltaE image TP_LOCALLAB_MASK;Mask TP_LOCALLAB_MASK2;Contrast curve TP_LOCALLAB_MASKCOL;Mask Curves +TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection TP_LOCALLAB_MASKH;Hue curve -TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a single tool, this requires activating another tool (but without using the tool : sliders to 0,...) where is the mask you want to activate.\n\nYou can also duplicate the RT-spot and place it right next to each other,variations of references allow fine work on images. +//TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a single tool, this requires activating another tool (but without using the tool : sliders to 0,...) where is the mask you want to activate.\n\nYou can also duplicate the RT-spot and place it right next to each other,variations of references allow fine work on images. +TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ) \n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. TP_LOCALLAB_MED;Medium TP_LOCALLAB_MEDIAN;Median Low TP_LOCALLAB_MEDNONE;None @@ -2613,12 +2628,13 @@ TP_LOCALLAB_MERFOR;Color Dodge TP_LOCALLAB_MERFOU;Multiply TP_LOCALLAB_MERGE1COLFRA;Merge with Original or Previous or Background TP_LOCALLAB_MERGECOLFRA;Mask: LCH & Structure +TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCH curves and/or a structure-detection algorithm TP_LOCALLAB_MERGEFIV;Previous Spot(Mask 7) + Mask LCH TP_LOCALLAB_MERGEFOU;Previous Spot(Mask 7) -TP_LOCALLAB_MERGEMER_TOOLTIP;Take into account ΔE to merge files (equivalent of scope for this use) +TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case) TP_LOCALLAB_MERGENONE;None TP_LOCALLAB_MERGEONE;Short Curves 'L' Mask -TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity merge % current Spot with original or previous Spot.\nContrast threshold : adjust result in function of Original contrast +TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. TP_LOCALLAB_MERGETHR;Original(Mask 7) + Mask LCH TP_LOCALLAB_MERGETWO;Original(Mask 7) TP_LOCALLAB_MERGETYPE;Merge image and mask @@ -2687,7 +2703,7 @@ TP_LOCALLAB_RADIUS_TOOLTIP;Above Radius 30 Use Fast Fourier Transform TP_LOCALLAB_RADMASKCOL;Smooth radius TP_LOCALLAB_RECT;Rectangle TP_LOCALLAB_RECURS;Recursive references -TP_LOCALLAB_RECURS_TOOLTIP;Recalculate references for hue, luma, chroma after each module and after each RT-spot.\nAlso useful for working with masks. +TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. TP_LOCALLAB_REFLABEL;Ref. (0..1) Chroma=%1 Luma=%2 Hue=%3 TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot @@ -2714,6 +2730,7 @@ TP_LOCALLAB_RETI_SCALE_TOOLTIP;If scale=1, retinex behaves like local contrast w TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex - 9 TP_LOCALLAB_REWEI;Reweighting iterates TP_LOCALLAB_RGB;RGB Tone Curve +TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. TP_LOCALLAB_ROW_NVIS;Not visible TP_LOCALLAB_ROW_VIS;Visible TP_LOCALLAB_SATUR;Saturation @@ -2745,6 +2762,8 @@ TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone equalizer TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows & highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. //Can be used instead - or in complement - of exposure module in difficult cases.\nThe use of Denoise may be necessary : lightening the shadows.\n\nCan be used as graduated filter (increase Scope) TP_LOCALLAB_SHAMASKCOL;Shadows +TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm +TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm TP_LOCALLAB_SHAPETYPE;RT-spot shape TP_LOCALLAB_SHAPE_TOOLTIP;Elipse is normal mode.\nRectangle can be used in some cases, for example to work in full image in conjonction with delimiters outside preview, transition = 100.\n\nPolygone - Beziers are waiting for GUI... TP_LOCALLAB_SHARAMOUNT;Amount @@ -2766,7 +2785,8 @@ TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) TP_LOCALLAB_SHOWLC;Mask and modifications TP_LOCALLAB_SHOWMASK;Show mask -TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Display mask modifications.\nBeware, you can only view one tool mask at the same time.\n\nNote: Use Mask is before algorihtm shape detection. +//TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Display mask modifications.\nBeware, you can only view one tool mask at the same time.\n\nNote: Use Mask is before algorihtm shape detection. +TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks\nShow modifications without mask: shows the modifications before any masks are applied\nShow modifications with mask: shows the modifications after a mask has been applied\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the "Spot structure" cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Show process Fourier:\nShows the different stages of the process.\nLaplace - builds the second derivative according to the threshold (first step).\nFourier -shows the transformed Laplacian with DCT.\nPoisson - show solution of Poisson DCE.\nNormalize - show result without normalization luminance. TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise TP_LOCALLAB_SHOWMASKTYP2;Denoise @@ -2791,19 +2811,21 @@ TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer - 5 TP_LOCALLAB_SIGMAWAV;Attenuation response TP_LOCALLAB_SIM;Simple TP_LOCALLAB_SLOMASKCOL;Slope +TP_LOCALLAB_SLOMASK_TOOLTIP;Gamma and Slope allow a soft and artifact-free transformation of the mask by progressively modifying “L” to avoid any discontinuities. TP_LOCALLAB_SLOSH;Slope TP_LOCALLAB_SOFT;Soft Light & Original Retinex TP_LOCALLAB_SOFTM;Soft Light //TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Original Retinex is very different from others Retinex method.\nIts acts on grey and balance luminance.\nIt is an emulation of "Dodge" and "Burn" TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts TP_LOCALLAB_SOFTRETI_TOOLTIP;Take into account deltaE to improve Transmission map TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 TP_LOCALLAB_SOURCE_GRAY;Value TP_LOCALLAB_SPECCASE;Specific cases TP_LOCALLAB_SPECIAL;Special use of RGB curves -TP_LOCALLAB_SPECIAL_TOOLTIP;Only for this RGB curve, disabled (or reduce effects) of Scope, mask...for example, if you want to have a negative effect. +TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. “Scope”, masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. TP_LOCALLAB_SPOTNAME;New Spot TP_LOCALLAB_STD;Standard TP_LOCALLAB_STR;Strength @@ -2812,14 +2834,17 @@ TP_LOCALLAB_STREN;Compression Strength TP_LOCALLAB_STRENG;Strength TP_LOCALLAB_STRENGR;Strength TP_LOCALLAB_STRENGTH;Noise +TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with "strength", but you can also use the "scope" function which allows you to delimit the action (e.g., to isolate a particular color). TP_LOCALLAB_STRGRID;Strength TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\nif Strength Retinex >= 0.1 Dehaze is in luminance mode. TP_LOCALLAB_STRUC;Structure TP_LOCALLAB_STRUCCOL;Spot Structure TP_LOCALLAB_STRUCCOL1;Spot Structure -TP_LOCALLAB_STRUCT_TOOLTIP;Use Sobel algorithm to take into account structure in shape detection.\nyou can have a preview by activating "mask and modifications - Show spot structure".\n\nCan be used in conjunction with masks (advanced) structure, blur, wavelet to improve edge detection.\n\nNeeds maskless adjustments to be activated (lightness, exposure...) +//TP_LOCALLAB_STRUCT_TOOLTIP;Use Sobel algorithm to take into account structure in shape detection.\nyou can have a preview by activating "mask and modifications - Show spot structure".\n\nCan be used in conjunction with masks (advanced) structure, blur, wavelet to improve edge detection.\n\nNeeds maskless adjustments to be activated (lightness, exposure...) +TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate "Mask and modifications” > “Show spot structure" (advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and “Local contrast (by wavelet level)” to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either ‘Show modified image” or “Show modifications with mask ”. TP_LOCALLAB_STRUMASKCOL;Structure mask strength -TP_LOCALLAB_STRUMASK_TOOLTIP;Generate a structure mask with difference between surface areas and reliefs.\nIf structure mask as tool is enabled, this mask is used in addition to the other tools (gamma, slope, contrast curve ...) +TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox "Structure mask as tool" unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask 1 (Blur and denoise") and mask 7 (Color & Light). +TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended ! TP_LOCALLAB_STYPE;Shape method TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. TP_LOCALLAB_SYM;Symmetrical (mouse) @@ -2834,6 +2859,7 @@ TP_LOCALLAB_TLABEL2;TM Effective Tm=%1 TM=%2 TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize TP_LOCALLAB_TM;Tone Mapping TP_LOCALLAB_TM_MASK;Use transmission map +TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox "Structure mask as tool" checked: in this case a mask showing the structure will be generated after one or more of the 3 curves has been modified.\n Here, the "Structure mask" behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. This option is sensitive to "deltaE image mask" and the associated slider "Scope (deltaE image mask)". TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This parameter affects sensitivity to edges.\n The greater it is the more likely an illumination change is to be considered an "edge".\n If set to zero tone mapping will have an effect similar to unsharp masking. TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Gamma moves the action of tone-mapping to shadows or highlights. TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. @@ -2842,12 +2868,14 @@ TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe TP_LOCALLAB_TONEMASCALE_TOOLTIP;This control gives meaning to the difference between "local" and "global" contrast.\nThe greater it is the larger a detail needs to be in order to be boosted TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 TP_LOCALLAB_TOOLCOL;Structure mask as tool -TP_LOCALLAB_TOOLMASK;Mask Tools +TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allow you to modify the mask, if one exist TP_LOCALLAB_TRANSIT;Transition Gradient +TP_LOCALLAB_TOOLMASK;Mask Tools TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY -TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Changes the transition of the abscissa to that of the ordinate +TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition TP_LOCALLAB_TRANSITVALUE;Transition value TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +//TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light) TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light) TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas, as a percentage of the "radius" TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain @@ -2889,7 +2917,8 @@ TP_LOCALLAB_WAVHIGH;Ψ Wavelet high TP_LOCALLAB_WAVLEV;Blur by Level TP_LOCALLAB_WAVLOW;Ψ Wavelet low TP_LOCALLAB_WAVMASK;Ψ Local contrast (by wavelet level) -TP_LOCALLAB_WAVMASK_TOOLTIP;Allows fine work on mask levels contrasts (structure) +TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings...) +TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in “Local contrast (by wavelet level)” TP_LOCALLAB_WAVMED;Ψ Wavelet normal TP_LOCALLAB_WEDIANHI;Median Hi TP_LOCALLAB_WHITE_EV;White Ev diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index f47f28447..801e6f118 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -461,6 +461,7 @@ LocallabColor::LocallabColor(): labgridmerg(Gtk::manage(new LabGrid(EvLocallabLabGridmergValue, M("TP_LOCALLAB_LABGRID_VALUES"), false))), merlucol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MERLUCOL"), 0.0, 100.0, 0.5, 32., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), expmaskcol(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWC")))), + mergecolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_MERGECOLFRA")))), showmaskcolMethod(Gtk::manage(new MyComboBoxText())), showmaskcolMethodinv(Gtk::manage(new MyComboBoxText())), enaColorMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), @@ -476,6 +477,7 @@ LocallabColor::LocallabColor(): contcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CONTCOL"), 0., 200., 0.5, 0.))), blurcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURCOL"), 0.2, 100., 0.5, 0.2))), blendmaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + toolcolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK")))), radmaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), lapmaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), chromaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), @@ -830,7 +832,6 @@ LocallabColor::LocallabColor(): mask7Box->pack_start(*mask7); expmaskcol1->add(*mask7Box, false); pack_start(*expmaskcol1, false, false); - Gtk::Frame* const mergecolFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_MERGECOLFRA"))); mergecolFrame->set_label_align(0.025, 0.5); ToolParamBlock* const maskcolBox = Gtk::manage(new ToolParamBlock()); maskcolBox->pack_start(*showmaskcolMethod, Gtk::PACK_SHRINK, 4); @@ -849,7 +850,7 @@ LocallabColor::LocallabColor(): blurFrame->add(*blurmBox); maskcolBox->pack_start(*blurFrame, Gtk::PACK_SHRINK, 0); maskcolBox->pack_start(*blendmaskcol, Gtk::PACK_SHRINK, 0); - Gtk::Frame* const toolcolFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK"))); +// Gtk::Frame* const toolcolFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK"))); toolcolFrame->set_label_align(0.025, 0.5); ToolParamBlock* const toolcolBox = Gtk::manage(new ToolParamBlock()); toolcolBox->pack_start(*radmaskcol, Gtk::PACK_SHRINK, 0); @@ -919,6 +920,12 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips) if (showTooltips) { lumFrame->set_tooltip_text(M("TP_LOCALLAB_EXPCOLOR_TOOLTIP")); lightness->set_tooltip_text(M("TP_LOCALLAB_LIGHTN_TOOLTIP")); + gridMethod->set_tooltip_text(M("TP_LOCALLAB_GRIDMETH_TOOLTIP")); + strengthgrid->set_tooltip_text(M("TP_LOCALLAB_STRENGRID_TOOLTIP")); + blurcolde->set_tooltip_text(M("TP_LOCALLAB_BLURCOLDE_TOOLTIP")); + softradiuscol->set_tooltip_text(M("TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP")); + expgradcol->set_tooltip_text(M("TP_LOCALLAB_EXPGRADCOL_TOOLTIP")); + rgbCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_RGBCURVE_TOOLTIP")); sensi->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); structcol->set_tooltip_text(M("TP_LOCALLAB_STRUCT_TOOLTIP")); strcol->set_tooltip_text(M("TP_LOCALLAB_GRADGEN_TOOLTIP")); @@ -938,15 +945,34 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips) blurFrame->set_tooltip_text(M("TP_LOCALLAB_BLURMASK_TOOLTIP")); blendmaskcol->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); radmaskcol->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); - lapmaskcol->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); maskHCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_HHMASK_TOOLTIP")); mask2CurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); Lmaskshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); mask2CurveEditorGwav->set_tooltip_text(M("TP_LOCALLAB_WAVMASK_TOOLTIP")); LLmaskcolshapewav->setTooltip(M("TP_LOCALLAB_LMASK_LEVEL_TOOLTIP")); + mergecolFrame->set_tooltip_markup(M("TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP")); + maskCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + strumaskcol->set_tooltip_text(M("TP_LOCALLAB_STRUSTRMASK_TOOLTIP")); + toolcol->set_tooltip_text(M("TP_LOCALLAB_TOOLMASK_TOOLTIP")); + toolcolFrame->set_tooltip_text(M("TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP")); + fftColorMask->set_tooltip_text(M("TP_LOCALLAB_FFTMASK_TOOLTIP")); + gammaskcol->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskcol->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskcol->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + shadmaskcol->set_tooltip_text(M("TP_LOCALLAB_SHADMASK_TOOLTIP")); + contcol->set_tooltip_text(M("TP_LOCALLAB_CONTTHMASK_TOOLTIP")); + blurcol->set_tooltip_text(M("TP_LOCALLAB_BLURRMASK_TOOLTIP")); + lapmaskcol->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + csThresholdcol->set_tooltip_text(M("TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP")); } else { lumFrame->set_tooltip_text(""); lightness->set_tooltip_text(""); + gridMethod->set_tooltip_text(""); + strengthgrid->set_tooltip_text(""); + blurcolde->set_tooltip_text(""); + softradiuscol->set_tooltip_text(""); + expgradcol->set_tooltip_text(""); + rgbCurveEditorG->set_tooltip_text(""); sensi->set_tooltip_text(""); structcol->set_tooltip_text(""); strcol->set_tooltip_text(""); @@ -954,15 +980,27 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips) qualitycurveMethod->set_tooltip_markup(""); special->set_tooltip_text(""); expmaskcol1->set_tooltip_text(""); + maskCurveEditorG->set_tooltip_markup(""); mercol->set_tooltip_text(""); opacol->set_tooltip_text(""); conthrcol->set_tooltip_text(""); gridmerFrame->set_tooltip_text(""); expmaskcol->set_tooltip_markup(""); + mergecolFrame->set_tooltip_markup(""); CCmaskshape->setTooltip(""); LLmaskshape->setTooltip(""); HHmaskshape->setTooltip(""); struFrame->set_tooltip_text(""); + strumaskcol->set_tooltip_text(""); + toolcol->set_tooltip_text(""); + toolcolFrame->set_tooltip_text(""); + fftColorMask->set_tooltip_text(""); + gammaskcol->set_tooltip_text(""); + chromaskcol->set_tooltip_text(""); + slomaskcol->set_tooltip_text(""); + shadmaskcol->set_tooltip_text(""); + contcol->set_tooltip_text(""); + blurcol->set_tooltip_text(""); blurFrame->set_tooltip_text(""); blendmaskcol->set_tooltip_text(""); radmaskcol->set_tooltip_text(""); @@ -972,6 +1010,7 @@ void LocallabColor::updateAdviceTooltips(const bool showTooltips) Lmaskshape->setTooltip(""); mask2CurveEditorGwav->set_tooltip_text(""); LLmaskcolshapewav->setTooltip(""); + csThresholdcol->set_tooltip_text(""); } } @@ -2613,6 +2652,7 @@ void LocallabExposure::updateAdviceTooltips(const bool showTooltips) // expMethod->set_tooltip_text(M("TP_LOCALLAB_EXPMETHOD_TOOLTIP")); // pdeFrame->set_tooltip_text(M("TP_LOCALLAB_PDEFRAME_TOOLTIP")); exppde->set_tooltip_text(M("TP_LOCALLAB_PDEFRAME_TOOLTIP")); + blurexpde->set_tooltip_text(M("TP_LOCALLAB_BLURCOLDE_TOOLTIP")); laplacexp->set_tooltip_text(M("TP_LOCALLAB_EXPLAP_TOOLTIP")); linear->set_tooltip_text(M("TP_LOCALLAB_EXPLAPLIN_TOOLTIP")); balanexp->set_tooltip_text(M("TP_LOCALLAB_EXPLAPBAL_TOOLTIP")); @@ -2632,13 +2672,19 @@ void LocallabExposure::updateAdviceTooltips(const bool showTooltips) HHmaskexpshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); blendmaskexp->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); radmaskexp->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); - lapmaskexp->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + lapmaskexp->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); strmaskexp->set_tooltip_text(M("TP_LOCALLAB_GRADGEN_TOOLTIP")); mask2expCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); Lmaskexpshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + maskexpCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + gammaskexp->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskexp->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskexp->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + lapmaskexp->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); } else { exp->set_tooltip_text(""); exppde->set_tooltip_text(""); + blurexpde->set_tooltip_text(""); laplacexp->set_tooltip_text(""); linear->set_tooltip_text(""); balanexp->set_tooltip_text(""); @@ -2657,10 +2703,13 @@ void LocallabExposure::updateAdviceTooltips(const bool showTooltips) HHmaskexpshape->setTooltip(""); blendmaskexp->set_tooltip_text(""); radmaskexp->set_tooltip_text(""); - lapmaskexp->set_tooltip_text(""); strmaskexp->set_tooltip_text(""); mask2expCurveEditorG->set_tooltip_text(""); Lmaskexpshape->setTooltip(""); + gammaskexp->set_tooltip_text(""); + chromaskexp->set_tooltip_text(""); + slomaskexp->set_tooltip_text(""); + lapmaskexp->set_tooltip_text(""); } } @@ -3725,14 +3774,20 @@ void LocallabShadow::updateAdviceTooltips(const bool showTooltips) sloSH->set_tooltip_text(M("TP_LOCALLAB_SHTRC_TOOLTIP")); strSH->set_tooltip_text(M("TP_LOCALLAB_GRADGEN_TOOLTIP")); expmasksh->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); + blurSHde->set_tooltip_text(M("TP_LOCALLAB_BLURCOLDE_TOOLTIP")); CCmaskSHshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); LLmaskSHshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); HHmaskSHshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); blendmaskSH->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); radmaskSH->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); - lapmaskSH->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); mask2SHCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); LmaskSHshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + maskSHCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + gammaskSH->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskSH->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskSH->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + lapmaskSH->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + } else { exp->set_tooltip_text(""); @@ -3742,6 +3797,7 @@ void LocallabShadow::updateAdviceTooltips(const bool showTooltips) gamSH->set_tooltip_text(""); sloSH->set_tooltip_text(""); strSH->set_tooltip_text(""); + blurSHde->set_tooltip_text(""); expmasksh->set_tooltip_markup(""); CCmaskSHshape->setTooltip(""); LLmaskSHshape->setTooltip(""); @@ -3751,6 +3807,10 @@ void LocallabShadow::updateAdviceTooltips(const bool showTooltips) lapmaskSH->set_tooltip_text(""); mask2SHCurveEditorG->set_tooltip_text(""); LmaskSHshape->setTooltip(""); + maskSHCurveEditorG->set_tooltip_markup(""); + gammaskSH->set_tooltip_text(""); + chromaskSH->set_tooltip_text(""); + slomaskSH->set_tooltip_text(""); } } @@ -4625,6 +4685,11 @@ void LocallabVibrance::updateAdviceTooltips(const bool showTooltips) blendmaskvib->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); mask2vibCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); Lmaskvibshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + maskvibCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + gammaskvib->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskvib->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskvib->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + lapmaskvib->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); } else { exp->set_tooltip_text(""); warm->set_tooltip_text(""); @@ -4636,6 +4701,11 @@ void LocallabVibrance::updateAdviceTooltips(const bool showTooltips) blendmaskvib->set_tooltip_text(""); mask2vibCurveEditorG->set_tooltip_text(""); Lmaskvibshape->setTooltip(""); + maskvibCurveEditorG->set_tooltip_markup(""); + gammaskvib->set_tooltip_text(""); + chromaskvib->set_tooltip_text(""); + slomaskvib->set_tooltip_text(""); + lapmaskvib->set_tooltip_text(""); } } @@ -5661,6 +5731,7 @@ LocallabBlur::LocallabBlur(): HHmaskblshape(static_cast(maskblCurveEditorG->addCurve(CT_Flat, "LC(H)", nullptr, false, true))), strumaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUMASKCOL"), 0., 200., 0.1, 0.))), toolbl(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_TOOLCOL")))), + toolblFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK")))), blendmaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), radmaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), lapmaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), @@ -5904,7 +5975,6 @@ LocallabBlur::LocallabBlur(): Gtk::HSeparator* const separatorstrubl = Gtk::manage(new Gtk::HSeparator()); maskblBox->pack_start(*separatorstrubl, Gtk::PACK_SHRINK, 2); maskblBox->pack_start(*blendmaskbl, Gtk::PACK_SHRINK, 0); - Gtk::Frame* const toolblFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK"))); toolblFrame->set_label_align(0.025, 0.5); ToolParamBlock* const toolblBox = Gtk::manage(new ToolParamBlock()); toolblBox->pack_start(*radmaskbl, Gtk::PACK_SHRINK, 0); @@ -5968,6 +6038,17 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) lapmaskbl->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); Lmaskblshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); LLmaskblshapewav->setTooltip(M("TP_LOCALLAB_LMASK_LEVEL_TOOLTIP")); + maskblCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + strumaskbl->set_tooltip_text(M("TP_LOCALLAB_STRUSTRMASK_TOOLTIP")); + toolbl->set_tooltip_text(M("TP_LOCALLAB_TOOLMASK_TOOLTIP")); + toolblFrame->set_tooltip_text(M("TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP")); + gammaskbl->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskbl->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskbl->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + shadmaskbl->set_tooltip_text(M("TP_LOCALLAB_SHADHMASK_TOOLTIP")); + shadmaskblsha->set_tooltip_text(M("TP_LOCALLAB_SHADMASK_TOOLTIP")); + lapmaskbl->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + csThresholdblur->set_tooltip_text(M("TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP")); } else { expblnoise->set_tooltip_markup(""); radius->set_tooltip_text(""); @@ -5986,6 +6067,17 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) lapmaskbl->set_tooltip_text(""); Lmaskblshape->setTooltip(""); LLmaskblshapewav->setTooltip(""); + maskblCurveEditorG->set_tooltip_markup(""); + strumaskbl->set_tooltip_text(""); + toolbl->set_tooltip_text(""); + toolblFrame->set_tooltip_text(""); + gammaskbl->set_tooltip_text(""); + chromaskbl->set_tooltip_text(""); + slomaskbl->set_tooltip_text(""); + shadmaskbl->set_tooltip_text(""); + shadmaskblsha->set_tooltip_text(""); + csThresholdblur->set_tooltip_text(""); + } } diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index 4d26e2915..d44717de2 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -225,6 +225,7 @@ private: LabGrid* const labgridmerg; Adjuster* const merlucol; MyExpander* const expmaskcol; + Gtk::Frame* const mergecolFrame ; MyComboBoxText* const showmaskcolMethod; MyComboBoxText* const showmaskcolMethodinv; Gtk::CheckButton* const enaColorMask; @@ -240,6 +241,7 @@ private: Adjuster* const contcol; Adjuster* const blurcol; Adjuster* const blendmaskcol; + Gtk::Frame* const toolcolFrame; Adjuster* const radmaskcol; Adjuster* const lapmaskcol; Adjuster* const chromaskcol; @@ -678,6 +680,7 @@ private: FlatCurveEditor* const HHmaskblshape; Adjuster* const strumaskbl; Gtk::CheckButton* const toolbl; + Gtk::Frame* const toolblFrame; Adjuster* const blendmaskbl; Adjuster* const radmaskbl; Adjuster* const lapmaskbl; diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index 015b5b183..27a450a12 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -285,10 +285,14 @@ void LocallabTone::updateAdviceTooltips(const bool showTooltips) LLmasktmshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); HHmasktmshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); blendmasktm->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); - lapmasktm->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); radmasktm->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); mask2tmCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); Lmasktmshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + masktmCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + gammasktm->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromasktm->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomasktm->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + lapmasktm->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); } else { exp->set_tooltip_text(""); equiltm->set_tooltip_text(""); @@ -302,10 +306,16 @@ void LocallabTone::updateAdviceTooltips(const bool showTooltips) LLmasktmshape->setTooltip(""); HHmasktmshape->setTooltip(""); blendmasktm->set_tooltip_text(""); - lapmasktm->set_tooltip_text(""); radmasktm->set_tooltip_text(""); mask2tmCurveEditorG->set_tooltip_text(""); Lmasktmshape->setTooltip(""); + mask2tmCurveEditorG->set_tooltip_text(""); + Lmasktmshape->setTooltip(""); + masktmCurveEditorG->set_tooltip_markup(""); + gammasktm->set_tooltip_text(""); + chromasktm->set_tooltip_text(""); + slomasktm->set_tooltip_text(""); + lapmasktm->set_tooltip_text(""); } } @@ -988,9 +998,14 @@ void LocallabRetinex::updateAdviceTooltips(const bool showTooltips) HHmaskretishape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); blendmaskreti->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); radmaskreti->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); - lapmaskreti->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); mask2retiCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); Lmaskretishape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + maskretiCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + gammaskreti->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskreti->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskreti->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + lapmaskreti->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + } else { loglin->set_tooltip_text(""); sensih->set_tooltip_text(""); @@ -1016,9 +1031,13 @@ void LocallabRetinex::updateAdviceTooltips(const bool showTooltips) HHmaskretishape->setTooltip(""); blendmaskreti->set_tooltip_text(""); radmaskreti->set_tooltip_text(""); - lapmaskreti->set_tooltip_text(""); mask2retiCurveEditorG->set_tooltip_text(""); Lmaskretishape->setTooltip(""); + maskretiCurveEditorG->set_tooltip_markup(""); + gammaskreti->set_tooltip_text(""); + chromaskreti->set_tooltip_text(""); + slomaskreti->set_tooltip_text(""); + lapmaskreti->set_tooltip_text(""); } } @@ -2624,6 +2643,8 @@ void LocallabContrast::updateAdviceTooltips(const bool showTooltips) blendmasklc->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); mask2lcCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); Lmasklcshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + masklcCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + chromasklc->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); } else { contFrame->set_tooltip_text(""); LocalcurveEditorwav->set_tooltip_markup(""); @@ -2648,6 +2669,8 @@ void LocallabContrast::updateAdviceTooltips(const bool showTooltips) blendmasklc->set_tooltip_text(""); mask2lcCurveEditorG->set_tooltip_text(""); Lmasklcshape->setTooltip(""); + masklcCurveEditorG->set_tooltip_markup(""); + chromasklc->set_tooltip_text(""); } } @@ -4062,9 +4085,13 @@ void LocallabCBDL::updateAdviceTooltips(const bool showTooltips) HHmaskcbshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); blendmaskcb->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); radmaskcb->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); - lapmaskcb->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); mask2cbCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); Lmaskcbshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + maskcbCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + gammaskcb->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskcb->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskcb->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + lapmaskcb->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); } else { levFrame->set_tooltip_text(""); @@ -4082,9 +4109,13 @@ void LocallabCBDL::updateAdviceTooltips(const bool showTooltips) HHmaskcbshape->setTooltip(""); blendmaskcb->set_tooltip_text(""); radmaskcb->set_tooltip_text(""); - lapmaskcb->set_tooltip_text(""); mask2cbCurveEditorG->set_tooltip_text(""); Lmaskcbshape->setTooltip(""); + maskcbCurveEditorG->set_tooltip_markup(""); + gammaskcb->set_tooltip_text(""); + chromaskcb->set_tooltip_text(""); + slomaskcb->set_tooltip_text(""); + lapmaskcb->set_tooltip_text(""); } } @@ -5117,12 +5148,25 @@ void LocallabMask::updateAdviceTooltips(const bool showTooltips) HHmask_shape->setTooltip(M("TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP")); struFrame->set_tooltip_text(M("TP_LOCALLAB_STRUMASK_TOOLTIP")); radmask->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); - lapmask->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); mask_HCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_HHMASK_TOOLTIP")); mask2CurveEditorG->set_tooltip_text(M("TP_LOCALLAB_WAVMASK_TOOLTIP")); Lmask_shape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); mask2CurveEditorGwav->set_tooltip_text(M("TP_LOCALLAB_WAVMASK_TOOLTIP")); LLmask_shapewav->setTooltip(M("TP_LOCALLAB_LMASK_LEVEL_TOOLTIP")); + mask_CurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + strumaskmask->set_tooltip_text(M("TP_LOCALLAB_STRUSTRMASK_TOOLTIP")); + blurFrame->set_tooltip_text(M("TP_LOCALLAB_BLURMASK_TOOLTIP")); + toolmask->set_tooltip_text(M("TP_LOCALLAB_TOOLMASK_TOOLTIP")); + toolmaskFrame->set_tooltip_text(M("TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP")); + fftmask->set_tooltip_text(M("TP_LOCALLAB_FFTMASK_TOOLTIP")); + gammask->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromask->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slopmask->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + shadmask->set_tooltip_text(M("TP_LOCALLAB_SHADMASK_TOOLTIP")); + contmask->set_tooltip_text(M("TP_LOCALLAB_CONTTHMASK_TOOLTIP")); + blurmask->set_tooltip_text(M("TP_LOCALLAB_BLURRMASK_TOOLTIP")); + lapmask->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + csThresholdmask->set_tooltip_text(M("TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP")); } else { exp->set_tooltip_text(""); sensimask->set_tooltip_text(""); @@ -5133,12 +5177,25 @@ void LocallabMask::updateAdviceTooltips(const bool showTooltips) HHmask_shape->setTooltip(""); struFrame->set_tooltip_text(""); radmask->set_tooltip_text(""); - lapmask->set_tooltip_text(""); mask_HCurveEditorG->set_tooltip_text(""); mask2CurveEditorG->set_tooltip_text(""); Lmask_shape->setTooltip(""); mask2CurveEditorGwav->set_tooltip_text(""); LLmask_shapewav->setTooltip(""); + mask_CurveEditorG->set_tooltip_markup(""); + strumaskmask->set_tooltip_text(""); + blurFrame->set_tooltip_text(""); + toolmask->set_tooltip_text(""); + toolmaskFrame->set_tooltip_text(""); + fftmask->set_tooltip_text(""); + gammask->set_tooltip_text(""); + chromask->set_tooltip_text(""); + slopmask->set_tooltip_text(""); + shadmask->set_tooltip_text(""); + contmask->set_tooltip_text(""); + blurmask->set_tooltip_text(""); + lapmask->set_tooltip_text(""); + csThresholdmask->set_tooltip_text(""); } } From 1a5456dbd10c44a684d938a3579d57979eadef4c Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sat, 26 Sep 2020 11:54:05 -0700 Subject: [PATCH 118/185] Implement RGB parade --- .../svg/histogram-type-parade-off-small.svg | 132 ++++++++++++++ .../svg/histogram-type-parade-small.svg | 132 ++++++++++++++ rtdata/languages/default | 1 + rtgui/editorpanel.cc | 2 + rtgui/histogrampanel.cc | 168 ++++++++++++++++-- rtgui/histogrampanel.h | 9 + rtgui/options.h | 1 + 7 files changed, 428 insertions(+), 17 deletions(-) create mode 100644 rtdata/images/svg/histogram-type-parade-off-small.svg create mode 100644 rtdata/images/svg/histogram-type-parade-small.svg diff --git a/rtdata/images/svg/histogram-type-parade-off-small.svg b/rtdata/images/svg/histogram-type-parade-off-small.svg new file mode 100644 index 000000000..015960fcc --- /dev/null +++ b/rtdata/images/svg/histogram-type-parade-off-small.svg @@ -0,0 +1,132 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-type-parade-small.svg b/rtdata/images/svg/histogram-type-parade-small.svg new file mode 100644 index 000000000..f299f8ab2 --- /dev/null +++ b/rtdata/images/svg/histogram-type-parade-small.svg @@ -0,0 +1,132 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/languages/default b/rtdata/languages/default index 0ec86d367..fbfab9b86 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -252,6 +252,7 @@ HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. HISTOGRAM_TOOLTIP_TYPE;Toggle visibility of the scope selection buttons. HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index ab7aa873d..34d677206 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -2301,6 +2301,7 @@ bool EditorPanel::updateVectorscopeHS(void) const bool EditorPanel::updateWaveform(void) const { return histogram_scope_type == ScopeType::WAVEFORM + || histogram_scope_type == ScopeType::PARADE || histogram_scope_type == ScopeType::NONE; } @@ -2327,6 +2328,7 @@ void EditorPanel::scopeTypeChanged(ScopeType new_type) case ScopeType::VECTORSCOPE_HS: histogram_observable->requestUpdateVectorscopeHS(); break; + case ScopeType::PARADE: case ScopeType::WAVEFORM: histogram_observable->requestUpdateWaveform(); break; diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index b79262426..68f0d91b6 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -86,6 +86,7 @@ HistogramPanel::HistogramPanel () : case ScopeType::VECTORSCOPE_HS: histogramRGBArea = nullptr; break; + case ScopeType::PARADE: case ScopeType::WAVEFORM: histogramRGBArea = histogramRGBAreaVert.get(); break; @@ -129,17 +130,20 @@ HistogramPanel::HistogramPanel () : histImage.reset(new RTImage("histogram-type-histogram-small.png")); histRawImage.reset(new RTImage("histogram-bayer-on-small.png")); + paradeImage.reset(new RTImage("histogram-type-parade-small.png")); waveImage.reset(new RTImage("histogram-type-waveform-small.png")); vectHcImage.reset(new RTImage("histogram-type-vectorscope-hc-small.png")); vectHsImage.reset(new RTImage("histogram-type-vectorscope-hs-small.png")); histImageOn.reset(new RTImage("histogram-type-histogram-small.png")); histRawImageOn.reset(new RTImage("histogram-bayer-on-small.png")); + paradeImageOn.reset(new RTImage("histogram-type-parade-small.png")); waveImageOn.reset(new RTImage("histogram-type-waveform-small.png")); vectHcImageOn.reset(new RTImage("histogram-type-vectorscope-hc-small.png")); vectHsImageOn.reset(new RTImage("histogram-type-vectorscope-hs-small.png")); histImageOff.reset(new RTImage("histogram-type-histogram-off-small.png")); histRawImageOff.reset(new RTImage("histogram-bayer-off-small.png")); + paradeImageOff.reset(new RTImage("histogram-type-parade-off-small.png")); waveImageOff.reset(new RTImage("histogram-type-waveform-off-small.png")); vectHcImageOff.reset(new RTImage("histogram-type-vectorscope-hc-off-small.png")); vectHsImageOff.reset(new RTImage("histogram-type-vectorscope-hs-off-small.png")); @@ -156,11 +160,13 @@ HistogramPanel::HistogramPanel () : Gtk::RadioButtonGroup scopeTypeGroup; scopeHistBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); scopeHistRawBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); + scopeParadeBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); scopeWaveBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); scopeVectHcBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); scopeVectHsBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); scopeHistBtn->set_mode(false); scopeHistRawBtn->set_mode(false); + scopeParadeBtn->set_mode(false); scopeWaveBtn->set_mode(false); scopeVectHcBtn->set_mode(false); scopeVectHsBtn->set_mode(false); @@ -185,6 +191,8 @@ HistogramPanel::HistogramPanel () : scopeHistBtn->set_can_focus(false); scopeHistRawBtn->set_name("histButton"); scopeHistRawBtn->set_can_focus(false); + scopeParadeBtn->set_name("histButton"); + scopeParadeBtn->set_can_focus(false); scopeWaveBtn->set_name("histButton"); scopeWaveBtn->set_can_focus(false); scopeVectHcBtn->set_name("histButton"); @@ -202,6 +210,7 @@ HistogramPanel::HistogramPanel () : showBAR->set_relief (Gtk::RELIEF_NONE); scopeHistBtn->set_relief (Gtk::RELIEF_NONE); scopeHistRawBtn->set_relief (Gtk::RELIEF_NONE); + scopeParadeBtn->set_relief (Gtk::RELIEF_NONE); scopeWaveBtn->set_relief (Gtk::RELIEF_NONE); scopeVectHcBtn->set_relief (Gtk::RELIEF_NONE); scopeVectHsBtn->set_relief (Gtk::RELIEF_NONE); @@ -216,6 +225,7 @@ HistogramPanel::HistogramPanel () : showBAR->set_tooltip_text (M("HISTOGRAM_TOOLTIP_BAR")); scopeHistBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM")); scopeHistRawBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW")); + scopeParadeBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_PARADE")); scopeWaveBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_WAVEFORM")); scopeVectHcBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC")); scopeVectHsBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS")); @@ -249,6 +259,7 @@ HistogramPanel::HistogramPanel () : showMode->set_image(*mode2Image); scopeHistBtn->set_image(*histImageOff); scopeHistRawBtn->set_image(*histRawImageOff); + scopeParadeBtn->set_image(*paradeImageOff); scopeWaveBtn->set_image(*waveImageOff); scopeVectHcBtn->set_image(*vectHcImageOff); scopeVectHsBtn->set_image(*vectHsImageOff); @@ -261,6 +272,10 @@ HistogramPanel::HistogramPanel () : scopeHistRawBtn->set_active(); scopeHistRawBtn->set_image(*histRawImageOn); break; + case ScopeType::PARADE: + scopeParadeBtn->set_active(); + scopeParadeBtn->set_image(*paradeImageOn); + break; case ScopeType::WAVEFORM: scopeWaveBtn->set_active(); scopeWaveBtn->set_image(*waveImageOn); @@ -279,6 +294,8 @@ HistogramPanel::HistogramPanel () : showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); type_changed(); + updateHistAreaOptions(); + updateHistRGBAreaOptions(); setExpandAlignProperties(showRed , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showGreen, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); @@ -299,6 +316,7 @@ HistogramPanel::HistogramPanel () : showBAR->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::bar_toggled), showBAR ); scopeHistBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeHistBtn)); scopeHistRawBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeHistRawBtn)); + scopeParadeBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeParadeBtn)); scopeWaveBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeWaveBtn)); scopeVectHcBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeVectHcBtn)); scopeVectHsBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeVectHsBtn)); @@ -314,6 +332,7 @@ HistogramPanel::HistogramPanel () : scopeButtons->add(*scopeHistBtn); scopeButtons->add(*scopeHistRawBtn); + scopeButtons->add(*scopeParadeBtn); scopeButtons->add(*scopeWaveBtn); scopeButtons->add(*scopeVectHsBtn); scopeButtons->add(*scopeVectHcBtn); @@ -462,6 +481,8 @@ void HistogramPanel::type_selected(Gtk::RadioButton* button) new_type = ScopeType::HISTOGRAM; } else if (button == scopeHistRawBtn) { new_type = ScopeType::HISTOGRAM_RAW; + } else if (button == scopeParadeBtn) { + new_type = ScopeType::PARADE; } else if (button == scopeWaveBtn) { new_type = ScopeType::WAVEFORM; } else if (button == scopeVectHcBtn) { @@ -481,6 +502,9 @@ void HistogramPanel::type_selected(Gtk::RadioButton* button) case ScopeType::HISTOGRAM_RAW: scopeHistRawBtn->set_image(*histRawImageOff); break; + case ScopeType::PARADE: + scopeParadeBtn->set_image(*paradeImageOff); + break; case ScopeType::WAVEFORM: scopeWaveBtn->set_image(*waveImageOff); break; @@ -501,6 +525,9 @@ void HistogramPanel::type_selected(Gtk::RadioButton* button) case ScopeType::HISTOGRAM_RAW: scopeHistRawBtn->set_image(*histRawImageOn); break; + case ScopeType::PARADE: + scopeParadeBtn->set_image(*paradeImageOn); + break; case ScopeType::WAVEFORM: scopeWaveBtn->set_image(*waveImageOn); break; @@ -551,6 +578,7 @@ void HistogramPanel::type_changed() scopeType->set_image(*histRawImage); histogramRGBArea = nullptr; break; + case ScopeType::PARADE: case ScopeType::WAVEFORM: showRed->set_sensitive(); showGreen->set_sensitive(); @@ -558,7 +586,11 @@ void HistogramPanel::type_changed() showValue->set_sensitive(); showChro->set_sensitive(false); showMode->set_sensitive(false); - scopeType->set_image(*waveImage); + if (options.histogramScopeType == ScopeType::PARADE) { + scopeType->set_image(*paradeImage); + } else { + scopeType->set_image(*waveImage); + } histogramRGBArea = histogramRGBAreaVert.get(); break; case ScopeType::VECTORSCOPE_HC: @@ -803,7 +835,11 @@ void HistogramRGBArea::setShow(bool show) void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustring &profile, const Glib::ustring &profileW) { - if (!get_realized () || !showMode || !(options.histogramScopeType == ScopeType::HISTOGRAM || options.histogramScopeType == ScopeType::WAVEFORM)) { + if (!get_realized () || !showMode || !( + options.histogramScopeType == ScopeType::HISTOGRAM + || options.histogramScopeType == ScopeType::PARADE + || options.histogramScopeType == ScopeType::WAVEFORM + )) { return; } @@ -852,6 +888,7 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustrin if( (needLuma || needChroma) && (options.histogramScopeType == ScopeType::HISTOGRAM + || options.histogramScopeType == ScopeType::PARADE || options.histogramScopeType == ScopeType::WAVEFORM) ) { float Lab_L, Lab_a, Lab_b; @@ -1009,7 +1046,7 @@ void HistogramRGBAreaHori::get_preferred_width_for_height_vfunc (int height, int void HistogramRGBAreaVert::drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) { double pos; - if (options.histogramDrawMode < 2 || options.histogramScopeType == ScopeType::WAVEFORM) { + if (options.histogramDrawMode < 2 || options.histogramScopeType == ScopeType::PARADE || options.histogramScopeType == ScopeType::WAVEFORM) { pos = padding + value * (winh - padding * 2.0 - 1) / max_value + 0.5 * scale; } else { pos = padding + HistogramScaling::log (max_value, value) * (winh - padding * 2.0) / max_value + 0.5 * scale; @@ -1054,7 +1091,7 @@ HistogramArea::HistogramArea (DrawModeListener *fml) : vect_hc_buffer_dirty(true), vect_hs_buffer_dirty(true), waveform_scale(0), rwave(0, 0), gwave(0, 0),bwave(0, 0), lwave(0, 0), - wave_buffer_dirty(true), + parade_buffer_dirty(true), wave_buffer_dirty(true), valid(false), drawMode(options.histogramDrawMode), myDrawModeListener(fml), scopeType(options.histogramScopeType), oldwidth(-1), oldheight(-1), @@ -1178,13 +1215,14 @@ void HistogramArea::update( ghistRaw = histGreenRaw; bhistRaw = histBlueRaw; break; + case ScopeType::PARADE: case ScopeType::WAVEFORM: waveform_scale = waveformScale; rwave = waveformRed; gwave = waveformGreen; bwave = waveformBlue; lwave = waveformLuma; - wave_buffer_dirty = true; + parade_buffer_dirty = wave_buffer_dirty = true; break; case ScopeType::VECTORSCOPE_HS: vectorscope_scale = vectorscopeScale; @@ -1285,7 +1323,7 @@ void HistogramArea::updateBackBuffer () } // draw horizontal gridlines - if (options.histogramScopeType == ScopeType::WAVEFORM) { + if (options.histogramScopeType == ScopeType::PARADE || options.histogramScopeType == ScopeType::WAVEFORM) { for (int i = 0; i <= nrOfVGridPartitions; i++) { const double ypos = h - padding - (pow(2.0,i) - 1) * (h - 2 * padding - 1) / 255.0; cr->move_to(0, ypos); @@ -1419,6 +1457,8 @@ void HistogramArea::updateBackBuffer () drawMarks(cr, bhchanged, realhistheight, w, ui, oi); } + } else if (scopeType == ScopeType::PARADE && rwave.getWidth() > 0) { + drawParade(cr, w, h); } else if (scopeType == ScopeType::WAVEFORM && rwave.getWidth() > 0) { drawWaveform(cr, w, h); } else if (scopeType == ScopeType::VECTORSCOPE_HC || scopeType == ScopeType::VECTORSCOPE_HS) { @@ -1505,6 +1545,101 @@ void HistogramArea::drawMarks(Cairo::RefPtr &cr, cr->fill(); } +void HistogramArea::drawParade(Cairo::RefPtr &cr, int w, int h) +{ + // Arbitrary scale factor divided by current scale. + const float scale = trace_brightness * 32.f * 255.f / waveform_scale; + const int wave_width = rwave.getWidth(); + const int wave_height = rwave.getHeight(); + + // See Cairo documentation on stride. + const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, rwave.getWidth()); + + if (parade_buffer_dirty) { + const auto buffer_size = static_cast::size_type>(wave_height) * cairo_stride; + parade_buffer_r.assign(buffer_size, 0); + parade_buffer_g.assign(buffer_size, 0); + parade_buffer_b.assign(buffer_size, 0); + wave_buffer_luma.assign(buffer_size, 0); + + assert(parade_buffer_r.size() % 4 == 0); + assert(parade_buffer_g.size() % 4 == 0); + assert(parade_buffer_b.size() % 4 == 0); + assert(wave_buffer_luma.size() % 4 == 0); + + for (int val = 0; val < wave_height; val++) { + const int* const r_row = rwave[val]; + const int* const g_row = gwave[val]; + const int* const b_row = bwave[val]; + std::uint32_t* const buffer_r_row = reinterpret_cast(parade_buffer_r.data() + (255 - val) * cairo_stride); + std::uint32_t* const buffer_g_row = reinterpret_cast(parade_buffer_g.data() + (255 - val) * cairo_stride); + std::uint32_t* const buffer_b_row = reinterpret_cast(parade_buffer_b.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char r = std::min(scale * r_row[col], 0xff); + const unsigned char g = std::min(scale * g_row[col], 0xff); + const unsigned char b = std::min(scale * b_row[col], 0xff); + if (r == 0) { + buffer_r_row[col] = 0; + } else { + buffer_r_row[col] = (r << 16) | (r << 24); + } + if (g == 0) { + buffer_g_row[col] = 0; + } else { + buffer_g_row[col] = (g << 8) | (g << 24); + } + if (b == 0) { + buffer_b_row[col] = 0; + } else { + const unsigned char green = b / 2; // Make blue easier to see. + buffer_b_row[col] = b | (green << 8) | (b << 24); + } + } + } + + for (int val = 0; val < wave_height; val++) { + const int* const l_row = lwave[val]; + std::uint32_t* const buffer_row = + reinterpret_cast(wave_buffer_luma.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char l = std::min(scale * l_row[col], 0xff); + buffer_row[col] = l | (l << 8) | (l << 16) | (l << 24); + } + } + + parade_buffer_dirty = false; + } + + std::vector buffers; + if (needLuma) { + buffers.push_back(wave_buffer_luma.data()); + } + if (needRed) { + buffers.push_back(parade_buffer_r.data()); + } + if (needGreen) { + buffers.push_back(parade_buffer_g.data()); + } + if (needBlue) { + buffers.push_back(parade_buffer_b.data()); + } + + auto orig_matrix = cr->get_matrix(); + const double display_wave_width = static_cast(w) / buffers.size(); + for (int i = 0; i < buffers.size(); i++) { + Cairo::RefPtr surface; + cr->translate(i * display_wave_width, padding); + cr->scale(display_wave_width / wave_width, (h - 2 * padding) / wave_height); + surface = Cairo::ImageSurface::create( + buffers[i], Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); + cr->set_source(surface, 0, 0); + cr->set_operator(Cairo::OPERATOR_OVER); + cr->paint(); + surface->finish(); + cr->set_matrix(orig_matrix); + } +} + void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, int h) { if (scopeType != ScopeType::VECTORSCOPE_HC && scopeType != ScopeType::VECTORSCOPE_HS) { @@ -1726,15 +1861,13 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h } } - if (needLuma) { - for (int val = 0; val < wave_height; val++) { - const int* const l_row = lwave[val]; - std::uint32_t* const buffer_row = - reinterpret_cast(wave_buffer_luma.data() + (255 - val) * cairo_stride); - for (int col = 0; col < wave_width; col++) { - const unsigned char l = std::min(scale * l_row[col], 0xff); - buffer_row[col] = l | (l << 8) | (l << 16) | (l << 24); - } + for (int val = 0; val < wave_height; val++) { + const int* const l_row = lwave[val]; + std::uint32_t* const buffer_row = + reinterpret_cast(wave_buffer_luma.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char l = std::min(scale * l_row[col], 0xff); + buffer_row[col] = l | (l << 8) | (l << 16) | (l << 24); } } @@ -1834,7 +1967,8 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) setDirty(true); queue_draw (); } else if ( - scopeType == ScopeType::WAVEFORM + scopeType == ScopeType::PARADE + || scopeType == ScopeType::WAVEFORM || scopeType == ScopeType::VECTORSCOPE_HC || scopeType == ScopeType::VECTORSCOPE_HS ) { // Adjust brightness. @@ -1844,7 +1978,7 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) double dx = (event->x - movingPosition) / get_width(); float new_brightness = LIM(trace_brightness * pow(RANGE, dx), MIN_BRIGHT, MAX_BRIGHT); if (new_brightness != trace_brightness) { - wave_buffer_dirty = vect_hc_buffer_dirty = vect_hs_buffer_dirty = true; + parade_buffer_dirty = wave_buffer_dirty = vect_hc_buffer_dirty = vect_hs_buffer_dirty = true; trace_brightness = new_brightness; setDirty(true); queue_draw(); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 4417e2373..cca27a0d9 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -166,6 +166,10 @@ protected: bool vect_hc_buffer_dirty, vect_hs_buffer_dirty; int waveform_scale; array2D rwave, gwave, bwave, lwave; + std::vector parade_buffer_r; + std::vector parade_buffer_g; + std::vector parade_buffer_b; + bool parade_buffer_dirty; std::vector wave_buffer; std::vector wave_buffer_luma; bool wave_buffer_dirty; @@ -227,6 +231,7 @@ public: private: void drawCurve(Cairo::RefPtr &cr, const LUTu & data, double scale, int hsize, int vsize); void drawMarks(Cairo::RefPtr &cr, const LUTu & data, double scale, int hsize, int & ui, int & oi); + void drawParade(Cairo::RefPtr &cr, int hsize, int vsize); void drawVectorscope(Cairo::RefPtr &cr, int hsize, int vsize); void drawWaveform(Cairo::RefPtr &cr, int hsize, int vsize); Gtk::SizeRequestMode get_request_mode_vfunc () const override; @@ -268,6 +273,7 @@ protected: Gtk::RadioButton* scopeHistBtn; Gtk::RadioButton* scopeHistRawBtn; + Gtk::RadioButton* scopeParadeBtn; Gtk::RadioButton* scopeWaveBtn; Gtk::RadioButton* scopeVectHcBtn; Gtk::RadioButton* scopeVectHsBtn; @@ -288,17 +294,20 @@ protected: std::unique_ptr histImage; std::unique_ptr histRawImage; + std::unique_ptr paradeImage; std::unique_ptr waveImage; std::unique_ptr vectHcImage; std::unique_ptr vectHsImage; std::unique_ptr histImageOn; std::unique_ptr histRawImageOn; + std::unique_ptr paradeImageOn; std::unique_ptr waveImageOn; std::unique_ptr vectHcImageOn; std::unique_ptr vectHsImageOn; std::unique_ptr histImageOff; std::unique_ptr histRawImageOff; + std::unique_ptr paradeImageOff; std::unique_ptr waveImageOff; std::unique_ptr vectHcImageOff; std::unique_ptr vectHsImageOff; diff --git a/rtgui/options.h b/rtgui/options.h index e64c31ad1..aa5cff373 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -179,6 +179,7 @@ public: NONE = -1, HISTOGRAM, HISTOGRAM_RAW, + PARADE, VECTORSCOPE_HC, VECTORSCOPE_HS, WAVEFORM From 0ad5f9587f3a14fd28548616948ef0f9fac6a2e2 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sat, 26 Sep 2020 12:40:14 -0700 Subject: [PATCH 119/185] Fix segfault Make sure histogramRGBArea isn't null before using it. --- rtgui/histogrampanel.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 68f0d91b6..93091733c 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -295,7 +295,9 @@ HistogramPanel::HistogramPanel () : type_changed(); updateHistAreaOptions(); - updateHistRGBAreaOptions(); + if (histogramRGBArea) { + updateHistRGBAreaOptions(); + } setExpandAlignProperties(showRed , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showGreen, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); From cecb753595d850bfaab0e827384bf8ae5f918f62 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sat, 26 Sep 2020 16:30:51 -0700 Subject: [PATCH 120/185] Increase performance of some scopes --- rtgui/histogrampanel.cc | 116 +++++++++++++++++++++++----------------- rtgui/histogrampanel.h | 4 +- 2 files changed, 70 insertions(+), 50 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 93091733c..0df6496c7 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1093,7 +1093,8 @@ HistogramArea::HistogramArea (DrawModeListener *fml) : vect_hc_buffer_dirty(true), vect_hs_buffer_dirty(true), waveform_scale(0), rwave(0, 0), gwave(0, 0),bwave(0, 0), lwave(0, 0), - parade_buffer_dirty(true), wave_buffer_dirty(true), + parade_buffer_r_dirty(true), parade_buffer_g_dirty(true), parade_buffer_b_dirty(true), + wave_buffer_dirty(true), wave_buffer_luma_dirty(true), valid(false), drawMode(options.histogramDrawMode), myDrawModeListener(fml), scopeType(options.histogramScopeType), oldwidth(-1), oldheight(-1), @@ -1166,6 +1167,7 @@ void HistogramArea::get_preferred_width_for_height_vfunc (int height, int &minim void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, int mode, ScopeType type, bool pointer) { + wave_buffer_dirty = wave_buffer_dirty || needRed != r || needGreen != g || needBlue != b; options.histogramRed = needRed = r; options.histogramGreen = needGreen = g; @@ -1175,8 +1177,6 @@ void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, int m options.histogramDrawMode = drawMode = mode; options.histogramScopeType = scopeType = type; options.histogramBar = needPointer = pointer; - - wave_buffer_dirty = true; } bool HistogramArea::updatePending(void) @@ -1224,7 +1224,7 @@ void HistogramArea::update( gwave = waveformGreen; bwave = waveformBlue; lwave = waveformLuma; - parade_buffer_dirty = wave_buffer_dirty = true; + parade_buffer_r_dirty = parade_buffer_g_dirty = parade_buffer_b_dirty = wave_buffer_dirty = wave_buffer_luma_dirty = true; break; case ScopeType::VECTORSCOPE_HS: vectorscope_scale = vectorscopeScale; @@ -1556,49 +1556,67 @@ void HistogramArea::drawParade(Cairo::RefPtr &cr, int w, int h) // See Cairo documentation on stride. const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, rwave.getWidth()); + const auto buffer_size = static_cast::size_type>(wave_height) * cairo_stride; - if (parade_buffer_dirty) { - const auto buffer_size = static_cast::size_type>(wave_height) * cairo_stride; + if (parade_buffer_r_dirty && needRed) { parade_buffer_r.assign(buffer_size, 0); - parade_buffer_g.assign(buffer_size, 0); - parade_buffer_b.assign(buffer_size, 0); - wave_buffer_luma.assign(buffer_size, 0); - assert(parade_buffer_r.size() % 4 == 0); - assert(parade_buffer_g.size() % 4 == 0); - assert(parade_buffer_b.size() % 4 == 0); - assert(wave_buffer_luma.size() % 4 == 0); for (int val = 0; val < wave_height; val++) { const int* const r_row = rwave[val]; - const int* const g_row = gwave[val]; - const int* const b_row = bwave[val]; std::uint32_t* const buffer_r_row = reinterpret_cast(parade_buffer_r.data() + (255 - val) * cairo_stride); - std::uint32_t* const buffer_g_row = reinterpret_cast(parade_buffer_g.data() + (255 - val) * cairo_stride); - std::uint32_t* const buffer_b_row = reinterpret_cast(parade_buffer_b.data() + (255 - val) * cairo_stride); for (int col = 0; col < wave_width; col++) { const unsigned char r = std::min(scale * r_row[col], 0xff); - const unsigned char g = std::min(scale * g_row[col], 0xff); - const unsigned char b = std::min(scale * b_row[col], 0xff); - if (r == 0) { - buffer_r_row[col] = 0; - } else { + if (r != 0) { buffer_r_row[col] = (r << 16) | (r << 24); } - if (g == 0) { - buffer_g_row[col] = 0; - } else { + } + } + + parade_buffer_r_dirty = false; + } + + if (parade_buffer_g_dirty && needGreen) { + parade_buffer_g.assign(buffer_size, 0); + assert(parade_buffer_g.size() % 4 == 0); + + for (int val = 0; val < wave_height; val++) { + const int* const g_row = gwave[val]; + std::uint32_t* const buffer_g_row = reinterpret_cast(parade_buffer_g.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char g = std::min(scale * g_row[col], 0xff); + if (g != 0) { buffer_g_row[col] = (g << 8) | (g << 24); } - if (b == 0) { - buffer_b_row[col] = 0; - } else { + } + } + + parade_buffer_g_dirty = false; + } + + if (parade_buffer_b_dirty && needBlue) { + parade_buffer_b.assign(buffer_size, 0); + assert(parade_buffer_b.size() % 4 == 0); + + for (int val = 0; val < wave_height; val++) { + const int* const b_row = bwave[val]; + std::uint32_t* const buffer_b_row = reinterpret_cast(parade_buffer_b.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char b = std::min(scale * b_row[col], 0xff); + if (b != 0) { const unsigned char green = b / 2; // Make blue easier to see. buffer_b_row[col] = b | (green << 8) | (b << 24); } } } + parade_buffer_b_dirty = false; + } + + if (wave_buffer_luma_dirty && needLuma) { + wave_buffer_luma.assign(buffer_size, 0); + assert(wave_buffer_luma.size() % 4 == 0); + for (int val = 0; val < wave_height; val++) { const int* const l_row = lwave[val]; std::uint32_t* const buffer_row = @@ -1609,7 +1627,7 @@ void HistogramArea::drawParade(Cairo::RefPtr &cr, int w, int h) } } - parade_buffer_dirty = false; + wave_buffer_luma_dirty = false; } std::vector buffers; @@ -1668,7 +1686,6 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in assert(vect_buffer.size() % 4 == 0); - // TODO: Optimize. for (int y = 0; y < vect_height; y++) { const int* const vect_row = vect[y]; std::uint32_t* const buffer_row = @@ -1834,16 +1851,12 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h // See Cairo documentation on stride. const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, rwave.getWidth()); + const auto buffer_size = static_cast::size_type>(wave_height) * cairo_stride; - if (wave_buffer_dirty) { - const auto buffer_size = static_cast::size_type>(wave_height) * cairo_stride; + if (wave_buffer_dirty && (needRed || needGreen || needBlue)) { wave_buffer.assign(buffer_size, 0); - wave_buffer_luma.assign(buffer_size, 0); - assert(wave_buffer.size() % 4 == 0); - assert(wave_buffer_luma.size() % 4 == 0); - // TODO: Optimize. for (int val = 0; val < wave_height; val++) { const int* const r_row = rwave[val]; const int* const g_row = gwave[val]; @@ -1854,15 +1867,20 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h const unsigned char g = needGreen ? std::min(scale * g_row[col], 0xff) : 0; const unsigned char b = needBlue ? std::min(scale * b_row[col], 0xff) : 0; const unsigned char value = rtengine::max(r, g, b); - if (value == 0) { - buffer_row[col] = 0; - } else { - // Speedup with one memory access instead of four. + if (value != 0) { + // Ensures correct order regardless of endianness. buffer_row[col] = b | (g << 8) | (r << 16) | (value << 24); } } } + wave_buffer_dirty = false; + } + + if (wave_buffer_luma_dirty && needLuma) { + wave_buffer_luma.assign(buffer_size, 0); + assert(wave_buffer_luma.size() % 4 == 0); + for (int val = 0; val < wave_height; val++) { const int* const l_row = lwave[val]; std::uint32_t* const buffer_row = @@ -1873,7 +1891,7 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h } } - wave_buffer_dirty = false; + wave_buffer_luma_dirty = false; } Cairo::RefPtr surface; @@ -1888,12 +1906,14 @@ void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h cr->paint(); surface->finish(); } - surface = Cairo::ImageSurface::create( - wave_buffer.data(), Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); - cr->set_source(surface, 0, 0); - cr->set_operator(Cairo::OPERATOR_OVER); - cr->paint(); - surface->finish(); + if (needRed || needGreen || needBlue) { + surface = Cairo::ImageSurface::create( + wave_buffer.data(), Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); + cr->set_source(surface, 0, 0); + cr->set_operator(Cairo::OPERATOR_OVER); + cr->paint(); + surface->finish(); + } cr->set_matrix(orig_matrix); } @@ -1980,7 +2000,7 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) double dx = (event->x - movingPosition) / get_width(); float new_brightness = LIM(trace_brightness * pow(RANGE, dx), MIN_BRIGHT, MAX_BRIGHT); if (new_brightness != trace_brightness) { - parade_buffer_dirty = wave_buffer_dirty = vect_hc_buffer_dirty = vect_hs_buffer_dirty = true; + parade_buffer_r_dirty = parade_buffer_g_dirty = parade_buffer_b_dirty = wave_buffer_dirty = wave_buffer_luma_dirty = vect_hc_buffer_dirty = vect_hs_buffer_dirty = true; trace_brightness = new_brightness; setDirty(true); queue_draw(); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index cca27a0d9..fdce93d00 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -169,10 +169,10 @@ protected: std::vector parade_buffer_r; std::vector parade_buffer_g; std::vector parade_buffer_b; - bool parade_buffer_dirty; + bool parade_buffer_r_dirty, parade_buffer_g_dirty, parade_buffer_b_dirty; std::vector wave_buffer; std::vector wave_buffer_luma; - bool wave_buffer_dirty; + bool wave_buffer_dirty, wave_buffer_luma_dirty; bool valid; int drawMode; From 075011cc78b57709f4101018ea020839109ac7f4 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 28 Sep 2020 18:11:45 +0200 Subject: [PATCH 121/185] Fixed bad behavior structure mask - suppress warning BENCHFUN ipwavelet (#5920) * Change tooltip settings * Change colo and light tooltip * Change mask color and light tooltip * Others change to tooltip mask * Another change to tooltip color and light * Change all mask in locallabtolls.cc * Change all masks in locallabtools2.cc * Change tooltip shape detection * Fixed bad behavior structure mask * Suppress BENCHFUN in ipwavelet.cc --- rtengine/iplocallab.cc | 6 +++--- rtengine/ipwavelet.cc | 10 +++++----- rtengine/procparams.cc | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 94806e93c..dc8f01d48 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -4107,7 +4107,6 @@ void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int if (strumask > 0.f && astool) { - #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif @@ -9701,7 +9700,6 @@ void ImProcFunctions::Lab_Local( bool blurz = false; bool delt = params->locallab.spots.at(sp).deltae; - bool astool = params->locallab.spots.at(sp).toolbl; if (((radius > 1.5 * GAUSS_SKIP) || lp.stren > 0.1 || lp.blmet == 1 || lp.guidb > 1 || lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) && lp.blurena) { blurz = true; @@ -13204,6 +13202,7 @@ void ImProcFunctions::Lab_Local( const float amountcd = 0.f; const float anchorcd = 50.f; const int highl = 0; + bool astool = params->locallab.spots.at(sp).toolcol; maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, reserved, inv, lp, strumask, astool, @@ -14289,7 +14288,8 @@ void ImProcFunctions::Lab_Local( const float amountcd = 0.f; const float anchorcd = 50.f; const int highl = 0; - + bool astool = params->locallab.spots.at(sp).toolmask; + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, reserved, inv, lp, strumask, astool, locccmas_Curve, lcmas_utili, locllmas_Curve, llmas_utili, lochhmas_Curve, lhmas_utili, lochhhmas_Curve, lhhmas_utili, multiThread, diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 8fbb03b18..5920c4078 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1872,9 +1872,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (usechrom) { Ldecomp->reconstruct(labco->data, cp.strength); } - if (settings->verbose) { - printf("OK END\n"); - } +// if (settings->verbose) { +// printf("OK END\n"); +// } } } @@ -2604,7 +2604,7 @@ void ImProcFunctions::WaveletcontAllLfinal(wavelet_decomposition& WaveletCoeffs_ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition& WaveletCoeffs_L, const Wavblcurve & wavblcurve, struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili) { - BENCHFUN +// BENCHFUN const int maxlvl = WaveletCoeffs_L.maxlevel(); const int W_L = WaveletCoeffs_L.level_W(0); const int H_L = WaveletCoeffs_L.level_H(0); @@ -3036,7 +3036,7 @@ void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition& WaveletCoeffs_a, void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition& WaveletCoeffs_ab, const Wavblcurve & wavblcurve, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, const bool useChannelA, int skip, float *meanab, float *sigmaab) { -BENCHFUN +//BENCHFUN int maxlvl = WaveletCoeffs_ab.maxlevel(); int W_L = WaveletCoeffs_ab.level_W(0); int H_L = WaveletCoeffs_ab.level_H(0); diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 0a3cb6c6b..b427f24ee 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2881,7 +2881,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : }, invers(false), special(false), - toolcol(true), + toolcol(false), enaColorMask(false), fftColorMask(true), CCmaskcurve{ @@ -3895,7 +3895,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : 0.35 }, strumaskmask(0.), - toolmask(true), + toolmask(false), radmask(0.0), lapmask(0.0), chromask(0.0), From b8af429f0edecd9868447d35a0b1c7a3b5fd7e44 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Mon, 28 Sep 2020 22:17:49 -0700 Subject: [PATCH 122/185] Prevent null pointer access Thanks to Ingo for fixing the segfault. --- rtengine/improccoordinator.cc | 2 +- rtengine/improccoordinator.h | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 72dfb0cd3..a88f6401f 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -364,7 +364,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } imgsrc->getRAWHistogram(histRedRaw, histGreenRaw, histBlueRaw); - hist_raw_dirty = !hListener->updateHistogramRaw(); + hist_raw_dirty = !(hListener && hListener->updateHistogramRaw()); highDetailPreprocessComputed = highDetailNeeded; diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index d39fa3f9e..3020d68d5 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -469,7 +469,9 @@ public: hListener->setObservable(nullptr); } hListener = h; - h->setObservable(this); + if (h) { + h->setObservable(this); + } } void setAutoCamListener (AutoCamListener* acl) override { From d7f40eceb3960af152988be87a1dbefea3e9b8ba Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 29 Sep 2020 18:01:50 +0200 Subject: [PATCH 123/185] Local adjustments - tooltip for shadows-Highlights Vibrance LogEncoding (#5921) * Change tooltip vibrance - SH - log encoding * Try to suppress some tooltips message * Change some tooltip and code for tooltip * Newtooltip for Log encoding --- rtdata/languages/default | 39 ++++++++++++++++++++++------------ rtgui/locallabtools.cc | 46 +++++++++++++++++++++++++++++++++++++++- rtgui/locallabtools2.cc | 21 +++++++++++++++--- 3 files changed, 89 insertions(+), 17 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 459032912..4410abf50 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2510,7 +2510,8 @@ TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform TP_LOCALLAB_FFTW2;ƒ - Use Fast Fourier Transform (TIF, JPG,..) TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements) TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform -TP_LOCALLAB_FULLIMAGE;Calculate dark-Ev/white-Ev value on the entire image +TP_LOCALLAB_FULLIMAGE;Calculate the dark-Ev & white-Ev values for the entire image +TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the entire image. TP_LOCALLAB_GAM;Gamma TP_LOCALLAB_GAMFRA;Tone response curve (TRC) TP_LOCALLAB_GAMM;Gamma @@ -2587,22 +2588,30 @@ TP_LOCALLAB_LOC_CONTRASTPYRLAB;Graduated Filter - Edge Sharpness - Blur TP_LOCALLAB_LOC_RESIDPYR;Residual Image (Main) TP_LOCALLAB_LOG;Log Encoding TP_LOCALLAB_LOGAUTO;Automatic -TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will bring an evaluation of dynamic range and Source Gray point (if "Automatic" Source gray enabled).\nTo be able to touch up the automatic values, press the button again -TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm, the shadows are darker, the highlights are brighter.\nValues greater than 2 change the action of the algorithm, the shadows are grayer the highlights are more washed out -TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of Dynamic Range - Black Ev and White Ev -TP_LOCALLAB_LOGENCOD_TOOLTIP;Allows Tone Mapping with Logarithm encoding (ACES).\nUsefull for underexposed pictures, or with high dynamic range.\n\nTwo steps in the process : 1) Calculate Dynamic Range 2) User adaptation +//TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will bring an evaluation of dynamic range and Source Gray point (if "Automatic" Source gray enabled).\nTo be able to touch up the automatic values, press the button again +TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and Source Gray Point (if "Automatic Source Gray Point” enabled).\nPress the button again to adjust the automatically calculated values. +//TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm, the shadows are darker, the highlights are brighter.\nValues greater than 2 change the action of the algorithm, the shadows are grayer the highlights are more washed out +TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +//TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of Dynamic Range - Black Ev and White Ev +TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of Dynamic Range i.e. Black Ev and White Ev +//TP_LOCALLAB_LOGENCOD_TOOLTIP;Allows Tone Mapping with Logarithm encoding (ACES).\nUsefull for underexposed pictures, or with high dynamic range.\n\nTwo steps in the process : 1) Calculate Dynamic Range 2) User adaptation +TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process : 1) Dynamic Range calculation 2) Manual adjustment TP_LOCALLAB_LOGFRA;Source Gray Point -TP_LOCALLAB_LOGFRAME_TOOLTIP;Calculate or use Exposure levels of the image early in the process:\n Black Ev, White Ev and Source Gray point.\n Take into account main exposure compensation. +//TP_LOCALLAB_LOGFRAME_TOOLTIP;Calculate or use Exposure levels of the image early in the process:\n Black Ev, White Ev and Source Gray point.\n Take into account main exposure compensation. +TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the Source Gray Point for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\n Takes into account exposure compensation in the main-menu Exposure tab. +//Allows you to calculate and adjust Ev levels for the entire image. The resulting values will be used by all Lab operations and most RGB operations in the pipeline:\n Black Ev, White Ev and Source Gray Point.\n Takes into account exposure compensation in main-menu Exposure tab. TP_LOCALLAB_LOGLIN;Logarithm mode TP_LOCALLAB_LOGPFRA;Relative Exposure Levels -TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estimated gray point value of the image, early in the process -TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can change this value to adapt it to your taste. +//TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estimated gray point value of the image, early in the process +TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estimated gray point value of the image. +//TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can change this value to adapt it to your taste. +TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can adjust this value to suit. TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 TP_LOCALLAB_LUM;Curves LL - CC TP_LOCALLAB_LUMADARKEST;Darkest TP_LOCALLAB_LUMASK;Background color for luminance and color masks TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications) -TP_LOCALLAB_LUMAWHITESEST;Whiteest +TP_LOCALLAB_LUMAWHITESEST;Lightest TP_LOCALLAB_LUMFRA;L*a*b* standard TP_LOCALLAB_LUMONLY;Luminance only TP_LOCALLAB_MASKCOM;Common Color Mask @@ -2667,7 +2676,8 @@ TP_LOCALLAB_MRFOU;Previous Spot TP_LOCALLAB_MRONE;None TP_LOCALLAB_MRTHR;Original Image TP_LOCALLAB_MRTWO;Short Curves 'L' Mask -TP_LOCALLAB_MULTIPL_TOOLTIP;Allows the retouching of tones over a very wide range : -18EV +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts light tones up to 4EV +//TP_LOCALLAB_MULTIPL_TOOLTIP;Allows the retouching of tones over a very wide range : -18EV +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts light tones up to 4EV +TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV TP_LOCALLAB_NEIGH;Radius TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02 @@ -2682,6 +2692,7 @@ TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) TP_LOCALLAB_NOISEMETH;Denoise TP_LOCALLAB_NONENOISE;None +TP_LOCALLAB_NUL_TOOLTIP;. TP_LOCALLAB_OFFS;Offset TP_LOCALLAB_OFFSETWAV;Offset TP_LOCALLAB_OPACOL;Opacity @@ -2859,7 +2870,7 @@ TP_LOCALLAB_TLABEL2;TM Effective Tm=%1 TM=%2 TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize TP_LOCALLAB_TM;Tone Mapping TP_LOCALLAB_TM_MASK;Use transmission map -TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox "Structure mask as tool" checked: in this case a mask showing the structure will be generated after one or more of the 3 curves has been modified.\n Here, the "Structure mask" behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. This option is sensitive to "deltaE image mask" and the associated slider "Scope (deltaE image mask)". +TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox "Structure mask as tool" checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the "Structure mask" behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This parameter affects sensitivity to edges.\n The greater it is the more likely an illumination change is to be considered an "edge".\n If set to zero tone mapping will have an effect similar to unsharp masking. TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Gamma moves the action of tone-mapping to shadows or highlights. TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. @@ -2884,7 +2895,8 @@ TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscis TP_LOCALLAB_USEMASK;Use mask TP_LOCALLAB_VART;Variance (contrast) TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool -TP_LOCALLAB_VIBRA_TOOLTIP;Adjust vibrance (essentially the same as the global adjustment).\nCarry out the equivalent of a white-balance adjustment using a CIECAM algorithm. +//TP_LOCALLAB_VIBRA_TOOLTIP;Adjust vibrance (essentially the same as the global adjustment).\nCarry out the equivalent of a white-balance adjustment using a CIECAM algorithm. +TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool - 3 TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise - 1 @@ -2898,7 +2910,8 @@ TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask - 13 TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. TP_LOCALLAB_WAMASKCOL;Ψ Mask Wavelet level TP_LOCALLAB_WARM;Warm/Cool & Color artifacts -TP_LOCALLAB_WARM_TOOLTIP;This slider use Ciecam algorithm and acts as White Balance, it can warm or cool the area selected.\nIt can also in some cases reduce color artifacts. +//TP_LOCALLAB_WARM_TOOLTIP;This slider use Ciecam algorithm and acts as White Balance, it can warm or cool the area selected.\nIt can also in some cases reduce color artifacts. +TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler\nIt can also reduce color artifacts in some cases. TP_LOCALLAB_WASDEN_TOOLTIP;Denoise luminance for the 3 first levels (fine).\nThe right limit of the curve correspond to coarse : level 3 and beyond TP_LOCALLAB_WAV;Local contrast by level TP_LOCALLAB_WAVBLUR_TOOLTIP;Performs a blur for each level of decomposition, as well as the residual image. diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index 801e6f118..1529d9239 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -3787,7 +3787,19 @@ void LocallabShadow::updateAdviceTooltips(const bool showTooltips) chromaskSH->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); slomaskSH->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); lapmaskSH->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); - + /* + highlights->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + h_tonalwidth->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + shadows->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + s_tonalwidth->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + sh_radius->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + */ + highlights->set_tooltip_text(""); + h_tonalwidth->set_tooltip_text(""); + shadows->set_tooltip_text(""); + s_tonalwidth->set_tooltip_text(""); + sh_radius->set_tooltip_text(""); + } else { exp->set_tooltip_text(""); @@ -3811,6 +3823,11 @@ void LocallabShadow::updateAdviceTooltips(const bool showTooltips) gammaskSH->set_tooltip_text(""); chromaskSH->set_tooltip_text(""); slomaskSH->set_tooltip_text(""); + highlights->set_tooltip_text(""); + h_tonalwidth->set_tooltip_text(""); + shadows->set_tooltip_text(""); + s_tonalwidth->set_tooltip_text(""); + sh_radius->set_tooltip_text(""); } } @@ -4690,6 +4707,25 @@ void LocallabVibrance::updateAdviceTooltips(const bool showTooltips) chromaskvib->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); slomaskvib->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); lapmaskvib->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); +/* + saturated->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + pastels->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + psThreshold->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + protectSkins->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + avoidColorShift->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + pastSatTog->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + sensiv->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + curveEditorGG->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); +*/ + saturated->set_tooltip_text(""); + pastels->set_tooltip_text(""); + psThreshold->set_tooltip_text(""); + protectSkins->set_tooltip_text(""); + avoidColorShift->set_tooltip_text(""); + pastSatTog->set_tooltip_text(""); + sensiv->set_tooltip_text(""); + curveEditorGG->set_tooltip_text(""); + } else { exp->set_tooltip_text(""); warm->set_tooltip_text(""); @@ -4706,6 +4742,14 @@ void LocallabVibrance::updateAdviceTooltips(const bool showTooltips) chromaskvib->set_tooltip_text(""); slomaskvib->set_tooltip_text(""); lapmaskvib->set_tooltip_text(""); + saturated->set_tooltip_text(""); + pastels->set_tooltip_text(""); + psThreshold->set_tooltip_text(""); + protectSkins->set_tooltip_text(""); + avoidColorShift->set_tooltip_text(""); + pastSatTog->set_tooltip_text(""); + sensiv->set_tooltip_text(""); + curveEditorGG->set_tooltip_text(""); } } diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index 27a450a12..0d1bf55a5 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -4637,13 +4637,23 @@ void LocallabLog::updateAdviceTooltips(const bool showTooltips) exp->set_tooltip_text(M("TP_LOCALLAB_LOGENCOD_TOOLTIP")); logPFrame->set_tooltip_text(M("TP_LOCALLAB_LOGFRAME_TOOLTIP")); autocompute->set_tooltip_text(M("TP_LOCALLAB_LOGAUTO_TOOLTIP")); - blackEv->set_tooltip_text(M("TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP")); - whiteEv->set_tooltip_text(M("TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP")); - sourceGray->set_tooltip_text(M("TP_LOCALLAB_LOGSRCGREY_TOOLTIP")); + // blackEv->set_tooltip_text(M("TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP")); + // whiteEv->set_tooltip_text(M("TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP")); + blackEv->set_tooltip_text(""); + whiteEv->set_tooltip_text(""); + sourceGray->set_tooltip_text(""); targetGray->set_tooltip_text(M("TP_LOCALLAB_LOGTARGGREY_TOOLTIP")); baselog->set_tooltip_text(M("TP_LOCALLAB_LOGBASE_TOOLTIP")); strlog->set_tooltip_text(M("TP_LOCALLAB_GRADGEN_TOOLTIP")); anglog->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + + // detail->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + // Autogray->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + // sensilog->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + detail->set_tooltip_text(""); + Autogray->set_tooltip_text(""); + sensilog->set_tooltip_text(""); + fullimage->set_tooltip_text(M("TP_LOCALLAB_FULLIMAGELOG_TOOLTIP")); } else { exp->set_tooltip_text(""); logPFrame->set_tooltip_text(""); @@ -4655,6 +4665,11 @@ void LocallabLog::updateAdviceTooltips(const bool showTooltips) baselog->set_tooltip_text(""); strlog->set_tooltip_text(""); anglog->set_tooltip_text(""); + detail->set_tooltip_text(""); + Autogray->set_tooltip_text(""); + sensilog->set_tooltip_text(""); + fullimage->set_tooltip_text(""); + } } From 5fa327d0937a11f670b91209fd54bb830429b4e4 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 30 Sep 2020 08:13:01 +0200 Subject: [PATCH 124/185] Local adjstments - Change 2 settings tooltip - clean language default --- rtdata/languages/default | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 4410abf50..c0a4d5f16 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2461,15 +2461,12 @@ TP_LOCALLAB_EV_VIS_ALL;Show all TP_LOCALLAB_EXCLUF;Excluding TP_LOCALLAB_EXCLUF_TOOLTIP;Can be used to exclude this part of datas - move Scope to extend color.\n You can apply all settings to this RT-spot. TP_LOCALLAB_EXCLUTYPE;Spot method -//TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in inverted mode TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in inverted mode TP_LOCALLAB_EXECLU;Excluding spot TP_LOCALLAB_EXNORM;Normal spot -//TP_LOCALLAB_EXPCBDL_TOOLTIP;In the case of contaminated sensor (type "grease"), and when the area is important or for a series of small defects.\n\na) Put the selection spot on a pronounced default (adapting its size if necessary), use a large spot enough to allow wavelet; b) choose a wide selection area to cover most of the area affected by the defects; c) Select a transition value (low) and transition decay (high value); d) act on levels 2, 3, 4 or 5 or lower by reducing the contrast (values below 100) and by acting on the chroma slider if necessary. e)possibly act on "scope" to reduce the extent of the action.\n\nYou can also complete with Blur levels and Gaussian blur (Smooth Blur and noise) TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens. TP_LOCALLAB_EXPCHROMA;Chroma compensation TP_LOCALLAB_EXPCHROMA_TOOLTIP;Only in association with exposure compensation and PDE Ipol.\nAvoids desaturation of colors -//TP_LOCALLAB_EXPCOLOR_TOOLTIP;In the case of small defects.\n\nRed-eyes : red-centered circular selector, spot delimiters close to the eye, weak scope, "lightness" -100, "chrominance" -100.\n\nSpotIR :Circular selector centered on the defect, spot delimiters close to the default - reduce "chrominance", possibly act on "scope" to reduce the extent of the action.\n\nDust - grease (small) :Circular selector centered on the defect (adapt the size of the spot), spot delimiters not too close to the defect to allow an inconspicuous transition. a) "Transition" (low values) and "Transition weak" (high values); b) act on "lightness" and possibly on "chrominance" or "Color correction grid - direct" to approach the rendering of the polluted zone to that of the healthy zone; c) act moderately on "scope" to modulate the desired action.\n\nYou can also complete with Gaussian blur (Smooth Blur and noise) TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ TP_LOCALLAB_EXPCOMPINV;Exposure compensation @@ -2521,7 +2518,6 @@ TP_LOCALLAB_GAMSH;Gamma TP_LOCALLAB_GRADANG;Gradient angle TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees : -180 0 +180 TP_LOCALLAB_GRADFRA;Graduated Filter Mask -//TP_LOCALLAB_GRADGEN_TOOLTIP;Graduated filter is supplied with Color and Light & merge file, Exposure & mask, Shadows Highlight, Vibrance, Log Encoding.\n\nVibrance, Color and Light & merge file, are provided with GF luminance, chrominance, Hue.\nFeather is located in settings. TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance TP_LOCALLAB_GRADSTR;Gradient strength @@ -2547,7 +2543,6 @@ TP_LOCALLAB_HLH;Curves H TP_LOCALLAB_IND;Independent (mouse) TP_LOCALLAB_INDSL;Independent (mouse + sliders) TP_LOCALLAB_INVERS;Inverse -//TP_LOCALLAB_INVERS_TOOLTIP;If selected (inverse) less possibilities.\n\nAlternative\nFirst Spot:\n full image - delimiter outside preview\n Shape RT-spot area : rectangle. Transition 100\n\nSecond spot : Excluding spot TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n full image - delimiter outside preview\n RT-spot shape: rectangle. Transition 100\n\nSecond spot : Excluding spot TP_LOCALLAB_ISOGR;Coarseness (ISO) TP_LOCALLAB_LABBLURM;Blur Mask @@ -2588,23 +2583,15 @@ TP_LOCALLAB_LOC_CONTRASTPYRLAB;Graduated Filter - Edge Sharpness - Blur TP_LOCALLAB_LOC_RESIDPYR;Residual Image (Main) TP_LOCALLAB_LOG;Log Encoding TP_LOCALLAB_LOGAUTO;Automatic -//TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will bring an evaluation of dynamic range and Source Gray point (if "Automatic" Source gray enabled).\nTo be able to touch up the automatic values, press the button again TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and Source Gray Point (if "Automatic Source Gray Point” enabled).\nPress the button again to adjust the automatically calculated values. -//TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm, the shadows are darker, the highlights are brighter.\nValues greater than 2 change the action of the algorithm, the shadows are grayer the highlights are more washed out TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. -//TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of Dynamic Range - Black Ev and White Ev TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of Dynamic Range i.e. Black Ev and White Ev -//TP_LOCALLAB_LOGENCOD_TOOLTIP;Allows Tone Mapping with Logarithm encoding (ACES).\nUsefull for underexposed pictures, or with high dynamic range.\n\nTwo steps in the process : 1) Calculate Dynamic Range 2) User adaptation TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process : 1) Dynamic Range calculation 2) Manual adjustment TP_LOCALLAB_LOGFRA;Source Gray Point -//TP_LOCALLAB_LOGFRAME_TOOLTIP;Calculate or use Exposure levels of the image early in the process:\n Black Ev, White Ev and Source Gray point.\n Take into account main exposure compensation. TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the Source Gray Point for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\n Takes into account exposure compensation in the main-menu Exposure tab. -//Allows you to calculate and adjust Ev levels for the entire image. The resulting values will be used by all Lab operations and most RGB operations in the pipeline:\n Black Ev, White Ev and Source Gray Point.\n Takes into account exposure compensation in main-menu Exposure tab. TP_LOCALLAB_LOGLIN;Logarithm mode TP_LOCALLAB_LOGPFRA;Relative Exposure Levels -//TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estimated gray point value of the image, early in the process TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estimated gray point value of the image. -//TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can change this value to adapt it to your taste. TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can adjust this value to suit. TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 TP_LOCALLAB_LUM;Curves LL - CC @@ -2618,13 +2605,12 @@ TP_LOCALLAB_MASKCOM;Common Color Mask TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. //These masks works as all tools, they take into account scope color.\nThey are different from others masks which complete a tool (Color and Light, Exposure...) TP_LOCALLAB_MASFRAME;Mask and Merge -TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the deltaE image to avoid modifying the selection area when the following sliders are used: gamma mask, slope mask, chroma mask and curve contrast , level contrasts, and mask blur, structure (if tool enabled ) .\nDisabled when Inverse mode is used +TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the deltaE image to avoid modifying the selection area when the following Mask Tools are used: Gamma , Slope , Chroma, Contrast curve , Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ) .\nDisabled when Inverse mode is used TP_LOCALLAB_MASK;Mask TP_LOCALLAB_MASK2;Contrast curve TP_LOCALLAB_MASKCOL;Mask Curves TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection TP_LOCALLAB_MASKH;Hue curve -//TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a single tool, this requires activating another tool (but without using the tool : sliders to 0,...) where is the mask you want to activate.\n\nYou can also duplicate the RT-spot and place it right next to each other,variations of references allow fine work on images. TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ) \n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. TP_LOCALLAB_MED;Medium TP_LOCALLAB_MEDIAN;Median Low @@ -2676,7 +2662,6 @@ TP_LOCALLAB_MRFOU;Previous Spot TP_LOCALLAB_MRONE;None TP_LOCALLAB_MRTHR;Original Image TP_LOCALLAB_MRTWO;Short Curves 'L' Mask -//TP_LOCALLAB_MULTIPL_TOOLTIP;Allows the retouching of tones over a very wide range : -18EV +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts light tones up to 4EV TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV TP_LOCALLAB_NEIGH;Radius TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) @@ -2776,7 +2761,7 @@ TP_LOCALLAB_SHAMASKCOL;Shadows TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm TP_LOCALLAB_SHAPETYPE;RT-spot shape -TP_LOCALLAB_SHAPE_TOOLTIP;Elipse is normal mode.\nRectangle can be used in some cases, for example to work in full image in conjonction with delimiters outside preview, transition = 100.\n\nPolygone - Beziers are waiting for GUI... +TP_LOCALLAB_SHAPE_TOOLTIP;”Ellipse” is the normal mode.\n “Rectangle” can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. TP_LOCALLAB_SHARAMOUNT;Amount TP_LOCALLAB_SHARBLUR;Blur radius TP_LOCALLAB_SHARDAMPING;Damping @@ -2826,7 +2811,6 @@ TP_LOCALLAB_SLOMASK_TOOLTIP;Gamma and Slope allow a soft and artifact-free trans TP_LOCALLAB_SLOSH;Slope TP_LOCALLAB_SOFT;Soft Light & Original Retinex TP_LOCALLAB_SOFTM;Soft Light -//TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Original Retinex is very different from others Retinex method.\nIts acts on grey and balance luminance.\nIt is an emulation of "Dodge" and "Burn" TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. TP_LOCALLAB_SOFTRADIUSCOL;Soft radius TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. @@ -2851,7 +2835,6 @@ TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\ni TP_LOCALLAB_STRUC;Structure TP_LOCALLAB_STRUCCOL;Spot Structure TP_LOCALLAB_STRUCCOL1;Spot Structure -//TP_LOCALLAB_STRUCT_TOOLTIP;Use Sobel algorithm to take into account structure in shape detection.\nyou can have a preview by activating "mask and modifications - Show spot structure".\n\nCan be used in conjunction with masks (advanced) structure, blur, wavelet to improve edge detection.\n\nNeeds maskless adjustments to be activated (lightness, exposure...) TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate "Mask and modifications” > “Show spot structure" (advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and “Local contrast (by wavelet level)” to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either ‘Show modified image” or “Show modifications with mask ”. TP_LOCALLAB_STRUMASKCOL;Structure mask strength TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox "Structure mask as tool" unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask 1 (Blur and denoise") and mask 7 (Color & Light). @@ -2875,7 +2858,6 @@ TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This parameter affects sensitivity to edges.\n TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Gamma moves the action of tone-mapping to shadows or highlights. TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main menu tool must be de-activated if this tool is used. -//Tone Mapping - main menu must be disabled TP_LOCALLAB_TONEMASCALE_TOOLTIP;This control gives meaning to the difference between "local" and "global" contrast.\nThe greater it is the larger a detail needs to be in order to be boosted TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 TP_LOCALLAB_TOOLCOL;Structure mask as tool @@ -2886,7 +2868,6 @@ TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition TP_LOCALLAB_TRANSITVALUE;Transition value TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) -//TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light) TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light) TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas, as a percentage of the "radius" TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain @@ -2895,7 +2876,6 @@ TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscis TP_LOCALLAB_USEMASK;Use mask TP_LOCALLAB_VART;Variance (contrast) TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool -//TP_LOCALLAB_VIBRA_TOOLTIP;Adjust vibrance (essentially the same as the global adjustment).\nCarry out the equivalent of a white-balance adjustment using a CIECAM algorithm. TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool - 3 TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 @@ -2910,7 +2890,6 @@ TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask - 13 TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. TP_LOCALLAB_WAMASKCOL;Ψ Mask Wavelet level TP_LOCALLAB_WARM;Warm/Cool & Color artifacts -//TP_LOCALLAB_WARM_TOOLTIP;This slider use Ciecam algorithm and acts as White Balance, it can warm or cool the area selected.\nIt can also in some cases reduce color artifacts. TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler\nIt can also reduce color artifacts in some cases. TP_LOCALLAB_WASDEN_TOOLTIP;Denoise luminance for the 3 first levels (fine).\nThe right limit of the curve correspond to coarse : level 3 and beyond TP_LOCALLAB_WAV;Local contrast by level From f7a3abc9a9c6762fab98ed1ccef674683d7e2ca8 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 2 Oct 2020 13:16:28 +0200 Subject: [PATCH 125/185] Local adjustments - Labels tooltip DR exposure - Common mask - softlight or.retinex - french (#5924) * Suppress BENCHFUN iplocallab - new tooltips for Exposure - common mask - original retinex * Change tooltip original retinex * Others Change tooltip Laplacian * Change labels french * Others change settings original-retinex DR exposure * Change GUI for Contrast attenator --- rtdata/languages/Francais | 59 +++++++++++++++++++-------------------- rtdata/languages/default | 50 +++++++++++++++------------------ rtengine/iplocallab.cc | 42 +++++++++++++++------------- rtgui/locallabtools.cc | 5 +++- rtgui/locallabtools.h | 1 + 5 files changed, 79 insertions(+), 78 deletions(-) diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 1483d7cc5..540f6c87a 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -1782,17 +1782,17 @@ TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - direct floute et bruite avec tous les rég TP_LOCALLAB_BLNOI_EXP;Flouter & Bruit TP_LOCALLAB_BLNORM;Normal TP_LOCALLAB_BLSYM;Symétrique -TP_LOCALLAB_BLUFR;Adoucir - Flouter - Grain - Debruiter +TP_LOCALLAB_BLUFR;Flouter - Grain - Debruiter TP_LOCALLAB_BLUMETHOD_TOOLTIP;Pour flouter l'arrère plan et isoler le premier plan:\n*Flouter l'arrière plan avec un RT-spot couvrant totalement l'image (valeurs élevées Etendue et transition) - normal ou inverse.\n*Isoler le premier plan avec un ou plusieurs RT-spot Exclusion avec l'outils que vous voulez (accroître Etendue).\n\nCe module peut être utilisé en réduction de bruit additionnelle,incluant un "median" et un "Filtre Guidé" TP_LOCALLAB_BLUR;Flou Gaussien - Bruit - Grain TP_LOCALLAB_BLURCBDL;Flouter niveaux 0-1-2-3-4 -TP_LOCALLAB_BLURCOL;Rayon floutage masque +TP_LOCALLAB_BLURCOL;Rayon floutage TP_LOCALLAB_BLURDE;Flouter la détection de forme TP_LOCALLAB_BLURLC;Luminance seulement TP_LOCALLAB_BLURLEVELFRA;Flouter niveaux TP_LOCALLAB_BLURMASK_TOOLTIP;Génère un masque flou, prend en compte la structure avec le curseur de seuil de contraste du Masque flou. TP_LOCALLAB_BLURRESIDFRA;Flouter image Résiduelle -TP_LOCALLAB_BLUR_TOOLNAME;Adoucir Flouter Grain & Réduction du Bruit - 1 +TP_LOCALLAB_BLUR_TOOLNAME;Flouter/Grain & Réduction du Bruit - 1 TP_LOCALLAB_BLWH;Tous les changements forcés en noir et blanc TP_LOCALLAB_BLWH_TOOLTIP;Force le changement de la composante "a" et "b" à zéro.\nUtile quand l'utilisateur choisit un processus noir et blanc, ou un film. TP_LOCALLAB_BUTTON_ADD;Ajouter @@ -1804,7 +1804,7 @@ TP_LOCALLAB_CBDL;Contraste niveaux détail TP_LOCALLAB_CBDLCLARI_TOOLTIP;Ajuste les tons moyens et les réhausse. TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Agit comme un outil ondelettes.\nLe premier niveau (0) agit sur des détails de 2x2.\nLe dernier niveau (5) agit sur des détails de 64x64. TP_LOCALLAB_CBDL_THRES_TOOLTIP;Empêche d'augmenter le bruit -TP_LOCALLAB_CBDL_TOOLNAME;Contraste par niveaux de détails(Défauts) - 2 +TP_LOCALLAB_CBDL_TOOLNAME;Contraste par niveaux de détails - 2 TP_LOCALLAB_CENTER_X;Centre X TP_LOCALLAB_CENTER_Y;Centre Y TP_LOCALLAB_CH;Courbes CL - LC @@ -1814,7 +1814,7 @@ TP_LOCALLAB_CHROMABLU_TOOLTIP;Agit comme un amplificateur-reducteur d'action en TP_LOCALLAB_CHROMACBDL;Chroma TP_LOCALLAB_CHROMACB_TOOLTIP;Agit comme un amplificateur-reducteur d'action en comparant aux curseurs de luminance.\nEn dessous de 100 reduit, au dessus de 100 amplifie TP_LOCALLAB_CHROMALEV;Niveaux de Chroma -TP_LOCALLAB_CHROMASKCOL;Masque Chroma +TP_LOCALLAB_CHROMASKCOL;Chroma TP_LOCALLAB_CHROMASK_TOOLTIP;Vous pouvez utiliser ce curseur pour désaturer l'arrière plan (inverse masque - courbe proche de 0).\nEgalement pour atténier ou accroître l'action du masque sur la chroma TP_LOCALLAB_CHRRT;Chroma TP_LOCALLAB_CIRCRADIUS;Taille Spot @@ -1833,7 +1833,7 @@ TP_LOCALLAB_COLORDEPREV_TOOLTIP;Bouton Prévisualisation ΔE a besoin qu'un seul TP_LOCALLAB_COLORDE_TOOLTIP;Affiche la prévisualisation ΔE en bleu si négatif et en vert si positif.\n\nMasque et modifications (montre modifications sans masque): montre les modifications réelles si positf, montre les modifications améliorées (luminance seule) en bleu et jaune si négatif. TP_LOCALLAB_COLORSCOPE;Etendue Outils Couleur TP_LOCALLAB_COLORSCOPE_TOOLTIP;Utilise une étendue commune pour Couleur et lumière, Ombres Lumières, Vibrance.\nLes autres outils ont leur étendue spécifique. -TP_LOCALLAB_COLOR_TOOLNAME;Couleur&Lumière (Défauts) - 11 +TP_LOCALLAB_COLOR_TOOLNAME;Couleur & Lumière - 11 TP_LOCALLAB_COL_NAME;Nom TP_LOCALLAB_COL_VIS;Statut TP_LOCALLAB_COMPFRA;Niveaux Contraste directionnel @@ -1922,14 +1922,13 @@ TP_LOCALLAB_EXPLAP_TOOLTIP;Plus vous agissez sur ce curseur de seuil, plus grand TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Autorise de nombreuses possibilités de fusionner les images (comme les calques dans Photosshop) : difference, multiply, soft light, overlay...avec opacité...\nOriginale Image : fusionne le RT-spot en cours avec Originale.\nSpot Précédent : fusionne le RT-spot en cours avec le précédent - si il n'y a qu'un spot précédent = original.\nArrière plan : fusionne le RT-spot en cours avec la couleur et la luminance de l'arrière plan (moins de possibilités) TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : utilise un algorithme similaire à Exposure principal mais en L*a*b* et en prenant en compte le deltaE.\n\nCompression dynamique et atténuateur de contraste : utilise un autre algorithme aussi avec deltaE et avec l'équation de Poisson pour résoudre le Laplacien dans l'espace de Fourier.\nAtténuateur, Compression dynamqiue et Standard peuvent être combinés.\nFFTW La transformée de Fourier est optimisée en taille pour réduire les temps de traitement.\nRéduit les artéfacts et le bruit. TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applique un median avant la transformée de Laplace pour éviter les artéfacts (bruit).\nVous pouvez aussi utiliser l'outil "Réduction du bruit". -TP_LOCALLAB_EXPOSE;Compression dynamique - Exposition -//TP_LOCALLAB_EXPOSURE_TOOLTIP;Dans certains cases (fortes ombres ..) vous pouvez utiliser le module "Shadows Highlights", "Tone equalizer", "TRC", "Encoding Log"... +TP_LOCALLAB_EXPOSE;Compression dynamique & Exposition TP_LOCALLAB_EXPOSURE_TOOLTIP;Modifie l'exposition dans l'espace L*a*b* en utilisant un Laplacien et les algorithmes PDE en prenant en compte dE, minimise les artéfacts. TP_LOCALLAB_EXPRETITOOLS;Outils Retinex avancés TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUtiliser de basses valeurs de transition et de hautes valeurs de transition affaiblissement et Etendue pour simuler un petit RT-spot. TP_LOCALLAB_EXPTOOL;Outils exposition TP_LOCALLAB_EXPTRC;Courbe de réponse Tonale - TRC -TP_LOCALLAB_EXP_TOOLNAME;Atténuation Contraste -Compression Dynamique & Exposition- 10 +TP_LOCALLAB_EXP_TOOLNAME;Compression Dynamique & Exposition- 10 TP_LOCALLAB_FATAMOUNT;Quantité TP_LOCALLAB_FATANCHOR;Ancre TP_LOCALLAB_FATANCHORA;Décalage @@ -1949,7 +1948,7 @@ TP_LOCALLAB_FULLIMAGE;Calcule les valeurs Noir Ev - Blanc Ev - sur l'image enti TP_LOCALLAB_GAM;Gamma TP_LOCALLAB_GAMFRA;Courbe Réponse Tonale (TRC) TP_LOCALLAB_GAMM;Gamma -TP_LOCALLAB_GAMMASKCOL;Gamma masque +TP_LOCALLAB_GAMMASKCOL;Gamma TP_LOCALLAB_GAMSH;Gamma TP_LOCALLAB_GRADANG;Angle du Gradient TP_LOCALLAB_GRADANG_TOOLTIP;Angle de Rotation en degrés : -180 0 +180 @@ -1989,11 +1988,11 @@ TP_LOCALLAB_LABSTRUM;Masque Structure TP_LOCALLAB_LAPLACC;ΔØ Masque Laplacien résoud PDE TP_LOCALLAB_LAPLACE;Laplacien seuil ΔE TP_LOCALLAB_LAPLACEXP;Laplacien seuil -TP_LOCALLAB_LAPMASKCOL;Laplacien seuil masque +TP_LOCALLAB_LAPMASKCOL;Laplacien seuil TP_LOCALLAB_LAPRAD_TOOLTIP;Eviter d'utiliser Radius and Laplace Seuil en même temps.\nLaplacien seuil reduit le contraste, artéfacts, adoucit le résultat. TP_LOCALLAB_LAP_MASK_TOOLTIP;Résoud PDE (Equation aux dérivées partielles) pour tous les masques Laplacien.\nSi activé Laplacien masque seuil reduit les artéfacts et adoucit les résultats.\nSi désactivé réponse linaire. TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT améliore la qualité et autorise de grands rayons, mais accroît les temps de traitement.\nCe temps dépends de la surface devant être traitée.\nA utiliser de préférences pour de grands rayons.\n\nLes Dimensions peuvent être réduites de quelques pixels pour optimiser FFTW.\nCette optimisation peut réduire le temps de traitement d'un facteur de 1.5 à 10.\n -TP_LOCALLAB_LC_TOOLNAME;Constrast Local & Ondelettes (Défauts) - 7 +TP_LOCALLAB_LC_TOOLNAME;Constraste Local & Ondelettes - 7 TP_LOCALLAB_LEVELBLUR;Maximum Flouter TP_LOCALLAB_LEVELLOCCONTRAST_TOOLTIP;En abscisse le contraste local (proche du concept de luminance). En ordonnée, amplification ou reduction du contraste local. TP_LOCALLAB_LEVELWAV;Ψ Ondelettes Niveaux @@ -2008,7 +2007,7 @@ TP_LOCALLAB_LIST_TOOLTIP;Vous pouvez choisir 3 niveaux de complexité pour chaqu TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Donne priorité à l'action sur les tons moyens et hautes lumières en choisissant les niveaux concernés d'ondelettes TP_LOCALLAB_LMASK_LL_TOOLTIP;Give priority to action on midtones and high lights TP_LOCALLAB_LOCCONT;Masque Flou -TP_LOCALLAB_LOC_CONTRAST;Contraste Local-Ondelettes-déf. +TP_LOCALLAB_LOC_CONTRAST;Contraste Local & Ondelettes TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pyramide 1: TP_LOCALLAB_LOC_CONTRASTPYR2;Ψ Pyramide 2: TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contr. par niveaux- Tone Mapping - Cont.Dir. @@ -2031,16 +2030,16 @@ TP_LOCALLAB_LUM;Courbes LL - CC TP_LOCALLAB_LUMADARKEST;Plus Sombre TP_LOCALLAB_LUMASK;Maqsue Luminance arrière plan TP_LOCALLAB_LUMASK_TOOLTIP;Ajuste le gris de l'arrière plan du masque dans Montrer Masque (Masque et modifications) -TP_LOCALLAB_LUMAWHITESEST;Plus blanc -TP_LOCALLAB_LUMONLY;Luminance seulemnt +TP_LOCALLAB_LUMAWHITESEST;Plus clair +TP_LOCALLAB_LUMONLY;Luminance seulement TP_LOCALLAB_MASKCOM;Masque couleur Commun TP_LOCALLAB_MASKCOM_TOOLTIP;Ces masques travaillent comme les autres outils, ils prennet en compte Etendue.\nIls sont différents des autres masques qui complètent un outil (Couleur et Lumière, Exposition...) TP_LOCALLAB_MASFRAME;Masque et Fusion TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and curves contrast , levels contrasts, and mask blur, structure(if enabled tool) are used.\nDisabled in Inverse TP_LOCALLAB_MASK;Masque -TP_LOCALLAB_MASK2;Courbe de Contraste masque +TP_LOCALLAB_MASK2;Courbe de Contraste TP_LOCALLAB_MASKCOL;Masque Courbes -TP_LOCALLAB_MASKH;Courbe teinte masque +TP_LOCALLAB_MASKH;Courbe teinte TP_LOCALLAB_MASK_TOOLTIP;Vous pouvez activer plusieurs masques pour un simple outil, ceci nécessite d'activer un autre outil (mais sans utilser l'outil : curseurs à 0,...)où est le masque que vous souhaitez activer.\n\nVous pouvez aussi dupliquer le RT-spot et le placer juste à côté de l'autre,les variations de références autorisent un travail fin sur les images. TP_LOCALLAB_MED;Medium TP_LOCALLAB_MEDIAN;Median Bas @@ -2070,7 +2069,7 @@ TP_LOCALLAB_MERLUM;Luminosité TP_LOCALLAB_MERNIN;Ecran TP_LOCALLAB_MERONE;Normal TP_LOCALLAB_MERSAT;Saturation -TP_LOCALLAB_MERSEV;Soft Light Photshop +TP_LOCALLAB_MERSEV;Soft Light (legacy) TP_LOCALLAB_MERSEV0;Soft Light Illusion TP_LOCALLAB_MERSEV1;Soft Light W3C TP_LOCALLAB_MERSEV2;Lumière dure @@ -2123,7 +2122,7 @@ TP_LOCALLAB_QUALCURV_METHOD;Types de Courbes TP_LOCALLAB_QUAL_METHOD;Qualité globale TP_LOCALLAB_RADIUS;Rayon TP_LOCALLAB_RADIUS_TOOLTIP;Above Radius 30 Use Fast Fourier Transform -TP_LOCALLAB_RADMASKCOL;Rayon adoucir Masque +TP_LOCALLAB_RADMASKCOL;Rayon adoucir TP_LOCALLAB_RECT;Rectangle TP_LOCALLAB_RECURS;Réferences Récursives TP_LOCALLAB_RECURS_TOOLTIP;Recalcule les références pour teinte, luma, chroma après chaque module et après chaque RT-spot.\nAussi utile pour le travail avec les masques. @@ -2182,7 +2181,7 @@ TP_LOCALLAB_SHADEX;Ombres TP_LOCALLAB_SHADEXCOMP;Compression ombres & profondeur tonale TP_LOCALLAB_SHADHIGH;Ombres/Lumières - Egaliseur tonal TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Peut être utilisé - ou en complement - du module Exposition dans les cas difficiles.\nUtiliser réduction du bruit Denoise peut être nécessaire : éclaicir les ombres.\n\nPeut être utilisé comme un filtre gradué (augmenter Etendue) -TP_LOCALLAB_SHAMASKCOL;masque ombres +TP_LOCALLAB_SHAMASKCOL;Ombres TP_LOCALLAB_SHAPETYPE;Forme aire RT-spot TP_LOCALLAB_SHAPE_TOOLTIP;Ellipse est le mode normal.\nRectangle peut être utilé dans certains cas, par exemple pour travailler en image complète en conjonction avec les délimiteurs en dehors de la prévisualisation, transition = 100.\n\nPolygone - Beziers sont en attente de GUI... TP_LOCALLAB_SHARAMOUNT;Quantité @@ -2210,7 +2209,7 @@ TP_LOCALLAB_SHOWMASKTYP1;Flouter & Bruit TP_LOCALLAB_SHOWMASKTYP2;Réduction du bruit TP_LOCALLAB_SHOWMASKTYP3;Flouter & Bruit + De-bruite TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Masque et modifications peuvent être choisis.\nFlouter et bruit: dans ce cas il n'est pas utilisé pour 'Réduction du bruit'.\nRéduction du bruit : dans ce cas il n'est pas utilisé pour 'flouter et bruit'.\n\nFlouter et bruit + Réduction du bruit : le masque est partagé, faire attention à 'montrer modifications' et 'Etendue' -TP_LOCALLAB_SHOWMNONE;Rien +TP_LOCALLAB_SHOWMNONE;Montrer image modifiée TP_LOCALLAB_SHOWMODIF;Montrer modifications sans masque TP_LOCALLAB_SHOWMODIFMASK;Montrer modifications avec masque TP_LOCALLAB_SHOWNORMAL;Normalise luminance (non) @@ -2225,10 +2224,10 @@ TP_LOCALLAB_SHOWT;Masque et modifications TP_LOCALLAB_SHOWVI;Masque et modifications TP_LOCALLAB_SHRESFRA;Ombres/Lumières TP_LOCALLAB_SHTRC_TOOLTIP;Modifie les tons de l'image en agissant sur la TRC (Tone Response Curve).\nGamma agit principalement sur les tons lumineux.\nSlope (pente) agit principalement sur les tons sombres. -TP_LOCALLAB_SH_TOOLNAME;Ombres-lumières & Egaliser tonal - 5 +TP_LOCALLAB_SH_TOOLNAME;Ombres/lumières & Egaliseur tonal - 5 TP_LOCALLAB_SIGMAWAV;Atténuation Réponse TP_LOCALLAB_SIM;Simple -TP_LOCALLAB_SLOMASKCOL;Pente (slope) masque +TP_LOCALLAB_SLOMASKCOL;Pente (slope) TP_LOCALLAB_SLOSH;Pente TP_LOCALLAB_SOFT;Lumière douce - Original Retinex TP_LOCALLAB_SOFTM;Lumière douce (soft light) @@ -2254,9 +2253,9 @@ TP_LOCALLAB_STRGRID;Force TP_LOCALLAB_STRRETI_TOOLTIP;Si force Retinex < 0.2 seul Dehaze est activé.\nSi force Retinex >= 0.1 Dehaze est en mode luminance. TP_LOCALLAB_STRUC;Structure TP_LOCALLAB_STRUCCOL;Structure -TP_LOCALLAB_STRUCCOL1;Spot Structure +TP_LOCALLAB_STRUCCOL1;Spot structure TP_LOCALLAB_STRUCT_TOOLTIP;Utilise l'algorithme de Sobel pour prendre en compte la structure dans la détection de forme.\nvous pouvez prévisualiser avec "masque et modifications - Montrer structure spot".\n\nPeut être utilisé avec masques (avancé) structure, flouter, ondelettes pour améliorer la détection de bords.\n\nA besoin de réglages sans-masque pour êtrre activé (luminosité, exposition...) -TP_LOCALLAB_STRUMASKCOL;Structure masque force +TP_LOCALLAB_STRUMASKCOL;Structure force TP_LOCALLAB_STRUMASK_TOOLTIP;Génère un masque structure qui va différencier les aplats et reliefs.\nSi structure masque comme outil est activé, ce masque est untilisé en plus des autres outils (gamma, slope, courbe contraste ...) TP_LOCALLAB_STYPE;Forme méthode TP_LOCALLAB_STYPE_TOOLTIP;Vous pouvez choisir entre:\nSymétrique - gauche et droite sont liés, haut et bas sont liés.\nIndépendent - toutes les saisies sont indépendantes. @@ -2279,7 +2278,7 @@ TP_LOCALLAB_TONEMAP_TOOLTIP;Compression tonal - menu principal doit être désac TP_LOCALLAB_TONEMASCALE_TOOLTIP;Ce contrôle donne le pouvoir de différencier le contraste "local" et "global".\nPlus il est important, plus un détail sera accentué. TP_LOCALLAB_TONE_TOOLNAME;Compression tonale - 4 TP_LOCALLAB_TOOLCOL;Masque Structure comme outil -TP_LOCALLAB_TOOLMASK;Outils +TP_LOCALLAB_TOOLMASK;Outils du masque TP_LOCALLAB_TRANSIT;Transition - Gradient TP_LOCALLAB_TRANSITGRAD;Transition différentiation XY TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Change la transition des abscisses vers les ordonnées @@ -2295,16 +2294,16 @@ TP_LOCALLAB_VART;Variance (contraste) TP_LOCALLAB_VIBRANCE;Vibrance - Chaud & Froid TP_LOCALLAB_VIB_TOOLNAME;Vibrance - Chaud & Froid - 3 TP_LOCALLAB_SOFT_TOOLNAME;Lumière douce & Original Retinex - 6 -TP_LOCALLAB_BLUR_TOOLNAME;Adoucir Flouter Grain & De-bruite - 1 +TP_LOCALLAB_BLUR_TOOLNAME;Flouter/Grain & Réduction du bruit - 1 TP_LOCALLAB_TONE_TOOLNAME;Compression tonale - 4 TP_LOCALLAB_RET_TOOLNAME;De-brume & Retinex - 9 TP_LOCALLAB_SHARP_TOOLNAME;Netteté - 8 TP_LOCALLAB_LC_TOOLNAME;Constraste local & Ondelettes (Défauts) - 7 -TP_LOCALLAB_CBDL_TOOLNAME;Contraste par Niveau détail (Défauts) - 2 +TP_LOCALLAB_CBDL_TOOLNAME;Contraste par Niveau détail - 2 TP_LOCALLAB_LOG_TOOLNAME;Codage log - 0 TP_LOCALLAB_MASKCOM_TOOLNAME;Masque Commun Couleur - 13 TP_LOCALLAB_VIS_TOOLTIP;Click pour montrer/cacher le Spot sélectionné.\nCtrl+click pour montrer/cacher tous les Spot. -TP_LOCALLAB_WAMASKCOL;Ψ Masque Niveau Ondelettes +TP_LOCALLAB_WAMASKCOL;Ψ Niveau Ondelettes TP_LOCALLAB_WARM;Chaud - Froid & Artefacts de couleur TP_LOCALLAB_WARM_TOOLTIP;Ce curseur utilise l'algorithme Ciecam et agit comme une Balance des blancs, il prut réchauffer ou refroidir cool la zone concernée.\nIl peut aussi dans certains réduire les artefacts colorés. TP_LOCALLAB_WASDEN_TOOLTIP;De-bruite luminance pour les 3 premiers niveaux (fin).\nLa limite droite de la courbe correspond à gros : niveau 3 et au delà. @@ -2324,7 +2323,7 @@ TP_LOCALLAB_WAVGRAD_TOOLTIP;Filtre gradué pour Contraste local "luminance" TP_LOCALLAB_WAVHIGH;Ψ Ondelette haut TP_LOCALLAB_WAVLEV;Flouter par niveau TP_LOCALLAB_WAVLOW;Ψ Ondelette bas -TP_LOCALLAB_WAVMASK;Ψ Masque Niveau contraste local +TP_LOCALLAB_WAVMASK;Ψ Niveau contraste local TP_LOCALLAB_WAVMASK_TOOLTIP;Autorise un travail fin sur les masques niveaux de contraste (structure) TP_LOCALLAB_WAVMED;Ψ Ondelette normal TP_LOCALLAB_WEDIANHI;Median Haut diff --git a/rtdata/languages/default b/rtdata/languages/default index c0a4d5f16..7f6a3bf6a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2459,36 +2459,35 @@ TP_LOCALLAB_EV_NVIS_ALL;Hide all TP_LOCALLAB_EV_VIS;Show TP_LOCALLAB_EV_VIS_ALL;Show all TP_LOCALLAB_EXCLUF;Excluding -TP_LOCALLAB_EXCLUF_TOOLTIP;Can be used to exclude this part of datas - move Scope to extend color.\n You can apply all settings to this RT-spot. +TP_LOCALLAB_EXCLUF_TOOLTIP;‘Excluding’ mode prevents adjacent spots from influencing certain parts of the image. Adjusting ‘Scope’ will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. TP_LOCALLAB_EXCLUTYPE;Spot method -TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in inverted mode +TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode TP_LOCALLAB_EXECLU;Excluding spot TP_LOCALLAB_EXNORM;Normal spot TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens. TP_LOCALLAB_EXPCHROMA;Chroma compensation -TP_LOCALLAB_EXPCHROMA_TOOLTIP;Only in association with exposure compensation and PDE Ipol.\nAvoids desaturation of colors +TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with ‘Exposure compensation f’ and ‘Contrast Attenuator f’ to avoid desaturating colors. TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ TP_LOCALLAB_EXPCOMPINV;Exposure compensation -TP_LOCALLAB_EXPCOMP_TOOLTIP;For portrait or images with low color gradient, you can change "Shape detection" in "settings":\n\nIncrease 'Threshold ΔE scope'\nReduce 'ΔE decay'\nIncrease 'Balance ΔE ab-L' +TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change "Shape detection" in "Settings":\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)’ TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation of wavelet levels.\nHowever there are some differences: more tools and closer to the details.\nEx: Tone mapping for wavelet levels. TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small(< 32x32 pixels).\nUse low transition values and high decay transition values and scope to simulate small RT-spot and deal wth defects.\nUse if necessary the module 'Clarity & Sharp mask and Blend images' by adjusting 'Soft radius' to reduce artifacts. TP_LOCALLAB_EXPCURV;Curves TP_LOCALLAB_EXPGRAD;Graduated Filter TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and "Merge file") Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. -TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Balances the action between the original image and the Laplace transform. -TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Apply a gamma before and after Laplace transform -TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Add linear exposure component before application Laplace transform -TP_LOCALLAB_EXPLAP_TOOLTIP;The more you act on this threshold slider, the greater the action of reducing contrast. +TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend +TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform +TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform +TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control\nOriginal Image : merge current RT-spot with Original.\nPrevious spot : merge current Rt-spot with previous - if there is only one spot previous = original.\nBackground : merge current RT-spot with a color and luminance background (fewer possibilties) TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : use an algorithm similar as main Exposure but in L*a*b* and taking account of deltaE.\n\nContrast attenuator : use another algorithm also with deltaE and with Poisson equation to solve Laplacian in Fourier space.\nContrast attenuator, Dynamic range compression and Standard can be combined.\nFFTW Fourier Transform is optimized in size to reduce processing time.\nReduce artifacts and noise. -TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Apply a median before Laplace transform to prevent artifacts (noise).\nYou can also use "Denoise" tool. +TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the "Denoise" tool. TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure -//TP_LOCALLAB_EXPOSURE_TOOLTIP;In some cases (strong shadows ..) you can use others modules "Shadows Highlights", "Tone equalizer", "TRC", "Log Encoding"... TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high decay transition values and scope to simulate small RT-spot. -TP_LOCALLAB_EXPTOOL;Exposure tools +TP_LOCALLAB_EXPTOOL;Exposure Tools TP_LOCALLAB_EXPTRC;Tone Response Curve - TRC TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure - 10 TP_LOCALLAB_FATAMOUNT;Amount @@ -2496,7 +2495,7 @@ TP_LOCALLAB_FATANCHOR;Anchor TP_LOCALLAB_FATANCHORA;Offset TP_LOCALLAB_FATDETAIL;Detail TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ -TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal - use Fattal Tone mapping algorithm. +TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. TP_LOCALLAB_FATLEVEL;Sigma TP_LOCALLAB_FATRES;Amount Residual Image TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ @@ -2556,8 +2555,7 @@ TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE TP_LOCALLAB_LAPLACEXP;Laplacian threshold TP_LOCALLAB_LAPMASKCOL;Laplacian threshold TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using “Smooth radius” and “Laplacian threshold” (advanced) together.\nSmooth radius uses a guided filter to decrease artifacts and smooth out the transition -TP_LOCALLAB_LAPRAD1_TOOLTIP;Avoid using “Smooth radius” and “Laplacian threshold” (advanced) together.\nTransforms the mask to eliminate values lower than the threshold. -Reduces artifacts and noise, and allows local contrast to be modified. +TP_LOCALLAB_LAPRAD1_TOOLTIP;Avoid using “Smooth radius” and “Laplacian threshold” (advanced) together.\nTransforms the mask to eliminate values lower than the threshold.\nReduces artifacts and noise, and allows local contrast to be modified. TP_LOCALLAB_LAP_MASK_TOOLTIP;Solve PDE for all Laplacian masks.\nIf enabled Laplacian threshold mask reduce artifacts and smooth result.\nIf disabled linear response. TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated.\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\n TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets - 7 @@ -2603,7 +2601,6 @@ TP_LOCALLAB_LUMFRA;L*a*b* standard TP_LOCALLAB_LUMONLY;Luminance only TP_LOCALLAB_MASKCOM;Common Color Mask TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. -//These masks works as all tools, they take into account scope color.\nThey are different from others masks which complete a tool (Color and Light, Exposure...) TP_LOCALLAB_MASFRAME;Mask and Merge TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the deltaE image to avoid modifying the selection area when the following Mask Tools are used: Gamma , Slope , Chroma, Contrast curve , Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ) .\nDisabled when Inverse mode is used TP_LOCALLAB_MASK;Mask @@ -2682,12 +2679,12 @@ TP_LOCALLAB_OFFS;Offset TP_LOCALLAB_OFFSETWAV;Offset TP_LOCALLAB_OPACOL;Opacity TP_LOCALLAB_ORIGLC;Merge only with original image -TP_LOCALLAB_ORRETILAP_TOOLTIP;Acts on a second Laplacian threshold, to take into account ΔE to differentiate the action especially with the background (different from Scope) +TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by ‘Scope’. This allows you to differentiate the action for different parts of the image (with respect to the background for example). TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced TP_LOCALLAB_PASTELS2;Vibrance TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ -TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL - personal algorithm adapted from IPOL to Rawtherapee: lead to very different results and needs differents settings that Standard (negative black, gamma < 1,...)\nMay be usefull for low exposure or high dynamic range.\n +TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu ‘Exposure’\nMay be useful for under-exposed or high dynamic range images. TP_LOCALLAB_PREVIEW;Preview ΔE TP_LOCALLAB_PREVHIDE;Hide additional settings TP_LOCALLAB_PREVSHOW;Show additional settings @@ -2741,19 +2738,19 @@ TP_LOCALLAB_SENSIBN;Scope TP_LOCALLAB_SENSICB;Scope TP_LOCALLAB_SENSIDEN;Scope TP_LOCALLAB_SENSIEXCLU;Scope -TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust color to include in exclusion! +TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded TP_LOCALLAB_SENSIH;Scope -TP_LOCALLAB_SENSIH_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors. +TP_LOCALLAB_SENSIH_TOOLTIP;Adjusts the scope of action:\nSmall values limit action to colors close to those under the center spot.\nHigh values let the tool act on a wider range of colors. TP_LOCALLAB_SENSILOG;Scope TP_LOCALLAB_SENSIS;Scope -TP_LOCALLAB_SENSIS_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm. -TP_LOCALLAB_SENSI_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm. -TP_LOCALLAB_SENSIMASK_TOOLTIP;Adjust scope of action for this common mask tool.\nActs on the gap between the original image and the mask.\nThe references (luma, chroma, hue) are those of the center of the RT-spot\n\nYou can also act on deltaE internal to the mask with 'Scope Mask deltaE image' in 'Settings' +TP_LOCALLAB_SENSIS_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors. +TP_LOCALLAB_SENSI_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors. +TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma & hue references from the center of the RT-spot\n\nYou can also adjust the deltaE of the mask itself by using 'Scope (deltaE image mask)' in 'Settings' > ‘Mask & Merge’ TP_LOCALLAB_SETTINGS;Settings TP_LOCALLAB_SH1;Shadows Highlights TP_LOCALLAB_SH2;Equalizer TP_LOCALLAB_SHADEX;Shadows -TP_LOCALLAB_SHADEXCOMP;Shadows compression & tonal width +TP_LOCALLAB_SHADEXCOMP;Shadow compression & tonal width TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone equalizer TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows & highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. //Can be used instead - or in complement - of exposure module in difficult cases.\nThe use of Denoise may be necessary : lightening the shadows.\n\nCan be used as graduated filter (increase Scope) @@ -2781,7 +2778,6 @@ TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) TP_LOCALLAB_SHOWLC;Mask and modifications TP_LOCALLAB_SHOWMASK;Show mask -//TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Display mask modifications.\nBeware, you can only view one tool mask at the same time.\n\nNote: Use Mask is before algorihtm shape detection. TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks\nShow modifications without mask: shows the modifications before any masks are applied\nShow modifications with mask: shows the modifications after a mask has been applied\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the "Spot structure" cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Show process Fourier:\nShows the different stages of the process.\nLaplace - builds the second derivative according to the threshold (first step).\nFourier -shows the transformed Laplacian with DCT.\nPoisson - show solution of Poisson DCE.\nNormalize - show result without normalization luminance. TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise @@ -2791,7 +2787,7 @@ TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Mask and modifications can be chosen.\nBlur and TP_LOCALLAB_SHOWMNONE;Show modified image TP_LOCALLAB_SHOWMODIF;Show modifications without mask TP_LOCALLAB_SHOWMODIFMASK;Show modifications with mask -TP_LOCALLAB_SHOWNORMAL;Normalize luminance (no) +TP_LOCALLAB_SHOWNORMAL;No luminance normalization TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) TP_LOCALLAB_SHOWR;Mask and modifications @@ -2833,8 +2829,8 @@ TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with "strength", TP_LOCALLAB_STRGRID;Strength TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\nif Strength Retinex >= 0.1 Dehaze is in luminance mode. TP_LOCALLAB_STRUC;Structure -TP_LOCALLAB_STRUCCOL;Spot Structure -TP_LOCALLAB_STRUCCOL1;Spot Structure +TP_LOCALLAB_STRUCCOL;Spot structure +TP_LOCALLAB_STRUCCOL1;Spot structure TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate "Mask and modifications” > “Show spot structure" (advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and “Local contrast (by wavelet level)” to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either ‘Show modified image” or “Show modifications with mask ”. TP_LOCALLAB_STRUMASKCOL;Structure mask strength TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox "Structure mask as tool" unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask 1 (Blur and denoise") and mask 7 (Color & Light). diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index dc8f01d48..9eb9b06f6 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -1561,7 +1561,7 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, const struct local_params & lp small adaptations to local adjustments replace log2 by log(lp.baselog) allows diferentiation between low and high lights */ - BENCHFUN + // BENCHFUN const float gray = lp.sourcegray / 100.f; const float shadows_range = lp.blackev; const float dynamic_range = lp.whiteev - lp.blackev; @@ -1713,7 +1713,7 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, const struct local_params & lp void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, float *blackev, float *whiteev, bool *Autogr, int fw, int fh, float xsta, float xend, float ysta, float yend, int SCALE) { - BENCHFUN + //BENCHFUN //adpatation to local adjustments Jacques Desmis 12 2019 const PreviewProps pp(0, 0, fw, fh, SCALE); @@ -1847,7 +1847,7 @@ void tone_eq(array2D &R, array2D &G, array2D &B, const stru */ { - BENCHFUN + // BENCHFUN const int W = R.getWidth(); const int H = R.getHeight(); @@ -2055,7 +2055,7 @@ void tone_eq(array2D &R, array2D &G, array2D &B, const stru void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab) { //be careful quasi duplicate with branch cat02wb - BENCHFUN + //BENCHFUN int width = lab->W, height = lab->H; float Yw; @@ -2418,7 +2418,7 @@ void ImProcFunctions::softprocess(const LabImage* bufcolorig, array2D &bu void ImProcFunctions::exlabLocal(local_params& lp, int bfh, int bfw, int bfhr, int bfwr, LabImage* bufexporig, LabImage* lab, const LUTf& hltonecurve, const LUTf& shtonecurve, const LUTf& tonecurve, const float hueref, const float lumaref, const float chromaref) { - BENCHFUN + //BENCHFUN //exposure local constexpr float maxran = 65536.f; @@ -3459,7 +3459,7 @@ static void showmask(int lumask, const local_params& lp, int xstart, int ystart, void ImProcFunctions::discrete_laplacian_threshold(float * data_out, const float * data_in, size_t nx, size_t ny, float t) { - BENCHFUN + // BENCHFUN if (!data_in || !data_out) { fprintf(stderr, "a pointer is NULL and should not be so\n"); @@ -3546,7 +3546,7 @@ void ImProcFunctions::rex_poisson_dct(float * data, size_t nx, size_t ny, double * @author Nicolas Limare * some adaptations for Rawtherapee */ - BENCHFUN + // BENCHFUN /* * get the cosinus tables @@ -3660,7 +3660,7 @@ void ImProcFunctions::retinex_pde(const float * datain, float * dataout, int bfw * adapted for Rawtherapee by Jacques Desmis 6-2019 */ - BENCHFUN + // BENCHFUN #ifdef RT_FFTW3F_OMP if (multiThread) { fftwf_init_threads(); @@ -4527,7 +4527,7 @@ void ImProcFunctions::InverseSharp_Local(float **loctemp, const float hueref, co void ImProcFunctions::Sharp_Local(int call, float **loctemp, int senstype, const float hueref, const float chromaref, const float lumaref, local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk) { - BENCHFUN + //BENCHFUN const float ach = lp.trans / 100.f; const float varsens = senstype == 1 ? lp.senslc : lp.senssha; const bool sharshow = (lp.showmasksharmet == 1); @@ -4651,7 +4651,8 @@ void ImProcFunctions::Sharp_Local(int call, float **loctemp, int senstype, const void ImProcFunctions::Exclude_Local(float **deltaso, float hueref, float chromaref, float lumaref, float sobelref, float meansobel, const struct local_params & lp, const LabImage * original, LabImage * transformed, const LabImage * rsv, const LabImage * reserv, int cx, int cy, int sk) { - BENCHFUN { + // BENCHFUN + { const float ach = lp.trans / 100.f; const float varsens = lp.sensexclu; const float mindE = 2.f + MINSCOPE * varsens * lp.thr; @@ -4790,7 +4791,8 @@ void ImProcFunctions::Exclude_Local(float **deltaso, float hueref, float chromar void ImProcFunctions::transit_shapedetect_retinex(int call, int senstype, LabImage * bufexporig, LabImage * bufmask, LabImage * buforigmas, float **buflight, float **bufchro, const float hueref, const float chromaref, const float lumaref, const struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk) { - BENCHFUN { + //BENCHFUN + { const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); const int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); @@ -5005,7 +5007,7 @@ void ImProcFunctions::transit_shapedetect_retinex(int call, int senstype, LabIma void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexporig, LabImage * originalmask, float **bufchro, bool HHutili, const float hueref, const float chromaref, const float lumaref, float sobelref, float meansobel, float ** blend2, const struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk) { - BENCHFUN + // BENCHFUN const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); const int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); @@ -5912,7 +5914,7 @@ void optfft(int N_fftwsize, int &bfh, int &bfw, int &bfhr, int &bfwr, struct loc void ImProcFunctions::BlurNoise_Local(LabImage *tmp1, LabImage * originalmask, float **bufchro, const float hueref, const float chromaref, const float lumaref, local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk) { //local BLUR - BENCHFUN + //BENCHFUN const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); @@ -6403,7 +6405,7 @@ void ImProcFunctions::exposure_pde(float * dataor, float * datain, float * datao */ { - BENCHFUN + //BENCHFUN #ifdef RT_FFTW3F_OMP if (multiThread) { fftwf_init_threads(); @@ -6488,7 +6490,7 @@ void ImProcFunctions::fftw_convol_blur(float * input, float * output, int bfw, i ** you can enabled or disabled this function with rtsettings.fftwsigma in options. By default empirical formula is disabled ** in fact no importance....if it is this function (for sigma) or another... we are not in research :) */ - BENCHFUN + //BENCHFUN #ifdef RT_FFTW3F_OMP if (multiThread) { @@ -6666,7 +6668,7 @@ void ImProcFunctions::fftw_convol_blur2(float **input2, float **output2, int bfw void ImProcFunctions::fftw_tile_blur(int GW, int GH, int tilssize, int max_numblox_W, int min_numblox_W, float **tmp1, int numThreads, double radius) { - BENCHFUN + //BENCHFUN float epsil = 0.001f / (tilssize * tilssize); fftwf_plan plan_forward_blox[2]; fftwf_plan plan_backward_blox[2]; @@ -7076,7 +7078,7 @@ void ImProcFunctions::wavcont(const struct local_params& lp, float ** tmp, wavel const LocwavCurve & loccomprewavCurve, bool loccomprewavutili, float radlevblur, int process, float chromablu, float thres, float sigmadc, float deltad) { - BENCHFUN + //BENCHFUN const int W_L = wdspot.level_W(0); const int H_L = wdspot.level_H(0); @@ -7289,7 +7291,7 @@ void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float const LocwavCurve & locedgwavCurve, bool locedgwavutili, float sigm, float offs, int & maxlvl, float sigmadc, float deltad, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena, bool compreena, float compress, float thres) { -BENCHFUN +//BENCHFUN std::unique_ptr wdspot(new wavelet_decomposition(tmp[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen)); //first decomposition for compress dynamic range positive values and other process @@ -7964,7 +7966,7 @@ BENCHFUN void ImProcFunctions::fftw_denoise(int GW, int GH, int max_numblox_W, int min_numblox_W, float **tmp1, array2D *Lin, int numThreads, const struct local_params & lp, int chrom) { - BENCHFUN + // BENCHFUN fftwf_plan plan_forward_blox[2]; fftwf_plan plan_backward_blox[2]; @@ -9545,7 +9547,7 @@ void ImProcFunctions::Lab_Local( return; } - BENCHFUN + //BENCHFUN constexpr int del = 3; // to avoid crash with [loy - begy] and [lox - begx] and bfh bfw // with gtk2 [loy - begy-1] [lox - begx -1 ] and del = 1 struct local_params lp; diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index 1529d9239..6b87e4dbf 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -2356,6 +2356,7 @@ LocallabExposure::LocallabExposure(): linear(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LINEAR"), 0.01, 1., 0.01, 0.05))), balanexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BALANEXP"), 0.5, 1.5, 0.01, 1.0))), gamm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMM"), 0.2, 1.3, 0.01, 0.4))), + labelexpmethod(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_NOISEMETH") + ":"))), exnoiseMethod(Gtk::manage(new MyComboBoxText())), // fatFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_FATFRA")))), expfat(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_FATFRA")))), @@ -2555,7 +2556,7 @@ LocallabExposure::LocallabExposure(): pdeBox->pack_start(*balanexp); pdeBox->pack_start(*gamm); Gtk::HBox* const ctboxexpmethod = Gtk::manage(new Gtk::HBox()); - Gtk::Label* const labelexpmethod = Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_NOISEMETH") + ":")); +// Gtk::Label* const labelexpmethod = Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_NOISEMETH") + ":")); ctboxexpmethod->pack_start(*labelexpmethod, Gtk::PACK_SHRINK, 4); ctboxexpmethod->pack_start(*exnoiseMethod); pdeBox->pack_start(*ctboxexpmethod); @@ -2657,6 +2658,7 @@ void LocallabExposure::updateAdviceTooltips(const bool showTooltips) linear->set_tooltip_text(M("TP_LOCALLAB_EXPLAPLIN_TOOLTIP")); balanexp->set_tooltip_text(M("TP_LOCALLAB_EXPLAPBAL_TOOLTIP")); gamm->set_tooltip_text(M("TP_LOCALLAB_EXPLAPGAMM_TOOLTIP")); + labelexpmethod->set_tooltip_text(M("TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP")); exnoiseMethod->set_tooltip_text(M("TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP")); // fatFrame->set_tooltip_text(M("TP_LOCALLAB_FATFRAME_TOOLTIP")); expfat->set_tooltip_text(M("TP_LOCALLAB_FATFRAME_TOOLTIP")); @@ -2689,6 +2691,7 @@ void LocallabExposure::updateAdviceTooltips(const bool showTooltips) linear->set_tooltip_text(""); balanexp->set_tooltip_text(""); gamm->set_tooltip_text(""); + labelexpmethod->set_tooltip_text(""); exnoiseMethod->set_tooltip_text(""); expfat->set_tooltip_text(""); expcomp->set_tooltip_text(""); diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index d44717de2..a048f4fd2 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -325,6 +325,7 @@ private: Adjuster* const linear; Adjuster* const balanexp; Adjuster* const gamm; + Gtk::Label* const labelexpmethod; MyComboBoxText* const exnoiseMethod; // Gtk::Frame* const fatFrame; MyExpander* const expfat; From 0e1f62371399d86564058f96ed20ae6cdb8e6e95 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 2 Oct 2020 16:27:18 +0200 Subject: [PATCH 126/185] Local adjustments - simplify Label tooltip GUI scope (#5925) * Suppress BENCHFUN iplocallab - new tooltips for Exposure - common mask - original retinex * Change tooltip original retinex * Others Change tooltip Laplacian * Change labels french * Others change settings original-retinex DR exposure * Change GUI for Contrast attenator * Change scope tooltip * Change GUI locallabtools and tooltip * Simplify GUI label and tooltip scope --- rtdata/languages/default | 12 ++---------- rtgui/locallabtools.cc | 13 ++++++++++--- rtgui/locallabtools2.cc | 21 ++++++++++++--------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 7f6a3bf6a..8a181e2a7 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2734,17 +2734,9 @@ TP_LOCALLAB_SCALTM;Scale TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if DeltaE Image Mask is enabled.\nLow values avoid retouching selected area TP_LOCALLAB_SENSI;Scope -TP_LOCALLAB_SENSIBN;Scope -TP_LOCALLAB_SENSICB;Scope -TP_LOCALLAB_SENSIDEN;Scope TP_LOCALLAB_SENSIEXCLU;Scope TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded -TP_LOCALLAB_SENSIH;Scope -TP_LOCALLAB_SENSIH_TOOLTIP;Adjusts the scope of action:\nSmall values limit action to colors close to those under the center spot.\nHigh values let the tool act on a wider range of colors. -TP_LOCALLAB_SENSILOG;Scope -TP_LOCALLAB_SENSIS;Scope -TP_LOCALLAB_SENSIS_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors. -TP_LOCALLAB_SENSI_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors. +TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma & hue references from the center of the RT-spot\n\nYou can also adjust the deltaE of the mask itself by using 'Scope (deltaE image mask)' in 'Settings' > ‘Mask & Merge’ TP_LOCALLAB_SETTINGS;Settings TP_LOCALLAB_SH1;Shadows Highlights @@ -2779,7 +2771,7 @@ TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) TP_LOCALLAB_SHOWLC;Mask and modifications TP_LOCALLAB_SHOWMASK;Show mask TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks\nShow modifications without mask: shows the modifications before any masks are applied\nShow modifications with mask: shows the modifications after a mask has been applied\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the "Spot structure" cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. -TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Show process Fourier:\nShows the different stages of the process.\nLaplace - builds the second derivative according to the threshold (first step).\nFourier -shows the transformed Laplacian with DCT.\nPoisson - show solution of Poisson DCE.\nNormalize - show result without normalization luminance. +TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise TP_LOCALLAB_SHOWMASKTYP2;Denoise TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index 6b87e4dbf..233f47e3f 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -4720,6 +4720,7 @@ void LocallabVibrance::updateAdviceTooltips(const bool showTooltips) sensiv->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); curveEditorGG->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); */ + saturated->set_tooltip_text(""); pastels->set_tooltip_text(""); psThreshold->set_tooltip_text(""); @@ -5411,11 +5412,14 @@ void LocallabSoft::updateAdviceTooltips(const bool showTooltips) showmasksoftMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP")); streng->set_tooltip_text(M("TP_LOCALLAB_ORRETISTREN_TOOLTIP")); laplace->set_tooltip_text(M("TP_LOCALLAB_ORRETILAP_TOOLTIP")); + sensisf->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + } else { exp->set_tooltip_text(""); showmasksoftMethod->set_tooltip_markup(""); streng->set_tooltip_text(""); laplace->set_tooltip_text(""); + sensisf->set_tooltip_text(""); } } @@ -5747,7 +5751,7 @@ LocallabBlur::LocallabBlur(): guidbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GUIDBL"), 0, 1000, 1, 0))), strbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRBL"), 0, 100, 1, 50))), epsbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_EPSBL"), -10, 10, 1, 0))), - sensibn(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIBN"), 0, 100, 1, 40))), + sensibn(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 40))), blurMethod(Gtk::manage(new MyComboBoxText())), chroMethod(Gtk::manage(new MyComboBoxText())), activlum(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ACTIV")))), @@ -5767,7 +5771,7 @@ LocallabBlur::LocallabBlur(): detailthr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAILTHR"), 0, 100, 1, 0))), adjblur(Gtk::manage(new Adjuster(M("TP_LOCALLAB_ADJ"), -100., 100., 1., 0., Gtk::manage(new RTImage("circle-blue-yellow-small.png")), Gtk::manage(new RTImage("circle-red-green-small.png"))))), bilateral(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BILATERAL"), 0, 100, 1, 0))), - sensiden(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIDEN"), 0, 100, 1, 60))), + sensiden(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), expmaskbl(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWPLUS")))), showmaskblMethod(Gtk::manage(new MyComboBoxText())), showmaskblMethodtyp(Gtk::manage(new MyComboBoxText())), @@ -6070,7 +6074,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) if (showTooltips) { expblnoise->set_tooltip_markup(M("TP_LOCALLAB_BLUMETHOD_TOOLTIP")); radius->set_tooltip_text(M("TP_LOCALLAB_RADIUS_TOOLTIP")); - sensibn->set_tooltip_text(M("TP_LOCALLAB_SENSIH_TOOLTIP")); + sensibn->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); blurMethod->set_tooltip_markup(M("TP_LOCALLAB_BLMETHOD_TOOLTIP")); expdenoise->set_tooltip_markup(M("TP_LOCALLAB_DENOI_TOOLTIP")); wavshapeden->setTooltip(M("TP_LOCALLAB_WASDEN_TOOLTIP")); @@ -6096,6 +6100,8 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) shadmaskblsha->set_tooltip_text(M("TP_LOCALLAB_SHADMASK_TOOLTIP")); lapmaskbl->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); csThresholdblur->set_tooltip_text(M("TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP")); + sensiden->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + } else { expblnoise->set_tooltip_markup(""); radius->set_tooltip_text(""); @@ -6124,6 +6130,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) shadmaskbl->set_tooltip_text(""); shadmaskblsha->set_tooltip_text(""); csThresholdblur->set_tooltip_text(""); + sensiden->set_tooltip_text(""); } } diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index 0d1bf55a5..9bc1b01ca 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -293,6 +293,7 @@ void LocallabTone::updateAdviceTooltips(const bool showTooltips) chromasktm->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); slomasktm->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); lapmasktm->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + } else { exp->set_tooltip_text(""); equiltm->set_tooltip_text(""); @@ -688,7 +689,7 @@ LocallabRetinex::LocallabRetinex(): retiFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_RETIFRA")))), str(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STR"), 0., 100., 0.2, 0.))), loglin(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_LOGLIN")))), - sensih(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIH"), 0, 100, 1, 60))), + sensih(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), retitoolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_RETITOOLFRA")))), retinexMethod(Gtk::manage(new MyComboBoxText())), fftwreti(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FFTW")))), @@ -975,7 +976,7 @@ void LocallabRetinex::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { loglin->set_tooltip_text(M("TP_LOCALLAB_RETI_LOGLIN_TOOLTIP")); - sensih->set_tooltip_text(M("TP_LOCALLAB_SENSIH_TOOLTIP")); + sensih->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); fftwreti->set_tooltip_text(M("TP_LOCALLAB_RETI_FFTW_TOOLTIP")); equilret->set_tooltip_text(M("TP_LOCALLAB_EQUILTM_TOOLTIP")); neigh->set_tooltip_text(M("TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP")); @@ -1771,7 +1772,7 @@ LocallabSharp::LocallabSharp(): shardamping(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARDAMPING"), 0, 100, 1, 0))), shariter(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARITER"), 5, 100, 1, 30))), sharradius(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARRADIUS"), 0.4, 2.5, 0.01, 0.75))), - sensisha(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIS"), 0, 100, 1, 40))), + sensisha(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 40))), inverssha(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), sharFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_SHARFRAME")))), showmasksharMethod(Gtk::manage(new MyComboBoxText())) @@ -1837,7 +1838,7 @@ void LocallabSharp::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { exp->set_tooltip_text(M("TP_LOCALLAB_EXPSHARP_TOOLTIP")); - sensisha->set_tooltip_text(M("TP_LOCALLAB_SENSIS_TOOLTIP")); + sensisha->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); } else { exp->set_tooltip_text(""); sensisha->set_tooltip_text(""); @@ -2130,7 +2131,7 @@ LocallabContrast::LocallabContrast(): residshathr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDSHATHR"), 0., 100., 1., 30.))), residhi(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDHI"), -100., 100., 1., 0.))), residhithr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDHITHR"), 0., 100., 1., 70.))), - sensilc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIS"), 0, 100, 1, 60))), + sensilc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), clariFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CLARIFRA")))), clarilres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CLARILRES"), -20., 100., 0.5, 0.))), claricres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CLARICRES"), -20., 100., 0.5, 0.))), @@ -2645,6 +2646,7 @@ void LocallabContrast::updateAdviceTooltips(const bool showTooltips) Lmasklcshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); masklcCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); chromasklc->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + sensilc->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); } else { contFrame->set_tooltip_text(""); LocalcurveEditorwav->set_tooltip_markup(""); @@ -2671,6 +2673,7 @@ void LocallabContrast::updateAdviceTooltips(const bool showTooltips) Lmasklcshape->setTooltip(""); masklcCurveEditorG->set_tooltip_markup(""); chromasklc->set_tooltip_text(""); + sensilc->set_tooltip_text(""); } } @@ -3905,7 +3908,7 @@ LocallabCBDL::LocallabCBDL(): clarityml(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CLARITYML"), 0.1, 100., 0.1, 0.1))), contresid(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CONTRESID"), -100, 100, 1, 0))), softradiuscb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 0.))), - sensicb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSICB"), 0, 100, 1, 60))), + sensicb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), expmaskcb(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWCB")))), showmaskcbMethod(Gtk::manage(new MyComboBoxText())), enacbMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), @@ -4078,7 +4081,7 @@ void LocallabCBDL::updateAdviceTooltips(const bool showTooltips) chromacbdl->set_tooltip_text(M("TP_LOCALLAB_CHROMACB_TOOLTIP")); threshold->set_tooltip_text(M("TP_LOCALLAB_CBDL_THRES_TOOLTIP")); clarityml->set_tooltip_text(M("TP_LOCALLAB_CBDLCLARI_TOOLTIP")); - sensicb->set_tooltip_text(M("TP_LOCALLAB_SENSIH_TOOLTIP")); + sensicb->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); expmaskcb->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); CCmaskcbshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); LLmaskcbshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); @@ -4571,7 +4574,7 @@ LocallabLog::LocallabLog(): targetGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TARGET_GRAY"), 5.0, 80.0, 0.1, 18.0))), detail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0., 1., 0.01, 0.6))), baselog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BASELOG"), 1.3, 8., 0.05, 2., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), - sensilog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSILOG"), 0, 100, 1, 60))), + sensilog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), strlog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -2.0, 2.0, 0.05, 0.))), anglog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))) { @@ -4652,7 +4655,7 @@ void LocallabLog::updateAdviceTooltips(const bool showTooltips) // sensilog->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); detail->set_tooltip_text(""); Autogray->set_tooltip_text(""); - sensilog->set_tooltip_text(""); + sensilog->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); fullimage->set_tooltip_text(M("TP_LOCALLAB_FULLIMAGELOG_TOOLTIP")); } else { exp->set_tooltip_text(""); From 6b667ead58172179aceee7e9c730333b466a6d01 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Fri, 2 Oct 2020 21:55:15 -0700 Subject: [PATCH 127/185] Swap positions of scope buttons Make the scope type buttons the primary buttons and the other options secondary. --- .../images/svg/histogram-ellipsis-small.svg | 135 +++++++++++++++ rtdata/languages/default | 3 +- rtgui/histogrampanel.cc | 163 +++++++++--------- rtgui/histogrampanel.h | 13 +- rtgui/options.cc | 8 +- rtgui/options.h | 2 +- 6 files changed, 223 insertions(+), 101 deletions(-) create mode 100644 rtdata/images/svg/histogram-ellipsis-small.svg diff --git a/rtdata/images/svg/histogram-ellipsis-small.svg b/rtdata/images/svg/histogram-ellipsis-small.svg new file mode 100644 index 000000000..4fdb17907 --- /dev/null +++ b/rtdata/images/svg/histogram-ellipsis-small.svg @@ -0,0 +1,135 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/languages/default b/rtdata/languages/default index fbfab9b86..d7f5734ae 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -244,12 +244,13 @@ GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done edit HISTOGRAM_TOOLTIP_B;Show/Hide blue histogram. HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. +HISTOGRAM_TOOLTIP_CROSSHAIR;Show/Hide indicator crosshair. HISTOGRAM_TOOLTIP_G;Show/Hide green histogram. HISTOGRAM_TOOLTIP_L;Show/Hide CIELab luminance histogram. HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. HISTOGRAM_TOOLTIP_R;Show/Hide red histogram. HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. -HISTOGRAM_TOOLTIP_TYPE;Toggle visibility of the scope selection buttons. +HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 0df6496c7..66b322085 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -128,13 +128,6 @@ HistogramPanel::HistogramPanel () : mode1Image = new RTImage ("histogram-mode-logx-small.png"); mode2Image = new RTImage ("histogram-mode-logxy-small.png"); - histImage.reset(new RTImage("histogram-type-histogram-small.png")); - histRawImage.reset(new RTImage("histogram-bayer-on-small.png")); - paradeImage.reset(new RTImage("histogram-type-parade-small.png")); - waveImage.reset(new RTImage("histogram-type-waveform-small.png")); - vectHcImage.reset(new RTImage("histogram-type-vectorscope-hc-small.png")); - vectHsImage.reset(new RTImage("histogram-type-vectorscope-hs-small.png")); - histImageOn.reset(new RTImage("histogram-type-histogram-small.png")); histRawImageOn.reset(new RTImage("histogram-bayer-on-small.png")); paradeImageOn.reset(new RTImage("histogram-type-parade-small.png")); @@ -154,8 +147,8 @@ HistogramPanel::HistogramPanel () : showValue = Gtk::manage (new Gtk::ToggleButton ()); showChro = Gtk::manage (new Gtk::ToggleButton ()); showMode = Gtk::manage (new Gtk::Button ()); - scopeType = Gtk::manage (new Gtk::ToggleButton ()); showBAR = Gtk::manage (new Gtk::ToggleButton ()); + scopeOptions = Gtk::manage (new Gtk::ToggleButton ()); Gtk::RadioButtonGroup scopeTypeGroup; scopeHistBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); @@ -183,8 +176,8 @@ HistogramPanel::HistogramPanel () : showChro->set_can_focus(false); showMode->set_name("histButton"); showMode->set_can_focus(false); - scopeType->set_name("histButton"); - scopeType->set_can_focus(false); + scopeOptions->set_name("histButton"); + scopeOptions->set_can_focus(false); showBAR->set_name("histButton"); showBAR->set_can_focus(false); scopeHistBtn->set_name("histButton"); @@ -206,7 +199,7 @@ HistogramPanel::HistogramPanel () : showValue->set_relief (Gtk::RELIEF_NONE); showChro->set_relief (Gtk::RELIEF_NONE); showMode->set_relief (Gtk::RELIEF_NONE); - scopeType->set_relief (Gtk::RELIEF_NONE); + scopeOptions->set_relief (Gtk::RELIEF_NONE); showBAR->set_relief (Gtk::RELIEF_NONE); scopeHistBtn->set_relief (Gtk::RELIEF_NONE); scopeHistRawBtn->set_relief (Gtk::RELIEF_NONE); @@ -221,8 +214,7 @@ HistogramPanel::HistogramPanel () : showValue->set_tooltip_text (M("HISTOGRAM_TOOLTIP_L")); showChro->set_tooltip_text (M("HISTOGRAM_TOOLTIP_CHRO")); showMode->set_tooltip_text (M("HISTOGRAM_TOOLTIP_MODE")); - scopeType->set_tooltip_text (M("HISTOGRAM_TOOLTIP_TYPE")); - showBAR->set_tooltip_text (M("HISTOGRAM_TOOLTIP_BAR")); + scopeOptions->set_tooltip_text(M("HISTOGRAM_TOOLTIP_SHOW_OPTIONS")); scopeHistBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM")); scopeHistRawBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW")); scopeParadeBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_PARADE")); @@ -234,8 +226,8 @@ HistogramPanel::HistogramPanel () : buttonGrid->set_orientation(Gtk::ORIENTATION_HORIZONTAL); persistentButtons = Gtk::manage(new Gtk::Box()); persistentButtons->set_orientation(Gtk::ORIENTATION_VERTICAL); - scopeButtons = Gtk::manage(new Gtk::Box()); - scopeButtons->set_orientation(Gtk::ORIENTATION_VERTICAL); + optionButtons = Gtk::manage(new Gtk::Box()); + optionButtons->set_orientation(Gtk::ORIENTATION_VERTICAL); showRed->set_active (options.histogramRed); showGreen->set_active (options.histogramGreen); @@ -243,7 +235,7 @@ HistogramPanel::HistogramPanel () : showValue->set_active (options.histogramLuma); showChro->set_active (options.histogramChroma); // no showMode->set_active(), as it's not a ToggleButton - scopeType->set_active(options.histogramShowScopeButtons); + scopeOptions->set_active(options.histogramShowOptionButtons); showBAR->set_active (options.histogramBar); showRed->set_image (showRed->get_active() ? *redImage : *redImage_g); @@ -291,22 +283,19 @@ HistogramPanel::HistogramPanel () : case ScopeType::NONE: break; } + scopeOptions->set_image(*Gtk::manage(new RTImage("histogram-ellipsis-small.png"))); showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); - type_changed(); - updateHistAreaOptions(); - if (histogramRGBArea) { - updateHistRGBAreaOptions(); - } - setExpandAlignProperties(showRed , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showGreen, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showBlue , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showValue, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showChro , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showMode , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - setExpandAlignProperties(scopeType, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(scopeOptions, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showBAR , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(persistentButtons, false, true, Gtk::ALIGN_START, Gtk::ALIGN_FILL); + setExpandAlignProperties(optionButtons, false, true, Gtk::ALIGN_START, Gtk::ALIGN_FILL); showRed->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::red_toggled), showRed ); showGreen->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::green_toggled), showGreen ); @@ -314,7 +303,7 @@ HistogramPanel::HistogramPanel () : showValue->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::value_toggled), showValue ); showChro->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::chro_toggled), showChro ); showMode->signal_released().connect( sigc::mem_fun(*this, &HistogramPanel::mode_released), showMode ); - scopeType->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::type_pressed) ); + scopeOptions->signal_toggled().connect(sigc::mem_fun(*this, &HistogramPanel::scopeOptionsToggled)); showBAR->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::bar_toggled), showBAR ); scopeHistBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeHistBtn)); scopeHistRawBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeHistRawBtn)); @@ -323,31 +312,34 @@ HistogramPanel::HistogramPanel () : scopeVectHcBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeVectHcBtn)); scopeVectHsBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeVectHsBtn)); - persistentButtons->add(*showRed); - persistentButtons->add(*showGreen); - persistentButtons->add(*showBlue); - persistentButtons->add(*showValue); - persistentButtons->add(*showChro); - persistentButtons->add(*showMode); - persistentButtons->add(*scopeType); - persistentButtons->add(*showBAR); + optionButtons->add(*showRed); + optionButtons->add(*showGreen); + optionButtons->add(*showBlue); + optionButtons->add(*showValue); + optionButtons->add(*showChro); + optionButtons->add(*showMode); + optionButtons->add(*showBAR); - scopeButtons->add(*scopeHistBtn); - scopeButtons->add(*scopeHistRawBtn); - scopeButtons->add(*scopeParadeBtn); - scopeButtons->add(*scopeWaveBtn); - scopeButtons->add(*scopeVectHsBtn); - scopeButtons->add(*scopeVectHcBtn); + Gtk::VSeparator* separator = Gtk::manage(new Gtk::VSeparator()); + setExpandAlignProperties(separator, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_END); + persistentButtons->add(*scopeHistBtn); + persistentButtons->add(*scopeHistRawBtn); + persistentButtons->add(*scopeParadeBtn); + persistentButtons->add(*scopeWaveBtn); + persistentButtons->add(*scopeVectHsBtn); + persistentButtons->add(*scopeVectHcBtn); + persistentButtons->add(*separator); + persistentButtons->add(*scopeOptions); // Put the button vbox next to the window's border to be less disturbing if (options.histogramPosition == 1) { buttonGrid->add(*persistentButtons); - buttonGrid->add(*scopeButtons); + buttonGrid->add(*optionButtons); add (*buttonGrid); add (*gfxGrid); } else { - buttonGrid->add(*scopeButtons); + buttonGrid->add(*optionButtons); buttonGrid->add(*persistentButtons); add (*gfxGrid); @@ -355,8 +347,14 @@ HistogramPanel::HistogramPanel () : } show_all (); - scopeButtons->set_no_show_all(); - scopeButtons->set_visible(options.histogramShowScopeButtons); + optionButtons->set_no_show_all(); + optionButtons->set_visible(options.histogramShowOptionButtons); + + type_changed(); + updateHistAreaOptions(); + if (histogramRGBArea) { + updateHistRGBAreaOptions(); + } rconn = signal_size_allocate().connect( sigc::mem_fun(*this, &HistogramPanel::resized) ); } @@ -469,10 +467,10 @@ void HistogramPanel::mode_released () rgbv_toggled(); } -void HistogramPanel::type_pressed() +void HistogramPanel::scopeOptionsToggled() { - options.histogramShowScopeButtons = scopeType->get_active(); - scopeButtons->set_visible(scopeType->get_active()); + options.histogramShowOptionButtons = scopeOptions->get_active(); + optionButtons->set_visible(scopeOptions->get_active()); } void HistogramPanel::type_selected(Gtk::RadioButton* button) @@ -561,53 +559,48 @@ void HistogramPanel::type_changed() switch (options.histogramScopeType) { case ScopeType::HISTOGRAM: - showRed->set_sensitive(); - showGreen->set_sensitive(); - showBlue->set_sensitive(); - showValue->set_sensitive(); - showChro->set_sensitive(); - showMode->set_sensitive(); - scopeType->set_image(*histImage); + showRed->show(); + showGreen->show(); + showBlue->show(); + showValue->show(); + showChro->show(); + showMode->show(); + showBAR->show(); + showBAR->set_tooltip_text(M("HISTOGRAM_TOOLTIP_BAR")); histogramRGBArea = histogramRGBAreaHori.get(); break; case ScopeType::HISTOGRAM_RAW: - showRed->set_sensitive(); - showGreen->set_sensitive(); - showBlue->set_sensitive(); - showValue->set_sensitive(false); - showChro->set_sensitive(false); - showMode->set_sensitive(); - scopeType->set_image(*histRawImage); + showRed->show(); + showGreen->show(); + showBlue->show(); + showValue->hide(); + showChro->hide(); + showMode->show(); + showBAR->hide(); histogramRGBArea = nullptr; break; case ScopeType::PARADE: case ScopeType::WAVEFORM: - showRed->set_sensitive(); - showGreen->set_sensitive(); - showBlue->set_sensitive(); - showValue->set_sensitive(); - showChro->set_sensitive(false); - showMode->set_sensitive(false); - if (options.histogramScopeType == ScopeType::PARADE) { - scopeType->set_image(*paradeImage); - } else { - scopeType->set_image(*waveImage); - } + showRed->show(); + showGreen->show(); + showBlue->show(); + showValue->show(); + showChro->hide(); + showMode->hide(); + showBAR->show(); + showBAR->set_tooltip_text(M("HISTOGRAM_TOOLTIP_BAR")); histogramRGBArea = histogramRGBAreaVert.get(); break; case ScopeType::VECTORSCOPE_HC: case ScopeType::VECTORSCOPE_HS: - showRed->set_sensitive(false); - showGreen->set_sensitive(false); - showBlue->set_sensitive(false); - showValue->set_sensitive(false); - showChro->set_sensitive(false); - showMode->set_sensitive(false); - if (options.histogramScopeType == ScopeType::VECTORSCOPE_HC) { - scopeType->set_image(*vectHcImage); - } else { - scopeType->set_image(*vectHsImage); - } + showRed->hide(); + showGreen->hide(); + showBlue->hide(); + showValue->hide(); + showChro->hide(); + showMode->hide(); + showBAR->show(); + showBAR->set_tooltip_text(M("HISTOGRAM_TOOLTIP_CROSSHAIR")); histogramRGBArea = nullptr; break; case ScopeType::NONE: @@ -679,10 +672,10 @@ void HistogramPanel::reorder (Gtk::PositionType align) gfxGrid->add(*histogramRGBArea); } - scopeButtons->reference(); - removeIfThere(buttonGrid, scopeButtons, false); - buttonGrid->add(*scopeButtons); - scopeButtons->unreference(); + optionButtons->reference(); + removeIfThere(buttonGrid, optionButtons, false); + buttonGrid->add(*optionButtons); + optionButtons->unreference(); } else { buttonGrid->reference(); removeIfThere(this, buttonGrid, false); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index fdce93d00..5ecf378b8 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -257,7 +257,7 @@ protected: Gtk::Grid* gfxGrid; Gtk::Grid* buttonGrid; Gtk::Box* persistentButtons; - Gtk::Box* scopeButtons; + Gtk::Box* optionButtons; HistogramArea* histogramArea; HistogramRGBArea* histogramRGBArea; std::unique_ptr histogramRGBAreaHori; @@ -269,7 +269,7 @@ protected: Gtk::ToggleButton* showBAR; Gtk::ToggleButton* showChro; Gtk::Button* showMode; - Gtk::ToggleButton* scopeType; + Gtk::ToggleButton* scopeOptions; Gtk::RadioButton* scopeHistBtn; Gtk::RadioButton* scopeHistRawBtn; @@ -292,13 +292,6 @@ protected: Gtk::Image *barImage_g; Gtk::Image *chroImage_g; - std::unique_ptr histImage; - std::unique_ptr histRawImage; - std::unique_ptr paradeImage; - std::unique_ptr waveImage; - std::unique_ptr vectHcImage; - std::unique_ptr vectHsImage; - std::unique_ptr histImageOn; std::unique_ptr histRawImageOn; std::unique_ptr paradeImageOn; @@ -364,7 +357,7 @@ public: void chro_toggled (); void bar_toggled (); void mode_released (); - void type_pressed (); + void scopeOptionsToggled(); void type_selected(Gtk::RadioButton* button); void type_changed (); void rgbv_toggled (); diff --git a/rtgui/options.cc b/rtgui/options.cc index d71fcc57d..494a1ec3f 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -450,7 +450,7 @@ void Options::setDefaults() histogramHeight = 200; histogramDrawMode = 0; histogramScopeType = ScopeType::HISTOGRAM; - histogramShowScopeButtons = false; + histogramShowOptionButtons = false; curvebboxpos = 1; complexity = 2; prevdemo = PD_Sidecar; @@ -1440,8 +1440,8 @@ void Options::readFromFile(Glib::ustring fname) histogramScopeType = static_cast(keyFile.get_integer("GUI", "HistogramScopeType")); } - if (keyFile.has_key("GUI", "HistogramShowScopeButtons")) { - histogramShowScopeButtons = keyFile.get_boolean("GUI", "HistogramShowScopeButtons"); + if (keyFile.has_key("GUI", "HistogramShowOptionButtons")) { + histogramShowOptionButtons = keyFile.get_boolean("GUI", "HistogramShowOptionButtons"); } if (keyFile.has_key("GUI", "NavigatorRGBUnit")) { @@ -2267,7 +2267,7 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_integer("GUI", "HistogramHeight", histogramHeight); keyFile.set_integer("GUI", "HistogramDrawMode", histogramDrawMode); keyFile.set_integer("GUI", "HistogramScopeType", rtengine::toUnderlying(histogramScopeType)); - keyFile.set_boolean("GUI", "HistogramShowScopeButtons", histogramShowScopeButtons); + keyFile.set_boolean("GUI", "HistogramShowOptionButtons", histogramShowOptionButtons); keyFile.set_integer("GUI", "NavigatorRGBUnit", (int)navRGBUnit); keyFile.set_integer("GUI", "NavigatorHSVUnit", (int)navHSVUnit); keyFile.set_boolean("GUI", "ShowFilmStripToolBar", showFilmStripToolBar); diff --git a/rtgui/options.h b/rtgui/options.h index aa5cff373..476af79ec 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -323,7 +323,7 @@ public: int histogramHeight; int histogramDrawMode; ScopeType histogramScopeType; - bool histogramShowScopeButtons; + bool histogramShowOptionButtons; bool FileBrowserToolbarSingleRow; bool hideTPVScrollbar; int whiteBalanceSpotSize; From 04524b6332564d9b9771607d3f9ce6142c49f1f5 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Fri, 2 Oct 2020 22:19:33 -0700 Subject: [PATCH 128/185] Change vectorscope crosshair style The original crosshair used dashed lines extending across the vectorscope area. The new crosshair uses solid lines with a small length. --- rtgui/histogrampanel.cc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 66b322085..480a80c92 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1817,14 +1817,13 @@ void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, in cx = w / 2.f + scope_size * pointer_a * ab_factor; cy = h / 2.f - scope_size * pointer_b * ab_factor; } + const float crosshair_size = 20.f * s; cr->set_source_rgba(1, 1, 1, 0.5); - cr->set_dash(ch_ds, 0); - cr->move_to(0, cy); - cr->line_to(w, cy); - cr->move_to(cx, 0); - cr->line_to(cx, h); + cr->move_to(cx - crosshair_size, cy); + cr->line_to(cx + crosshair_size, cy); + cr->move_to(cx, cy - crosshair_size); + cr->line_to(cx, cy + crosshair_size); cr->stroke(); - cr->unset_dash(); cr->arc(cx, cy, 3 * s, 0, 2 * RT_PI); cr->set_source_rgb(1, 1, 1); cr->fill_preserve(); From b311b5b6d2c56550453368cd414539e978d3358a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 3 Oct 2020 10:18:23 +0200 Subject: [PATCH 129/185] Validate EXIF UTF-8 strings (fixes #5923) --- rtengine/imagedata.cc | 51 +++++++++++++++++++++++++------------------ rtgui/exifpanel.cc | 3 +++ 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index cedf08ca0..16b6a4c91 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -69,6 +69,15 @@ T getFromFrame( return {}; } +const std::string& validateUft8(const std::string& str, const std::string& on_error = "???") +{ + if (Glib::ustring(str).validate()) { + return str; + } + + return on_error; +} + } FramesMetaData* FramesMetaData::fromFile(const Glib::ustring& fname, std::unique_ptr rml, bool firstFrameOnly) @@ -122,7 +131,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } if (tag) { - make = tag->valueToString(); + make = validateUft8(tag->valueToString()); // Same dcraw treatment for (const auto& corp : { @@ -158,7 +167,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* tag = newFrameRootDir->findTagUpward("Model"); if (tag) { - model = tag->valueToString(); + model = validateUft8(tag->valueToString()); } if (!model.empty()) { @@ -193,14 +202,14 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* if (model == "Unknown") { tag = newFrameRootDir->findTag("UniqueCameraModel"); if (tag) { - model = tag->valueToString(); + model = validateUft8(tag->valueToString()); } } tag = newFrameRootDir->findTagUpward("Orientation"); if (tag) { - orientation = tag->valueToString(); + orientation = validateUft8(tag->valueToString()); } // Look for Rating metadata in the following order: @@ -310,7 +319,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } if (tag) { - serial = tag->valueToString(); + serial = validateUft8(tag->valueToString()); } // guess lens... @@ -320,7 +329,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* if (!make.compare(0, 8, "FUJIFILM")) { if (exif->getTag("LensModel")) { - lens = exif->getTag("LensModel")->valueToString(); + lens = validateUft8(exif->getTag("LensModel")->valueToString()); } } else if (!make.compare(0, 4, "SONY")) { if (iso_speed == 65535 || iso_speed == 0) { @@ -347,9 +356,9 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* const rtexif::Tag* const lens_make = exif->getTag(0xA433); const std::string make = lens_make - ? lens_make->valueToString() + ? validateUft8(lens_make->valueToString()) : std::string(); - const std::string model = lens_model->valueToString(); + const std::string model = validateUft8(lens_model->valueToString()); if (!model.empty()) { lens = make; @@ -382,7 +391,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* bool lensOk = false; if (mnote->getTag("LensData")) { - std::string ldata = mnote->getTag("LensData")->valueToString(); + std::string ldata = validateUft8(mnote->getTag("LensData")->valueToString()); size_t pos; if (ldata.size() > 10 && (pos = ldata.find("Lens = ")) != Glib::ustring::npos) { @@ -394,10 +403,10 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* size_t pos = lens.find("$FL$"); // is there a placeholder for focallength? if (pos != Glib::ustring::npos) { // then fill in focallength - lens = lens.replace(pos, 4, exif->getTag("FocalLength")->valueToString()); + lens = lens.replace(pos, 4, validateUft8(exif->getTag("FocalLength")->valueToString())); if (mnote->getTag("LensType")) { - std::string ltype = mnote->getTag("LensType")->valueToString(); + const std::string ltype = validateUft8(mnote->getTag("LensType")->valueToString()); if (ltype.find("MF = Yes") != Glib::ustring::npos) { // check, whether it's a MF lens, should be always lens = lens.replace(0, 7, "MF"); @@ -416,7 +425,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } if (!lensOk && mnote->getTag("Lens")) { - std::string ldata = mnote->getTag("Lens")->valueToString(); + const std::string ldata = validateUft8(mnote->getTag("Lens")->valueToString()); size_t i = 0, j = 0; double n[4] = {0.0}; @@ -453,7 +462,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* // Look whether it's MF or AF if (mnote->getTag("LensType")) { - std::string ltype = mnote->getTag("LensType")->valueToString(); + const std::string ltype = validateUft8(mnote->getTag("LensType")->valueToString()); if (ltype.find("MF = Yes") != Glib::ustring::npos) { // check, whether it's a MF lens lens = lens.replace(0, 7, "MF"); // replace 'Unknwon' with 'MF' @@ -478,7 +487,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* if (lt) { if (lt->toInt()) { - std::string ldata = lt->valueToString (); + const std::string ldata = validateUft8(lt->valueToString()); if (ldata.size() > 1) { found = true; @@ -499,7 +508,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* lt = mnote->findTag("LensID"); if (lt) { - std::string ldata = lt->valueToString(); + const std::string ldata = validateUft8(lt->valueToString()); if (ldata.size() > 1) { lens = ldata; @@ -521,7 +530,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } if (mnote->getTag("LensType")) { - lens = mnote->getTag ("LensType")->valueToString(); + lens = validateUft8(mnote->getTag("LensType")->valueToString()); // If MakeNotes are vague, fall back to Exif LensMake and LensModel if set // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Pentax.html#LensType if (lens == "M-42 or No Lens" || lens == "K or M Lens" || lens == "A Series Lens" || lens == "Sigma") { @@ -548,7 +557,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } else if (!make.compare (0, 4, "SONY") || !make.compare (0, 6, "KONICA")) { if (mnote->getTag ("LensID")) { - lens = mnote->getTag ("LensID")->valueToString (); + lens = validateUft8(mnote->getTag("LensID")->valueToString()); if (lens == "Unknown") { lens_from_make_and_model(); } @@ -558,7 +567,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* rtexif::TagDirectory* eq = mnote->getTag("Equipment")->getDirectory(); if (eq->getTag("LensType")) { - lens = eq->getTag("LensType")->valueToString(); + lens = validateUft8(eq->getTag("LensType")->valueToString()); } } if (lens == "Unknown") { @@ -566,7 +575,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } else if (!make.compare (0, 9, "Panasonic")) { if (mnote->getTag ("LensType")) { - std::string panalens = mnote->getTag("LensType")->valueToString(); + const std::string panalens = validateUft8(mnote->getTag("LensType")->valueToString()); if (panalens.find("LUMIX") != Glib::ustring::npos) { lens = "Panasonic " + panalens; @@ -576,9 +585,9 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } } else if (exif->getTag("DNGLensInfo")) { - lens = exif->getTag("DNGLensInfo")->valueToString(); + lens = validateUft8(exif->getTag("DNGLensInfo")->valueToString()); } else if (!lens_from_make_and_model() && exif->getTag ("LensInfo")) { - lens = exif->getTag("LensInfo")->valueToString(); + lens = validateUft8(exif->getTag("LensInfo")->valueToString()); } } } diff --git a/rtgui/exifpanel.cc b/rtgui/exifpanel.cc index 341d0f303..3f6bbacb5 100644 --- a/rtgui/exifpanel.cc +++ b/rtgui/exifpanel.cc @@ -209,6 +209,9 @@ void ExifPanel::setImageData (const FramesMetaData* id) Gtk::TreeModel::Children ExifPanel::addTag (const Gtk::TreeModel::Children& root, Glib::ustring field, Glib::ustring value, rtexif::ActionCode action, bool editable) { + if (!value.validate()) { + value = "???"; + } Gtk::TreeModel::Row row = * (exifTreeModel->append (root)); row[exifColumns.action] = action; From 0624ba9845d3695dbf1ce1003b62ea8afe657c83 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 3 Oct 2020 12:57:37 +0200 Subject: [PATCH 130/185] Local adjustments - labels tooltip TM - sharp - CBDL - and french (#5927) * Change tooltip french * Update labels tooltip french * Changes TM - sharp - CBDL * Others changes TM CBDL --- rtdata/languages/Francais | 31 +++++++++++++++++++++++++------ rtdata/languages/default | 34 +++++++++++++++++----------------- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 540f6c87a..ddec6087c 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -1782,6 +1782,7 @@ TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - direct floute et bruite avec tous les rég TP_LOCALLAB_BLNOI_EXP;Flouter & Bruit TP_LOCALLAB_BLNORM;Normal TP_LOCALLAB_BLSYM;Symétrique +TP_LOCALLAB_BLURCOLDE_TOOLTIP;L'image pour calculer dE est légèrement floutéeafin d'éviter de prendre en compte des pixels isolés. TP_LOCALLAB_BLUFR;Flouter - Grain - Debruiter TP_LOCALLAB_BLUMETHOD_TOOLTIP;Pour flouter l'arrère plan et isoler le premier plan:\n*Flouter l'arrière plan avec un RT-spot couvrant totalement l'image (valeurs élevées Etendue et transition) - normal ou inverse.\n*Isoler le premier plan avec un ou plusieurs RT-spot Exclusion avec l'outils que vous voulez (accroître Etendue).\n\nCe module peut être utilisé en réduction de bruit additionnelle,incluant un "median" et un "Filtre Guidé" TP_LOCALLAB_BLUR;Flou Gaussien - Bruit - Grain @@ -1791,6 +1792,7 @@ TP_LOCALLAB_BLURDE;Flouter la détection de forme TP_LOCALLAB_BLURLC;Luminance seulement TP_LOCALLAB_BLURLEVELFRA;Flouter niveaux TP_LOCALLAB_BLURMASK_TOOLTIP;Génère un masque flou, prend en compte la structure avec le curseur de seuil de contraste du Masque flou. +TP_LOCALLAB_BLURRMASK_TOOLTIP;Vous permet de faire varier "rayon" du flou Gaussien (0 to 1000) TP_LOCALLAB_BLURRESIDFRA;Flouter image Résiduelle TP_LOCALLAB_BLUR_TOOLNAME;Flouter/Grain & Réduction du Bruit - 1 TP_LOCALLAB_BLWH;Tous les changements forcés en noir et blanc @@ -1800,11 +1802,11 @@ TP_LOCALLAB_BUTTON_DEL;Effacer TP_LOCALLAB_BUTTON_DUPL;Dupliquer TP_LOCALLAB_BUTTON_REN;Renommer TP_LOCALLAB_BUTTON_VIS;Montrer/Cacher -TP_LOCALLAB_CBDL;Contraste niveaux détail +TP_LOCALLAB_CBDL;Contraste par niveaux de détail TP_LOCALLAB_CBDLCLARI_TOOLTIP;Ajuste les tons moyens et les réhausse. TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Agit comme un outil ondelettes.\nLe premier niveau (0) agit sur des détails de 2x2.\nLe dernier niveau (5) agit sur des détails de 64x64. TP_LOCALLAB_CBDL_THRES_TOOLTIP;Empêche d'augmenter le bruit -TP_LOCALLAB_CBDL_TOOLNAME;Contraste par niveaux de détails - 2 +TP_LOCALLAB_CBDL_TOOLNAME;Contraste par niveaux de détail - 2 TP_LOCALLAB_CENTER_X;Centre X TP_LOCALLAB_CENTER_Y;Centre Y TP_LOCALLAB_CH;Courbes CL - LC @@ -1847,6 +1849,7 @@ TP_LOCALLAB_CONTFRA;Contraste par niveau TP_LOCALLAB_CONTRAST;Contraste TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Contrôle de contraste du masque. TP_LOCALLAB_CONTRESID;Contraste +TP_LOCALLAB_CONTTHMASK_TOOLTIP;Vous permet de déterminer quelles parties de l'image seront concernées par la texture. TP_LOCALLAB_CONTTHR;Seuil contraste TP_LOCALLAB_CONTWFRA;Contrast Local TP_LOCALLAB_CSTHRESHOLD;Ψ Ondelettes niveaux @@ -1915,6 +1918,7 @@ TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;Voir la documentation de ondelettes niveaux.\ TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Evitez les spots trop petits(< 32x32 pixels).\nUtilisez de faibles valeurs de transition et de hautes valeurs de transition affaiblissement et d'Etendue pour simuler un petit RT-spot et s'adapter aux défauts.\nUtimiser si nécessaire le module 'Clarté & Maqsue netteté' et 'Fusion d'images' en ajustant 'Rayon adoucir' pour réduire les artéfacts. TP_LOCALLAB_EXPCURV;Courbes TP_LOCALLAB_EXPGRAD;Filtre gradué +TP_LOCALLAB_EXPGRADCOL_TOOLTIP;Un filtre gardué est disponible dans Couleur et lumière (luminance, chrominance & teinte gradients, et "Fusion fichier") Exposure (luminance grad.), Exposition Masque(luminance grad.), Ombres/lumières (luminance grad.), Vibrance (luminance, chrominance & teinte gradients), Local contrast & ondelettes pyramide (local contrast grad.).\nAdoucissement de gradient est dans "Réglages". TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Balance l'action entre l'iamge originale image et la transformée de Laplace. TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Applique un gamma avant et après la transformée de Laplace TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Ajoute une exposition linéaire avant l'application de la transformée de Laplace @@ -1941,14 +1945,17 @@ TP_LOCALLAB_FATSHFRA;Compression Dynamique Masque ƒ TP_LOCALLAB_FEATH_TOOLTIP;Largeur du Gradient en porcentage de la diagonale du Spot\nUtilisé par tous les Filtres Gradués dans tous les outils.\nPas d'action si les filtres gradués ne sont pas utilisés. TP_LOCALLAB_FEATVALUE;Adoucissement gradient (Filtres Gradués) TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +TP_LOCALLAB_FFTMASK_TOOLTIP;Utilise une transformée de Fourier pour une meilleure qualité (accroit le temps de traitement et le besoin en mémoire) TP_LOCALLAB_FFTW;ƒ - Utilise Fast Fourier Transform TP_LOCALLAB_FFTW2;ƒ - Utilise Fast Fourier Transform (TIF, JPG,..) TP_LOCALLAB_FFTWBLUR;ƒ - Utilise toujours Fast Fourier Transform TP_LOCALLAB_FULLIMAGE;Calcule les valeurs Noir Ev - Blanc Ev - sur l'image entière +TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calcule les valeurs Ev sur l'image entière. TP_LOCALLAB_GAM;Gamma TP_LOCALLAB_GAMFRA;Courbe Réponse Tonale (TRC) TP_LOCALLAB_GAMM;Gamma TP_LOCALLAB_GAMMASKCOL;Gamma +TP_LOCALLAB_GAMMASK_TOOLTIP;Gamma et Pente (Slope) autorise une transformation du masque en douceur et sans artefacts en modifiant progressivement "L" pour éviter les discontinuité. TP_LOCALLAB_GAMSH;Gamma TP_LOCALLAB_GRADANG;Angle du Gradient TP_LOCALLAB_GRADANG_TOOLTIP;Angle de Rotation en degrés : -180 0 +180 @@ -1968,6 +1975,7 @@ TP_LOCALLAB_GRALWFRA;Filtre Gradué Local contraste TP_LOCALLAB_GRIDFRAME_TOOLTIP;Vous pouvez utiliser cet outil comme une brosse. Utiliser un petit Spot et adaptez transition et transition affaiblissement\nSeulement en mode NORMAL et éventuellement Teinte, Saturation, Couleur, Luminosité sont concernés par Fusion arrire plan (ΔE) TP_LOCALLAB_GRIDONE;Virage partiel TP_LOCALLAB_GRIDTWO;Direct +TP_LOCALLAB_GRIDMETH_TOOLTIP;Virage partiel: la luminance est prise en compte quand varie la chroma -Equivalent de H=f(H) si le "point blanc" sur la grille the grid est à zéro et vous faites varier le "point noir" -Equivalent de "Virage partiel" si vous faites varier les 2 points.\n\nDirect: agit directement sur la chroma TP_LOCALLAB_GUIDBL;Rayon adoucir TP_LOCALLAB_GUIDFILTER;Rayon Filtre Guidé TP_LOCALLAB_GUIDFILTER_TOOLTIP;Adapter cette valeur en fonction des images - peut réduire ou accroître les artéfacts. @@ -1990,6 +1998,7 @@ TP_LOCALLAB_LAPLACE;Laplacien seuil ΔE TP_LOCALLAB_LAPLACEXP;Laplacien seuil TP_LOCALLAB_LAPMASKCOL;Laplacien seuil TP_LOCALLAB_LAPRAD_TOOLTIP;Eviter d'utiliser Radius and Laplace Seuil en même temps.\nLaplacien seuil reduit le contraste, artéfacts, adoucit le résultat. +TP_LOCALLAB_LAPRAD1_TOOLTIP;Eviter d'utiliser Radius and Laplace Seuil en même temps.\nTransforme le masque pour éliminer les valeurs inférieures au seuil.\nReduit les artefacts et le bruit, et permet une modification du contraste local. TP_LOCALLAB_LAP_MASK_TOOLTIP;Résoud PDE (Equation aux dérivées partielles) pour tous les masques Laplacien.\nSi activé Laplacien masque seuil reduit les artéfacts et adoucit les résultats.\nSi désactivé réponse linaire. TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT améliore la qualité et autorise de grands rayons, mais accroît les temps de traitement.\nCe temps dépends de la surface devant être traitée.\nA utiliser de préférences pour de grands rayons.\n\nLes Dimensions peuvent être réduites de quelques pixels pour optimiser FFTW.\nCette optimisation peut réduire le temps de traitement d'un facteur de 1.5 à 10.\n TP_LOCALLAB_LC_TOOLNAME;Constraste Local & Ondelettes - 7 @@ -2005,7 +2014,7 @@ TP_LOCALLAB_LINEAR;Linéarité TP_LOCALLAB_LIST_NAME;Ajoute un outil au spot courant... TP_LOCALLAB_LIST_TOOLTIP;Vous pouvez choisir 3 niveaux de complexité pour chaque outil: Basic, Normal & Avancé.\nLe réglage par défaut est Basic mais il peut être changé dans Préférences.\nVous pouvez aussi changer ce niveau pour chaque outil en cours. TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Donne priorité à l'action sur les tons moyens et hautes lumières en choisissant les niveaux concernés d'ondelettes -TP_LOCALLAB_LMASK_LL_TOOLTIP;Give priority to action on midtones and high lights +TP_LOCALLAB_LMASK_LL_TOOLTIP;Vous permet de modifier librement le contraste du masque. Peut amener de artefacts. TP_LOCALLAB_LOCCONT;Masque Flou TP_LOCALLAB_LOC_CONTRAST;Contraste Local & Ondelettes TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pyramide 1: @@ -2039,6 +2048,7 @@ TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to a TP_LOCALLAB_MASK;Masque TP_LOCALLAB_MASK2;Courbe de Contraste TP_LOCALLAB_MASKCOL;Masque Courbes +TP_LOCALLAB_MASKCURVE_TOOLTIP;Si la courbe est au sommet, le masque est compétement noir aucune transformation n'est réalisée par le masque sur l'image.\nQuand vous descendez la courbe, progressivement le masque va se colorer et s'éclaicir, l'image change de plus en plus.\n\nIl est recommendé (pas obligatoire) de positionner le sommet des courbes curves sur la ligne de transition grise qui représnte les références (chroma, luma, couleur). TP_LOCALLAB_MASKH;Courbe teinte TP_LOCALLAB_MASK_TOOLTIP;Vous pouvez activer plusieurs masques pour un simple outil, ceci nécessite d'activer un autre outil (mais sans utilser l'outil : curseurs à 0,...)où est le masque que vous souhaitez activer.\n\nVous pouvez aussi dupliquer le RT-spot et le placer juste à côté de l'autre,les variations de références autorisent un travail fin sur les images. TP_LOCALLAB_MED;Medium @@ -2052,6 +2062,7 @@ TP_LOCALLAB_MERFOR;Couleur esquiver TP_LOCALLAB_MERFOU;Multiplier TP_LOCALLAB_MERGE1COLFRA;Fusion avec Original ou Précédent ou arrière plan TP_LOCALLAB_MERGECOLFRA;Masque: LCH & Structure +TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Vous permet de créer des masques basés sur les 3 courbes LCH et/ou un algorithm de détection de structure TP_LOCALLAB_MERGEFIV;Previous Spot(Mask 7) + Mask LCH TP_LOCALLAB_MERGEFOU;Previous Spot(Mask 7) TP_LOCALLAB_MERGEMER_TOOLTIP;Prend en compte ΔE pour fusionner les fichiers (équivalent de Etendue pour cet usage) @@ -2171,8 +2182,7 @@ TP_LOCALLAB_SENSIH;Etendue TP_LOCALLAB_SENSIH_TOOLTIP;Ajuste Etendue de l'action:\nLes petites valeurs limitent l'action aux couleurs très similaires à celles sous le centre du spot.\nHautes valeurs laissent l'outil agir sur une large plage de couleurs. TP_LOCALLAB_SENSILOG;Etendue TP_LOCALLAB_SENSIS;Etendue -TP_LOCALLAB_SENSIS_TOOLTIP;Ajuste Etendue de l'action:\nLes petites valeurs limitent l'action aux couleurs très similaires à celles sous le centre du spot.\nHautes valeurs laissent l'outil agir sur une large plage de couleurs.\nValeurs inférieures à 20 conduisent à un meilleur algorithme. -TP_LOCALLAB_SENSI_TOOLTIP;Ajuste Etendue de l'action:\nLes petites valeurs limitent l'action aux couleurs très similaires à celles sous le centre du spot.\nHautes valeurs laissent l'outil agir sur une large plage de couleurs.\nValeurs inférieures à 20 conduisent à un meilleur algorithme. +TP_LOCALLAB_SENSI_TOOLTIP;Ajuste Etendue de l'action:\nLes petites valeurs limitent l'action aux couleurs très similaires à celles sous le centre du spot.\nHautes valeurs laissent l'outil agir sur une large plage de couleurs. TP_LOCALLAB_SENSIMASK_TOOLTIP;Ajuste Etendue pour ce masque commun.\nAgit sur l'écart entre l'image originale et le masque.\nLes références (luma, chroma, teinte) sont celles du centre du RT-spot\n\nVous pouvez aussi agir sur le deltaE interne au masque avec 'Etendue Masque deltaE image' dans 'Réglages' TP_LOCALLAB_SETTINGS;Réglages TP_LOCALLAB_SH1;Ombres Lumières @@ -2182,6 +2192,8 @@ TP_LOCALLAB_SHADEXCOMP;Compression ombres & profondeur tonale TP_LOCALLAB_SHADHIGH;Ombres/Lumières - Egaliseur tonal TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Peut être utilisé - ou en complement - du module Exposition dans les cas difficiles.\nUtiliser réduction du bruit Denoise peut être nécessaire : éclaicir les ombres.\n\nPeut être utilisé comme un filtre gradué (augmenter Etendue) TP_LOCALLAB_SHAMASKCOL;Ombres +TP_LOCALLAB_SHADMASK_TOOLTIP;Relève les ombres du masque de la même manière que l'algorithme "ombres/lumières" +TP_LOCALLAB_SHADHMASK_TOOLTIP;Abaisse les hautes lumières du masque de la même manière que l'algorithme "ombres/lumières" TP_LOCALLAB_SHAPETYPE;Forme aire RT-spot TP_LOCALLAB_SHAPE_TOOLTIP;Ellipse est le mode normal.\nRectangle peut être utilé dans certains cas, par exemple pour travailler en image complète en conjonction avec les délimiteurs en dehors de la prévisualisation, transition = 100.\n\nPolygone - Beziers sont en attente de GUI... TP_LOCALLAB_SHARAMOUNT;Quantité @@ -2228,12 +2240,13 @@ TP_LOCALLAB_SH_TOOLNAME;Ombres/lumières & Egaliseur tonal - 5 TP_LOCALLAB_SIGMAWAV;Atténuation Réponse TP_LOCALLAB_SIM;Simple TP_LOCALLAB_SLOMASKCOL;Pente (slope) +TP_LOCALLAB_SLOMASK_TOOLTIP;Gamma et Pente (Slope) autorise une transformation du masque en douceur et sans artefacts en modifiant progressivement "L" pour éviter les discontinuité. TP_LOCALLAB_SLOSH;Pente TP_LOCALLAB_SOFT;Lumière douce - Original Retinex TP_LOCALLAB_SOFTM;Lumière douce (soft light) -//TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Original Retinex est très différent des autres méthodes Retinex.\nIl agit sur les gris et équilibre la luminance.\nC'est une émulation de "Dodge" and "Burn" TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Applique un mélange Lumière douce. Effectue une émulation de "dodge and burn" en utilisant l'algorithme original de retinex. TP_LOCALLAB_SOFTRADIUSCOL;Rayon adoucir +TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applique un filtre guidé à l'image de sortie pour réduire les éventuels artefacts. TP_LOCALLAB_SOFTRETI;Reduire artefact ΔE TP_LOCALLAB_SOFTRETI_TOOLTIP;Prend en compte ΔE pour améliorer Transmission map TP_LOCALLAB_SOFT_TOOLNAME;Lumière douce & Original Retinex - 6 @@ -2247,6 +2260,7 @@ TP_LOCALLAB_STR;Force TP_LOCALLAB_STRBL;Force TP_LOCALLAB_STREN;Compression Force TP_LOCALLAB_STRENG;Force +TP_LOCALLAB_STRENGRID_TOOLTIP;Vous pouvez ajuster l'effet désiré avec "force", mais vous pouvez aussi utiliser la fonction "Etendue" qui permet de délimiter l'action (par exemple, pour isoler une couleur particulière). TP_LOCALLAB_STRENGR;Force TP_LOCALLAB_STRENGTH;Bruit TP_LOCALLAB_STRGRID;Force @@ -2257,6 +2271,7 @@ TP_LOCALLAB_STRUCCOL1;Spot structure TP_LOCALLAB_STRUCT_TOOLTIP;Utilise l'algorithme de Sobel pour prendre en compte la structure dans la détection de forme.\nvous pouvez prévisualiser avec "masque et modifications - Montrer structure spot".\n\nPeut être utilisé avec masques (avancé) structure, flouter, ondelettes pour améliorer la détection de bords.\n\nA besoin de réglages sans-masque pour êtrre activé (luminosité, exposition...) TP_LOCALLAB_STRUMASKCOL;Structure force TP_LOCALLAB_STRUMASK_TOOLTIP;Génère un masque structure qui va différencier les aplats et reliefs.\nSi structure masque comme outil est activé, ce masque est untilisé en plus des autres outils (gamma, slope, courbe contraste ...) +TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Un usage modéré de ce curseur est recommandé! TP_LOCALLAB_STYPE;Forme méthode TP_LOCALLAB_STYPE_TOOLTIP;Vous pouvez choisir entre:\nSymétrique - gauche et droite sont liés, haut et bas sont liés.\nIndépendent - toutes les saisies sont indépendantes. TP_LOCALLAB_SYM;Symétrique (souris) @@ -2278,7 +2293,9 @@ TP_LOCALLAB_TONEMAP_TOOLTIP;Compression tonal - menu principal doit être désac TP_LOCALLAB_TONEMASCALE_TOOLTIP;Ce contrôle donne le pouvoir de différencier le contraste "local" et "global".\nPlus il est important, plus un détail sera accentué. TP_LOCALLAB_TONE_TOOLNAME;Compression tonale - 4 TP_LOCALLAB_TOOLCOL;Masque Structure comme outil +TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Autorise de modifier le masque s'il a été créé TP_LOCALLAB_TOOLMASK;Outils du masque +TP_LOCALLAB_TOOLMASK_TOOLTIP;Génère un masque structure qui va différencier les aplats et reliefs.\nSi structure masque comme outil est activé, ce masque est untilisé en plus des autres outils (gamma, slope, courbe contraste ...) TP_LOCALLAB_TRANSIT;Transition - Gradient TP_LOCALLAB_TRANSITGRAD;Transition différentiation XY TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Change la transition des abscisses vers les ordonnées @@ -2292,6 +2309,7 @@ TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission en accord à transmission.\nAbsci TP_LOCALLAB_USEMASK;Utiliser masque TP_LOCALLAB_VART;Variance (contraste) TP_LOCALLAB_VIBRANCE;Vibrance - Chaud & Froid +TP_LOCALLAB_VIBRA_TOOLTIP;Ajuste vibrance (Globalement identique à Couleur ajustement).\nAmène l'équivalent d'une balance des blancs en utilisant l'algorithme CIECAM. TP_LOCALLAB_VIB_TOOLNAME;Vibrance - Chaud & Froid - 3 TP_LOCALLAB_SOFT_TOOLNAME;Lumière douce & Original Retinex - 6 TP_LOCALLAB_BLUR_TOOLNAME;Flouter/Grain & Réduction du bruit - 1 @@ -2324,6 +2342,7 @@ TP_LOCALLAB_WAVHIGH;Ψ Ondelette haut TP_LOCALLAB_WAVLEV;Flouter par niveau TP_LOCALLAB_WAVLOW;Ψ Ondelette bas TP_LOCALLAB_WAVMASK;Ψ Niveau contraste local +TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Amplitude des niveaux d'ondelettes utilisés par “Local contrast” TP_LOCALLAB_WAVMASK_TOOLTIP;Autorise un travail fin sur les masques niveaux de contraste (structure) TP_LOCALLAB_WAVMED;Ψ Ondelette normal TP_LOCALLAB_WEDIANHI;Median Haut diff --git a/rtdata/languages/default b/rtdata/languages/default index 8a181e2a7..7f4edddd6 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2350,7 +2350,7 @@ TP_LOCALLAB_BLURDE;Blur shape detection TP_LOCALLAB_BLURLC;Luminance Only TP_LOCALLAB_BLURLEVELFRA;Blur Levels TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. -TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the "radius" of the Gaussian blur (0 to 500) +TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the "radius" of the Gaussian blur (0 to 1000) TP_LOCALLAB_BLURRESIDFRA;Blur Residual TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise - 1 TP_LOCALLAB_BLWH;All changes forced in Black-and-White @@ -2360,19 +2360,19 @@ TP_LOCALLAB_BUTTON_DEL;Delete TP_LOCALLAB_BUTTON_DUPL;Duplicate TP_LOCALLAB_BUTTON_REN;Rename TP_LOCALLAB_BUTTON_VIS;Show/Hide -TP_LOCALLAB_CBDL;Contrast by detail levels -TP_LOCALLAB_CBDLCLARI_TOOLTIP;Takes the midtones and enhance them. -TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Acts as a wavelet tools.\nThe first level (0) acts on 2x2 details.\nThe last level (5) acts on 64x64 details. -TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevent the sharpening of noise +TP_LOCALLAB_CBDL;Contrast by Detail Levels +TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise TP_LOCALLAB_CBDL_TOOLNAME;CBDL - 2 TP_LOCALLAB_CENTER_X;Center X TP_LOCALLAB_CENTER_Y;Center Y TP_LOCALLAB_CH;Curves CL - LC TP_LOCALLAB_CHROMA;Chrominance TP_LOCALLAB_CHROMABLU;Chroma levels -TP_LOCALLAB_CHROMABLU_TOOLTIP;Acts as an amplifier-reducer action compare to settings of luma.\nUnder 1 reduce, above 1 amplifie +TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. TP_LOCALLAB_CHROMACBDL;Chroma -TP_LOCALLAB_CHROMACB_TOOLTIP;Acts as an amplifier-reducer action compare to sliders of luminance.\nUnder 100 reduce, above 100 amplifie +TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. TP_LOCALLAB_CHROMALEV;Chroma levels TP_LOCALLAB_CHROMASKCOL;Chroma TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). @@ -2407,7 +2407,7 @@ TP_LOCALLAB_CONTCOL;Contrast threshold TP_LOCALLAB_CONTFRA;Contrast by Level TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted depending on the texture. TP_LOCALLAB_CONTRAST;Contrast -TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely modify the contrast of the mask (gamma & slope), instead of using a continuous & progressive curve. However it can create artifacts that have to be dealt with using the “Smooth radius” or “Laplacian threshold sliders”. +TP_LOCALLAB_CONTRASTCURVMASK1_TOOLTIP;Allows you to freely modify the contrast of the mask (gamma & slope), instead of using a continuous & progressive curve. However it can create artifacts that have to be dealt with using the “Smooth radius” or “Laplacian threshold sliders”. TP_LOCALLAB_CONTRESID;Contrast TP_LOCALLAB_CONTTHR;Contrast Threshold TP_LOCALLAB_CONTWFRA;Local contrast @@ -2451,7 +2451,7 @@ TP_LOCALLAB_ENH;Enhanced TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise TP_LOCALLAB_EPSBL;Detail TP_LOCALLAB_EQUIL;Normalize Luminance -TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance in such a way that the mean and the variance of the output image is identical to that of the original. +TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and the variance of the output image is identical to that of the original. TP_LOCALLAB_ESTOP;Edge stopping TP_LOCALLAB_EV_DUPL;Copy of TP_LOCALLAB_EV_NVIS;Hide @@ -2464,7 +2464,7 @@ TP_LOCALLAB_EXCLUTYPE;Spot method TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode TP_LOCALLAB_EXECLU;Excluding spot TP_LOCALLAB_EXNORM;Normal spot -TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens. +TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). TP_LOCALLAB_EXPCHROMA;Chroma compensation TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with ‘Exposure compensation f’ and ‘Contrast Attenuator f’ to avoid desaturating colors. TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. @@ -2486,7 +2486,7 @@ TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace tr TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools -TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high decay transition values and scope to simulate small RT-spot. +TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high ‘Transition decay’ and ‘Scope’ values to simulate smaller RT-spots. TP_LOCALLAB_EXPTOOL;Exposure Tools TP_LOCALLAB_EXPTRC;Tone Response Curve - TRC TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure - 10 @@ -2571,7 +2571,7 @@ TP_LOCALLAB_LINEAR;Linearity TP_LOCALLAB_LIST_NAME;Add tool to current spot... TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard & Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Give priority to action on midtones and high lights and by choosing the concerned wavelet levels -TP_LOCALLAB_LMASK_LL_TOOLTIP;Give priority to action on midtones and high lights +TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask. May create artifacts. TP_LOCALLAB_LOCCONT;Unsharp Mask TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pyramid 1: @@ -2813,7 +2813,7 @@ TP_LOCALLAB_SPOTNAME;New Spot TP_LOCALLAB_STD;Standard TP_LOCALLAB_STR;Strength TP_LOCALLAB_STRBL;Strength -TP_LOCALLAB_STREN;Compression Strength +TP_LOCALLAB_STREN;Compression strength TP_LOCALLAB_STRENG;Strength TP_LOCALLAB_STRENGR;Strength TP_LOCALLAB_STRENGTH;Noise @@ -2842,11 +2842,11 @@ TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Var TP_LOCALLAB_TM;Tone Mapping TP_LOCALLAB_TM_MASK;Use transmission map TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox "Structure mask as tool" checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the "Structure mask" behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. -TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This parameter affects sensitivity to edges.\n The greater it is the more likely an illumination change is to be considered an "edge".\n If set to zero tone mapping will have an effect similar to unsharp masking. -TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Gamma moves the action of tone-mapping to shadows or highlights. +TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an "edge".\n If set to zero the tone mapping will have an effect similar to unsharp masking. +TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. -TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main menu tool must be de-activated if this tool is used. -TP_LOCALLAB_TONEMASCALE_TOOLTIP;This control gives meaning to the difference between "local" and "global" contrast.\nThe greater it is the larger a detail needs to be in order to be boosted +TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between "local" and "global" contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 TP_LOCALLAB_TOOLCOL;Structure mask as tool TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allow you to modify the mask, if one exist From 5ce65f5450f6faf15ad28534b469c5369752e94f Mon Sep 17 00:00:00 2001 From: Thanatomanic <6567747+Thanatomanic@users.noreply.github.com> Date: Sat, 3 Oct 2020 17:34:32 +0200 Subject: [PATCH 131/185] camconst support for Canon EOS R (fixes #5922) --- rtengine/camconst.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index eca17a238..b3a8d6c79 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1144,9 +1144,12 @@ Camera constants: "raw_crop": [ 144, 72, 6984, 4660 ] }, - { // Quality C, only raw crop + { // Quality B, samples by jonathanBieler (#5922). No dual-pixel information. "make_model": [ "Canon EOS R" ], - "raw_crop": [ 144, 46, 6744, 4500 ] + "dcraw_matrix" : [ 8293, -1789, -1094, -5025, 12925, 2327, -1199, 2769, 6108 ], // DNG v2 style + "raw_crop": [ 144, 46, 6744, 4500 ], + "masked_areas": [ 50, 40, 4540, 140 ], // Taken from ART + "ranges" : { "white" : 16367 } // Typically 16383 without LENR, with LENR safest value is 15800 for ISO 25600 }, { // Quality C From edbf701264961d04e3b3cbb1fa5d715856a9f056 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sat, 3 Oct 2020 22:37:13 -0700 Subject: [PATCH 132/185] Improve style of scope buttons Keep all buttons at the same place and use darkened button background instead of tiny icons to indicate which scope type is active. --- .../images/svg/histogram-bayer-off-small.svg | 139 ------------------ .../histogram-type-histogram-off-small.svg | 122 --------------- ...=> histogram-type-histogram-raw-small.svg} | 0 .../svg/histogram-type-parade-off-small.svg | 132 ----------------- ...istogram-type-vectorscope-hc-off-small.svg | 131 ----------------- ...istogram-type-vectorscope-hs-off-small.svg | 135 ----------------- .../svg/histogram-type-waveform-off-small.svg | 122 --------------- rtdata/themes/RawTherapee-GTK3-20_.css | 13 ++ rtdata/themes/TooWaBlue-GTK3-20_.css | 20 +++ rtgui/histogrampanel.cc | 91 +++--------- rtgui/histogrampanel.h | 13 -- 11 files changed, 53 insertions(+), 865 deletions(-) delete mode 100644 rtdata/images/svg/histogram-bayer-off-small.svg delete mode 100644 rtdata/images/svg/histogram-type-histogram-off-small.svg rename rtdata/images/svg/{histogram-bayer-on-small.svg => histogram-type-histogram-raw-small.svg} (100%) delete mode 100644 rtdata/images/svg/histogram-type-parade-off-small.svg delete mode 100644 rtdata/images/svg/histogram-type-vectorscope-hc-off-small.svg delete mode 100644 rtdata/images/svg/histogram-type-vectorscope-hs-off-small.svg delete mode 100644 rtdata/images/svg/histogram-type-waveform-off-small.svg diff --git a/rtdata/images/svg/histogram-bayer-off-small.svg b/rtdata/images/svg/histogram-bayer-off-small.svg deleted file mode 100644 index 5d6c439fb..000000000 --- a/rtdata/images/svg/histogram-bayer-off-small.svg +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - Maciej Dworak - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/histogram-type-histogram-off-small.svg b/rtdata/images/svg/histogram-type-histogram-off-small.svg deleted file mode 100644 index 456ead7e2..000000000 --- a/rtdata/images/svg/histogram-type-histogram-off-small.svg +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - Lawrence Lee - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/histogram-bayer-on-small.svg b/rtdata/images/svg/histogram-type-histogram-raw-small.svg similarity index 100% rename from rtdata/images/svg/histogram-bayer-on-small.svg rename to rtdata/images/svg/histogram-type-histogram-raw-small.svg diff --git a/rtdata/images/svg/histogram-type-parade-off-small.svg b/rtdata/images/svg/histogram-type-parade-off-small.svg deleted file mode 100644 index 015960fcc..000000000 --- a/rtdata/images/svg/histogram-type-parade-off-small.svg +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - Lawrence Lee - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/histogram-type-vectorscope-hc-off-small.svg b/rtdata/images/svg/histogram-type-vectorscope-hc-off-small.svg deleted file mode 100644 index 3a105a671..000000000 --- a/rtdata/images/svg/histogram-type-vectorscope-hc-off-small.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - Lawrence Lee - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/histogram-type-vectorscope-hs-off-small.svg b/rtdata/images/svg/histogram-type-vectorscope-hs-off-small.svg deleted file mode 100644 index 253d2d9c3..000000000 --- a/rtdata/images/svg/histogram-type-vectorscope-hs-off-small.svg +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - Lawrence Lee - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/histogram-type-waveform-off-small.svg b/rtdata/images/svg/histogram-type-waveform-off-small.svg deleted file mode 100644 index 787d6fe09..000000000 --- a/rtdata/images/svg/histogram-type-waveform-off-small.svg +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - Lawrence Lee - - - - - - - - RawTherapee icon. - - - - - - - - - - - - - - - - - - diff --git a/rtdata/themes/RawTherapee-GTK3-20_.css b/rtdata/themes/RawTherapee-GTK3-20_.css index 76f0004ee..07877c33f 100644 --- a/rtdata/themes/RawTherapee-GTK3-20_.css +++ b/rtdata/themes/RawTherapee-GTK3-20_.css @@ -720,6 +720,19 @@ flowboxchild:selected { margin: 0; } +/* Copied from button.flat style. */ +button.radio#histButton { + background-image: none; +} + +button.radio#histButton:checked { + background-image: linear-gradient(#343434, #2E2E2E, #292929); +} + +button.radio#histButton:hover { + background-image: linear-gradient(shade(#343434,1.3), shade(#2E2E2E,1.3), shade(#292929,1.3)); +} + /*** end ***************************************************************************************/ #MyExpander { diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index ce4bb8d28..af3445650 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -453,6 +453,26 @@ filechooser placessidebar list row:selected { padding-bottom: 0.25em; margin: 0; } +/* Copied from button.flat style. */ +button.radio#histButton { + border: 0.083333333333333333em solid transparent; + box-shadow: none; + background-image: none; + background-color: transparent; +} +button.radio#histButton:hover { + border-color: @bg-button-border; + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.1); + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); + background-color: @bg-button-hover; +} +button.radio#histButton:active, +button.radio#histButton:checked { + border-color: @bg-button-border; + box-shadow: inset 0 0.1em rgba(242, 242, 242, 0.08); + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); + background-color: @bg-button-active; +} /*** end ***************************************************************************************/ diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 480a80c92..8946a5e35 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -128,18 +128,12 @@ HistogramPanel::HistogramPanel () : mode1Image = new RTImage ("histogram-mode-logx-small.png"); mode2Image = new RTImage ("histogram-mode-logxy-small.png"); - histImageOn.reset(new RTImage("histogram-type-histogram-small.png")); - histRawImageOn.reset(new RTImage("histogram-bayer-on-small.png")); - paradeImageOn.reset(new RTImage("histogram-type-parade-small.png")); - waveImageOn.reset(new RTImage("histogram-type-waveform-small.png")); - vectHcImageOn.reset(new RTImage("histogram-type-vectorscope-hc-small.png")); - vectHsImageOn.reset(new RTImage("histogram-type-vectorscope-hs-small.png")); - histImageOff.reset(new RTImage("histogram-type-histogram-off-small.png")); - histRawImageOff.reset(new RTImage("histogram-bayer-off-small.png")); - paradeImageOff.reset(new RTImage("histogram-type-parade-off-small.png")); - waveImageOff.reset(new RTImage("histogram-type-waveform-off-small.png")); - vectHcImageOff.reset(new RTImage("histogram-type-vectorscope-hc-off-small.png")); - vectHsImageOff.reset(new RTImage("histogram-type-vectorscope-hs-off-small.png")); + Gtk::Image* histImage = Gtk::manage(new RTImage("histogram-type-histogram-small.png")); + Gtk::Image* histRawImage = Gtk::manage(new RTImage("histogram-type-histogram-raw-small.png")); + Gtk::Image* paradeImage = Gtk::manage(new RTImage("histogram-type-parade-small.png")); + Gtk::Image* waveImage = Gtk::manage(new RTImage("histogram-type-waveform-small.png")); + Gtk::Image* vectHcImage = Gtk::manage(new RTImage("histogram-type-vectorscope-hc-small.png")); + Gtk::Image* vectHsImage = Gtk::manage(new RTImage("histogram-type-vectorscope-hs-small.png")); showRed = Gtk::manage (new Gtk::ToggleButton ()); showGreen = Gtk::manage (new Gtk::ToggleButton ()); @@ -249,36 +243,30 @@ HistogramPanel::HistogramPanel () : showMode->set_image(*mode1Image); else showMode->set_image(*mode2Image); - scopeHistBtn->set_image(*histImageOff); - scopeHistRawBtn->set_image(*histRawImageOff); - scopeParadeBtn->set_image(*paradeImageOff); - scopeWaveBtn->set_image(*waveImageOff); - scopeVectHcBtn->set_image(*vectHcImageOff); - scopeVectHsBtn->set_image(*vectHsImageOff); + scopeHistBtn->set_image(*histImage); + scopeHistRawBtn->set_image(*histRawImage); + scopeParadeBtn->set_image(*paradeImage); + scopeWaveBtn->set_image(*waveImage); + scopeVectHcBtn->set_image(*vectHcImage); + scopeVectHsBtn->set_image(*vectHsImage); switch(options.histogramScopeType) { case ScopeType::HISTOGRAM: scopeHistBtn->set_active(); - scopeHistBtn->set_image(*histImageOn); break; case ScopeType::HISTOGRAM_RAW: scopeHistRawBtn->set_active(); - scopeHistRawBtn->set_image(*histRawImageOn); break; case ScopeType::PARADE: scopeParadeBtn->set_active(); - scopeParadeBtn->set_image(*paradeImageOn); break; case ScopeType::WAVEFORM: scopeWaveBtn->set_active(); - scopeWaveBtn->set_image(*waveImageOn); break; case ScopeType::VECTORSCOPE_HS: scopeVectHsBtn->set_active(); - scopeVectHsBtn->set_image(*vectHsImageOn); break; case ScopeType::VECTORSCOPE_HC: scopeVectHcBtn->set_active(); - scopeVectHcBtn->set_image(*vectHcImageOn); break; case ScopeType::NONE: break; @@ -294,6 +282,13 @@ HistogramPanel::HistogramPanel () : setExpandAlignProperties(showMode , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(scopeOptions, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(showBAR , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(scopeOptions, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + setExpandAlignProperties(scopeHistBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + setExpandAlignProperties(scopeHistRawBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + setExpandAlignProperties(scopeParadeBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + setExpandAlignProperties(scopeWaveBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + setExpandAlignProperties(scopeVectHcBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + setExpandAlignProperties(scopeVectHsBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); setExpandAlignProperties(persistentButtons, false, true, Gtk::ALIGN_START, Gtk::ALIGN_FILL); setExpandAlignProperties(optionButtons, false, true, Gtk::ALIGN_START, Gtk::ALIGN_FILL); @@ -321,7 +316,7 @@ HistogramPanel::HistogramPanel () : optionButtons->add(*showBAR); Gtk::VSeparator* separator = Gtk::manage(new Gtk::VSeparator()); - setExpandAlignProperties(separator, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_END); + setExpandAlignProperties(separator, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); persistentButtons->add(*scopeHistBtn); persistentButtons->add(*scopeHistRawBtn); persistentButtons->add(*scopeParadeBtn); @@ -495,52 +490,6 @@ void HistogramPanel::type_selected(Gtk::RadioButton* button) return; } - switch (options.histogramScopeType) { - case ScopeType::HISTOGRAM: - scopeHistBtn->set_image(*histImageOff); - break; - case ScopeType::HISTOGRAM_RAW: - scopeHistRawBtn->set_image(*histRawImageOff); - break; - case ScopeType::PARADE: - scopeParadeBtn->set_image(*paradeImageOff); - break; - case ScopeType::WAVEFORM: - scopeWaveBtn->set_image(*waveImageOff); - break; - case ScopeType::VECTORSCOPE_HC: - scopeVectHcBtn->set_image(*vectHcImageOff); - break; - case ScopeType::VECTORSCOPE_HS: - scopeVectHsBtn->set_image(*vectHsImageOff); - break; - case ScopeType::NONE: - break; - } - - switch (new_type) { - case ScopeType::HISTOGRAM: - scopeHistBtn->set_image(*histImageOn); - break; - case ScopeType::HISTOGRAM_RAW: - scopeHistRawBtn->set_image(*histRawImageOn); - break; - case ScopeType::PARADE: - scopeParadeBtn->set_image(*paradeImageOn); - break; - case ScopeType::WAVEFORM: - scopeWaveBtn->set_image(*waveImageOn); - break; - case ScopeType::VECTORSCOPE_HC: - scopeVectHcBtn->set_image(*vectHcImageOn); - break; - case ScopeType::VECTORSCOPE_HS: - scopeVectHsBtn->set_image(*vectHsImageOn); - break; - case ScopeType::NONE: - break; - } - options.histogramScopeType = new_type; type_changed(); diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 5ecf378b8..7cf1c5e6f 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -292,19 +292,6 @@ protected: Gtk::Image *barImage_g; Gtk::Image *chroImage_g; - std::unique_ptr histImageOn; - std::unique_ptr histRawImageOn; - std::unique_ptr paradeImageOn; - std::unique_ptr waveImageOn; - std::unique_ptr vectHcImageOn; - std::unique_ptr vectHsImageOn; - std::unique_ptr histImageOff; - std::unique_ptr histRawImageOff; - std::unique_ptr paradeImageOff; - std::unique_ptr waveImageOff; - std::unique_ptr vectHcImageOff; - std::unique_ptr vectHsImageOff; - Gtk::Image *mode0Image; Gtk::Image *mode1Image; Gtk::Image *mode2Image; From f168c9b48fab72962a107272825447d9b6841c3d Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 4 Oct 2020 21:15:01 +0200 Subject: [PATCH 133/185] Local adjustments - tooltip and GUI for blur denoise (#5932) * Change tooltip french * Update labels tooltip french * Changes TM - sharp - CBDL * Others changes TM CBDL * French tooltip denoise - blur * Change french tooltips denoise blur * Change combobox blurmethod by checkbox invbl * Change tooltip blur-denoise * another change denoise tooltip * Change one tooltip luminance noise reduction --- rtdata/languages/Francais | 19 ++++++++++-- rtdata/languages/default | 33 +++++++++++++++----- rtengine/iplocallab.cc | 15 ++++++--- rtengine/procevents.h | 2 ++ rtengine/procparams.cc | 4 +++ rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 4 ++- rtgui/locallabtools.cc | 64 +++++++++++++++++++++++++++++++++++++-- rtgui/locallabtools.h | 4 ++- rtgui/paramsedited.cc | 7 +++++ rtgui/paramsedited.h | 1 + 11 files changed, 137 insertions(+), 17 deletions(-) diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index ddec6087c..e6aae15b5 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -1875,7 +1875,16 @@ TP_LOCALLAB_DELTAD;Delta balance TP_LOCALLAB_DELTAEC;Masque ΔE Image TP_LOCALLAB_DENOIS;Ψ Réduction du bruit TP_LOCALLAB_DENOI_EXP;Réduction du bruit +TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservatif préserve les fréquences basses, alors que agressif tend à les effacer +TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Equilibre l'action de denoise luminance entre les ombres et les lumières TP_LOCALLAB_DENOI_TOOLTIP;Ce module peut être utilisé seul (à la fin du processus), ou en complément de Réduction du bruit (au début).\nEtendue(deltaE)permet de différencier l'action.\nVous pouvez compléter avec "median" ou "Filtre guidé" (Adoucir Flou...).\nVous pouvez compléter l'action avec "Flou niveaux" "Ondelette pyramide" +TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Permet de récupérer les détails de luminance par mise en oeuvre progressive de la transformée de Fourier (DCT) +TP_LOCALLAB_DENOICHROF_TOOLTIP;Agit sur les fins détails du bruit de chrominance +TP_LOCALLAB_DENOICHROC_TOOLTIP;Agit sur les paquets et amas de bruit de chrominance +TP_LOCALLAB_DENOICHRODET_TOOLTIP;Permet de récupérer les détails de chrominance par mise en oeuvre progressive de la transformée de Fourier (DCT) +TP_LOCALLAB_DENOITHR_TOOLTIP;Règle l'effet de bord pour privilégier l'action sur les aplats +TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Equilibre l'action de denoise chrominance entre les bleus-jaunes et les rouges-verts +TP_LOCALLAB_DENOIBILAT_TOOLTIP;Traite le bruit d'impulsion (poivre et sel) TP_LOCALLAB_DEPTH;Profondeur TP_LOCALLAB_DETAIL;Contrast local TP_LOCALLAB_DETAILSH;Details @@ -1905,11 +1914,9 @@ TP_LOCALLAB_EXCLUTYPE;Spot méthode TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Spot Normal utilise les données récursives.\n\nSpot exclusion réinitialise les données d'origine.\nPeut être utilsé pour annuler totalement ou partiellement une action précédente ou pour réaliser un mode inverse TP_LOCALLAB_EXECLU;Spot Exclusion TP_LOCALLAB_EXNORM;Spot Normal -//TP_LOCALLAB_EXPCBDL_TOOLTIP;Dans le cas d'un capteur contaminé ("graisse"), et qaund la surface est importante ou pourune série de petits défauts.\n\na) Mettre la sélection du spot sur un défaut prononcé (adapter la taille si nécessaire), utilise run spot suffisament grand qui autorise les ondelettes; b) choisir une aire suffisament grande pour couvrir largement la zone affectée par les défauts; c) Choisir une valeur de transition (basse) et une transition affaiblissement (haute); d) agir sur les niveaux 2, 3, 4 or 5 ou^plus bas en réduisant le the contrast (valeurs en dessous de 100) agir sur le curseur chroma si nécessaire. e)possibilité d'agir sur "Etendue" pour réduire la zone d'action.\n\nVous pouvez aussi compléter avec "Flou niveaux" et Flouu Gaussien (Adoucir Flou et bruit) TP_LOCALLAB_EXPCBDL_TOOLTIP;Peut être utilisé pour retirer les marques sur le capteur ou la lentille. TP_LOCALLAB_EXPCHROMA;Chroma compensation TP_LOCALLAB_EXPCHROMA_TOOLTIP;Seulement en association avec compensation d'exposition et PDE Ipol.\nEvite la desaturation des couleurs -//TP_LOCALLAB_EXPCOLOR_TOOLTIP;Dans le cas de petits défauts.\n\nYeux-rouges : sélecteur centré sur la partie rouge, délimiteurs du spot près de l'oeil, adaptez Etendue, "luminosité" -100, "chrominance" -100.\n\nSpotIR :sélection Circulaire centrée sur le défaut, délimiteurs du spot proches du default - reduire "chrominance", possibilté d'agir sur Etendue pour réduire la zone de l'action.\n\nPoussières - graisse (petit) :Sélection circulaire centrée sur le défaut (adapter la taille du spot), délimiteurs du spot pas trop près du défaut pour permettre une transition quasi invisible. a) "Transition" (faibles valeurs) and "Transition affaiblissement" (hautes valeurs); b) agir sur "luminosité" et aussi sur "chrominance" ou sur "Grille de correction couleur - direct" de telle manière que le rendu de la zone polluée soit proche de celui de la zone saine; c) agir modérement sur "Etendue" pour moduler l'action.\n\nVous pouvez aussi compléter avec Flouter Gaussien (Adoucir Flouter et bruit) TP_LOCALLAB_EXPCOLOR_TOOLTIP;Ajuste les couleurs, la luminosité, le contrast et corrige les petits défauts tels que teux-rouges, poussières sur le capteur, etc. TP_LOCALLAB_EXPCOMP;Compensation d'exposition ƒ TP_LOCALLAB_EXPCOMPINV;Compensation d'exposition @@ -1971,6 +1978,7 @@ TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Filttre Teinte force TP_LOCALLAB_GRADSTRLUM;Force Gradient Luminance TP_LOCALLAB_GRADSTR_TOOLTIP;Force Filtre en Ev TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +TP_LOCALLAB_GRAIN_TOOLTIP;Ajoute du grain pour simuler un film TP_LOCALLAB_GRALWFRA;Filtre Gradué Local contraste TP_LOCALLAB_GRIDFRAME_TOOLTIP;Vous pouvez utiliser cet outil comme une brosse. Utiliser un petit Spot et adaptez transition et transition affaiblissement\nSeulement en mode NORMAL et éventuellement Teinte, Saturation, Couleur, Luminosité sont concernés par Fusion arrire plan (ΔE) TP_LOCALLAB_GRIDONE;Virage partiel @@ -1979,6 +1987,9 @@ TP_LOCALLAB_GRIDMETH_TOOLTIP;Virage partiel: la luminance est prise en compte qu TP_LOCALLAB_GUIDBL;Rayon adoucir TP_LOCALLAB_GUIDFILTER;Rayon Filtre Guidé TP_LOCALLAB_GUIDFILTER_TOOLTIP;Adapter cette valeur en fonction des images - peut réduire ou accroître les artéfacts. +TP_LOCALLAB_GUIDBL_TOOLTIP;Applique un filtre guidé avec un rayon donné, pour réduire les artefacts ou flouter l'image +TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Force du filtre guidé +TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Détail - agit sur la répartition du filtre guidé, les valeurs négatives simulent un flou gaussien TP_LOCALLAB_HHMASK_TOOLTIP;Ajustements fin de la teinte par exemple pour la peau. TP_LOCALLAB_HIGHMASKCOL;Hautes lumières masque TP_LOCALLAB_HLH;Courbes H @@ -1986,6 +1997,7 @@ TP_LOCALLAB_IND;Independant (souris) TP_LOCALLAB_INDSL;Independant (souris + curseurs) TP_LOCALLAB_INVERS;Inverse TP_LOCALLAB_INVERS_TOOLTIP;Si sélectionné (inverse) moins de possibilités.\n\nAlternative\nPremier Spot:\n image entière - delimiteurs en dehors de la prévisualisation\n RT-spot forme sélection : rectangle. Transition 100\n\nDeuxième spot : Spot Exclusion +TP_LOCALLAB_INVBL_TOOLTIP;Alternative\nPremier Spot:\n image entière - delimiteurs en dehors de la prévisualisation\n RT-spot forme sélection : rectangle. Transition 100\n\nDeuxième spot : Spot Exclusion TP_LOCALLAB_ISOGR;Plus gros (ISO) TP_LOCALLAB_LABBLURM;Masque Flouter TP_LOCALLAB_LABEL;Ajustements Locaux @@ -2053,6 +2065,8 @@ TP_LOCALLAB_MASKH;Courbe teinte TP_LOCALLAB_MASK_TOOLTIP;Vous pouvez activer plusieurs masques pour un simple outil, ceci nécessite d'activer un autre outil (mais sans utilser l'outil : curseurs à 0,...)où est le masque que vous souhaitez activer.\n\nVous pouvez aussi dupliquer le RT-spot et le placer juste à côté de l'autre,les variations de références autorisent un travail fin sur les images. TP_LOCALLAB_MED;Medium TP_LOCALLAB_MEDIAN;Median Bas +TP_LOCALLAB_MEDIAN_TOOLTIP;Choisir un median 3x3 à 9x9: plus les valeurs sont élévées, plus la réduction du bruit ou le flou seront marqués +TP_LOCALLAB_MEDIANITER_TOOLTIP;Nombre d'applications successives du median TP_LOCALLAB_MEDNONE;Rien TP_LOCALLAB_MERCOL;Couleur TP_LOCALLAB_MERDCOL;Fusion arrière plan (ΔE) @@ -2102,6 +2116,7 @@ TP_LOCALLAB_MRTHR;Image Originale TP_LOCALLAB_MRTWO;Short Curves 'L' Mask TP_LOCALLAB_MULTIPL_TOOLTIP;Autorise la retouche des tons sur une large plage : -18EV +4EV. Le remier curseur agit sur -18EV and -6EV. Le dernier curseur agit sur les tons au-dessus de 4EV TP_LOCALLAB_NEIGH;Rayon +TP_LOCALLAB_NOISE_TOOLTIP;Ajoute du bruit de luminance TP_LOCALLAB_NOISECHROCOARSE;Chroma gros (Ond) TP_LOCALLAB_NOISECHROC_TOOLTIP;Si supérieur à zéro, algorithme haute qualité est activé.\nGros est sélectionné si curseur >=0.2 TP_LOCALLAB_NOISECHRODETAIL;Récupération des détails Chroma (DCT ƒ) diff --git a/rtdata/languages/default b/rtdata/languages/default index 7f4edddd6..ca66fb2ce 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1154,6 +1154,7 @@ HISTORY_MSG_955;Local - Enable Spot HISTORY_MSG_956;Local - CH Curve HISTORY_MSG_957;Local - Denoise mode HISTORY_MSG_958;Local - Show/hide settings +HISTORY_MSG_959;Local - Inverse blur HISTORY_MSG_BLSHAPE;Blur by level HISTORY_MSG_BLURCWAV;Blur chroma HISTORY_MSG_BLURWAV;Blur luminance @@ -2341,7 +2342,7 @@ TP_LOCALLAB_BLNOI_EXP;Blur & Noise TP_LOCALLAB_BLNORM;Normal TP_LOCALLAB_BLSYM;Symmetric TP_LOCALLAB_BLUFR;Blur/Grain & Denoise -TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n*Blur the background by a RT-spot fully covering the image (high values for scope and transition) - normal or inverse.\n*Isolate the foreground by one or more excluding RT-spot with the tools you want (increse scope).\n\nThis module can be used in additional noise reduction,including "median" and "Guided filter" +TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n*blur the background by completely covering the image with an an RT-spot (high values for scope and transition and ‘Normal’ or ‘Inverse’ in checkbox).\n*Isolate the foreground by using one or more ‘Excluding’ RT-spot(s) and increase the scope.\n\nThis module (including the "median" and "Guided filter") can be used in addition to the main-menu noise reduction. TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain TP_LOCALLAB_BLURCBDL;Blur levels 0-1-2-3-4 TP_LOCALLAB_BLURCOL;Radius @@ -2434,11 +2435,20 @@ TP_LOCALLAB_DELTAD;Delta balance TP_LOCALLAB_DELTAEC;ΔE Image mask TP_LOCALLAB_DENOIS;Ψ Denoise TP_LOCALLAB_DENOI_EXP;Denoise -TP_LOCALLAB_DENOI_TOOLTIP;This module can be used alone (at the end of process), or in complement of main denoise (at the beginning).\nScope allows to differentiate the action according to the color (deltaE).\nYou can complete the action with "median" or "Guided Filter" (Smooth Blur...).\nYou can complete the action with "Blur levels" "Wavelet pyramid" +TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. “Aggressive” mode removes low frequency detail. +TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (deltaE).\n\n You can refine the result with a "Median filter" or a "Guided Filter" (Soft radius). +TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise +TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or ‘salt & pepper’ noise. TP_LOCALLAB_DEPTH;Depth TP_LOCALLAB_DETAIL;Local contrast TP_LOCALLAB_DETAILSH;Details -TP_LOCALLAB_DETAILTHR;Luminance & Chroma detail threshold (DCT ƒ) +TP_LOCALLAB_DETAILTHR;Luminance & chroma detail threshold (DCT ƒ) TP_LOCALLAB_DUPLSPOTNAME;Copy TP_LOCALLAB_EDGFRA;Edge Sharpness TP_LOCALLAB_EDGSHOW;Show all tolls @@ -2527,6 +2537,7 @@ TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength TP_LOCALLAB_GRADSTRLUM;Luminance gradient strength TP_LOCALLAB_GRADSTR_TOOLTIP;Filter strength in stops +TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image TP_LOCALLAB_GRAINFRA;Film Grain 1:1 TP_LOCALLAB_GRALWFRA;Graduated Filter Local contrast TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use small spot and adapt transition and transition decay\nOnly mode NORMAL and eventually Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE) @@ -2534,15 +2545,20 @@ TP_LOCALLAB_GRIDONE;Color Toning TP_LOCALLAB_GRIDTWO;Direct TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma -Equivalent to H=f(H) if the "white dot" on the grid remains at zero and you only vary the "black dot"-Equivalent to "Color toning" if you vary the 2 dots.\n\nDirect: acts directly on the chroma TP_LOCALLAB_GUIDBL;Soft radius +TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. TP_LOCALLAB_GUIDFILTER;Guided filter radius TP_LOCALLAB_GUIDFILTER_TOOLTIP;Adapt this values according to images - can reduce or increase artifacts. +TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. TP_LOCALLAB_HIGHMASKCOL;Highlights TP_LOCALLAB_HLH;Curves H TP_LOCALLAB_IND;Independent (mouse) TP_LOCALLAB_INDSL;Independent (mouse + sliders) TP_LOCALLAB_INVERS;Inverse +TP_LOCALLAB_INVBL;Inverse TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n full image - delimiter outside preview\n RT-spot shape: rectangle. Transition 100\n\nSecond spot : Excluding spot +TP_LOCALLAB_INVBL_TOOLTIP;Alternative to ‘Inverse’ mode: use two spots\nFirst Spot:\n full image - delimiter outside preview\n RT-spot shape: rectangle. Transition 100\n\nSecond spot : Excluding spot TP_LOCALLAB_ISOGR;Coarseness (ISO) TP_LOCALLAB_LABBLURM;Blur Mask TP_LOCALLAB_LABEL;Local Adjustments @@ -2611,6 +2627,8 @@ TP_LOCALLAB_MASKH;Hue curve TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ) \n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. TP_LOCALLAB_MED;Medium TP_LOCALLAB_MEDIAN;Median Low +TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. TP_LOCALLAB_MEDNONE;None TP_LOCALLAB_MERCOL;Color TP_LOCALLAB_MERDCOL;Merge background (ΔE) @@ -2661,10 +2679,11 @@ TP_LOCALLAB_MRTHR;Original Image TP_LOCALLAB_MRTWO;Short Curves 'L' Mask TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV TP_LOCALLAB_NEIGH;Radius +TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02 TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery (DCT ƒ) -TP_LOCALLAB_NOISECHROFINE;Fine chroma(Wav) +TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) TP_LOCALLAB_NOISEDETAIL_TOOLTIP;Disabled if slider = 100 TP_LOCALLAB_NOISELEQUAL;Equalizer white-black TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) @@ -2692,7 +2711,7 @@ TP_LOCALLAB_PROXI;ΔE decay TP_LOCALLAB_QUALCURV_METHOD;Curve type TP_LOCALLAB_QUAL_METHOD;Global quality TP_LOCALLAB_RADIUS;Radius -TP_LOCALLAB_RADIUS_TOOLTIP;Above Radius 30 Use Fast Fourier Transform +TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30 TP_LOCALLAB_RADMASKCOL;Smooth radius TP_LOCALLAB_RECT;Rectangle TP_LOCALLAB_RECURS;Recursive references @@ -2879,7 +2898,7 @@ TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtr TP_LOCALLAB_WAMASKCOL;Ψ Mask Wavelet level TP_LOCALLAB_WARM;Warm/Cool & Color artifacts TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler\nIt can also reduce color artifacts in some cases. -TP_LOCALLAB_WASDEN_TOOLTIP;Denoise luminance for the 3 first levels (fine).\nThe right limit of the curve correspond to coarse : level 3 and beyond +TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve corresponds to the first 3 levels 0,1 &2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3 and beyond). TP_LOCALLAB_WAV;Local contrast by level TP_LOCALLAB_WAVBLUR_TOOLTIP;Performs a blur for each level of decomposition, as well as the residual image. TP_LOCALLAB_WAVCOMP;Compression by Level @@ -2888,7 +2907,7 @@ TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Achieve a Tone-mapping or reduction local contrast TP_LOCALLAB_WAVCOMP_TOOLTIP;Achive local contrast in function of the direction wavelet decomposition : horizontal, vertical, diagonal TP_LOCALLAB_WAVCON;Contrast by Level TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels : on abscissa levels. -TP_LOCALLAB_WAVDEN;Luminance denoise by level (0 1 2 +3 and more) +TP_LOCALLAB_WAVDEN;Luminance denoise by level (0 1 2 &3 and more) TP_LOCALLAB_WAVE;Ψ Wavelet TP_LOCALLAB_WAVEDG;Local contrast TP_LOCALLAB_WAVEEDG_TOOLTIP;Achieves a sharpness taking into account the notion of edges wavelet.\nRequires that at least the first 4 levels are usable diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 9eb9b06f6..bfa148304 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -811,12 +811,18 @@ static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locall } else if (locallab.spots.at(sp).medMethod == "99") { lp.medmet = 3; } - +/* if (locallab.spots.at(sp).blurMethod == "norm") { lp.blurmet = 0; } else if (locallab.spots.at(sp).blurMethod == "inv") { lp.blurmet = 1; } +*/ + if (locallab.spots.at(sp).invbl == false) { + lp.blurmet = 0; + } else if (locallab.spots.at(sp).invbl == true) { + lp.blurmet = 1; + } if (locallab.spots.at(sp).showmaskblMethodtyp == "blur") { lp.smasktyp = 0; @@ -9809,7 +9815,9 @@ void ImProcFunctions::Lab_Local( } bool execmaskblur = (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) && lp.smasktyp != 1; - if (((radius > 1.5 * GAUSS_SKIP && lp.rad > 1.6) || lp.stren > 0.1 || lp.blmet == 1 || lp.guidb > 0 || execmaskblur) && lp.blurena) { // radius < GAUSS_SKIP means no gauss, just copy of original image + int strengr = params->locallab.spots.at(sp).strengr; + + if (((radius > 1.5 * GAUSS_SKIP && lp.rad > 1.6) || lp.stren > 0.1 || lp.blmet == 1 || lp.guidb > 0 || strengr > 0 || execmaskblur) && lp.blurena) { // radius < GAUSS_SKIP means no gauss, just copy of original image // if (((radius > 1.5 * GAUSS_SKIP && lp.rad > 1.6) || lp.stren > 0.1 || lp.blmet == 1 || lp.guidb > 0 || lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) && lp.blurena) { // radius < GAUSS_SKIP means no gauss, just copy of original image std::unique_ptr tmp1; std::unique_ptr tmp2; @@ -9824,8 +9832,7 @@ void ImProcFunctions::Lab_Local( bool fft = params->locallab.spots.at(sp).fftwbl; int isogr = params->locallab.spots.at(sp).isogr; - int strengr = params->locallab.spots.at(sp).strengr; - int scalegr = params->locallab.spots.at(sp).scalegr; + int scalegr = 100;//params->locallab.spots.at(sp).scalegr; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 0cc199b89..7c711a3da 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -981,6 +981,8 @@ enum ProcEventCode { EvlocallabCHshape = 955, EvlocallabquaMethod = 956, Evlocallabhishow = 957, + Evlocallabinvbl = 958, + NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index b427f24ee..3c53c65d1 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -3326,6 +3326,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : }, enablMask(false), fftwbl(false), + invbl(false), toolbl(false), blendmaskbl(0), radmaskbl(0.0), @@ -4206,6 +4207,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && HHmaskblcurve == other.HHmaskblcurve && enablMask == other.enablMask && fftwbl == other.fftwbl + && invbl == other.invbl && toolbl == other.toolbl && blendmaskbl == other.blendmaskbl && radmaskbl == other.radmaskbl @@ -5734,6 +5736,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->HHmaskblcurve, "Locallab", "HHmaskblCurve_" + index_str, spot.HHmaskblcurve, keyFile); saveToKeyfile(!pedited || spot_edited->enablMask, "Locallab", "EnablMask_" + index_str, spot.enablMask, keyFile); saveToKeyfile(!pedited || spot_edited->fftwbl, "Locallab", "Fftwbl_" + index_str, spot.fftwbl, keyFile); + saveToKeyfile(!pedited || spot_edited->invbl, "Locallab", "Invbl_" + index_str, spot.invbl, keyFile); saveToKeyfile(!pedited || spot_edited->toolbl, "Locallab", "Toolbl_" + index_str, spot.toolbl, keyFile); saveToKeyfile(!pedited || spot_edited->blendmaskbl, "Locallab", "Blendmaskbl_" + index_str, spot.blendmaskbl, keyFile); saveToKeyfile(!pedited || spot_edited->radmaskbl, "Locallab", "Radmaskbl_" + index_str, spot.radmaskbl, keyFile); @@ -7463,6 +7466,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "HHmaskblCurve_" + index_str, pedited, spot.HHmaskblcurve, spotEdited.HHmaskblcurve); assignFromKeyfile(keyFile, "Locallab", "EnablMask_" + index_str, pedited, spot.enablMask, spotEdited.enablMask); assignFromKeyfile(keyFile, "Locallab", "Fftwbl_" + index_str, pedited, spot.fftwbl, spotEdited.fftwbl); + assignFromKeyfile(keyFile, "Locallab", "Invbl_" + index_str, pedited, spot.invbl, spotEdited.invbl); assignFromKeyfile(keyFile, "Locallab", "Toolbl_" + index_str, pedited, spot.toolbl, spotEdited.toolbl); assignFromKeyfile(keyFile, "Locallab", "Blendmaskbl_" + index_str, pedited, spot.blendmaskbl, spotEdited.blendmaskbl); assignFromKeyfile(keyFile, "Locallab", "Radmaskbl_" + index_str, pedited, spot.radmaskbl, spotEdited.radmaskbl); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index af79aec95..56cb86518 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1228,6 +1228,7 @@ struct LocallabParams { std::vector HHmaskblcurve; bool enablMask; bool fftwbl; + bool invbl; bool toolbl; int blendmaskbl; double radmaskbl; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 446e6e4fe..255d080ac 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -984,7 +984,9 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // Evlocallabactiv LUMINANCECURVE, // EvlocallabCHshape LUMINANCECURVE, //EvlocallabquaMethod - LUMINANCECURVE //Evlocallabhishow + LUMINANCECURVE, //Evlocallabhishow + LUMINANCECURVE // Evlocallabinvbl + }; diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index 233f47e3f..c11682091 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -5753,6 +5753,7 @@ LocallabBlur::LocallabBlur(): epsbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_EPSBL"), -10, 10, 1, 0))), sensibn(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 40))), blurMethod(Gtk::manage(new MyComboBoxText())), + invbl(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVBL")))), chroMethod(Gtk::manage(new MyComboBoxText())), activlum(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ACTIV")))), expdenoise(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI_EXP")))), @@ -5810,6 +5811,7 @@ LocallabBlur::LocallabBlur(): blMethodConn = blMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabBlur::blMethodChanged)); fftwblConn = fftwbl->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::fftwblChanged)); + invblConn = invbl->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::invblChanged)); radius->setAdjusterListener(this); @@ -5980,7 +5982,7 @@ LocallabBlur::LocallabBlur(): ToolParamBlock* const grainBox = Gtk::manage(new ToolParamBlock()); grainBox->pack_start(*isogr); grainBox->pack_start(*strengr); - grainBox->pack_start(*scalegr); +// grainBox->pack_start(*scalegr); grainFrame->add(*grainBox); blnoisebox->pack_start(*grainFrame); blnoisebox->pack_start(*medMethod); @@ -5989,7 +5991,8 @@ LocallabBlur::LocallabBlur(): blnoisebox->pack_start(*strbl); blnoisebox->pack_start(*epsbl); blnoisebox->pack_start(*sensibn); - blnoisebox->pack_start(*blurMethod); +// blnoisebox->pack_start(*blurMethod); + blnoisebox->pack_start(*invbl); blnoisebox->pack_start(*chroMethod); // blnoisebox->pack_start(*activlum); expblnoise->add(*blnoisebox, false); @@ -6074,10 +6077,28 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) if (showTooltips) { expblnoise->set_tooltip_markup(M("TP_LOCALLAB_BLUMETHOD_TOOLTIP")); radius->set_tooltip_text(M("TP_LOCALLAB_RADIUS_TOOLTIP")); + strength->set_tooltip_text(M("TP_LOCALLAB_NOISE_TOOLTIP")); + grainFrame->set_tooltip_text(M("TP_LOCALLAB_GRAIN_TOOLTIP")); sensibn->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + medMethod->set_tooltip_text(M("TP_LOCALLAB_MEDIAN_TOOLTIP")); + itera->set_tooltip_text(M("TP_LOCALLAB_MEDIANITER_TOOLTIP")); + guidbl->set_tooltip_text(M("TP_LOCALLAB_GUIDBL_TOOLTIP")); + strbl->set_tooltip_text(M("TP_LOCALLAB_GUIDSTRBL_TOOLTIP")); + epsbl->set_tooltip_text(M("TP_LOCALLAB_GUIDEPSBL_TOOLTIP")); blurMethod->set_tooltip_markup(M("TP_LOCALLAB_BLMETHOD_TOOLTIP")); + invbl->set_tooltip_markup(M("TP_LOCALLAB_INVBL_TOOLTIP")); expdenoise->set_tooltip_markup(M("TP_LOCALLAB_DENOI_TOOLTIP")); + quamethod->set_tooltip_markup(M("TP_LOCALLAB_DENOIQUA_TOOLTIP")); wavshapeden->setTooltip(M("TP_LOCALLAB_WASDEN_TOOLTIP")); + LocalcurveEditorwavden->setTooltip(M("TP_LOCALLAB_WASDEN_TOOLTIP")); + noiselequal->set_tooltip_text(M("TP_LOCALLAB_DENOIEQUAL_TOOLTIP")); + noiselumdetail->set_tooltip_text(M("TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP")); + noisechrof->set_tooltip_text(M("TP_LOCALLAB_DENOICHROF_TOOLTIP")); + noisechroc->set_tooltip_text(M("TP_LOCALLAB_DENOICHROC_TOOLTIP")); + noisechrodetail->set_tooltip_text(M("TP_LOCALLAB_DENOICHRODET_TOOLTIP")); + detailthr->set_tooltip_text(M("TP_LOCALLAB_DENOITHR_TOOLTIP")); + adjblur->set_tooltip_text(M("TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP")); + bilateral->set_tooltip_text(M("TP_LOCALLAB_DENOIBILAT_TOOLTIP")); noiselumc->set_tooltip_text(M("TP_LOCALLAB_NOISECHROC_TOOLTIP")); expmaskbl->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); showmaskblMethodtyp->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKTYP_TOOLTIP")); @@ -6103,8 +6124,28 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) sensiden->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); } else { + expblnoise->set_tooltip_markup(""); radius->set_tooltip_text(""); + strength->set_tooltip_text(""); + grainFrame->set_tooltip_text(""); + sensibn->set_tooltip_text(""); + medMethod->set_tooltip_text(""); + itera->set_tooltip_text(""); + guidbl->set_tooltip_text(""); + strbl->set_tooltip_text(""); + epsbl->set_tooltip_text(""); + blurMethod->set_tooltip_markup(""); + quamethod->set_tooltip_markup(""); + LocalcurveEditorwavden->setTooltip(""); + noiselequal->set_tooltip_text(""); + noiselumdetail->set_tooltip_text(""); + noisechrof->set_tooltip_text(""); + noisechroc->set_tooltip_text(""); + noisechrodetail->set_tooltip_text(""); + detailthr->set_tooltip_text(""); + adjblur->set_tooltip_text(""); + bilateral->set_tooltip_text(""); sensibn->set_tooltip_text(""); blurMethod->set_tooltip_markup(""); expdenoise->set_tooltip_markup(""); @@ -6148,6 +6189,7 @@ void LocallabBlur::disableListener() blMethodConn.block(true); fftwblConn.block(true); + invblConn.block(true); medMethodConn.block(true); blurMethodConn.block(true); chroMethodConn.block(true); @@ -6165,6 +6207,7 @@ void LocallabBlur::enableListener() blMethodConn.block(false); fftwblConn.block(false); + invblConn.block(false); medMethodConn.block(false); blurMethodConn.block(false); chroMethodConn.block(false); @@ -6202,6 +6245,7 @@ void LocallabBlur::read(const rtengine::procparams::ProcParams* pp, const Params } fftwbl->set_active(spot.fftwbl); + invbl->set_active(spot.invbl); radius->setValue(spot.radius); strength->setValue(spot.strength); isogr->setValue((double)spot.isogr); @@ -6321,6 +6365,7 @@ void LocallabBlur::write(rtengine::procparams::ProcParams* pp, ParamsEdited* ped } spot.fftwbl = fftwbl->get_active(); + spot.invbl = invbl->get_active(); spot.radius = radius->getValue(); spot.strength = strength->getIntValue(); spot.isogr = isogr->getIntValue(); @@ -6901,6 +6946,21 @@ void LocallabBlur::fftwblChanged() } } +void LocallabBlur::invblChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (invbl->get_active()) { + listener->panelChanged(Evlocallabinvbl, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(spotName) + ")"); + } else { + listener->panelChanged(Evlocallabinvbl, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(spotName) + ")"); + } + } + } +} + void LocallabBlur::medMethodChanged() { if (isLocActivated && exp->getEnabled()) { diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index a048f4fd2..29a8ca066 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -652,6 +652,7 @@ private: Adjuster* const epsbl; Adjuster* const sensibn; MyComboBoxText* const blurMethod; + Gtk::CheckButton* const invbl; MyComboBoxText* const chroMethod; Gtk::CheckButton* const activlum; MyExpander* const expdenoise; @@ -697,7 +698,7 @@ private: Gtk::HBox* const quaHBox; ThresholdAdjuster* const csThresholdblur; - sigc::connection blMethodConn, fftwblConn, medMethodConn, blurMethodConn, chroMethodConn, activlumConn, showmaskblMethodConn, showmaskblMethodtypConn, enablMaskConn, toolblConn; + sigc::connection blMethodConn, fftwblConn, invblConn, medMethodConn, blurMethodConn, chroMethodConn, activlumConn, showmaskblMethodConn, showmaskblMethodtypConn, enablMaskConn, toolblConn; sigc::connection quamethodconn; public: LocallabBlur(); @@ -733,6 +734,7 @@ private: void blMethodChanged(); void fftwblChanged(); + void invblChanged(); void medMethodChanged(); void blurMethodChanged(); void chroMethodChanged(); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 95036b063..bee8ed736 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1298,6 +1298,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).HHmaskblcurve = locallab.spots.at(j).HHmaskblcurve && pSpot.HHmaskblcurve == otherSpot.HHmaskblcurve; locallab.spots.at(j).enablMask = locallab.spots.at(j).enablMask && pSpot.enablMask == otherSpot.enablMask; locallab.spots.at(j).fftwbl = locallab.spots.at(j).fftwbl && pSpot.fftwbl == otherSpot.fftwbl; + locallab.spots.at(j).invbl = locallab.spots.at(j).invbl && pSpot.invbl == otherSpot.invbl; locallab.spots.at(j).toolbl = locallab.spots.at(j).toolbl && pSpot.toolbl == otherSpot.toolbl; locallab.spots.at(j).blendmaskbl = locallab.spots.at(j).blendmaskbl && pSpot.blendmaskbl == otherSpot.blendmaskbl; locallab.spots.at(j).radmaskbl = locallab.spots.at(j).radmaskbl && pSpot.radmaskbl == otherSpot.radmaskbl; @@ -4092,6 +4093,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).fftwbl = mods.locallab.spots.at(i).fftwbl; } + if (locallab.spots.at(i).invbl) { + toEdit.locallab.spots.at(i).invbl = mods.locallab.spots.at(i).invbl; + } + if (locallab.spots.at(i).toolbl) { toEdit.locallab.spots.at(i).toolbl = mods.locallab.spots.at(i).toolbl; } @@ -6432,6 +6437,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : HHmaskblcurve(v), enablMask(v), fftwbl(v), + invbl(v), toolbl(v), blendmaskbl(v), radmaskbl(v), @@ -6922,6 +6928,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) HHmaskblcurve = v; enablMask = v; fftwbl = v; + invbl = v; toolbl = v; blendmaskbl = v; radmaskbl = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index c589aa96f..4fdbfdfd5 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -641,6 +641,7 @@ public: bool HHmaskblcurve; bool enablMask; bool fftwbl; + bool invbl; bool toolbl; bool blendmaskbl; bool radmaskbl; From 21758da234871b53e7f77cb03e6c34dfa0e9a7e3 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 5 Oct 2020 13:03:07 +0200 Subject: [PATCH 134/185] Suppress TRC working profile --- rtengine/dcrop.cc | 4 ++-- rtengine/improccoordinator.cc | 3 ++- rtengine/simpleprocess.cc | 4 ++-- rtgui/icmpanel.cc | 14 +++++++------- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 0d191c087..d5596c8ce 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -804,7 +804,7 @@ void Crop::update(int todo) if (todo & M_RGBCURVE) { Imagefloat *workingCrop = baseCrop; - +/* if (params.icm.workingTRC == "Custom") { //exec TRC IN free const Glib::ustring profile = params.icm.workingProfile; @@ -818,7 +818,7 @@ void Crop::update(int todo) parent->ipf.workingtrc(workingCrop, workingCrop, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope, parent->getCustomTransformOut(), false, true, true); } } - +*/ double rrm, ggm, bbm; DCPProfileApplyState as; DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, as); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index a538391c4..405820b20 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -819,7 +819,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } if (todo & (M_AUTOEXP | M_RGBCURVE)) { - if (params->icm.workingTRC == "Custom") { //exec TRC IN free + /* if (params->icm.workingTRC == "Custom") { //exec TRC IN free if (oprevi == orig_prev) { oprevi = new Imagefloat(pW, pH); orig_prev->copyData(oprevi); @@ -848,6 +848,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) ipf.workingtrc(oprevi, oprevi, cw, ch, 5, params->icm.workingProfile, params->icm.workingTRCGamma, params->icm.workingTRCSlope, customTransformOut, false, true, true); } } + */ } diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 1455b0c64..e56111806 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -918,7 +918,7 @@ private: ipf.lab2rgb(labcbdl, *baseImg, params.icm.workingProfile); } - //gamma TRC working +/* //gamma TRC working if (params.icm.workingTRC == "Custom") { //exec TRC IN free const Glib::ustring profile = params.icm.workingProfile; @@ -932,7 +932,7 @@ private: ipf.workingtrc(baseImg, baseImg, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope, dummyTransForm, false, true, false); } } - +*/ // RGB processing curve1(65536); diff --git a/rtgui/icmpanel.cc b/rtgui/icmpanel.cc index 69cd21115..92827bf30 100644 --- a/rtgui/icmpanel.cc +++ b/rtgui/icmpanel.cc @@ -194,21 +194,21 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha wTRCHBox->pack_start(*wtrclab, Gtk::PACK_SHRINK); wTRC = Gtk::manage(new MyComboBoxText()); wTRCHBox->pack_start(*wTRC, Gtk::PACK_EXPAND_WIDGET); - wProfVBox->pack_start(*wTRCHBox, Gtk::PACK_EXPAND_WIDGET); + // wProfVBox->pack_start(*wTRCHBox, Gtk::PACK_EXPAND_WIDGET); wTRC->append(M("TP_ICM_WORKING_TRC_NONE")); wTRC->append(M("TP_ICM_WORKING_TRC_CUSTOM")); - wTRC->set_active(0); - wTRC->set_tooltip_text(M("TP_ICM_WORKING_TRC_TOOLTIP")); +// wTRC->set_active(0); +// wTRC->set_tooltip_text(M("TP_ICM_WORKING_TRC_TOOLTIP")); wGamma = Gtk::manage(new Adjuster(M("TP_ICM_WORKING_TRC_GAMMA"), 0.40, 15.0, 0.001, 2.4)); wSlope = Gtk::manage(new Adjuster(M("TP_ICM_WORKING_TRC_SLOPE"), 0., 150., 0.01, 12.92310)); - wProfVBox->pack_start(*wGamma, Gtk::PACK_SHRINK); - wGamma->show(); +// wProfVBox->pack_start(*wGamma, Gtk::PACK_SHRINK); +// wGamma->show(); - wProfVBox->pack_start(*wSlope, Gtk::PACK_SHRINK); - wSlope->show(); +// wProfVBox->pack_start(*wSlope, Gtk::PACK_SHRINK); +// wSlope->show(); wGamma->setAdjusterListener(this); From cde7aababbbf60188dab8133bc6c7fd991cacc0f Mon Sep 17 00:00:00 2001 From: Thanatomanic <6567747+Thanatomanic@users.noreply.github.com> Date: Mon, 5 Oct 2020 20:25:38 +0200 Subject: [PATCH 135/185] camconst support for DJI FC3170 (Mavic Air 2) See #5933 --- rtengine/camconst.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index b3a8d6c79..22270bfe2 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1279,15 +1279,18 @@ Camera constants: { // Quality C "make_model": [ "DJI FC2103" ], - "ranges": { - "black": 4080 - } + "ranges": { "black": 4080 } }, { // Quality C "make_model": "DJI FC6310", "ranges": { "white": 64886 } }, + + { // Quality C + "make_model": "DJI FC3170", + "ranges": { "white": 65472 } + }, { // Quality C "make_model": "FUJIFILM GFX 100", From d6f8de4281e895c130ee873b7596ddf85843a386 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 6 Oct 2020 13:45:47 +0200 Subject: [PATCH 136/185] Local adjustments - Tooltips and bug for Dehaz - Retinex (#5937) * Change tooltip french * Update labels tooltip french * Changes TM - sharp - CBDL * Others changes TM CBDL * French tooltip denoise - blur * Change french tooltips denoise blur * Change combobox blurmethod by checkbox invbl * Change tooltip blur-denoise * another change denoise tooltip * Change one tooltip luminance noise reduction * Add tooltip to dehaz-retinex * Change tooltip for dehaze retinex * Others change tooltip retinex dehaz * Change bad script for one tooltip MLABEL * Another change tooltip --- rtdata/languages/Francais | 2 ++ rtdata/languages/default | 34 ++++++++++++++++++---------------- rtgui/locallabtools.h | 1 + rtgui/locallabtools2.cc | 14 +++++++++++--- 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index e6aae15b5..ff11c80f8 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -1869,6 +1869,7 @@ TP_LOCALLAB_CURVENSOB2;Combined HueChroma + Contrast threshold (experimental) TP_LOCALLAB_CURVNONE;Désactive courbes TP_LOCALLAB_DARKRETI;Obscuirité TP_LOCALLAB_DEHAFRA;Elimination de la brume +TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Élimine la brume atmosphérique. Augmente généralement la saturation et les détails. \ N Peut supprimer les dominantes de couleur, mais peut également introduire une dominante bleue qui peut être corrigée à l'aide d'autres outils. TP_LOCALLAB_DEHAZ;Force TP_LOCALLAB_DEHAZ_TOOLTIP;Valeurs Négatives ajoute de la brume TP_LOCALLAB_DELTAD;Delta balance @@ -2169,6 +2170,7 @@ TP_LOCALLAB_RETI;De-brume - Retinex Fort contraste TP_LOCALLAB_RETIFRA;Retinex TP_LOCALLAB_RETIM;Original Retinex TP_LOCALLAB_RETITOOLFRA;Retinex Outils +TP_LOCALLAB_RETIFRAME_TOOLTIP; L'utilisation de Retinex peut être bénéfique pour le traitement des images: \ nqui sont floues, brumeuses ou ayant un voile de brouillard (en complément de Dehaz). \ Navec d'importants écarts de luminance. \ N où l'utilisateur recherche des effets spéciaux (cartographie des tons…) TP_LOCALLAB_RETI_FFTW_TOOLTIP;FFT améliore la qualité et autorise de grands rayons, mais accroît les temps de traitement.\nCe temps dépends de la surface traitée\nLe temps de traitements dépend de "scale" (échelle) (soyez prudent avec les hautes valeurs ).\nA utiliser de préférence avec de grand rayons.\n\nLes Dimensions peuvent être réduites de quelques pixels pour optimiser FFTW.\nCette optimisation peut réduire le temps de traitement d'un facteur de 1.5 à 10.\nOptimisation pas utilsée en prévisualisation TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Have no effect when the value "Lightness = 1" or "Darkness =2" is chosen.\nIn other cases, the last step of "Multiple scale Retinex" is applied an algorithm close to "local contrast", these 2 cursors, associated with "Strength" will allow to play upstream on the local contrast. TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Play on internal parameters to optimize response.\nLook at the "restored datas" indicators "near" min=0 and max=32768 (log mode), but others values are possible. diff --git a/rtdata/languages/default b/rtdata/languages/default index ca66fb2ce..b13decd13 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2430,7 +2430,8 @@ TP_LOCALLAB_CURVNONE;Disable curves TP_LOCALLAB_DARKRETI;Darkness TP_LOCALLAB_DEHAFRA;Dehaze TP_LOCALLAB_DEHAZ;Strength -TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values adds haze +TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze +TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. TP_LOCALLAB_DELTAD;Delta balance TP_LOCALLAB_DELTAEC;ΔE Image mask TP_LOCALLAB_DENOIS;Ψ Denoise @@ -2461,7 +2462,7 @@ TP_LOCALLAB_ENH;Enhanced TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise TP_LOCALLAB_EPSBL;Detail TP_LOCALLAB_EQUIL;Normalize Luminance -TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and the variance of the output image is identical to that of the original. +TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. TP_LOCALLAB_ESTOP;Edge stopping TP_LOCALLAB_EV_DUPL;Copy of TP_LOCALLAB_EV_NVIS;Hide @@ -2548,7 +2549,7 @@ TP_LOCALLAB_GUIDBL;Soft radius TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. TP_LOCALLAB_GUIDFILTER;Guided filter radius -TP_LOCALLAB_GUIDFILTER_TOOLTIP;Adapt this values according to images - can reduce or increase artifacts. +TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. TP_LOCALLAB_HIGHMASKCOL;Highlights @@ -2573,7 +2574,7 @@ TP_LOCALLAB_LAPMASKCOL;Laplacian threshold TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using “Smooth radius” and “Laplacian threshold” (advanced) together.\nSmooth radius uses a guided filter to decrease artifacts and smooth out the transition TP_LOCALLAB_LAPRAD1_TOOLTIP;Avoid using “Smooth radius” and “Laplacian threshold” (advanced) together.\nTransforms the mask to eliminate values lower than the threshold.\nReduces artifacts and noise, and allows local contrast to be modified. TP_LOCALLAB_LAP_MASK_TOOLTIP;Solve PDE for all Laplacian masks.\nIf enabled Laplacian threshold mask reduce artifacts and smooth result.\nIf disabled linear response. -TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated.\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\n +TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. Dimensions of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets - 7 TP_LOCALLAB_LEVELBLUR;Maximum blur levels TP_LOCALLAB_LEVELLOCCONTRAST_TOOLTIP;On the abscissa local contrast (near concept luminance). On the ordinate, amplification or reduction local contrast. @@ -2668,7 +2669,7 @@ TP_LOCALLAB_MERTWE;Exclusion TP_LOCALLAB_MERTWO;Subtract TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 (Clip - Offset) -TP_LOCALLAB_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible.\nYou can act on Clip Restored datas and Offset to normalize.\n\nRestored image with no mixture. +TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust ‘Clip restored data (gain)’ and ‘Offset’ to normalize.\nRecovers image data without blending. TP_LOCALLAB_MODE_EXPERT;Advanced TP_LOCALLAB_MODE_NORMAL;Standard TP_LOCALLAB_MODE_SIMPLE;Basic @@ -2731,14 +2732,15 @@ TP_LOCALLAB_RESIDSHA;Shadows TP_LOCALLAB_RESIDSHATHR;Shadows threshold TP_LOCALLAB_RETI;Dehaze & Retinex TP_LOCALLAB_RETIFRA;Retinex +TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). TP_LOCALLAB_RETIM;Original Retinex TP_LOCALLAB_RETITOOLFRA;Retinex Tools TP_LOCALLAB_RETI_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated\nThe treatment time depends on the value of scale (be carefull to high values).\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\nOptimization not used in Preview -TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Have no effect when the value "Lightness = 1" or "Darkness =2" is chosen.\nIn other cases, the last step of "Multiple scale Retinex" is applied an algorithm close to "local contrast", these 2 cursors, associated with "Strength" will allow to play upstream on the local contrast. -TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Play on internal parameters to optimize response.\nLook at the "restored datas" indicators "near" min=0 and max=32768 (log mode), but others values are possible. -TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm allows differenciation for haze or normal.\nLogarithm brings more contrast but will generate more halo. -TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;Adapt these values according to images - if misty images and depending on whether you want to act on the front or the background -TP_LOCALLAB_RETI_SCALE_TOOLTIP;If scale=1, retinex behaves like local contrast with many more possibilities.\nThe greater the scale, the more intense the recursive action, the longer the calculation times +TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of "Lightness = 1" or "Darkness =2".\nFor other values, the last step of a "Multiple scale Retinex" algorithm (similar to "local contrast") is applied. These 2 cursors, associated with "Strength" allow you to make adjustments upstream of local contrast +TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the "Restored data" values close to Min=0 and Max=32768 (log mode), but other values are possible. +TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex - 9 TP_LOCALLAB_REWEI;Reweighting iterates TP_LOCALLAB_RGB;RGB Tone Curve @@ -2857,7 +2859,7 @@ TP_LOCALLAB_THRESRETI;Threshold TP_LOCALLAB_THRESWAV;Balance threshold TP_LOCALLAB_TLABEL;TM Data Min=%1 Max=%2 Mean=%3 Sigma=%4 (Threshold) TP_LOCALLAB_TLABEL2;TM Effective Tm=%1 TM=%2 -TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize +TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. TP_LOCALLAB_TM;Tone Mapping TP_LOCALLAB_TM_MASK;Use transmission map TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox "Structure mask as tool" checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the "Structure mask" behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. @@ -2879,7 +2881,7 @@ TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 p TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas, as a percentage of the "radius" TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain TP_LOCALLAB_TRANSMISSIONMAP;Transmission map -TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.\nYou can act on this curve to change Transmission and reduce the artifacts +TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts TP_LOCALLAB_USEMASK;Use mask TP_LOCALLAB_VART;Variance (contrast) TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool @@ -2925,7 +2927,7 @@ TP_LOCAL_HEIGHT;Bottom TP_LOCAL_HEIGHT_T;Top TP_LOCAL_WIDTH;Right TP_LOCAL_WIDTH_L;Left -TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\n +TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light.\n TP_METADATA_EDIT;Apply modifications TP_METADATA_MODE;Metadata copy mode TP_METADATA_STRIP;Strip all metadata @@ -3103,7 +3105,7 @@ TP_RETINEX_FREEGAMMA;Free gamma TP_RETINEX_GAIN;Gain TP_RETINEX_GAINOFFS;Gain and Offset (brightness) TP_RETINEX_GAINTRANSMISSION;Gain transmission -TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain. TP_RETINEX_GAMMA;Gamma TP_RETINEX_GAMMA_FREE;Free TP_RETINEX_GAMMA_HIGH;High @@ -3138,7 +3140,7 @@ TP_RETINEX_MEDIAN;Transmission median filter TP_RETINEX_METHOD;Method TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\nHighlights = Remove magenta in highlights. TP_RETINEX_MLABEL;Restored data Min=%1 Max=%2 -TP_RETINEX_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible\nRestored image with no mixture. +TP_RETINEX_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust ‘Clip restored data (gain)’ and ‘Offset’ to normalize.\nRecovers image data without blending TP_RETINEX_NEIGHBOR;Radius TP_RETINEX_NEUTRAL;Reset TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. @@ -3153,7 +3155,7 @@ TP_RETINEX_THRESHOLD;Threshold TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss. TP_RETINEX_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 -TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map. +TP_RETINEX_TLABEL_TOOLTIP;ransmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. TP_RETINEX_TRANF;Transmission TP_RETINEX_TRANSMISSION;Transmission map TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index 29a8ca066..4ae593225 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -824,6 +824,7 @@ class LocallabRetinex: { private: // Retinex specific widgets + Gtk::Frame* const dehaFrame; Adjuster* const dehaz; Adjuster* const depth; Gtk::CheckButton* const lumonly; diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index 9bc1b01ca..55e3fab08 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -683,6 +683,7 @@ LocallabRetinex::LocallabRetinex(): LocallabTool(this, M("TP_LOCALLAB_RET_TOOLNAME"), M("TP_LOCALLAB_RETI"), true), // Retinex specific widgets + dehaFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_DEHAFRA")))), dehaz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEHAZ"), -100, 100, 1, 0))), depth(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEPTH"), 0, 100, 1, 25))), lumonly(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_LUMONLY")))), @@ -733,7 +734,6 @@ LocallabRetinex::LocallabRetinex(): const LocallabParams::LocallabSpot defSpot; // Parameter Retinex specific widgets - dehaz->set_tooltip_text(M("TP_LOCALLAB_DEHAZ_TOOLTIP")); dehaz->setAdjusterListener(this); depth->setAdjusterListener(this); @@ -860,7 +860,7 @@ LocallabRetinex::LocallabRetinex(): // Add Retinex specific widgets to GUI ToolParamBlock* const auxBox = Gtk::manage(new ToolParamBlock()); - Gtk::Frame* const dehaFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_DEHAFRA"))); +// Gtk::Frame* const dehaFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_DEHAFRA"))); dehaFrame->set_label_align(0.025, 0.5); ToolParamBlock* const dehaBox = Gtk::manage(new ToolParamBlock()); dehaBox->pack_start(*dehaz); @@ -975,9 +975,12 @@ void LocallabRetinex::getMaskView(int &colorMask, int &colorMaskinv, int &expMas void LocallabRetinex::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { + dehaFrame->set_tooltip_text(M("TP_LOCALLAB_DEHAZFRAME_TOOLTIP")); + dehaz->set_tooltip_text(M("TP_LOCALLAB_DEHAZ_TOOLTIP")); + retiFrame->set_tooltip_text(M("TP_LOCALLAB_RETIFRAME_TOOLTIP")); loglin->set_tooltip_text(M("TP_LOCALLAB_RETI_LOGLIN_TOOLTIP")); sensih->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); - fftwreti->set_tooltip_text(M("TP_LOCALLAB_RETI_FFTW_TOOLTIP")); + fftwreti->set_tooltip_text(M("TP_LOCALLAB_LC_FFTW_TOOLTIP")); equilret->set_tooltip_text(M("TP_LOCALLAB_EQUILTM_TOOLTIP")); neigh->set_tooltip_text(M("TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP")); vart->set_tooltip_text(M("TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP")); @@ -991,6 +994,7 @@ void LocallabRetinex::updateAdviceTooltips(const bool showTooltips) cTtransshape->setTooltip(M("TP_LOCALLAB_TRANSMISSION_TOOLTIP")); mMLabels->set_tooltip_markup(M("TP_LOCALLAB_MLABEL_TOOLTIP")); transLabels->set_tooltip_markup(M("TP_LOCALLAB_TLABEL_TOOLTIP")); + transLabels2->set_tooltip_markup(M("TP_LOCALLAB_TLABEL_TOOLTIP")); cTgainshape->setTooltip(M("TP_RETINEX_GAINTRANSMISSION_TOOLTIP")); expmaskreti->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); enaretiMasktmap->set_tooltip_markup(M("TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP")); @@ -1008,6 +1012,9 @@ void LocallabRetinex::updateAdviceTooltips(const bool showTooltips) lapmaskreti->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); } else { + dehaFrame->set_tooltip_text(""); + dehaz->set_tooltip_text(""); + retiFrame->set_tooltip_text(""); loglin->set_tooltip_text(""); sensih->set_tooltip_text(""); fftwreti->set_tooltip_text(""); @@ -1024,6 +1031,7 @@ void LocallabRetinex::updateAdviceTooltips(const bool showTooltips) cTtransshape->setTooltip(""); mMLabels->set_tooltip_markup(""); transLabels->set_tooltip_markup(""); + transLabels2->set_tooltip_markup(""); cTgainshape->setTooltip(""); expmaskreti->set_tooltip_markup(""); enaretiMasktmap->set_tooltip_markup(""); From dcabfe9cf0e335b4aa78b63bb68fb9a543547183 Mon Sep 17 00:00:00 2001 From: shapirus Date: Wed, 7 Oct 2020 10:04:46 +0300 Subject: [PATCH 137/185] Add a 13:18 photo paper crop aspect ratio (#5939) --- rtgui/crop.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/rtgui/crop.cc b/rtgui/crop.cc index 48d1e09af..961f1908b 100644 --- a/rtgui/crop.cc +++ b/rtgui/crop.cc @@ -82,6 +82,7 @@ public: {"17:22", 17.0 / 22.0}, // L1.294..., P0.772... {"45:35 - ePassport", 45.0 / 35.0}, // L1.285,... P0.777... {"64:27", 64.0 / 27.0}, // L2.370..., P0.421... + {"13:18", 13.0 / 18.0}, // L1.384..., P0.722... } { } From 46a22f71105e49a8fcd168e64678739778735923 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Thu, 8 Oct 2020 16:01:46 +0200 Subject: [PATCH 138/185] Hopefully fix MacOs clang builds --- rtengine/rcd_demosaic.cc | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/rtengine/rcd_demosaic.cc b/rtengine/rcd_demosaic.cc index 624b309b1..ff477281b 100644 --- a/rtengine/rcd_demosaic.cc +++ b/rtengine/rcd_demosaic.cc @@ -163,22 +163,24 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) for (int row = 4; row < tileRows - 4; row++) { int col = 4 + (fc(cfarray, row, 0) & 1); int indx = row * tileSize + col; - #ifdef __SSE2__ + const vfloat zd5v = F2V(0.5f); + const vfloat zd25v = F2V(0.25f); + const vfloat epsv = F2V(eps); for (; col < tilecols - 7; col += 8, indx += 8) { // Cardinal gradients const vfloat cfai = LC2VFU(cfa[indx]); - const vfloat N_Grad = eps + (vabsf(LC2VFU(cfa[indx - w1]) - LC2VFU(cfa[indx + w1])) + vabsf(cfai - LC2VFU(cfa[indx - w2]))) + (vabsf(LC2VFU(cfa[indx - w1]) - LC2VFU(cfa[indx - w3])) + vabsf(LC2VFU(cfa[indx - w2]) - LC2VFU(cfa[indx - w4]))); - const vfloat S_Grad = eps + (vabsf(LC2VFU(cfa[indx - w1]) - LC2VFU(cfa[indx + w1])) + vabsf(cfai - LC2VFU(cfa[indx + w2]))) + (vabsf(LC2VFU(cfa[indx + w1]) - LC2VFU(cfa[indx + w3])) + vabsf(LC2VFU(cfa[indx + w2]) - LC2VFU(cfa[indx + w4]))); - const vfloat W_Grad = eps + (vabsf(LC2VFU(cfa[indx - 1]) - LC2VFU(cfa[indx + 1])) + vabsf(cfai - LC2VFU(cfa[indx - 2]))) + (vabsf(LC2VFU(cfa[indx - 1]) - LC2VFU(cfa[indx - 3])) + vabsf(LC2VFU(cfa[indx - 2]) - LC2VFU(cfa[indx - 4]))); - const vfloat E_Grad = eps + (vabsf(LC2VFU(cfa[indx - 1]) - LC2VFU(cfa[indx + 1])) + vabsf(cfai - LC2VFU(cfa[indx + 2]))) + (vabsf(LC2VFU(cfa[indx + 1]) - LC2VFU(cfa[indx + 3])) + vabsf(LC2VFU(cfa[indx + 2]) - LC2VFU(cfa[indx + 4]))); + const vfloat N_Grad = epsv + (vabsf(LC2VFU(cfa[indx - w1]) - LC2VFU(cfa[indx + w1])) + vabsf(cfai - LC2VFU(cfa[indx - w2]))) + (vabsf(LC2VFU(cfa[indx - w1]) - LC2VFU(cfa[indx - w3])) + vabsf(LC2VFU(cfa[indx - w2]) - LC2VFU(cfa[indx - w4]))); + const vfloat S_Grad = epsv + (vabsf(LC2VFU(cfa[indx - w1]) - LC2VFU(cfa[indx + w1])) + vabsf(cfai - LC2VFU(cfa[indx + w2]))) + (vabsf(LC2VFU(cfa[indx + w1]) - LC2VFU(cfa[indx + w3])) + vabsf(LC2VFU(cfa[indx + w2]) - LC2VFU(cfa[indx + w4]))); + const vfloat W_Grad = epsv + (vabsf(LC2VFU(cfa[indx - 1]) - LC2VFU(cfa[indx + 1])) + vabsf(cfai - LC2VFU(cfa[indx - 2]))) + (vabsf(LC2VFU(cfa[indx - 1]) - LC2VFU(cfa[indx - 3])) + vabsf(LC2VFU(cfa[indx - 2]) - LC2VFU(cfa[indx - 4]))); + const vfloat E_Grad = epsv + (vabsf(LC2VFU(cfa[indx - 1]) - LC2VFU(cfa[indx + 1])) + vabsf(cfai - LC2VFU(cfa[indx + 2]))) + (vabsf(LC2VFU(cfa[indx + 1]) - LC2VFU(cfa[indx + 3])) + vabsf(LC2VFU(cfa[indx + 2]) - LC2VFU(cfa[indx + 4]))); // Cardinal pixel estimations const vfloat lpfi = LVFU(lpf[indx>>1]); - const vfloat N_Est = LC2VFU(cfa[indx - w1]) + (LC2VFU(cfa[indx - w1]) * (lpfi - LVFU(lpf[(indx - w2)>>1])) / (eps + lpfi + LVFU(lpf[(indx - w2)>>1]))); - const vfloat S_Est = LC2VFU(cfa[indx + w1]) + (LC2VFU(cfa[indx + w1]) * (lpfi - LVFU(lpf[(indx + w2)>>1])) / (eps + lpfi + LVFU(lpf[(indx + w2)>>1]))); - const vfloat W_Est = LC2VFU(cfa[indx - 1]) + (LC2VFU(cfa[indx - 1]) * (lpfi - LVFU(lpf[(indx - 2)>>1])) / (eps + lpfi + LVFU(lpf[(indx - 2)>>1]))); - const vfloat E_Est = LC2VFU(cfa[indx + 1]) + (LC2VFU(cfa[indx + 1]) * (lpfi - LVFU(lpf[(indx + 2)>>1])) / (eps + lpfi + LVFU(lpf[(indx + 2)>>1]))); + const vfloat N_Est = LC2VFU(cfa[indx - w1]) + (LC2VFU(cfa[indx - w1]) * (lpfi - LVFU(lpf[(indx - w2)>>1])) / (epsv + lpfi + LVFU(lpf[(indx - w2)>>1]))); + const vfloat S_Est = LC2VFU(cfa[indx + w1]) + (LC2VFU(cfa[indx + w1]) * (lpfi - LVFU(lpf[(indx + w2)>>1])) / (epsv + lpfi + LVFU(lpf[(indx + w2)>>1]))); + const vfloat W_Est = LC2VFU(cfa[indx - 1]) + (LC2VFU(cfa[indx - 1]) * (lpfi - LVFU(lpf[(indx - 2)>>1])) / (epsv + lpfi + LVFU(lpf[(indx - 2)>>1]))); + const vfloat E_Est = LC2VFU(cfa[indx + 1]) + (LC2VFU(cfa[indx + 1]) * (lpfi - LVFU(lpf[(indx + 2)>>1])) / (epsv + lpfi + LVFU(lpf[(indx + 2)>>1]))); // Vertical and horizontal estimations const vfloat V_Est = (S_Grad * N_Est + N_Grad * S_Est) / (N_Grad + S_Grad); @@ -187,9 +189,13 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) // G@B and G@R interpolation // Refined vertical and horizontal local discrimination const vfloat VH_Central_Value = LC2VFU(VH_Dir[indx]); - const vfloat VH_Neighbourhood_Value = 0.25f * ((LC2VFU(VH_Dir[indx - w1 - 1]) + LC2VFU(VH_Dir[indx - w1 + 1])) + (LC2VFU(VH_Dir[indx + w1 - 1]) + LC2VFU(VH_Dir[indx + w1 + 1]))); + const vfloat VH_Neighbourhood_Value = zd25v * ((LC2VFU(VH_Dir[indx - w1 - 1]) + LC2VFU(VH_Dir[indx - w1 + 1])) + (LC2VFU(VH_Dir[indx + w1 - 1]) + LC2VFU(VH_Dir[indx + w1 + 1]))); - const vfloat VH_Disc = vabsf(0.5f - VH_Central_Value) < vabsf(0.5f - VH_Neighbourhood_Value) ? VH_Neighbourhood_Value : VH_Central_Value; +#if defined(__clang__) + const vfloat VH_Disc = vself(vmaskf_lt(vabsf(zd5v - VH_Central_Value), vabsf(zd5v - VH_Neighbourhood_Value)), VH_Neighbourhood_Value, VH_Central_Value); +#else + const vfloat VH_Disc = vabsf(zd5v - VH_Central_Value) < vabsf(zd5v - VH_Neighbourhood_Value) ? VH_Neighbourhood_Value : VH_Central_Value; +#endif STC2VFU(rgb[1][indx], vintpf(VH_Disc, H_Est, V_Est)); } #endif From 38e14ffab4db911f56f5c2400ed218e62ac44c58 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 9 Oct 2020 12:46:58 +0200 Subject: [PATCH 139/185] Local adjustments - change labels and tooltip wavelets (#5941) * Added 2 tooltips fo local wavelet * First changes to labels tooltips LA wavelet * Second version tooltips LA wavelets * French tooltips LA wavelet * Small change french typos * Small 2 change french typos * Add additional tooltips LA wavelets * Last change labels tooltips * various small changes labels tooltips * Others small changes tooltips --- rtdata/languages/Francais | 27 +++++++- rtdata/languages/default | 133 ++++++++++++++++++++++---------------- rtgui/locallabtools2.cc | 79 +++++++++++++++++++++- 3 files changed, 182 insertions(+), 57 deletions(-) diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index ff11c80f8..ae2d78b2f 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -2342,10 +2342,35 @@ TP_LOCALLAB_WAMASKCOL;Ψ Niveau Ondelettes TP_LOCALLAB_WARM;Chaud - Froid & Artefacts de couleur TP_LOCALLAB_WARM_TOOLTIP;Ce curseur utilise l'algorithme Ciecam et agit comme une Balance des blancs, il prut réchauffer ou refroidir cool la zone concernée.\nIl peut aussi dans certains réduire les artefacts colorés. TP_LOCALLAB_WASDEN_TOOLTIP;De-bruite luminance pour les 3 premiers niveaux (fin).\nLa limite droite de la courbe correspond à gros : niveau 3 et au delà. +TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Contraste faible à élevé de gauche à droite en abscisse\nAugmente ou réduit le contraste en ordonnée. +TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Contraste faible à élevé de gauche à droite en abscisse\nAugmente ou réduit le contraste en ordonnée. +TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;L'effet sur le contraste local est maximum pour les valeurs moyennes, et affaibli pour les valeurs faibles ou élevées.\n Le curseur contrôle comment s'effectue les changements pour ces valeurs extêmse.\n Plus la valeur du curseur est élevée, plus grande sera l'étendue qui recevra le maximum d'ajustements, ainsi que le risque de voir apparaître des artefacts.\n .Plus faible sera cette valeur, plus les différences de contraste seront atténuées +TP_LOCALLAB_WAT_BLURLC_TOOLTIP;Par défaut les 3 dimensions de L*a*b* luminance et couleur sont concernées par le floutage.\nCase cochée - luminance seulement +TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Etendue des niveaux d’ondelettes utilisée dans l’ensemble du module “wavelets” +TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;Image résiduelle, a le même comportement que l'image principale +TP_LOCALLAB_WAT_CLARIL_TOOLTIP;"Fusion luma" est utilisée pour selectionner l'intensité de l'effet désiré sur la luminance. +TP_LOCALLAB_WAT_CLARIC_TOOLTIP;"Fusion chroma" est utilisée pour selectionner l'intensité de l'effet désiré sur la luminance. +TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;"Fusion seulement avec image originale", empêche les actions "Wavelet Pyramid" d'interférer avec "Claté" and "Masque netteté" +TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Permet au contraste local de varier en fonction d'un gradient et d'un angle. La variation du signal de la luminance signal est prise en compte et non pas la luminance. +TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Décalage modifie la balance entre faible contraste et contraste élévé.\nLes hautes valeurs amplifient les changements de contraste pour les détails à contraste élévé, alors que les faibles valeurs vont amplifier les détails à contraste faible .\nEn selectionant des valeurs faibles vous pouvez ainsi sélectionner les zones de contrastes qui seront accentuées. +TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;"Niveaux de Chroma": ajuste les valeurs "a" et "b" des composantes L*a*b* comme une proportion de la luminance. +TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similaira à Contraste par niveaux de détail. Des détails fins au gros details de gauche à droite en abscisse. +TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensité de la détection d'effet de bord +TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;Vous pouvez agir sur la répartition du contraste local selon l'intensité initiale du contraste par niveaux d'ondelettes.\nCeci aura comme conséquences de modifier l'effet de perspective et de relief de l'image, et/ou réduire les contrastes pour les très faibles niveaux de contraste initial +TP_LOCALLAB_WAT_GRADW_TOOLTIP;Plus vous déplacez le curseur à droite, plus l'algorithme de détection sera efficace, moins les effets du contraste local seront sensibles +TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Montre l'ensemble des outils "Netteté bords".\nLa lecture de la documentation wavelet est recommandée +TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Permet d'ajuster l'effet maximum de floutage des niveaux +TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Vous permet de flouter chaque niveau de décomposition.\nEn abscisse de gauche à droite, les niveaux de décomposition du plus fin au plus gros +TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Floute l'image résiduelle, indépendamment des niveaux +TP_LOCALLAB_WAT_WAVTM_TOOLTIP;La partie inférieure (négative) compresse chaque niveau de décomposition créant un effet tone mapping.\nLa partie supérieure (positive) atténue le contraste par niveau.\nEn abscisse de gauche à droite, les niveaux de décomposition du plus fin au plus gros +TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Equilibre l'action à l'intérieur de chaque niveau +TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Commpresse l'image résiduelle afin d'accentuer ou réduire les contrastes +TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;En déplaçant le curseur à gauche, les bas niveaux sont accentués, et vers la droite ce sont les bas niveaux qui sont réduits et les hauts niveaux accentués +TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Agit sur la balance des trois directions horizontale - verticale - diagonale - en fonction de la luminance de l'image.\nPar défaut les parties sombres ou hautes lumières sont réduites afin d'éviter les artefacts TP_LOCALLAB_WAV;Contrast local niveau TP_LOCALLAB_WAVBLUR_TOOLTIP;Réalise un flou pour chaque niveau de décomposition, également pour l'image résiduelle. TP_LOCALLAB_WAVCOMP;Compression par niveau -TP_LOCALLAB_WAVCOMPRE;(de)Compression par niveau +TP_LOCALLAB_WAVCOMPRE;Compression par niveau TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Réalise un 'Tone-mapping' ou une réduction du contraste local par niveau.\nEn abscisse: niveaux TP_LOCALLAB_WAVCOMP_TOOLTIP;Réalise un contrast local en fonction de la direction de la décomposition en ondelettes : horizontal, vertical, diagonal TP_LOCALLAB_WAVCON;Contraste par niveau diff --git a/rtdata/languages/default b/rtdata/languages/default index 6aec8478c..a2ebbda14 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2346,14 +2346,14 @@ TP_LOCALLAB_BLNOI_EXP;Blur & Noise TP_LOCALLAB_BLNORM;Normal TP_LOCALLAB_BLSYM;Symmetric TP_LOCALLAB_BLUFR;Blur/Grain & Denoise -TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n*blur the background by completely covering the image with an an RT-spot (high values for scope and transition and ‘Normal’ or ‘Inverse’ in checkbox).\n*Isolate the foreground by using one or more ‘Excluding’ RT-spot(s) and increase the scope.\n\nThis module (including the "median" and "Guided filter") can be used in addition to the main-menu noise reduction. +TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and ‘Normal’ or ‘Inverse’ in checkbox).\n-Isolate the foreground by using one or more ‘Excluding’ RT-spot(s) and increase the scope.\n\nThis module (including the "median" and "Guided filter") can be used in addition to the main-menu noise reduction. TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain TP_LOCALLAB_BLURCBDL;Blur levels 0-1-2-3-4 TP_LOCALLAB_BLURCOL;Radius TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. TP_LOCALLAB_BLURDE;Blur shape detection -TP_LOCALLAB_BLURLC;Luminance Only -TP_LOCALLAB_BLURLEVELFRA;Blur Levels +TP_LOCALLAB_BLURLC;Luminance only +TP_LOCALLAB_BLURLEVELFRA;Blur levels TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the "radius" of the Gaussian blur (0 to 1000) TP_LOCALLAB_BLURRESIDFRA;Blur Residual @@ -2384,45 +2384,45 @@ TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. TP_LOCALLAB_CHROMASK_TOOLTIP;You can use this slider to desaturated background (inverse mask - curve near 0).\nAlso to attenuate or enhance the action of a mask on the chroma TP_LOCALLAB_CHRRT;Chroma TP_LOCALLAB_CIRCRADIUS;Spot size -TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for treating foliage.\nHigh values may be useful for treating skin +TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for treating foliage.\nHigh values may be useful for treating skin TP_LOCALLAB_CLARICRES;Merge chroma -TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask - Blend & Soft images +TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask - Blend & Soften Images TP_LOCALLAB_CLARILRES;Merge luma TP_LOCALLAB_CLARISOFT;Soft radius -TP_LOCALLAB_CLARISOFT_TOOLTIP;Enabled for Clarity and Sharp mask if Merge Luma different from zero.\n\nEnabled for all wavelets pyramid modules.\nDisabled if Soft radius = 0 +TP_LOCALLAB_CLARISOFT_TOOLTIP;The "Soft radius" slider (guided filter algorithm) reduces halos and irregularities for both Clarity and Sharp Mask and for all pyramid wavelet processes. To deactivate, set slider to zero. TP_LOCALLAB_CLARITYML;Clarity -TP_LOCALLAB_CLARI_TOOLTIP;Under or equal level wavelet 4, 'Sharp mask' is enabled.\nAbove level wavelet 5 'Clarity' is enabled.\nUsefull if you use 'Level dynamic Range Compression' +TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): ‘Sharp mask’ is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping' TP_LOCALLAB_CLIPTM;Clip restored data (gain) TP_LOCALLAB_COFR;Color & Light TP_LOCALLAB_COLORDE;ΔE preview color - intensity TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color-preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modifications without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. -TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in "Add tool to current spot" menu\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE +TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in "Add tool to current spot" menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE TP_LOCALLAB_COLORSCOPE;Scope (color tools) TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. TP_LOCALLAB_COLOR_TOOLNAME;Color & Light - 11 TP_LOCALLAB_COL_NAME;Name TP_LOCALLAB_COL_VIS;Status -TP_LOCALLAB_COMPFRA;Directional Contrast -TP_LOCALLAB_COMPFRAME_TOOLTIP;Allows special effects. You can reduce artifacts with 'Clarity & Sharp mask - Blend & Soft Images".\nUses a lot of resources +TP_LOCALLAB_COMPFRA;Directional contrast +TP_LOCALLAB_COMPFRAME_TOOLTIP;Allows special effects. You can reduce artifacts with 'Clarity & Sharp mask - Blend & Soften Images".\nUses a lot of resources TP_LOCALLAB_COMPLEX_METHOD;Software Complexity TP_LOCALLAB_COMPLEX_TOOLTIP; Allow user to select Local adjustments rubrics. -TP_LOCALLAB_COMPREFRA;Wavelet level tone-mapping -TP_LOCALLAB_COMPRESS_TOOLTIP;Use if necessary the module 'Clarity & Sharp mask and Blend & Soft Images' by adjusting 'Soft radius' to reduce artifacts. +TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +TP_LOCALLAB_COMPRESS_TOOLTIP;Use if necessary the module 'Clarity & Sharp mask and Blend & Soften Images' by adjusting 'Soft radius' to reduce artifacts. TP_LOCALLAB_CONTCOL;Contrast threshold -TP_LOCALLAB_CONTFRA;Contrast by Level -TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted depending on the texture. +TP_LOCALLAB_CONTFRA;Contrast by level +TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. TP_LOCALLAB_CONTRAST;Contrast TP_LOCALLAB_CONTRASTCURVMASK1_TOOLTIP;Allows you to freely modify the contrast of the mask (gamma & slope), instead of using a continuous & progressive curve. However it can create artifacts that have to be dealt with using the “Smooth radius” or “Laplacian threshold sliders”. TP_LOCALLAB_CONTRESID;Contrast TP_LOCALLAB_CONTTHR;Contrast Threshold TP_LOCALLAB_CONTWFRA;Local contrast -TP_LOCALLAB_CSTHRESHOLD;Ψ Wavelets Levels +TP_LOCALLAB_CSTHRESHOLD;Ψ Wavelet levels TP_LOCALLAB_CSTHRESHOLDBLUR;Ψ Wavelet level selection TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance "Super" TP_LOCALLAB_CURVCURR;Normal TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nThe gray transition line which represents the references (chroma, luma, hue).\nYou can choose or not to position the top of the curves on this transition. -TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To be active, you must enable combobox 'Curve type' +TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the ‘Curve type’ combobox to ‘Normal’ TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. @@ -2455,8 +2455,8 @@ TP_LOCALLAB_DETAIL;Local contrast TP_LOCALLAB_DETAILSH;Details TP_LOCALLAB_DETAILTHR;Luminance & chroma detail threshold (DCT ƒ) TP_LOCALLAB_DUPLSPOTNAME;Copy -TP_LOCALLAB_EDGFRA;Edge Sharpness -TP_LOCALLAB_EDGSHOW;Show all tolls +TP_LOCALLAB_EDGFRA;Edge sharpness +TP_LOCALLAB_EDGSHOW;Show all tools TP_LOCALLAB_ELI;Ellipse TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping TP_LOCALLAB_ENABLE_MASK;Enable mask @@ -2465,7 +2465,7 @@ TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled Mask uses Restored Datas after Tr TP_LOCALLAB_ENH;Enhanced TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise TP_LOCALLAB_EPSBL;Detail -TP_LOCALLAB_EQUIL;Normalize Luminance +TP_LOCALLAB_EQUIL;Normalize luminance TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. TP_LOCALLAB_ESTOP;Edge stopping TP_LOCALLAB_EV_DUPL;Copy of @@ -2486,8 +2486,8 @@ TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ TP_LOCALLAB_EXPCOMPINV;Exposure compensation TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change "Shape detection" in "Settings":\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)’ -TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation of wavelet levels.\nHowever there are some differences: more tools and closer to the details.\nEx: Tone mapping for wavelet levels. -TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small(< 32x32 pixels).\nUse low transition values and high decay transition values and scope to simulate small RT-spot and deal wth defects.\nUse if necessary the module 'Clarity & Sharp mask and Blend images' by adjusting 'Soft radius' to reduce artifacts. +TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Locallab version: more tools and more possibilities for working on individual detail levels.\ne.g. Wavelet-level tone mapping. +TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low ‘Transition value’ and high ‘Transition decay’ and ‘Scope’ to simulate small RT-spots and deal wth defects.\nUse 'Clarity & Sharp mask and Blend & Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. TP_LOCALLAB_EXPCURV;Curves TP_LOCALLAB_EXPGRAD;Graduated Filter TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and "Merge file") Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. @@ -2495,7 +2495,7 @@ TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. -TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control\nOriginal Image : merge current RT-spot with Original.\nPrevious spot : merge current Rt-spot with previous - if there is only one spot previous = original.\nBackground : merge current RT-spot with a color and luminance background (fewer possibilties) +TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-spot with Original.\nPrevious spot : merge current Rt-spot with previous - if there is only one spot previous = original.\nBackground : merge current RT-spot with a color and luminance background (fewer possibilties) TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : use an algorithm similar as main Exposure but in L*a*b* and taking account of deltaE.\n\nContrast attenuator : use another algorithm also with deltaE and with Poisson equation to solve Laplacian in Fourier space.\nContrast attenuator, Dynamic range compression and Standard can be combined.\nFFTW Fourier Transform is optimized in size to reduce processing time.\nReduce artifacts and noise. TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the "Denoise" tool. TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure @@ -2544,11 +2544,11 @@ TP_LOCALLAB_GRADSTRLUM;Luminance gradient strength TP_LOCALLAB_GRADSTR_TOOLTIP;Filter strength in stops TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image TP_LOCALLAB_GRAINFRA;Film Grain 1:1 -TP_LOCALLAB_GRALWFRA;Graduated Filter Local contrast +TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use small spot and adapt transition and transition decay\nOnly mode NORMAL and eventually Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE) TP_LOCALLAB_GRIDONE;Color Toning TP_LOCALLAB_GRIDTWO;Direct -TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma -Equivalent to H=f(H) if the "white dot" on the grid remains at zero and you only vary the "black dot"-Equivalent to "Color toning" if you vary the 2 dots.\n\nDirect: acts directly on the chroma +TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the "white dot" on the grid remains at zero and you only vary the "black dot". Equivalent to "Color toning" if you vary the 2 dots.\n\nDirect: acts directly on the chroma TP_LOCALLAB_GUIDBL;Soft radius TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. @@ -2562,7 +2562,7 @@ TP_LOCALLAB_IND;Independent (mouse) TP_LOCALLAB_INDSL;Independent (mouse + sliders) TP_LOCALLAB_INVERS;Inverse TP_LOCALLAB_INVBL;Inverse -TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n full image - delimiter outside preview\n RT-spot shape: rectangle. Transition 100\n\nSecond spot : Excluding spot +TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n full image - delimiter outside preview\n RT-spot shape: rectangle. Transition 100\n\nSecond spot: Excluding spot TP_LOCALLAB_INVBL_TOOLTIP;Alternative to ‘Inverse’ mode: use two spots\nFirst Spot:\n full image - delimiter outside preview\n RT-spot shape: rectangle. Transition 100\n\nSecond spot : Excluding spot TP_LOCALLAB_ISOGR;Coarseness (ISO) TP_LOCALLAB_LABBLURM;Blur Mask @@ -2578,15 +2578,14 @@ TP_LOCALLAB_LAPMASKCOL;Laplacian threshold TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using “Smooth radius” and “Laplacian threshold” (advanced) together.\nSmooth radius uses a guided filter to decrease artifacts and smooth out the transition TP_LOCALLAB_LAPRAD1_TOOLTIP;Avoid using “Smooth radius” and “Laplacian threshold” (advanced) together.\nTransforms the mask to eliminate values lower than the threshold.\nReduces artifacts and noise, and allows local contrast to be modified. TP_LOCALLAB_LAP_MASK_TOOLTIP;Solve PDE for all Laplacian masks.\nIf enabled Laplacian threshold mask reduce artifacts and smooth result.\nIf disabled linear response. -TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. Dimensions of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets - 7 TP_LOCALLAB_LEVELBLUR;Maximum blur levels -TP_LOCALLAB_LEVELLOCCONTRAST_TOOLTIP;On the abscissa local contrast (near concept luminance). On the ordinate, amplification or reduction local contrast. -TP_LOCALLAB_LEVELWAV;Ψ Wavelets Levels +TP_LOCALLAB_LEVELWAV;Ψ Wavelet levels TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4 TP_LOCALLAB_LEVFRA;Levels TP_LOCALLAB_LIGHTNESS;Lightness -TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 force luminance to zero +TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero TP_LOCALLAB_LIGHTRETI;Lightness TP_LOCALLAB_LINEAR;Linearity TP_LOCALLAB_LIST_NAME;Add tool to current spot... @@ -2597,9 +2596,9 @@ TP_LOCALLAB_LOCCONT;Unsharp Mask TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pyramid 1: TP_LOCALLAB_LOC_CONTRASTPYR2;Ψ Pyramid 2: -TP_LOCALLAB_LOC_CONTRASTPYR2LAB;Contrast by Level- Tone Mapping - Dir.Contrast -TP_LOCALLAB_LOC_CONTRASTPYRLAB;Graduated Filter - Edge Sharpness - Blur -TP_LOCALLAB_LOC_RESIDPYR;Residual Image (Main) +TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level- Tone Mapping - Dir.Contrast +TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter - Edge Sharpness - Blur +TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) TP_LOCALLAB_LOG;Log Encoding TP_LOCALLAB_LOGAUTO;Automatic TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and Source Gray Point (if "Automatic Source Gray Point” enabled).\nPress the button again to adjust the automatically calculated values. @@ -2629,7 +2628,7 @@ TP_LOCALLAB_MASK2;Contrast curve TP_LOCALLAB_MASKCOL;Mask Curves TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection TP_LOCALLAB_MASKH;Hue curve -TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ) \n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allows you to make fine adjustments. TP_LOCALLAB_MED;Medium TP_LOCALLAB_MEDIAN;Median Low TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. @@ -2708,7 +2707,7 @@ TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the TP_LOCALLAB_PASTELS2;Vibrance TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ -TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu ‘Exposure’\nMay be useful for under-exposed or high dynamic range images. +TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu ‘Exposure’.\nMay be useful for under-exposed or high dynamic range images. TP_LOCALLAB_PREVIEW;Preview ΔE TP_LOCALLAB_PREVHIDE;Hide additional settings TP_LOCALLAB_PREVSHOW;Show additional settings @@ -2770,7 +2769,6 @@ TP_LOCALLAB_SHADEX;Shadows TP_LOCALLAB_SHADEXCOMP;Shadow compression & tonal width TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone equalizer TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows & highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. -//Can be used instead - or in complement - of exposure module in difficult cases.\nThe use of Denoise may be necessary : lightening the shadows.\n\nCan be used as graduated filter (increase Scope) TP_LOCALLAB_SHAMASKCOL;Shadows TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm @@ -2795,7 +2793,7 @@ TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) TP_LOCALLAB_SHOWLC;Mask and modifications TP_LOCALLAB_SHOWMASK;Show mask -TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks\nShow modifications without mask: shows the modifications before any masks are applied\nShow modifications with mask: shows the modifications after a mask has been applied\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the "Spot structure" cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modifications without mask: shows the modifications before any masks are applied.\nShow modifications with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the "Spot structure" cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise TP_LOCALLAB_SHOWMASKTYP2;Denoise @@ -2842,7 +2840,7 @@ TP_LOCALLAB_STREN;Compression strength TP_LOCALLAB_STRENG;Strength TP_LOCALLAB_STRENGR;Strength TP_LOCALLAB_STRENGTH;Noise -TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with "strength", but you can also use the "scope" function which allows you to delimit the action (e.g., to isolate a particular color). +TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with "strength", but you can also use the "scope" function which allows you to delimit the action (e.g. to isolate a particular color). TP_LOCALLAB_STRGRID;Strength TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\nif Strength Retinex >= 0.1 Dehaze is in luminance mode. TP_LOCALLAB_STRUC;Structure @@ -2851,7 +2849,7 @@ TP_LOCALLAB_STRUCCOL1;Spot structure TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate "Mask and modifications” > “Show spot structure" (advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and “Local contrast (by wavelet level)” to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either ‘Show modified image” or “Show modifications with mask ”. TP_LOCALLAB_STRUMASKCOL;Structure mask strength TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox "Structure mask as tool" unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask 1 (Blur and denoise") and mask 7 (Color & Light). -TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended ! +TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! TP_LOCALLAB_STYPE;Shape method TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. TP_LOCALLAB_SYM;Symmetrical (mouse) @@ -2874,7 +2872,7 @@ TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between "local" and "global" contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4 TP_LOCALLAB_TOOLCOL;Structure mask as tool -TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allow you to modify the mask, if one exist +TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists TP_LOCALLAB_TRANSIT;Transition Gradient TP_LOCALLAB_TOOLMASK;Mask Tools TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY @@ -2882,7 +2880,7 @@ TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition TP_LOCALLAB_TRANSITVALUE;Transition value TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light) -TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas, as a percentage of the "radius" +TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the "radius" TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain TP_LOCALLAB_TRANSMISSIONMAP;Transmission map TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts @@ -2903,23 +2901,48 @@ TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask - 13 TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. TP_LOCALLAB_WAMASKCOL;Ψ Mask Wavelet level TP_LOCALLAB_WARM;Warm/Cool & Color artifacts -TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler\nIt can also reduce color artifacts in some cases. +TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve corresponds to the first 3 levels 0,1 &2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3 and beyond). +TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncrease or decrease local contrast on the y-axis. +TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details, and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment, and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the "Wavelets" module. +TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +TP_LOCALLAB_WAT_CLARIL_TOOLTIP;“Merge luma” is used to select the intensity of the desired effect on luminance. +TP_LOCALLAB_WAT_CLARIC_TOOLTIP;“Merge chroma” is used to select the intensity of the desired effect on chrominance. +TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;“Merge only with original image”, prevents the “Wavelet Pyramid” settings from interfering with “Clarity” and “Sharp mask”. +TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low “Attenuation response” value you can select which contrast values will be enhanced. +TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;“Chroma levels”: adjusts the “a” and “b” components of Lab* as a proportion of the luminance value. +TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the "Edge sharpness" tools. It is advisable to read the Wavelet Levels documentation. +TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. TP_LOCALLAB_WAV;Local contrast by level -TP_LOCALLAB_WAVBLUR_TOOLTIP;Performs a blur for each level of decomposition, as well as the residual image. -TP_LOCALLAB_WAVCOMP;Compression by Level -TP_LOCALLAB_WAVCOMPRE;(un)Compression by Level -TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Achieve a Tone-mapping or reduction local contrast by level.\nOn abscissa levels -TP_LOCALLAB_WAVCOMP_TOOLTIP;Achive local contrast in function of the direction wavelet decomposition : horizontal, vertical, diagonal -TP_LOCALLAB_WAVCON;Contrast by Level -TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels : on abscissa levels. -TP_LOCALLAB_WAVDEN;Luminance denoise by level (0 1 2 &3 and more) -TP_LOCALLAB_WAVE;Ψ Wavelet +TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +TP_LOCALLAB_WAVCOMP;Compression by level +TP_LOCALLAB_WAVCOMPRE;Compression by level +TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal +TP_LOCALLAB_WAVCON;Contrast by level +TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +TP_LOCALLAB_WAVDEN;Luminance denoise by level +TP_LOCALLAB_WAVE;Ψ Wavelets TP_LOCALLAB_WAVEDG;Local contrast -TP_LOCALLAB_WAVEEDG_TOOLTIP;Achieves a sharpness taking into account the notion of edges wavelet.\nRequires that at least the first 4 levels are usable -TP_LOCALLAB_WAVGRAD_TOOLTIP;Graduated filter for Local contrast "luminance" +TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. TP_LOCALLAB_WAVHIGH;Ψ Wavelet high -TP_LOCALLAB_WAVLEV;Blur by Level +TP_LOCALLAB_WAVLEV;Blur by level TP_LOCALLAB_WAVLOW;Ψ Wavelet low TP_LOCALLAB_WAVMASK;Ψ Local contrast (by wavelet level) TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings...) @@ -3371,7 +3394,7 @@ TP_WAVELET_EDEFFECT;Attenuation response TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment TP_WAVELET_EDGCONT;Local contrast TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+std. dev. and maxima. -TP_WAVELET_EDGE;Edge Sharpness +TP_WAVELET_EDGE;Edge sharpness TP_WAVELET_EDGEAMPLI;Base amplification TP_WAVELET_EDGEDETECT;Gradient sensitivity TP_WAVELET_EDGEDETECTTHR;Threshold low (noise) @@ -3402,7 +3425,7 @@ TP_WAVELET_HUESKY;Hue range TP_WAVELET_HUESKY_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. TP_WAVELET_ITER;Delta balance levels TP_WAVELET_ITER_TOOLTIP;Left: increase low levels and reduce high levels,\nRight: reduce low levels and increase high levels. -TP_WAVELET_LABEL;Wavelet Levels +TP_WAVELET_LABEL;Wavelet levels TP_WAVELET_LARGEST;Coarsest TP_WAVELET_LEVCH;Chroma TP_WAVELET_LEVDEN;Level 5-6 denoise diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index 55e3fab08..e793f1c92 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -2630,10 +2630,49 @@ void LocallabContrast::updateAdviceTooltips(const bool showTooltips) { if (showTooltips) { contFrame->set_tooltip_text(M("TP_LOCALLAB_EXPCONTRAST_TOOLTIP")); - LocalcurveEditorwav->set_tooltip_markup(M("TP_LOCALLAB_LEVELLOCCONTRAST_TOOLTIP")); + LocalcurveEditorwav->set_tooltip_markup(M("TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP")); + csThreshold->set_tooltip_markup(M("TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP")); levelwav->set_tooltip_markup(M("TP_LOCALLAB_LEVELWAV_TOOLTIP")); clariFrame->set_tooltip_markup(M("TP_LOCALLAB_CLARI_TOOLTIP")); clarisoft->set_tooltip_markup(M("TP_LOCALLAB_CLARISOFT_TOOLTIP")); + + wavshape->setTooltip(M("TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP")); + clarilres->set_tooltip_text(M("TP_LOCALLAB_WAT_CLARIL_TOOLTIP")); + claricres->set_tooltip_text(M("TP_LOCALLAB_WAT_CLARIC_TOOLTIP")); + sigmalc->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + sigmalc2->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + sigmaed->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + sigmabl->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + sigma->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + sigmadc->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + sigmadr->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + origlc->set_tooltip_text(M("TP_LOCALLAB_WAT_ORIGLC_TOOLTIP")); + strwav->set_tooltip_text(M("TP_LOCALLAB_WAT_STRWAV_TOOLTIP")); + angwav->set_tooltip_text(M("TP_LOCALLAB_WAT_STRWAV_TOOLTIP")); + strengthw->set_tooltip_text(M("TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP")); + LocalcurveEditorwavedg->set_tooltip_markup(M("TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP")); + wavshapeedg->setTooltip(M("TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP")); + gradw->set_tooltip_text(M("TP_LOCALLAB_WAT_GRADW_TOOLTIP")); + waveshow->set_tooltip_text(M("TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP")); + LocalcurveEditorwavlev->set_tooltip_markup(M("TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP")); + wavshapelev->setTooltip(M("TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP")); + levelblur->set_tooltip_text(M("TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP")); + residblur->set_tooltip_text(M("TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP")); + blurlc->set_tooltip_text(M("TP_LOCALLAB_WAT_BLURLC_TOOLTIP")); + offset->set_tooltip_text(M("TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP")); + chromalev->set_tooltip_text(M("TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP")); + LocalcurveEditorwavcon->set_tooltip_markup(M("TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP")); + wavshapecon->setTooltip(M("TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP")); + LocalcurveEditorwavcompre->set_tooltip_markup(M("TP_LOCALLAB_WAT_WAVTM_TOOLTIP")); + wavshapecompre->setTooltip(M("TP_LOCALLAB_WAT_WAVTM_TOOLTIP")); + deltad->set_tooltip_text(M("TP_LOCALLAB_WAT_DELTABAL_TOOLTIP")); + LocalcurveEditorwavcomp->set_tooltip_markup(M("TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP")); + wavshapecomp->setTooltip(M("TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP")); + threswav->set_tooltip_text(M("TP_LOCALLAB_WAT_BALTHRES_TOOLTIP")); + residcomp->set_tooltip_text(M("TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP")); + + + expresidpyr->set_tooltip_text(M("TP_LOCALLAB_WAT_EXPRESID_TOOLTIP")); expcontrastpyr->set_tooltip_text(M("TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP")); wavgradl->set_tooltip_text(M("TP_LOCALLAB_WAVGRAD_TOOLTIP")); wavedg->set_tooltip_text(M("TP_LOCALLAB_WAVEEDG_TOOLTIP")); @@ -2658,6 +2697,8 @@ void LocallabContrast::updateAdviceTooltips(const bool showTooltips) } else { contFrame->set_tooltip_text(""); LocalcurveEditorwav->set_tooltip_markup(""); + csThreshold->set_tooltip_markup(""); + expresidpyr->set_tooltip_text(""); levelwav->set_tooltip_markup(""); clariFrame->set_tooltip_markup(""); clarisoft->set_tooltip_markup(""); @@ -2682,6 +2723,42 @@ void LocallabContrast::updateAdviceTooltips(const bool showTooltips) masklcCurveEditorG->set_tooltip_markup(""); chromasklc->set_tooltip_text(""); sensilc->set_tooltip_text(""); + + wavshape->setTooltip(""); + clarilres->set_tooltip_text(""); + claricres->set_tooltip_text(""); + sigmalc->set_tooltip_text(""); + sigmalc2->set_tooltip_text(""); + sigmaed->set_tooltip_text(""); + sigmabl->set_tooltip_text(""); + sigma->set_tooltip_text(""); + sigmadc->set_tooltip_text(""); + sigmadr->set_tooltip_text(""); + origlc->set_tooltip_text(""); + strwav->set_tooltip_text(""); + angwav->set_tooltip_text(""); + strengthw->set_tooltip_text(""); + LocalcurveEditorwavedg->set_tooltip_markup(""); + wavshapeedg->setTooltip(""); + gradw->set_tooltip_text(""); + waveshow->set_tooltip_text(""); + LocalcurveEditorwavlev->set_tooltip_markup(""); + wavshapelev->setTooltip(""); + residblur->set_tooltip_text(""); + blurlc->set_tooltip_text(""); + levelblur->set_tooltip_text(""); + offset->set_tooltip_text(""); + chromalev->set_tooltip_text(""); + LocalcurveEditorwavcon->set_tooltip_markup(""); + wavshapecon->setTooltip(""); + LocalcurveEditorwavcompre->set_tooltip_markup(""); + wavshapecompre->setTooltip(""); + deltad->set_tooltip_text(""); + LocalcurveEditorwavcomp->set_tooltip_markup(""); + wavshapecomp->setTooltip(""); + threswav->set_tooltip_text(""); + residcomp->set_tooltip_text(""); + } } From 5fd640f9779810e364ab834f7d21f53fa09ab0ac Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 9 Oct 2020 16:53:03 +0200 Subject: [PATCH 140/185] Change GUI to disable denoise if level sup to 7 (#5942) --- rtengine/ipwavelet.cc | 4 ++++ rtgui/wavelet.cc | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 5920c4078..6c20d7d93 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1036,6 +1036,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } + if (levwavL == 6 && cp.noiseena) { + cp.chromfi = 0.01f; + } + if (cp.chromfi > 0.f || cp.chromco > 0.f) { if (levwavL < 7) { levwavL = 7; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 47cdc9342..c7647798a 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -3730,6 +3730,13 @@ void Wavelet::adjusterChanged(Adjuster* a, double newval) } else { sup->hide(); } + if(z >= 8 ) { + expnoise->setEnabled(false); + expnoise->set_sensitive(false); + } else { + // expnoise->setEnabled(pp->wavelet.expnoise); + expnoise->set_sensitive(true); + } listener->panelChanged(EvWavthres, thres->getTextValue()); updateGUImaxlev(); @@ -3852,6 +3859,13 @@ void Wavelet::enabledUpdateUI() sup->hide(); } + if(z >= 8) { + expnoise->setEnabled(false); + expnoise->set_sensitive(false); + } else { + expnoise->set_sensitive(true); + } + // adjusterUpdateUI(tmrs); } } From 74f28ebf04ca62a44817508b0a76253ffaad1f6d Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 10 Oct 2020 08:24:21 +0200 Subject: [PATCH 141/185] Change show modifications --- rtdata/languages/default | 10 +++++----- rtgui/locallabtools.cc | 5 +++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index a2ebbda14..83779b8f0 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2395,7 +2395,7 @@ TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): ‘Sharp mask’ is enabled\ TP_LOCALLAB_CLIPTM;Clip restored data (gain) TP_LOCALLAB_COFR;Color & Light TP_LOCALLAB_COLORDE;ΔE preview color - intensity -TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color-preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modifications without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color-preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in "Add tool to current spot" menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE TP_LOCALLAB_COLORSCOPE;Scope (color tools) TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. @@ -2793,15 +2793,15 @@ TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) TP_LOCALLAB_SHOWLC;Mask and modifications TP_LOCALLAB_SHOWMASK;Show mask -TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modifications without mask: shows the modifications before any masks are applied.\nShow modifications with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the "Spot structure" cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the "Spot structure" cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise TP_LOCALLAB_SHOWMASKTYP2;Denoise TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Mask and modifications can be chosen.\nBlur and noise : in this case it is not used for 'denoise'.\nDenoise : in this case it is not used for 'blur and noise'.\n\nBlur and noise + denoise : mask is shared, be carefull to 'show modifications' and 'scope' TP_LOCALLAB_SHOWMNONE;Show modified image -TP_LOCALLAB_SHOWMODIF;Show modifications without mask -TP_LOCALLAB_SHOWMODIFMASK;Show modifications with mask +TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask TP_LOCALLAB_SHOWNORMAL;No luminance normalization TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) @@ -2846,7 +2846,7 @@ TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\ni TP_LOCALLAB_STRUC;Structure TP_LOCALLAB_STRUCCOL;Spot structure TP_LOCALLAB_STRUCCOL1;Spot structure -TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate "Mask and modifications” > “Show spot structure" (advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and “Local contrast (by wavelet level)” to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either ‘Show modified image” or “Show modifications with mask ”. +TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate "Mask and modifications” > “Show spot structure" (advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and “Local contrast (by wavelet level)” to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either ‘Show modified image” or “Show modified areas with mask ”. TP_LOCALLAB_STRUMASKCOL;Structure mask strength TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox "Structure mask as tool" unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask 1 (Blur and denoise") and mask 7 (Color & Light). TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index c11682091..0fdbac588 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -2,8 +2,7 @@ * This file is part of RawTherapee. * * Copyright (c) 2004-2010 Gabor Horvath frame - * - * +fft * * RawTherapee 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 @@ -6082,6 +6081,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) sensibn->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); medMethod->set_tooltip_text(M("TP_LOCALLAB_MEDIAN_TOOLTIP")); itera->set_tooltip_text(M("TP_LOCALLAB_MEDIANITER_TOOLTIP")); + fftwbl->set_tooltip_text(M("TP_LOCALLAB_FFTMASK_TOOLTIP")); guidbl->set_tooltip_text(M("TP_LOCALLAB_GUIDBL_TOOLTIP")); strbl->set_tooltip_text(M("TP_LOCALLAB_GUIDSTRBL_TOOLTIP")); epsbl->set_tooltip_text(M("TP_LOCALLAB_GUIDEPSBL_TOOLTIP")); @@ -6132,6 +6132,7 @@ void LocallabBlur::updateAdviceTooltips(const bool showTooltips) sensibn->set_tooltip_text(""); medMethod->set_tooltip_text(""); itera->set_tooltip_text(""); + fftwbl->set_tooltip_text(""); guidbl->set_tooltip_text(""); strbl->set_tooltip_text(""); epsbl->set_tooltip_text(""); From c335e7ba246b842c036fd7a18e7d83ceb153b0ba Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sat, 10 Oct 2020 11:56:13 -0700 Subject: [PATCH 142/185] Fix bug with vectorscope not updating The scope would not redraw after switching from one vectorscope to another. This commit sets the drawing area dirty when the scope type changes. --- rtgui/histogrampanel.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 8946a5e35..63d299fa5 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -497,6 +497,8 @@ void HistogramPanel::type_selected(Gtk::RadioButton* button) if (histogramRGBArea) { updateHistRGBAreaOptions(); } + histogramArea->setDirty(true); + histogramArea->queue_draw(); } void HistogramPanel::type_changed() From ee1c85879d1ac6175a745e6cfe2d4e3f63fb9583 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sat, 10 Oct 2020 12:11:59 -0700 Subject: [PATCH 143/185] Suppress unnecessary updates to scope back buffer Upon the resize signal, the scope back buffers were redrawn, even if there was no actual change to the size. This commit checks the size and only updates the back buffers if the size changed. --- rtgui/histogrampanel.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 63d299fa5..8742c8bb0 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -403,14 +403,19 @@ void HistogramPanel::showRGBBar() void HistogramPanel::resized (Gtk::Allocation& req) { + static int old_height = 0; + static int old_width = 0; - if (!histogramArea->updatePending()) { + bool size_changed = + old_height != req.get_height() || old_width != req.get_width(); + + if (!histogramArea->updatePending() && size_changed) { histogramArea->updateBackBuffer (); histogramArea->queue_draw (); } // set histogramRGBArea invalid; - if (histogramRGBArea) { + if (histogramRGBArea && size_changed) { histogramRGBArea->updateBackBuffer(-1, -1, -1); histogramRGBArea->queue_draw (); } @@ -418,6 +423,8 @@ void HistogramPanel::resized (Gtk::Allocation& req) // Store current height of the histogram options.histogramHeight = get_height(); + old_height = req.get_height(); + old_width = req.get_width(); } void HistogramPanel::red_toggled () @@ -589,7 +596,7 @@ void HistogramPanel::rgbv_toggled () if (histogramRGBArea) { updateHistRGBAreaOptions(); - histogramRGBArea->updateBackBuffer (0, 0, 0); + histogramRGBArea->updateBackBuffer(-1, -1, -1); histogramRGBArea->queue_draw (); } } From 992a5ad3d99e8786bdc1a4304723c8d48cd2383d Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sat, 10 Oct 2020 15:15:28 -0700 Subject: [PATCH 144/185] Change how histogram RGB indicators are rendered Show/hide them instead of removing/adding and fix the width of the vertical indicator. --- rtgui/histogrampanel.cc | 71 ++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 47 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 8742c8bb0..1165881a5 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -73,11 +73,9 @@ HistogramPanel::HistogramPanel () : histogramRGBAreaHori.reset(new HistogramRGBAreaHori()); setExpandAlignProperties(histogramRGBAreaHori.get(), true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_END); - histogramRGBAreaHori->show(); histogramRGBAreaVert.reset(new HistogramRGBAreaVert()); setExpandAlignProperties(histogramRGBAreaVert.get(), false, true, Gtk::ALIGN_END, Gtk::ALIGN_FILL); - histogramRGBAreaVert->show(); switch (options.histogramScopeType) { case ScopeType::NONE: @@ -102,13 +100,14 @@ HistogramPanel::HistogramPanel () : gfxGrid = Gtk::manage (new Gtk::Grid ()); gfxGrid->set_row_spacing(1); gfxGrid->set_column_spacing(1); - histogramRGBAreaHori->setParent(gfxGrid); - histogramRGBAreaVert->setParent(gfxGrid); gfxGrid->add(*histogramArea); - - if (options.histogramBar) { - showRGBBar(); - } + gfxGrid->attach_next_to( + *histogramRGBAreaVert, *histogramArea, + options.histogramPosition == 1 ? Gtk::POS_RIGHT : Gtk::POS_LEFT + ); + gfxGrid->attach_next_to(*histogramRGBAreaHori, *histogramArea, Gtk::POS_BOTTOM); + histogramRGBAreaHori->set_no_show_all(); + histogramRGBAreaVert->set_no_show_all(); redImage = new RTImage ("histogram-red-on-small.png"); greenImage = new RTImage ("histogram-green-on-small.png"); @@ -379,26 +378,19 @@ HistogramPanel::~HistogramPanel () void HistogramPanel::showRGBBar() { - Gtk::PositionType pos; + histogramRGBAreaHori->set_visible( + histogramRGBArea == histogramRGBAreaHori.get() && showBAR->get_active()); + histogramRGBAreaVert->set_visible( + histogramRGBArea == histogramRGBAreaVert.get() && showBAR->get_active()); + histogramRGBAreaHori->setShow(false); + histogramRGBAreaVert->setShow(false); - if (histogramRGBArea == histogramRGBAreaHori.get()) { - pos = Gtk::POS_BOTTOM; - } else if (histogramRGBArea == nullptr) { + if (!histogramRGBArea) { return; - } else { - if (options.histogramPosition == 1) { - pos = Gtk::POS_RIGHT; - } else { - pos = Gtk::POS_LEFT; - } } - gfxGrid->attach_next_to(*histogramRGBArea, *histogramArea, pos); setHistRGBInvalid(); - histogramRGBArea->setShow( - options.histogramScopeType == ScopeType::HISTOGRAM - || options.histogramScopeType == ScopeType::WAVEFORM - ); + histogramRGBArea->setShow(showBAR->get_active()); } void HistogramPanel::resized (Gtk::Allocation& req) @@ -510,11 +502,6 @@ void HistogramPanel::type_selected(Gtk::RadioButton* button) void HistogramPanel::type_changed() { - if (showBAR->get_active() && histogramRGBArea) { - histogramRGBArea->setShow(false); - gfxGrid->remove(*histogramRGBArea); - } - switch (options.histogramScopeType) { case ScopeType::HISTOGRAM: showRed->show(); @@ -570,21 +557,14 @@ void HistogramPanel::type_changed() panel_listener->scopeTypeChanged(options.histogramScopeType); } - if (showBAR->get_active()) { - showRGBBar(); - } + showRGBBar(); } void HistogramPanel::bar_toggled () { showBAR->set_image(showBAR->get_active() ? *barImage : *barImage_g); rgbv_toggled(); - - if (showBAR->get_active()) { - showRGBBar(); - } else if (histogramRGBArea) { - gfxGrid->remove(*histogramRGBArea); - } + showRGBBar(); } void HistogramPanel::rgbv_toggled () @@ -625,10 +605,8 @@ void HistogramPanel::reorder (Gtk::PositionType align) add (*gfxGrid); gfxGrid->unreference(); - if (histogramRGBArea == histogramRGBAreaVert.get()) { - gfxGrid->remove(*histogramRGBArea); - gfxGrid->add(*histogramRGBArea); - } + gfxGrid->remove(*histogramRGBAreaVert); + gfxGrid->add(*histogramRGBAreaVert); optionButtons->reference(); removeIfThere(buttonGrid, optionButtons, false); @@ -640,10 +618,8 @@ void HistogramPanel::reorder (Gtk::PositionType align) add (*buttonGrid); buttonGrid->unreference(); - if (histogramRGBArea == histogramRGBAreaVert.get()) { - gfxGrid->remove(*histogramArea); - gfxGrid->add(*histogramArea); - } + gfxGrid->remove(*histogramRGBAreaVert); + gfxGrid->attach_next_to(*histogramRGBAreaVert, *histogramArea, Gtk::POS_LEFT); persistentButtons->reference(); removeIfThere(buttonGrid, persistentButtons, false); @@ -1021,7 +997,8 @@ void HistogramRGBAreaVert::get_preferred_height_vfunc (int &minimum_height, int void HistogramRGBAreaVert::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - getPreferredThickness(minimum_width, natural_width); + minimum_width = 10 * RTScalable::getScale(); + natural_width = minimum_width; } void HistogramRGBAreaVert::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const @@ -1031,7 +1008,7 @@ void HistogramRGBAreaVert::get_preferred_height_for_width_vfunc (int width, int void HistogramRGBAreaVert::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const { - getPreferredThicknessForLength(height, minimum_width, natural_width); + get_preferred_width_vfunc(minimum_width, natural_width); } // From 8e92c13b287f513fab1c9ba2d288eff4c5caee1a Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 11 Oct 2020 12:41:19 +0200 Subject: [PATCH 145/185] Fixed crash issue 5945 --- rtengine/ipwavelet.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 6c20d7d93..b0fb54211 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1030,7 +1030,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } - if (!exblurL && cp.contrast == 0.f && cp.blurres == 0.f && !cp.tonemap && !cp.finena && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels + if (!exblurL && cp.contrast == 0.f && cp.blurres == 0.f && !cp.tonemap && !cp.finena && !cp.edgeena && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels while (levwavL > 0 && cp.mul[levwavL - 1] == 0.f) { // cp.mul[level] == 0.f means no changes to level levwavL--; } From 17940b3103d1c9436235e6316173854362d69358 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 11 Oct 2020 16:12:24 +0200 Subject: [PATCH 146/185] Two others crash fixed in wavelet when enable with none --- rtengine/ipwavelet.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index b0fb54211..297c38778 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1030,7 +1030,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } - if (!exblurL && cp.contrast == 0.f && cp.blurres == 0.f && !cp.tonemap && !cp.finena && !cp.edgeena && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels + if (!exblurL && cp.contrast == 0.f && cp.blurres == 0.f && !cp.tonemap && !cp.resena && !cp.chromena && !cp.finena && !cp.edgeena && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels while (levwavL > 0 && cp.mul[levwavL - 1] == 0.f) { // cp.mul[level] == 0.f means no changes to level levwavL--; } From 0511458502ad82dfb9dc37feaa9b14b02cca9905 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 11 Oct 2020 18:38:01 +0200 Subject: [PATCH 147/185] Fixed crash when preview too small for denoise --- rtengine/ipwavelet.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 297c38778..ee8ee34b6 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -749,6 +749,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const maxlev2 = 6; } + if (minsizetile < 64) { + maxlev2 = 5; + } + levwav = rtengine::min(maxlev2, levwav); #ifdef _OPENMP @@ -1049,6 +1053,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (levwavL < 5 && cp.noiseena) { levwavL = 6; //to allow edge and denoise => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! } + + levwavL = rtengine::min(maxlevelcrop, levwavL); + /* if(cp.denoicurvh || cp.levdenhigh > 0.01f) { levwavL = levwav; From e93c4f6ed4bc10457961cb86a773b932646881e9 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Sun, 11 Oct 2020 12:29:47 -0700 Subject: [PATCH 148/185] Add slider for adjusting scope trace brightness This makes it easier for users to discover the feature and see the current brightness. --- rtdata/languages/default | 1 + rtdata/themes/RawTherapee-GTK3-20_.css | 17 ++++++ rtdata/themes/TooWaBlue-GTK3-20_.css | 21 ++++++++ rtgui/histogrampanel.cc | 72 ++++++++++++++++++++------ rtgui/histogrampanel.h | 13 +++++ 5 files changed, 109 insertions(+), 15 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index d7f5734ae..e7c47e50d 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -251,6 +251,7 @@ HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of HISTOGRAM_TOOLTIP_R;Show/Hide red histogram. HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade diff --git a/rtdata/themes/RawTherapee-GTK3-20_.css b/rtdata/themes/RawTherapee-GTK3-20_.css index 07877c33f..f4f9ddb7f 100644 --- a/rtdata/themes/RawTherapee-GTK3-20_.css +++ b/rtdata/themes/RawTherapee-GTK3-20_.css @@ -720,6 +720,23 @@ flowboxchild:selected { margin: 0; } +/* Vertical version of slider. */ +#histScale { + min-height: 4em; + min-width: 0.4166666666666666em; + margin: 0.5833333333333333em 0 0 0; +} +#histScale trough { + padding: 0.583333333333333333em 0; +} +#histScale trough highlight { + margin: -0.583333333333333333em 0; + padding: 0.1em 0 0 0.1em; +} +#histScale.fine-tune trough highlight { + padding: 0.5em 0 0 0.5em; +} + /* Copied from button.flat style. */ button.radio#histButton { background-image: none; diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index af3445650..c4300413e 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -453,6 +453,27 @@ filechooser placessidebar list row:selected { padding-bottom: 0.25em; margin: 0; } + +/* Vertical version of slider. */ +#histScale { + min-height: 4em; + min-width: 1.833333333333333333em; + margin: -0.333333333333333333em 0; +} +#histScale trough { + padding: 0.583333333333333333em 0; +} +#histScale highlight { + background-image: linear-gradient(to right, shade (@accent-color2,1.22), shade(@accent-color2,.88)); + margin: -0.583333333333333333em 0; + padding: 0.333333333333333333em 0 0 0.333333333333333333em; +} +#histScale slider { +} +#histScale.fine-tune highlight { + padding: 0.5em 0 0 0.5em; +} + /* Copied from button.flat style. */ button.radio#histButton { border: 0.083333333333333333em solid transparent; diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 1165881a5..3c7a3e631 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -273,14 +273,14 @@ HistogramPanel::HistogramPanel () : scopeOptions->set_image(*Gtk::manage(new RTImage("histogram-ellipsis-small.png"))); showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); - setExpandAlignProperties(showRed , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - setExpandAlignProperties(showGreen, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - setExpandAlignProperties(showBlue , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - setExpandAlignProperties(showValue, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - setExpandAlignProperties(showChro , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - setExpandAlignProperties(showMode , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showRed , false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showGreen, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showBlue , false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showValue, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showChro , false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showMode , false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); setExpandAlignProperties(scopeOptions, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - setExpandAlignProperties(showBAR , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showBAR , false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); setExpandAlignProperties(scopeOptions, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); setExpandAlignProperties(scopeHistBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); setExpandAlignProperties(scopeHistRawBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); @@ -306,6 +306,15 @@ HistogramPanel::HistogramPanel () : scopeVectHcBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeVectHcBtn)); scopeVectHsBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeVectHsBtn)); + brightnessWidget = Gtk::manage(new Gtk::Scale(Gtk::ORIENTATION_VERTICAL)); + brightnessWidget->set_inverted(); + brightnessWidget->set_range(log(HistogramArea::MIN_BRIGHT), log(HistogramArea::MAX_BRIGHT)); + brightnessWidget->set_draw_value(false); + brightnessWidget->signal_value_changed().connect(sigc::mem_fun(*this, &HistogramPanel::brightnessWidgetValueChanged)); + brightnessWidget->set_name("histScale"); + brightnessWidget->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS")); + setExpandAlignProperties(brightnessWidget, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + optionButtons->add(*showRed); optionButtons->add(*showGreen); optionButtons->add(*showBlue); @@ -313,6 +322,7 @@ HistogramPanel::HistogramPanel () : optionButtons->add(*showChro); optionButtons->add(*showMode); optionButtons->add(*showBAR); + optionButtons->add(*brightnessWidget); Gtk::VSeparator* separator = Gtk::manage(new Gtk::VSeparator()); setExpandAlignProperties(separator, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); @@ -350,6 +360,7 @@ HistogramPanel::HistogramPanel () : updateHistRGBAreaOptions(); } + brightness_changed_connection = histogramArea->getBrighnessChangedSignal().connect(sigc::mem_fun(*this, &HistogramPanel::brightnessUpdated)); rconn = signal_size_allocate().connect( sigc::mem_fun(*this, &HistogramPanel::resized) ); } @@ -461,6 +472,17 @@ void HistogramPanel::mode_released () rgbv_toggled(); } +void HistogramPanel::brightnessWidgetValueChanged(void) +{ + ConnectionBlocker blocker(brightness_changed_connection); + histogramArea->setBrightness(exp(brightnessWidget->get_value())); +} + +void HistogramPanel::brightnessUpdated(float brightness) +{ + brightnessWidget->set_value(log(brightness)); +} + void HistogramPanel::scopeOptionsToggled() { options.histogramShowOptionButtons = scopeOptions->get_active(); @@ -512,6 +534,7 @@ void HistogramPanel::type_changed() showMode->show(); showBAR->show(); showBAR->set_tooltip_text(M("HISTOGRAM_TOOLTIP_BAR")); + brightnessWidget->hide(); histogramRGBArea = histogramRGBAreaHori.get(); break; case ScopeType::HISTOGRAM_RAW: @@ -522,6 +545,7 @@ void HistogramPanel::type_changed() showChro->hide(); showMode->show(); showBAR->hide(); + brightnessWidget->hide(); histogramRGBArea = nullptr; break; case ScopeType::PARADE: @@ -534,6 +558,7 @@ void HistogramPanel::type_changed() showMode->hide(); showBAR->show(); showBAR->set_tooltip_text(M("HISTOGRAM_TOOLTIP_BAR")); + brightnessWidget->show(); histogramRGBArea = histogramRGBAreaVert.get(); break; case ScopeType::VECTORSCOPE_HC: @@ -546,6 +571,7 @@ void HistogramPanel::type_changed() showMode->hide(); showBAR->show(); showBAR->set_tooltip_text(M("HISTOGRAM_TOOLTIP_CROSSHAIR")); + brightnessWidget->show(); histogramRGBArea = nullptr; break; case ScopeType::NONE: @@ -1921,23 +1947,39 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) || scopeType == ScopeType::VECTORSCOPE_HC || scopeType == ScopeType::VECTORSCOPE_HS ) { // Adjust brightness. - constexpr float MIN_BRIGHT = 0.1; - constexpr float MAX_BRIGHT = 3; constexpr float RANGE = MAX_BRIGHT / MIN_BRIGHT; double dx = (event->x - movingPosition) / get_width(); float new_brightness = LIM(trace_brightness * pow(RANGE, dx), MIN_BRIGHT, MAX_BRIGHT); - if (new_brightness != trace_brightness) { - parade_buffer_r_dirty = parade_buffer_g_dirty = parade_buffer_b_dirty = wave_buffer_dirty = wave_buffer_luma_dirty = vect_hc_buffer_dirty = vect_hs_buffer_dirty = true; - trace_brightness = new_brightness; - setDirty(true); - queue_draw(); - } + setBrightness(new_brightness); movingPosition = event->x; } return true; } +float HistogramArea::getBrightness(void) +{ + return trace_brightness; +} + +void HistogramArea::setBrightness(float brightness) +{ + brightness = LIM(brightness, MIN_BRIGHT, MAX_BRIGHT); + if (brightness != trace_brightness) { + parade_buffer_r_dirty = parade_buffer_g_dirty = parade_buffer_b_dirty = wave_buffer_dirty = wave_buffer_luma_dirty = vect_hc_buffer_dirty = vect_hs_buffer_dirty = true; + trace_brightness = brightness; + setDirty(true); + queue_draw(); + + signal_brightness_changed.emit(trace_brightness); + } +} + +HistogramArea::SignalBrightnessChanged HistogramArea::getBrighnessChangedSignal(void) +{ + return signal_brightness_changed; +} + HistogramArea::type_signal_factor_changed HistogramArea::signal_factor_changed() { return sigFactorChanged; diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 7cf1c5e6f..393df51a5 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -152,7 +152,10 @@ class HistogramArea final : public Gtk::DrawingArea, public BackBuffer, private { public: typedef sigc::signal type_signal_factor_changed; + typedef sigc::signal SignalBrightnessChanged; + static constexpr float MIN_BRIGHT = 0.1; + static constexpr float MAX_BRIGHT = 3; private: IdleRegister idle_register; type_signal_factor_changed sigFactorChanged; @@ -194,6 +197,8 @@ protected: int pointer_red, pointer_green, pointer_blue; float pointer_a, pointer_b; + SignalBrightnessChanged signal_brightness_changed; + public: explicit HistogramArea(DrawModeListener *fml = nullptr); ~HistogramArea() override; @@ -226,6 +231,10 @@ public: bool on_button_press_event (GdkEventButton* event) override; bool on_button_release_event (GdkEventButton* event) override; bool on_motion_notify_event (GdkEventMotion* event) override; + float getBrightness(void); + /** Set the trace brightness, with 1 being normal. */ + void setBrightness(float brightness); + SignalBrightnessChanged getBrighnessChangedSignal(void); type_signal_factor_changed signal_factor_changed(); private: @@ -270,6 +279,7 @@ protected: Gtk::ToggleButton* showChro; Gtk::Button* showMode; Gtk::ToggleButton* scopeOptions; + Gtk::Scale* brightnessWidget; Gtk::RadioButton* scopeHistBtn; Gtk::RadioButton* scopeHistRawBtn; @@ -298,6 +308,7 @@ protected: HistogramPanelListener* panel_listener; + sigc::connection brightness_changed_connection; sigc::connection rconn; void setHistInvalid (); void showRGBBar(); @@ -344,6 +355,8 @@ public: void chro_toggled (); void bar_toggled (); void mode_released (); + void brightnessWidgetValueChanged(); + void brightnessUpdated(float brightness); void scopeOptionsToggled(); void type_selected(Gtk::RadioButton* button); void type_changed (); From 8e9e3971306240bd0bb22fa79d74218e379efae7 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 12 Oct 2020 08:35:09 +0200 Subject: [PATCH 149/185] Fixed crash by changing level with preview size --- rtengine/ipwavelet.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index ee8ee34b6..31cb07566 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -669,7 +669,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const maxlevelcrop = 6; } - if (minwin < 64) { + if (minwin * skip < 64) { maxlevelcrop = 5; } @@ -1054,7 +1054,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const levwavL = 6; //to allow edge and denoise => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! } - levwavL = rtengine::min(maxlevelcrop, levwavL); /* if(cp.denoicurvh || cp.levdenhigh > 0.01f) { @@ -1066,12 +1065,13 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const levwavL = levwav; } + + bool usechrom = cp.chromfi > 0.f || cp.chromco > 0.f; + levwavL = rtengine::min(maxlevelcrop, levwavL); if (settings->verbose) { printf("Level decomp L=%i\n", levwavL); } - bool usechrom = cp.chromfi > 0.f || cp.chromco > 0.f; - if (levwavL > 0) { const std::unique_ptr Ldecomp(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); // const std::unique_ptr Ldecomp2(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); @@ -1773,6 +1773,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } + levwava = rtengine::min(maxlevelcrop, levwava); if (settings->verbose) { printf("Leval decomp a=%i\n", levwava); } @@ -1809,11 +1810,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } + + levwavb = rtengine::min(maxlevelcrop, levwavb); if (settings->verbose) { printf("Leval decomp b=%i\n", levwavb); } - if (levwavb > 0) { const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); From 344735bb8b6672c9fbdef32802d1cab08f4f90ef Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 12 Oct 2020 11:13:32 +0200 Subject: [PATCH 150/185] Change call edge to Ftblockdn --- rtengine/FTblockDN.cc | 10 ++++++++++ rtengine/ipwavelet.cc | 29 ++++++++++++++++++++++++++--- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index d43fa6baa..bef60e59a 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -2378,6 +2378,11 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition& Wavele { int maxlvl = WaveletCoeffs_L.maxlevel(); + if (local == 1) { + maxlvl = 6; //for local denoise + } + + if (local == 2) { maxlvl = 7; //for local denoise } @@ -2615,6 +2620,11 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition& WaveletCoeffs_L int maxlvl = WaveletCoeffs_L.maxlevel(); + if (local == 1) { + maxlvl = 6; //for local denoise + } + + if (local == 2) { maxlvl = 7; //for local denoise } diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 31cb07566..613e74723 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -673,6 +673,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const maxlevelcrop = 5; } + if (minwin * skip < 32) { + maxlevelcrop = 4; + } int levwav = params->wavelet.thres; if(params->wavelet.expnoise) { @@ -753,6 +756,10 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const maxlev2 = 5; } + if (minsizetile < 32) { + maxlev2 = 4; + } + levwav = rtengine::min(maxlev2, levwav); #ifdef _OPENMP @@ -1068,6 +1075,8 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const bool usechrom = cp.chromfi > 0.f || cp.chromco > 0.f; levwavL = rtengine::min(maxlevelcrop, levwavL); + levwavL = rtengine::min(maxlev2, levwavL); + if (settings->verbose) { printf("Level decomp L=%i\n", levwavL); } @@ -1761,7 +1770,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (!hhutili) { //always a or b int levwava = levwav; - if (!exblurab && cp.chrores == 0.f && cp.blurcres == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels + if (!exblurab && cp.chrores == 0.f && cp.blurcres == 0.f && !cp.tonemap && !cp.resena && !cp.chromena && !cp.finena && !cp.edgeena&& params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels while (levwava > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwava - 1] == 0.f)) || (cp.CHmet != 2 && (levwava == 10 || (!cp.curv || cp.mulC[levwava - 1] == 0.f))))) && (!cp.opaRG || levwava == 10 || (cp.opaRG && cp.mulopaRG[levwava - 1] == 0.f)) && ((levwava == 10 || (cp.CHSLmet == 1 && cp.mulC[levwava - 1] == 0.f)))) { levwava--; } @@ -1774,31 +1783,40 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } levwava = rtengine::min(maxlevelcrop, levwava); + levwava = rtengine::min(maxlev2, levwava); if (settings->verbose) { printf("Leval decomp a=%i\n", levwava); } if (levwava > 0) { const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); - if (!adecomp->memory_allocation_failed()) { + if(levwava == 6) { + edge = 1; + } if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.quamet == 0 )) { + WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + } Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab, wavNestedLevels); + WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); + adecomp->reconstruct(labco->data + datalen, cp.strength); + } } int levwavb = levwav; - if (!exblurab && cp.chrores == 0.f && cp.blurcres == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels + if (!exblurab && cp.chrores == 0.f && cp.blurcres == 0.f && !cp.tonemap && !cp.resena && !cp.chromena && !cp.finena && !cp.edgeena && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels while (levwavb > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavb - 1] == 0.f)) || (cp.CHmet != 2 && (levwavb == 10 || (!cp.curv || cp.mulC[levwavb - 1] == 0.f))))) && (!cp.opaBY || levwavb == 10 || (cp.opaBY && cp.mulopaBY[levwavb - 1] == 0.f)) && ((levwavb == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavb - 1] == 0.f)))) { levwavb--; } @@ -1812,12 +1830,17 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const levwavb = rtengine::min(maxlevelcrop, levwavb); + levwavb = rtengine::min(maxlev2, levwavb); + if (settings->verbose) { printf("Leval decomp b=%i\n", levwavb); } if (levwavb > 0) { const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + if(levwavb == 6) { + edge = 1; + } if (!bdecomp->memory_allocation_failed()) { // if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f )) { From a30dca0b0e0e66cc9fa4363cdc22b07961340ee4 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 13 Oct 2020 13:27:20 +0200 Subject: [PATCH 151/185] Profiled lens correction: Do not call lensfun search with empty strings --- rtengine/rtlensfun.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 363819cf7..58f3d12a3 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -438,7 +438,7 @@ std::vector LFDatabase::getLenses() const LFCamera LFDatabase::findCamera(const Glib::ustring &make, const Glib::ustring &model) const { LFCamera ret; - if (data_) { + if (data_ && !make.empty()) { MyMutex::MyLock lock(lfDBMutex); auto found = data_->FindCamerasExt(make.c_str(), model.c_str()); if (found) { @@ -453,7 +453,7 @@ LFCamera LFDatabase::findCamera(const Glib::ustring &make, const Glib::ustring & LFLens LFDatabase::findLens(const LFCamera &camera, const Glib::ustring &name) const { LFLens ret; - if (data_) { + if (data_ && !name.empty()) { MyMutex::MyLock lock(lfDBMutex); auto found = data_->FindLenses(camera.data_, nullptr, name.c_str()); for (size_t pos = 0; !found && pos < name.size(); ) { From 8e43a9544e2456b69eb0280808e78cc9a829463a Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 14 Oct 2020 08:12:31 +0200 Subject: [PATCH 152/185] Local adjustments small changes GUI flat curves --- rtgui/locallabtools.cc | 2 +- rtgui/locallabtools2.cc | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index 0fdbac588..09d1a7cf5 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -758,7 +758,7 @@ LocallabColor::LocallabColor(): LLmaskcolshapewav->setIdentityValue(0.); LLmaskcolshapewav->setResetCurve(FlatCurveType(defSpot.LLmaskcolcurvewav.at(0)), defSpot.LLmaskcolcurvewav); - LLmaskcolshapewav->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); +// LLmaskcolshapewav->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); mask2CurveEditorGwav->curveListComplete(); diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index e793f1c92..a0619eafd 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -2231,7 +2231,7 @@ LocallabContrast::LocallabContrast(): wavshape->setIdentityValue(0.); wavshape->setResetCurve(FlatCurveType(defSpot.locwavcurve.at(0)), defSpot.locwavcurve); - wavshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); +// wavshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); LocalcurveEditorwav->curveListComplete(); @@ -2298,7 +2298,7 @@ LocallabContrast::LocallabContrast(): wavshapeedg->setIdentityValue(0.); wavshapeedg->setResetCurve(FlatCurveType(defSpot.locedgwavcurve.at(0)), defSpot.locedgwavcurve); - wavshapeedg->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); +// wavshapeedg->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); LocalcurveEditorwavedg->curveListComplete(); @@ -2398,7 +2398,7 @@ LocallabContrast::LocallabContrast(): wavshapecomp->setIdentityValue(0.); wavshapecomp->setResetCurve(FlatCurveType(defSpot.loccompwavcurve.at(0)), defSpot.loccompwavcurve); - wavshapecomp->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); +// wavshapecomp->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); LocalcurveEditorwavcomp->curveListComplete(); @@ -2427,7 +2427,7 @@ LocallabContrast::LocallabContrast(): LLmasklcshape->setIdentityValue(0.); LLmasklcshape->setResetCurve(FlatCurveType(defSpot.LLmasklccurve.at(0)), defSpot.LLmasklccurve); - LLmasklcshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); +// LLmasklcshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); HHmasklcshape->setIdentityValue(0.); HHmasklcshape->setResetCurve(FlatCurveType(defSpot.HHmasklccurve.at(0)), defSpot.HHmasklccurve); @@ -5162,7 +5162,7 @@ LocallabMask::LocallabMask(): LLmask_shapewav->setIdentityValue(0.); LLmask_shapewav->setResetCurve(FlatCurveType(defSpot.LLmask_curvewav.at(0)), defSpot.LLmask_curvewav); - LLmask_shapewav->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); +// LLmask_shapewav->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); mask2CurveEditorGwav->curveListComplete(); From be67261d0bdeb21ffe15fe968dd5bc16edd407e0 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Wed, 14 Oct 2020 09:10:58 +0200 Subject: [PATCH 153/185] Workaround to allow building on msys2 with libjpeg-turbo, #4713 --- rtengine/jdatasrc.cc | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/rtengine/jdatasrc.cc b/rtengine/jdatasrc.cc index a5008b00f..f9256899d 100644 --- a/rtengine/jdatasrc.cc +++ b/rtengine/jdatasrc.cc @@ -248,12 +248,18 @@ my_error_exit (j_common_ptr cinfo) } -//const char * const jpeg_std_message_table[] = { -//#include "jerror.h" -// NULL -//}; -extern const char * const jpeg_std_message_table[]; +#ifdef WIN32 +#define JVERSION "6b 27-Mar-1998" +#define JCOPYRIGHT_SHORT "(C) 1998, Thomas G. Lane" +#define JMESSAGE(code,string) string , +const char * const jpeg_std_message_table[] = { +#include "jerror.h" + NULL +}; +#else +extern const char * const jpeg_std_message_table[]; +#endif /* * Actual output of an error or trace message. From 01ad249718933ea4797462b4c0f9ff52c79724d3 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Thu, 15 Oct 2020 21:09:13 -0700 Subject: [PATCH 154/185] Make scope trace brightness persistent --- rtgui/histogrampanel.cc | 4 ++++ rtgui/options.cc | 6 ++++++ rtgui/options.h | 1 + 3 files changed, 11 insertions(+) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 3c7a3e631..2655897e3 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -362,6 +362,8 @@ HistogramPanel::HistogramPanel () : brightness_changed_connection = histogramArea->getBrighnessChangedSignal().connect(sigc::mem_fun(*this, &HistogramPanel::brightnessUpdated)); rconn = signal_size_allocate().connect( sigc::mem_fun(*this, &HistogramPanel::resized) ); + + histogramArea->setBrightness(options.histogramTraceBrightness); } HistogramPanel::~HistogramPanel () @@ -476,11 +478,13 @@ void HistogramPanel::brightnessWidgetValueChanged(void) { ConnectionBlocker blocker(brightness_changed_connection); histogramArea->setBrightness(exp(brightnessWidget->get_value())); + options.histogramTraceBrightness = histogramArea->getBrightness(); } void HistogramPanel::brightnessUpdated(float brightness) { brightnessWidget->set_value(log(brightness)); + options.histogramTraceBrightness = histogramArea->getBrightness(); } void HistogramPanel::scopeOptionsToggled() diff --git a/rtgui/options.cc b/rtgui/options.cc index 494a1ec3f..46d9b9ca5 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -451,6 +451,7 @@ void Options::setDefaults() histogramDrawMode = 0; histogramScopeType = ScopeType::HISTOGRAM; histogramShowOptionButtons = false; + histogramTraceBrightness = 1; curvebboxpos = 1; complexity = 2; prevdemo = PD_Sidecar; @@ -1444,6 +1445,10 @@ void Options::readFromFile(Glib::ustring fname) histogramShowOptionButtons = keyFile.get_boolean("GUI", "HistogramShowOptionButtons"); } + if (keyFile.has_key("GUI", "HistogramTraceBrightness")) { + histogramTraceBrightness = keyFile.get_double("GUI", "HistogramTraceBrightness"); + } + if (keyFile.has_key("GUI", "NavigatorRGBUnit")) { navRGBUnit = (NavigatorUnit)keyFile.get_integer("GUI", "NavigatorRGBUnit"); } @@ -2268,6 +2273,7 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_integer("GUI", "HistogramDrawMode", histogramDrawMode); keyFile.set_integer("GUI", "HistogramScopeType", rtengine::toUnderlying(histogramScopeType)); keyFile.set_boolean("GUI", "HistogramShowOptionButtons", histogramShowOptionButtons); + keyFile.set_double("GUI", "HistogramTraceBrightness", histogramTraceBrightness); keyFile.set_integer("GUI", "NavigatorRGBUnit", (int)navRGBUnit); keyFile.set_integer("GUI", "NavigatorHSVUnit", (int)navHSVUnit); keyFile.set_boolean("GUI", "ShowFilmStripToolBar", showFilmStripToolBar); diff --git a/rtgui/options.h b/rtgui/options.h index 476af79ec..d2e0c0543 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -324,6 +324,7 @@ public: int histogramDrawMode; ScopeType histogramScopeType; bool histogramShowOptionButtons; + float histogramTraceBrightness; bool FileBrowserToolbarSingleRow; bool hideTPVScrollbar; int whiteBalanceSpotSize; From cfb22d555022884f9cade07eded320f644e5a794 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Thu, 15 Oct 2020 21:13:01 -0700 Subject: [PATCH 155/185] Fix signed comparison compiler warning --- rtgui/histogrampanel.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 2655897e3..bbad4ecf3 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -1604,7 +1604,7 @@ void HistogramArea::drawParade(Cairo::RefPtr &cr, int w, int h) auto orig_matrix = cr->get_matrix(); const double display_wave_width = static_cast(w) / buffers.size(); - for (int i = 0; i < buffers.size(); i++) { + for (unsigned i = 0; i < buffers.size(); i++) { Cairo::RefPtr surface; cr->translate(i * display_wave_width, padding); cr->scale(display_wave_width / wave_width, (h - 2 * padding) / wave_height); From 044d16503c55f3b310307c324960efa207122225 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Fri, 16 Oct 2020 17:15:03 -0700 Subject: [PATCH 156/185] Fix undefined reference compilation error The debug build failed to compile due to undefined reference to HistogramArea::MAX_BRIGHT and HistogramArea::MIN_BRIGHT. Co-authored-by: Ingo Weyrich --- rtgui/histogrampanel.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index bbad4ecf3..d7e9bbc69 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -29,6 +29,9 @@ using namespace rtengine; +constexpr float HistogramArea::MAX_BRIGHT; +constexpr float HistogramArea::MIN_BRIGHT; + using ScopeType = Options::ScopeType; // From bc3c4fab972078ef8ef4088006005eb3f7008d11 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 19 Oct 2020 07:11:06 +0200 Subject: [PATCH 157/185] GUI local adjustments - Change the location of double slider wavelet level --- rtgui/locallabtools2.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index a0619eafd..38f5a756d 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -2456,10 +2456,11 @@ LocallabContrast::LocallabContrast(): pack_start(*lcamount); pack_start(*lcdarkness); pack_start(*lclightness); + pack_start(*csThreshold); ToolParamBlock* const coBox = Gtk::manage(new ToolParamBlock()); coBox->pack_start(*sigmalc); coBox->pack_start(*LocalcurveEditorwav, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor - coBox->pack_start(*csThreshold); + // coBox->pack_start(*csThreshold); contFrame->add(*coBox); pack_start(*contFrame); // pack_start(*levelwav); @@ -3912,6 +3913,7 @@ void LocallabContrast::updateContrastGUI1() lcdarkness->show(); lclightness->show(); contFrame->hide(); + csThreshold->hide(); levelwav->hide(); expresidpyr->hide(); clariFrame->hide(); @@ -3927,6 +3929,7 @@ void LocallabContrast::updateContrastGUI1() lcdarkness->hide(); lclightness->hide(); contFrame->show(); + csThreshold->show(); levelwav->show(); expresidpyr->show(); clariFrame->show(); From 1a3907081ff2eb1a32974050eca8a2c7d8903d0b Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 19 Oct 2020 20:34:33 +0200 Subject: [PATCH 158/185] Local adjustments wavelet - Change label curve local contrast --- rtdata/languages/default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 83779b8f0..b3e04635b 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2928,7 +2928,7 @@ TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. -TP_LOCALLAB_WAV;Local contrast by level +TP_LOCALLAB_WAV;Local contrast TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. TP_LOCALLAB_WAVCOMP;Compression by level TP_LOCALLAB_WAVCOMPRE;Compression by level From 352ba5a68971602170e7632ee64b57c8469e6c49 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 21 Oct 2020 14:48:37 +0200 Subject: [PATCH 159/185] Added accidentally deleted DCPs --- rtdata/dcpprofiles/Canon EOS R.dcp | Bin 0 -> 65350 bytes rtdata/dcpprofiles/Canon EOS R5.dcp | Bin 0 -> 65358 bytes rtdata/dcpprofiles/Canon EOS R6.dcp | Bin 0 -> 65358 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 rtdata/dcpprofiles/Canon EOS R.dcp create mode 100644 rtdata/dcpprofiles/Canon EOS R5.dcp create mode 100644 rtdata/dcpprofiles/Canon EOS R6.dcp diff --git a/rtdata/dcpprofiles/Canon EOS R.dcp b/rtdata/dcpprofiles/Canon EOS R.dcp new file mode 100644 index 0000000000000000000000000000000000000000..6ea5302e290637ef5fb806575782f07b7d344e80 GIT binary patch literal 65350 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 AWdHyG literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/Canon EOS R5.dcp b/rtdata/dcpprofiles/Canon EOS R5.dcp new file mode 100644 index 0000000000000000000000000000000000000000..88f94620d81db7082a8a0ca694b40482addd2612 GIT binary patch literal 65358 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 Hudn|P*ZbOi literal 0 HcmV?d00001 diff --git a/rtdata/dcpprofiles/Canon EOS R6.dcp b/rtdata/dcpprofiles/Canon EOS R6.dcp new file mode 100644 index 0000000000000000000000000000000000000000..7aaa04ab2ae26c27255035db864c1ab65ca15283 GIT binary patch literal 65358 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 Tul#ZU?{gIYyQ-@G{`!9ap7K-9 literal 0 HcmV?d00001 From 08a8911369cfd35c3896aa4ecedf8b4cc0761aa3 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 22 Oct 2020 08:59:36 +0200 Subject: [PATCH 160/185] Local adjustments - Change max slope --- rtdata/languages/default | 2 +- rtgui/locallabtools.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index b3e04635b..e206e82f7 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2813,7 +2813,7 @@ TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(advanced) TP_LOCALLAB_SHOWT;Mask and modifications TP_LOCALLAB_SHOWVI;Mask and modifications TP_LOCALLAB_SHRESFRA;Shadows/Highlights -TP_LOCALLAB_SHTRC_TOOLTIP;Modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones +TP_LOCALLAB_SHTRC_TOOLTIP;Modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer - 5 TP_LOCALLAB_SIGMAWAV;Attenuation response TP_LOCALLAB_SIM;Simple diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index 09d1a7cf5..3fb654245 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -3557,7 +3557,7 @@ LocallabShadow::LocallabShadow(): blurSHde(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURDE"), 2, 100, 1, 5))), gamFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GAMFRA")))), gamSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMSH"), 0.25, 15.0, 0.01, 2.4))), - sloSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOSH"), 0.0, 150.0, 0.01, 12.92))), + sloSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOSH"), 0.0, 300.0, 0.01, 12.92))), expgradsh(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPGRAD")))), strSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -4., 4., 0.05, 0.))), angSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), From 19ecd8e81dec3606e858f065541b9372af3ae227 Mon Sep 17 00:00:00 2001 From: Thanatomanic <6567747+Thanatomanic@users.noreply.github.com> Date: Thu, 22 Oct 2020 16:17:20 +0200 Subject: [PATCH 161/185] Replace TRC in RTv2_Medium profile with sRGB curve. This makes the TRC's identical to the v4 counterpart and other profiles. --- rtdata/iccprofiles/output/RTv2_Medium.icc | Bin 868 -> 25432 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rtdata/iccprofiles/output/RTv2_Medium.icc b/rtdata/iccprofiles/output/RTv2_Medium.icc index ebaf4d133aabc2fdc3a71d6aa7ea1b5152b38b94..930f38a710fb53cf06e28c75b2af98219b6575fe 100644 GIT binary patch literal 25432 zcmeI5S5#A9yRYY3={*EO?>+S1d+%L(k&g78US6%lTj;;?gTFc8UwQs-j(2e~-d^)#duPPZf3h(0 zZw~k;8&Ut}l*HKWYXd_umD!T2I$-01x~;P zxB(B~1^hq&2m&D>0z`or5C@Wg0i=L5kOgu;9w=;AMj5C8RiF+ufF{ra+CUfR0exTq zjDRsP0j9tlSO8041#Gq}Xb0?p<91D*x2w7XxB++I0X%^>@BzNt74`=KAaJ|JAs`fl zZC5%1L~hqQ8pMD&5DyYS;`W_L0jVGjWPnVN1+qad$OF4UJ}3lxz+O-Uia`k|1^Yo6 zI0z1ba!>)Pz+rF%RD&8&3+g~UI1WyL25=HIf+o-mPJ3 z2n*pM0z`ty5EWv9Xb>Ajhd3ZEh#TUC_#gpD5E6z&ATdZBl7twLG$aejK?;x}qztJ* zYLEt`328&RkRD_J8A8U8DP#s&Kvs}7WDD6t4v-V%0_}j@AP>k3@`ik&osd5i2n9o- zP#6>rMMBX~3={_?KuJ&vlnSLonNT*A3*|xiP$9GzDuzm+Qm70%2$e&X&|#<=IttZ7 z_0Vys0XhXWL8qZJ&{?P*ItO(?T~If45$c7mK>g4FGzbkrH=$wZ4s;J1g~p%<&?9IP zdIC*D&!8D-7J3c6ffk@e=pFO{`UHK3R-kXt8uSDD1^t0GVF1H03dX=Vm;jSt3QU99 zV0M@j=7#xT0ayqYfyH4-SPGVb11W=)M=B%L zkeWzcqyf?xX^yl)+9Dm1E=V_|7t$9QfDA^4AtRA7$OL3EG98(P%taO;_aaM>Wyo@5 z74j&u4tWB33V9mYiadwxMD`$ik^RVP$Q#Jp$a}~!8Wsh=3xuQH# zzNi3H2r3*Eg^EKZq0&%Us6135st8qzI*6)7Rio-qCs2*37E~Lm1J#Y{MfIbup>CjV zqef8Us0q{*>N#o_HIG_CeMEgheMkL3{XqjX5{*R@(Nr`WniI{37D9`m8E9FwB3c!# zh1NqGq0P`%Xgjns+70c6_Cp7u!_blFSacFP4V{I~L+?TFLzkh;(MQm==;P={bPKu- z-HGl&Uq%n0htR|55%f5E5Xpx>jH(cjSP=-(KCL1J(i5{8Ch$M9eTFrpYq zj4VbGqlVGK=wnPU78qNMBgPfuiSfe(VZty`m^e%_CIgd$DZmtC_G8L1M=-UR6PPB< z8O%A%1xzodA9EcujJbyy$4p|LVqRkAFpHRvm=(+_<`-rQi^SrvWGoHKf#t;tVa2i1 zSOu&qRuij-HO5+CZLv;RH>@|-9~**=z{X;eu<6(wYyq|yTZXN`R%7e2C$XooZP-ri zMQk5-5PJ)I4?B*1jD3ck#m-~jVVAMrus^VyI0O!hBjIQ`4jdm&7$<>~!71U?aXL6d zoH@=0=ZJH~dE@+XA-D)!94;A`fy=|~!Ij_+;SS?!aSga;TpO+vcM;c*yNcvd_Yo*yrYXW-@WDtIlt0p1jEjd#Gi;=S9i}7XnN_-9eIKByg7TJv?g)c!qeM*hB0m4iWDV$BB=L&xv!yCE_x1mH3+k zldvQ*iB94n36msA@+4J~Hpz%&L9!?9AbFDlNV`Zeq-0ViDW9~DbdYp}R8MLowURnX zy`%xsEz$_-5$P#umh_hNiS&*1iwu!5WHOmf<{=A{8Ds^r8d;ZYLbfJ5lHJLEvgzR&pn~mwb&pOdcgqke`uXlb6V!$!p{d3X(#g&?sCKL5c)L zj-pD@p%_!FD2^0&iXSC}5=BX*WKecf_E8Q|swu}Q&6IXZH>HnqgL04ZkTOk~rM#sq zQ&uT|s0b>7N~3a71*wu$d8!&!mugD2p*mB&r~%Yn)HrG?HHW&FT1Ks+)>9j)ZPW|Y zE7T$CUFt*XGxmSmP} zmO_^OER`&EER8H@SuU{ju?(@?V|m2#l;t(cJC+reA2dM2(x@~JngC6LCQnnN>Cwz+ zb~IO-4=tD$MN6V((F$q%X_d4(S|hEE)=lfD-K34uCTTOYdD=(XciJCTBrB1Xjg^;G zlvRdRg;j^ugw=-Ch1Huih&7Tmku{UGfVGshinX4#iM5@zhxID!FzXoW6V{ikZ&{aF z*IBpNFl-byPBuX{Nj3#GO*TU|OExDqPqqNI2(|>a47LKcQnpIAdbTFEcD9Rb18le1 z#@VLWUa>8)t+4&1!*o2ImCi#KrOVJ&>AG|?x*gq(?ne)!$I{d2yXpJr74%wqBfXv8 zLm!|I)5q!4^jGwE^sn^a>U4z|#-ICpj-HSbtJ(4|%J)39t<~+}NnRAG9g!3`yOU^~k70zE=2rd#AJC`6AgG-4^hs%`9p39vp zfGdJ4kt>^PFV`Wi8m>mJcCJfYgIxExCb?d4EpmO~`o)dlCUJ9c3vx?wD|72|n{zvG zdvXVHM{%cc=W*}juH-((-NN0;-N${4dz^ckdye}f_Zko2!SS&2@bO6SDDr6WnDE%~ zxbp!(++s=E5_d4$g?_=Is-uJxUc{lm6d^A2jJ_$ZWK5afTJ_kNe zzF@u>zBIl9zB0aQzEgbde3$r!_(u7j@V(~yz_-Q^`0@O7egS?deieRweoKBAeqa7w z{0aQo{6+i~{Pp}T{9XK4`S0*Q;(x)v$p4jpLjWT{6W|q)5Kt1(5il2U67UfS6^Iwe z64)zHE>JJfBG4spRp5@mgun}dC4p}On}Rq&HbH(thMBv zhXor1+XOEO4hh~DoECf|xGeZn2q{Dn;uaDUQV`M>G81wX@(~IXN)XBxDi*2~Ixf^I z)FX6VXjEuQXin&p&`)8cFh!VKSWH+^SV!1g*jdFKR97DjFafEt)1;D0)b=UbIEDTXax#M085@jp%35-(qMnni#*B zl$ffRp_r|hhgh&!oLH7vkyxeJ39&Y@Ua^~E55#7~mc+h`1974_r?{xNg1C;jg}96O zPVq?bRPh4wgW`4KE#lqcgW{v&)8Y%_E8-gxI0?Fhkc6y+mV}vvlZ3BCxI~IXzQh5E zT8S2kZizvO`w~wj79>_AHYM?r?2;mq@{&4|7LqQK{*qCWX_9*+%O#IXo|WvCyeaum z@`dDk$u$OoL1FMRBpIpmHWgr={43CVYjH-;0jJ=Gv%r2Q^nF5(ZGRI`j%Jj+aQ`{b(Sn&i6V2IcO{J(qhYwmyy?!H<#ZbA1EIy zpDkZ1e^maoe7F3N`~&$H@*m`XDqs}Y6oeHN6!a9V6+9F|6_ONoD;!ifrqHHvMd7x> zV}&;gD+*hRBt;%YhN8NniK3I@PQ_@&OvQbQ)r!rE-HJns4-{W2epLLWgjHf!5>--C zGElNt@==OVN>kdaRHbxEsZ(iCX-sKG>AlhqWsEXiSwvY;Szp;s*;_eWIaPVDa+UHa z~VX zwOX@UkJ?SO3AH)36}2sOvO1r-jJmeEmAZ#|n0m5$p?anIDfKS(>*^2GXVsV0H#CSE zJQ`9Oni>`wZWb53(b3usZb1hnL|^t5cXytN{=GPFvxYP8O1UDmpzHLbO%wXTiUrfZ97 zt7w~OJ8K7OCur~1F4u0*?$jRCexN<8{aJfUhpfY|Bd4RQW2@t%6RDG_Q>s&|b5^HM zXGG_j&U>9-x_DhKU52ivuBEPrZkTSWZjo-aZi{ZO?j7AJ-9_DXJ&YcQo`jydp1Gcz zUZ`G*-d?>UdZ+a+>D|_w(p%J9*T?8{=u7CU>znJl>xb#5>KEx(>$m9l>fhCWs{c;^ zrvc7@+d#@d%fQOO%OJua!=Til&Y;bp-{8K%3xj2YO+&JwfT6shzM+HRPQy6EJi~Is zlZIV}Hw-5X=MBFbp^WH8;znvl=0@&DVMb|2#YQzotww!Dqee4EpNuw*$;JZ43dRP; zj>ZAT@y7YamBvlRJ;uYvQ^rfiKTU8Z+$Pc{IwrOzJ|@v7IVJ~98ce!OZkSA(ESRjB zqD?tWB~3L=txUa4BTchR%S?}(c9;&CPMFS{u9~6EILsu?G|jBcyv(A^vds>doiOV( z8#0?TTQFNQ$Cz`POPOn%+nD>B$C&4uA2L5>-fe!%e9C;u{HF!Mg4aUMLf^u{BETZS zqR`^7MT^B{ixG<%i%%9?mMoUSmMWH}mTs0|mg$xymi3nBEe9y zSlL?nS;bl9TUA;$TlHGqvwCjz$!g1*#ah@}#oEl;-8$Sl(|W)4aqCX&8`h7l7p;HV z5N!BtL`IXE~3IwUz1In+3`J6v;k~UvMdx2GBo{#!WfwCS50^-n9G7yJCYQ@Dqb{>9Uw5E(aPE-ap|`_n zNAQl+9VI)C?daNZYsd7C4?DJ8X|7_f8m>03ey;JZdt8sYwz&?vPPi_*{&FL^3Aw4b zS-5$*MZ4{Gt8zQz*6;Sf?Ty>IJKmk&UCG_l-NQZ7J=eX${j__Z`_J z!^FegBhn+sqr&5~N1w--$DGHSC*G6KQ_<7Z)59~$GtaZqv&FOD^MU8Q=MOKUm!Ox5 zmxY&?SBzJ_*AcI?Ue~-PycWHFdsDqdy*0dTymxvhdKY=ud3Si<^nU97$p`YG`!IZT zeVlwkeA0c&d`|jY@)_}&_4)3L_2uC;Yno?)ts(`??dolV_*GPLrJ;JEL~)-g$WE*`0$sCwIQvx#>^ym+;r| zckmDPPxn9If6Bkt|Gxj6|5^YcKrlcxz$(BmAR(YApgy20;C8@Fz)B!GkULO5&?L|! zFgh?lusX0ka42vp@M91Z#2zFaWDw*U6cLmgR29@3bS-Ey=v~lOFk3JqSTEQ)I4n3j zxFWbE_-gP(@KW$b2rWc1L^s4KBrGH=q&%c0s9vaZXjo`=XhrCm z(1Fm&(08F*VQgViVFqD4!Xm@MS79=oD<73`|nb$-{a zUC(!|grmcG!ou6u*_go*YH zQIf=ybdy|?B9e9|9Zl*;x|1}Uw3bXt7ERVpc1{jY&P%RN?nu6!{4#kpg_I(iqMhQL z5}uNmax|qQ<#x(!%33NpRV-B})g?6|H9xf`wJY^*>g&`WY1A}{H2pN!wCJ?LwEDE3 zw9&NrwBPBh>C)*&>7MEF>BZ>{>6g0a@2F|b3$`+a;kGWa_;23%K4eglFP_7%Js~R&n?M4mD`s)nfoyh zmB*K-mS>k2l9!WrB(EdyPTuRhpSx+hrFI+d_S&7ed;jjH-2=Oy?EajO%@@qq%y-HU z&(F`V%kR#=pZ_+0vw)*Op}?{rpdh`VqM)tdR>8}HwL(gvWT9c9XJJBNX<<|0)xsx* zpZ8$*2<_3@)xCCmL-*$HJ-WAR@5tWyy_-cGMG8fh zMFB;bMO8)Tif$LZF8Wo>S}ap+R_s@tT3lXyw)kf8%i{HYEc>MP8SnGim%Q)bzBBu7 z?3>xQRzfLZlo*wGmn4-OC}}AfDtTVAT1qLEEHx_iDorXqP})*DR60|-wx6<}vEO*V z_x|Ml2luz`zp?+t{`E4JGU+nYGT*Y)vhuRFvf;8=MUUH z@aDkAL5_n;2W<|99LzmfbFlm1*ukYk@FCtq>W3T;MI0(Tbo|ieLz9P=%dzFc<+|l= z<#FXD<;~@T<}9El^m5yl{S?jm3fu5l@}`?R(_~L zR|!^WSM8{ZttzQ%sv4|%R<(MVdRXeP>EWG+(+^i2?l?Shc;N^*!gECJh{KVHBYTcC z9O*yux8&Q)gZmSeIRQw63S_LEVRX zOucZuUcE;r2J@z&XBiTIbx(C7mljcmCYyxp(K$=S9vNp7%YUalZO|&-sb-Uphz~QXLi@ z!5zChPIO%Dc-HZwlisP+>ChR~S<>0kd8_kH7wF>e((dx;O75!c>g*ct`gj31y@d9xqfB#%0?egpH`oHUvghn--W(MeP8;? z{j&Ym{o(yZ{ipkH_0M00uL@n&zv_E6^J?wY%U7qbt_{!!R0f;|;sy>3oEx}5@ZlQ% z8snP9wUBFt*BYzkBNLjk|OA;CsUNjPCj0%e&Wb@A|!0BVa^u z#9(CSNY2Rdk!vHfBU_^aqxz$MqdB9;Mh8Y;j&9!Pzpr=S_kQ;MWA_K{&)(k}6ByGU z^Bc<5nmi1C zSopB%;qb$^k1&rU9$7pJdsO`B%%gjc-cJxFq$g}9A}97wv`>spe4eCCDoi>|#!Z$_ zc1=!9et*pNSoN{%zURwuVf6~xcu{oGY;o6O$zuEBgT=2)Y)k4( z9!r@^$Cd_{-n>J-lYD3OF6!NZcU|u$->tvrdav`|?|t6;#`nYT-+dr{ko(~HA@RfE z50^j8eAxUb^wH#F=*QxZZ6C)!e*MJuN&S=Or>svWKHd1Vu#8=nUbb6~TdrKbwES#& zFH3;m167q2hbUmCvL`m(e_Sdm+CTuEH1Ug=wT`4##q`qkoV z#MiQ~U0)x6{qc?GoBp?eZ-w8^d>j4tm9Q$m>a?1?dUW;b z>Z>*6n#7v*TFhGc+Qqe}Ya8oA>n7`A>!s@*>l5qiKX`uV{RsH6=SS<0u^%fx=|44p z`uxoM+4S@7&yT;Tzf^v?|H}Mz;@8bzOTUS~6@I(?PW@f?d+_)CAM78QKMsGA{v7>t z_0Q`K)COb2b|Ze{@Wz#mmz(gW#HRIT%x2|g@8--F*b>{a+=|*N-@3Tssm|g&;7l7#nV0r=eV0hnF@rWb(e1z>ssm|g&;7l7#nV0r=eV0hnHZ|9`yz|LGg>&2hU!z;>4a_R)X!YWSyf0Bfj{oT8?tlA>mUg5376Boq{c z{+Zu?V%?VYD{VIeP~6u4Yi_5%W5RZ00J-hIe?R_f@xNd6zaIbFo{0agQ^LQm_qShz h|8|c6m+k%m!P`9p{6XyY82shzy${U1d<`jr3x delta 164 zcmca{jPVJZ3IhXkN=|ZaF_QuVLvCJ4QINZnLPTVg0{bHdZU#OEK?X$z;fX5C+!*-M zLxP+c7??O17#R4HAZ!T`yS${J1SqZnWQ(NarlbJbHbC~2l-xWJ`vQ>NkdzHl!yGVK dfbo+W10$0$14D9YQ5jGQ1hDcq%Ou$_0st>mA6ozb From 3345fb6f45381671f4f8ef5f335770ffb7307f8c Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 22 Oct 2020 16:34:38 +0200 Subject: [PATCH 162/185] Change tooltip ICC Profile Creator --- rtdata/languages/default | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index e206e82f7..24318cb33 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1301,7 +1301,7 @@ ICCPROFCREATOR_ILL_65;D65 ICCPROFCREATOR_ILL_80;D80 ICCPROFCREATOR_ILL_DEF;Default ICCPROFCREATOR_ILL_INC;StdA 2856K -ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +ICCPROFCREATOR_ILL_TOOLTIP;You can set the illuminant for ICC v4 profiles and also for ICC v2 profiles. ICCPROFCREATOR_PRIMARIES;Primaries: ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 @@ -1318,7 +1318,7 @@ ICCPROFCREATOR_PRIM_REC2020;Rec2020 ICCPROFCREATOR_PRIM_REDX;Red X ICCPROFCREATOR_PRIM_REDY;Red Y ICCPROFCREATOR_PRIM_SRGB;sRGB -ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +ICCPROFCREATOR_PRIM_TOOLTIP;You can set custom primaries for ICC v4 profiles and also for ICC v2 profiles. ICCPROFCREATOR_PRIM_WIDEG;Widegamut ICCPROFCREATOR_PROF_V2;ICC v2 ICCPROFCREATOR_PROF_V4;ICC v4 From 7d696a24e627b5acc33faacb1eb0876035512047 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 23 Oct 2020 07:13:22 +0200 Subject: [PATCH 163/185] Local adjustments - Another changes max slope and tooltip --- rtdata/languages/default | 2 +- rtengine/iplocallab.cc | 4 +++- rtgui/locallabtools.cc | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 24318cb33..51d11b729 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2813,7 +2813,7 @@ TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(advanced) TP_LOCALLAB_SHOWT;Mask and modifications TP_LOCALLAB_SHOWVI;Mask and modifications TP_LOCALLAB_SHRESFRA;Shadows/Highlights -TP_LOCALLAB_SHTRC_TOOLTIP;Modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer - 5 TP_LOCALLAB_SIGMAWAV;Attenuation response TP_LOCALLAB_SIM;Simple diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index bfa148304..dfba8a4c2 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -11049,8 +11049,10 @@ void ImProcFunctions::Lab_Local( } bool tonecurv = false; + const Glib::ustring profile = params->icm.workingProfile; + bool isworking = (profile == "sRGB" || profile == "Adobe RGB" || profile == "ProPhoto" || profile == "WideGamut" || profile == "BruceRGB" || profile == "Beta RGB" || profile == "BestRGB" || profile == "Rec2020" || profile == "ACESp0" || profile == "ACESp1"); - if (params->locallab.spots.at(sp).gamSH != 2.4 || params->locallab.spots.at(sp).sloSH != 12.92) { + if (isworking && (params->locallab.spots.at(sp).gamSH != 2.4 || params->locallab.spots.at(sp).sloSH != 12.92)) { tonecurv = true; } diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index 3fb654245..f9dbab2eb 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -3557,7 +3557,7 @@ LocallabShadow::LocallabShadow(): blurSHde(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURDE"), 2, 100, 1, 5))), gamFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GAMFRA")))), gamSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMSH"), 0.25, 15.0, 0.01, 2.4))), - sloSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOSH"), 0.0, 300.0, 0.01, 12.92))), + sloSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOSH"), 0.0, 500.0, 0.01, 12.92))), expgradsh(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPGRAD")))), strSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -4., 4., 0.05, 0.))), angSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), From 27c4c546ef31a455539a72cc1dd5dcd91fce25b6 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 25 Oct 2020 09:35:03 +0100 Subject: [PATCH 164/185] Added complex method standard advanced to ciecam02 --- rtdata/languages/default | 1 + rtengine/procparams.cc | 4 ++ rtengine/procparams.h | 1 + rtgui/colorappearance.cc | 123 +++++++++++++++++++++++++++++++++++++-- rtgui/colorappearance.h | 9 +++ rtgui/paramsedited.cc | 6 ++ rtgui/paramsedited.h | 1 + 7 files changed, 141 insertions(+), 4 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 0263e99fd..6fcbb7b32 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1968,6 +1968,7 @@ TP_COLORAPP_SURROUND_AVER;Average TP_COLORAPP_SURROUND_DARK;Dark TP_COLORAPP_SURROUND_DIM;Dim TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) +TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment. The image will become slightly bright.\n\nDark: Dark environment. The image will become more bright.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very bright. TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness TP_COLORAPP_TCMODE_CHROMA;Chroma diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 503fa05eb..0528f0e49 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1375,6 +1375,7 @@ ColorAppearanceParams::ColorAppearanceParams() : curveMode(TcMode::LIGHT), curveMode2(TcMode::LIGHT), curveMode3(CtcMode::CHROMA), + complexmethod("normal"), surround("Average"), surrsrc("Average"), adapscen(2000.0), @@ -1423,6 +1424,7 @@ bool ColorAppearanceParams::operator ==(const ColorAppearanceParams& other) cons && curveMode == other.curveMode && curveMode2 == other.curveMode2 && curveMode3 == other.curveMode3 + && complexmethod == other.complexmethod && surround == other.surround && surrsrc == other.surrsrc && adapscen == other.adapscen @@ -5282,6 +5284,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->colorappearance.degreeout, "Color appearance", "Degreeout", colorappearance.degreeout, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.autodegreeout, "Color appearance", "AutoDegreeout", colorappearance.autodegreeout, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.surround, "Color appearance", "Surround", colorappearance.surround, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.complexmethod, "Color appearance", "complex", colorappearance.complexmethod, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.surrsrc, "Color appearance", "Surrsrc", colorappearance.surrsrc, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.adaplum, "Color appearance", "AdaptLum", colorappearance.adaplum, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.badpixsl, "Color appearance", "Badpixsl", colorappearance.badpixsl, keyFile); @@ -6863,6 +6866,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Color appearance", "AutoDegreeout", pedited, colorappearance.autodegreeout, pedited->colorappearance.autodegreeout); + assignFromKeyfile(keyFile, "Color appearance", "complex", pedited, colorappearance.complexmethod, pedited->colorappearance.complexmethod); assignFromKeyfile(keyFile, "Color appearance", "Surround", pedited, colorappearance.surround, pedited->colorappearance.surround); assignFromKeyfile(keyFile, "Color appearance", "Surrsrc", pedited, colorappearance.surrsrc, pedited->colorappearance.surrsrc); assignFromKeyfile(keyFile, "Color appearance", "AdaptLum", pedited, colorappearance.adaplum, pedited->colorappearance.adaplum); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index a017d6177..7cf8bf4a2 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -672,6 +672,7 @@ struct ColorAppearanceParams { TcMode curveMode; TcMode curveMode2; CtcMode curveMode3; + Glib::ustring complexmethod; Glib::ustring surround; Glib::ustring surrsrc; diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 934f922ae..b55d45294 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -222,7 +222,21 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" Evcatpreset = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_CAT02PRESET"); EvCATAutotempout = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_TEMPOUT"); EvCATillum = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ILLUM"); + EvCATcomplex = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_CATCOMPLEX"); //preset button cat02 + + complexmethod = Gtk::manage (new MyComboBoxText ()); + complexmethod->append(M("TP_WAVELET_COMPNORMAL")); + complexmethod->append(M("TP_WAVELET_COMPEXPERT")); + complexmethodconn = complexmethod->signal_changed().connect(sigc::mem_fun(*this, &ColorAppearance::complexmethodChanged)); + complexmethod->set_tooltip_text(M("TP_WAVELET_COMPLEX_TOOLTIP")); + Gtk::HBox* const complexHBox = Gtk::manage(new Gtk::HBox()); + Gtk::Label* const complexLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_COMPLEXLAB") + ":")); + complexHBox->pack_start(*complexLabel, Gtk::PACK_SHRINK, 4); + complexHBox->pack_start(*complexmethod); + pack_start (*complexHBox, Gtk::PACK_SHRINK); + + presetcat02 = Gtk::manage (new Gtk::CheckButton (M ("TP_COLORAPP_PRESETCAT02"))); presetcat02->set_tooltip_markup (M("TP_COLORAPP_PRESETCAT02_TIP")); presetcat02conn = presetcat02->signal_toggled().connect( sigc::mem_fun(*this, &ColorAppearance::presetcat02pressed)); @@ -256,7 +270,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" Gtk::HBox* surrHBox1 = Gtk::manage (new Gtk::HBox ()); surrHBox1->set_spacing (2); - surrHBox1->set_tooltip_markup (M ("TP_COLORAPP_SURROUND_TOOLTIP")); + surrHBox1->set_tooltip_markup (M ("TP_COLORAPP_SURSOURCE_TOOLTIP")); Gtk::Label* surrLabel1 = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_SURROUND") + ":")); surrHBox1->pack_start (*surrLabel1, Gtk::PACK_SHRINK); surrsrc = Gtk::manage (new MyComboBoxText ()); @@ -270,7 +284,11 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" // p1VBox->pack_start (*surrsource, Gtk::PACK_SHRINK); - Gtk::HBox* wbmHBox = Gtk::manage (new Gtk::HBox ()); + + +// Gtk::HBox* wbmHBox = Gtk::manage (new Gtk::HBox ()); + wbmHBox = Gtk::manage (new Gtk::HBox ()); + wbmHBox->set_spacing (2); wbmHBox->set_tooltip_markup (M ("TP_COLORAPP_MODEL_TOOLTIP")); Gtk::Label* wbmLab = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_MODEL") + ":")); @@ -285,7 +303,8 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" p1VBox->pack_start (*wbmHBox); - Gtk::HBox* illumHBox = Gtk::manage (new Gtk::HBox ()); +// Gtk::HBox* illumHBox = Gtk::manage (new Gtk::HBox ()); + illumHBox = Gtk::manage (new Gtk::HBox ()); illumHBox->set_spacing (2); illumHBox->set_tooltip_markup (M ("TP_COLORAPP_ILLUM_TOOLTIP")); Gtk::Label* illumLab = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_ILLUM") + ":")); @@ -362,7 +381,8 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" p2VBox = Gtk::manage ( new Gtk::VBox()); p2VBox->set_spacing (2); - Gtk::HBox* alHBox = Gtk::manage (new Gtk::HBox ()); +// Gtk::HBox* alHBox = Gtk::manage (new Gtk::HBox ()); + alHBox = Gtk::manage (new Gtk::HBox ()); alHBox->set_spacing (2); alHBox->set_tooltip_markup (M ("TP_COLORAPP_ALGO_TOOLTIP")); Gtk::Label* alLabel = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_ALGO") + ":")); @@ -803,6 +823,7 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) { disableListener (); + complexmethodconn.block(true); tcmodeconn.block (true); tcmode2conn.block (true); tcmode3conn.block (true); @@ -861,6 +882,9 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) if (!pedited->colorappearance.curveMode) { toneCurveMode->set_active (2); } + if (!pedited->colorappearance.complexmethod) { + complexmethod->set_active_text(M("GENERAL_UNCHANGED")); + } if (!pedited->colorappearance.curveMode2) { toneCurveMode2->set_active (2); @@ -876,6 +900,13 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) setEnabled (pp->colorappearance.enabled); + if (pp->colorappearance.complexmethod == "normal") { + complexmethod->set_active(0); + } else if (pp->colorappearance.complexmethod == "expert") { + complexmethod->set_active(1); + } + + surrsrcconn.block (true); if (pedited && !pedited->colorappearance.surrsrc) { @@ -1038,9 +1069,18 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) presetcat02conn.block (false); lastpresetcat02 = pp->colorappearance.presetcat02; + if (complexmethod->get_active_row_number() == 0) { + updateGUIToMode(0); + convertParamToNormal(); + + } else { + updateGUIToMode(1); + } + tcmode3conn.block (false); tcmode2conn.block (false); tcmodeconn.block (false); + complexmethodconn.block(false); enableListener (); } void ColorAppearance::autoOpenCurve () @@ -1119,6 +1159,7 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) } if (pedited) { + pedited->colorappearance.complexmethod = complexmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->colorappearance.degree = degree->getEditedState (); pedited->colorappearance.degreeout = degreeout->getEditedState (); pedited->colorappearance.adapscen = adapscen->getEditedState (); @@ -1166,6 +1207,14 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) } + if (complexmethod->get_active_row_number() == 0) { + pp->colorappearance.complexmethod = "normal"; + } else if (complexmethod->get_active_row_number() == 1) { + pp->colorappearance.complexmethod = "expert"; + } + + + if (surrsrc->get_active_row_number() == 0) { pp->colorappearance.surrsrc = "Average"; } else if (surrsrc->get_active_row_number() == 1) { @@ -1224,6 +1273,69 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) } } + + +void ColorAppearance::updateGUIToMode(int mode) +{ + if(mode ==0) { + alHBox->hide(); + wbmHBox->hide(); + curveEditorG->hide(); + curveEditorG2->hide(); + curveEditorG3->hide(); + greenout->hide(); + badpixsl->hide(); + } else { + alHBox->show(); + wbmHBox->show(); + curveEditorG->show(); + curveEditorG2->show(); + curveEditorG3->show(); + greenout->show(); + badpixsl->show(); + } + +} + +void ColorAppearance::convertParamToNormal() +{ + const ColorAppearanceParams def_params; + disableListener(); + algo->set_active (0); + shape->setCurve(def_params.curve); + shape2->setCurve(def_params.curve2); + shape3->setCurve(def_params.curve3); + shape->reset(); + shape2->reset(); + shape3->reset(); + wbmodel->set_active (0); + if (presetcat02->get_active ()) { + wbmodel->set_active (2); + } + greenout->setValue(def_params.greenout); + badpixsl->setValue(def_params.badpixsl); + + enableListener(); + + // Update GUI based on converted widget parameters: +} + +void ColorAppearance::complexmethodChanged() +{ + if (complexmethod->get_active_row_number() == 0) { + updateGUIToMode(0); + convertParamToNormal(); + + } else { + updateGUIToMode(1); + } + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvCATcomplex, complexmethod->get_active_text()); + } +} + + void ColorAppearance::curveChanged (CurveEditor* ce) { @@ -1924,6 +2036,7 @@ void ColorAppearance::wbmodelChanged () { if (wbmodel->get_active_row_number() == 0 || wbmodel->get_active_row_number() == 1) { illum->hide(); + illumHBox->hide(); tempsc->hide(); greensc->hide(); tempsc->setValue (5003); @@ -1931,6 +2044,7 @@ void ColorAppearance::wbmodelChanged () } if (wbmodel->get_active_row_number() == 2) { + illumHBox->show(); tempsc->show(); greensc->show(); illum->show(); @@ -2081,6 +2195,7 @@ void ColorAppearance::setBatchMode (bool batchMode) tempsc->showEditedCB (); greensc->showEditedCB (); + complexmethod->append(M("GENERAL_UNCHANGED")); surround->append (M ("GENERAL_UNCHANGED")); surrsrc->append (M ("GENERAL_UNCHANGED")); wbmodel->append (M ("GENERAL_UNCHANGED")); diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index c326b06f9..6976f4d29 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -77,6 +77,9 @@ public: void curveMode3Changed (); bool curveMode3Changed_ (); void neutral_pressed (); + void complexmethodChanged(); + void convertParamToNormal(); + void updateGUIToMode(int mode); void expandCurve (bool isExpanded); bool isCurveExpanded (); @@ -104,6 +107,7 @@ private: rtengine::ProcEvent Evcatpreset; rtengine::ProcEvent EvCATAutotempout; rtengine::ProcEvent EvCATillum; + rtengine::ProcEvent EvCATcomplex; bool bgTTipQuery (int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip); bool srTTipQuery (int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip); void foldAllButMe (GdkEventButton* event, MyExpander *expander); @@ -139,6 +143,7 @@ private: MyComboBoxText* toneCurveMode; MyComboBoxText* toneCurveMode2; MyComboBoxText* toneCurveMode3; + MyComboBoxText* complexmethod; //Adjuster* edge; Gtk::CheckButton* surrsource; @@ -165,6 +170,10 @@ private: sigc::connection surrconn; sigc::connection gamutconn, datacieconn, tonecieconn /*,badpixconn , sharpcieconn*/; sigc::connection tcmodeconn, tcmode2conn, tcmode3conn, neutralconn; + sigc::connection complexmethodconn; + Gtk::HBox* alHBox; + Gtk::HBox* wbmHBox; + Gtk::HBox* illumHBox; CurveEditorGroup* curveEditorG; CurveEditorGroup* curveEditorG2; CurveEditorGroup* curveEditorG3; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 024806556..94d706dc7 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -244,6 +244,7 @@ void ParamsEdited::set(bool v) colorappearance.curveMode = v; colorappearance.curveMode2 = v; colorappearance.curveMode3 = v; + colorappearance.complexmethod = v; colorappearance.tempout = v; colorappearance.autotempout = v; colorappearance.greenout = v; @@ -912,6 +913,7 @@ void ParamsEdited::initFrom(const std::vector& colorappearance.curveMode = colorappearance.curveMode && p.colorappearance.curveMode == other.colorappearance.curveMode; colorappearance.curveMode2 = colorappearance.curveMode2 && p.colorappearance.curveMode2 == other.colorappearance.curveMode2; colorappearance.curveMode3 = colorappearance.curveMode3 && p.colorappearance.curveMode3 == other.colorappearance.curveMode3; + colorappearance.complexmethod = colorappearance.complexmethod && p.colorappearance.complexmethod == other.colorappearance.complexmethod; colorappearance.tempout = colorappearance.tempout && p.colorappearance.tempout == other.colorappearance.tempout; colorappearance.autotempout = colorappearance.autotempout && p.colorappearance.autotempout == other.colorappearance.autotempout; colorappearance.greenout = colorappearance.greenout && p.colorappearance.greenout == other.colorappearance.greenout; @@ -2605,6 +2607,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.colorappearance.curveMode3 = mods.colorappearance.curveMode3; } + if (colorappearance.complexmethod) { + toEdit.colorappearance.complexmethod = mods.colorappearance.complexmethod; + } + if (colorappearance.enabled) { toEdit.colorappearance.enabled = mods.colorappearance.enabled; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index a043688c5..0cacef527 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -266,6 +266,7 @@ struct ColorAppearanceParamsEdited { bool curveMode; bool curveMode2; bool curveMode3; + bool complexmethod; bool enabled; bool degree; bool autodegree; From fa330e73600339ffcde1d461db48b6128efb4fd2 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 25 Oct 2020 09:39:18 +0100 Subject: [PATCH 165/185] History message ciecam complexity --- rtdata/languages/default | 1 + 1 file changed, 1 insertion(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index 6fcbb7b32..010fe69f4 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1186,6 +1186,7 @@ HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +HISTORY_MSG_CATCOMPLEX;Ciecam complexity HISTORY_MSG_COMPLEX;Wavelet complexity HISTORY_MSG_COMPLEXRETI;Retinex complexity HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth From fd9f3246f03b0bc334a6c6364fc17b5e1e96fd49 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sun, 25 Oct 2020 10:06:10 +0100 Subject: [PATCH 166/185] Show Hide forgotten checkbutton Ciecam --- rtgui/colorappearance.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index b55d45294..864a01a22 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -1285,6 +1285,7 @@ void ColorAppearance::updateGUIToMode(int mode) curveEditorG3->hide(); greenout->hide(); badpixsl->hide(); + datacie->hide(); } else { alHBox->show(); wbmHBox->show(); @@ -1293,6 +1294,7 @@ void ColorAppearance::updateGUIToMode(int mode) curveEditorG3->show(); greenout->show(); badpixsl->show(); + datacie->show(); } } From b4f68adb64d2bc91b0ade144c9745b9f6a5bbba7 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 25 Oct 2020 13:46:34 +0100 Subject: [PATCH 167/185] iplab2rgb.cc: speedup for copyAndClamp(), #5964 --- rtengine/color.cc | 51 --------------------------------- rtengine/color.h | 47 ++++++++++++++++++++++++++++--- rtengine/iplab2rgb.cc | 65 +++++++++++++++++++++++++++++++++++-------- 3 files changed, 97 insertions(+), 66 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index 5761733f0..23f1ad9f6 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1015,23 +1015,6 @@ void Color::xyz2r (float x, float y, float z, float &r, const double rgb_xyz[3][ r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ; } -// same for float -void Color::xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const float rgb_xyz[3][3]) -{ - r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ; - g = ((rgb_xyz[1][0] * x + rgb_xyz[1][1] * y + rgb_xyz[1][2] * z)) ; - b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ; -} - -#ifdef __SSE2__ -void Color::xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat &b, const vfloat rgb_xyz[3][3]) -{ - r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ; - g = ((rgb_xyz[1][0] * x + rgb_xyz[1][1] * y + rgb_xyz[1][2] * z)) ; - b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ; -} -#endif // __SSE2__ - #ifdef __SSE2__ void Color::trcGammaBW (float &r, float &g, float &b, float gammabwr, float gammabwg, float gammabwb) { @@ -1646,19 +1629,6 @@ void Color::gammanf2lut (LUTf &gammacurve, float gamma, float divisor, float fac #endif } -void Color::Lab2XYZ(float L, float a, float b, float &x, float &y, float &z) -{ - float LL = L / 327.68f; - float aa = a / 327.68f; - float bb = b / 327.68f; - float fy = (c1By116 * LL) + c16By116; // (L+16)/116 - float fx = (0.002f * aa) + fy; - float fz = fy - (0.005f * bb); - x = 65535.0f * f2xyz(fx) * D50x; - z = 65535.0f * f2xyz(fz) * D50z; - y = (LL > epskap) ? 65535.0f * fy * fy * fy : 65535.0f * LL / kappa; -} - float Color::L2Y(float L) { const float LL = L / 327.68f; @@ -1676,27 +1646,6 @@ void Color::L2XYZ(float L, float &x, float &y, float &z) // for black & white y = (LL > epskap) ? 65535.0f * fy * fy * fy : 65535.0f * LL / kappa; } - -#ifdef __SSE2__ -void Color::Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &z) -{ - vfloat c327d68 = F2V(327.68f); - L /= c327d68; - a /= c327d68; - b /= c327d68; - vfloat fy = F2V(c1By116) * L + F2V(c16By116); - vfloat fx = F2V(0.002f) * a + fy; - vfloat fz = fy - (F2V(0.005f) * b); - vfloat c65535 = F2V(65535.f); - x = c65535 * f2xyz(fx) * F2V(D50x); - z = c65535 * f2xyz(fz) * F2V(D50z); - vfloat res1 = fy * fy * fy; - vfloat res2 = L / F2V(kappa); - y = vself(vmaskf_gt(L, F2V(epskap)), res1, res2); - y *= c65535; -} -#endif // __SSE2__ - inline float Color::computeXYZ2Lab(float f) { if (f < 0.f) { diff --git a/rtengine/color.h b/rtengine/color.h index 704871d39..b6bf60818 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -570,9 +570,20 @@ public: */ static void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const double rgb_xyz[3][3]); static void xyz2r (float x, float y, float z, float &r, const double rgb_xyz[3][3]); - static void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const float rgb_xyz[3][3]); + static inline void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const float rgb_xyz[3][3]) + { + r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ; + g = ((rgb_xyz[1][0] * x + rgb_xyz[1][1] * y + rgb_xyz[1][2] * z)) ; + b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ; + } + #ifdef __SSE2__ - static void xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat &b, const vfloat rgb_xyz[3][3]); + static inline void xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat &b, const vfloat rgb_xyz[3][3]) + { + r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ; + g = ((rgb_xyz[1][0] * x + rgb_xyz[1][1] * y + rgb_xyz[1][2] * z)) ; + b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ; + } #endif @@ -603,12 +614,40 @@ public: * @param y Y coordinate [0 ; 65535] ; can be negative! (return value) * @param z Z coordinate [0 ; 65535] ; can be negative! (return value) */ - static void Lab2XYZ(float L, float a, float b, float &x, float &y, float &z); + static inline void Lab2XYZ(float L, float a, float b, float &x, float &y, float &z) + { + float LL = L / 327.68f; + float aa = a / 327.68f; + float bb = b / 327.68f; + float fy = (c1By116 * LL) + c16By116; // (L+16)/116 + float fx = (0.002f * aa) + fy; + float fz = fy - (0.005f * bb); + x = 65535.f * f2xyz(fx) * D50x; + z = 65535.f * f2xyz(fz) * D50z; + y = (LL > epskapf) ? 65535.f * fy * fy * fy : 65535.f * LL / kappaf; + } + static void L2XYZ(float L, float &x, float &y, float &z); static float L2Y(float L); #ifdef __SSE2__ - static void Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &z); +static inline void Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &z) +{ + vfloat c327d68 = F2V(327.68f); + L /= c327d68; + a /= c327d68; + b /= c327d68; + vfloat fy = F2V(c1By116) * L + F2V(c16By116); + vfloat fx = F2V(0.002f) * a + fy; + vfloat fz = fy - (F2V(0.005f) * b); + vfloat c65535 = F2V(65535.f); + x = c65535 * f2xyz(fx) * F2V(D50x); + z = c65535 * f2xyz(fz) * F2V(D50z); + vfloat res1 = fy * fy * fy; + vfloat res2 = L / F2V(kappa); + y = vself(vmaskf_gt(L, F2V(epskap)), res1, res2); + y *= c65535; +} #endif // __SSE2__ /** diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index af7c454a3..dd89301ae 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -32,8 +32,6 @@ namespace rtengine { -extern void filmlike_clip(float *r, float *g, float *b); - namespace { inline void copyAndClampLine(const float *src, unsigned char *dst, const int W) @@ -46,9 +44,26 @@ inline void copyAndClampLine(const float *src, unsigned char *dst, const int W) inline void copyAndClamp(const LabImage *src, unsigned char *dst, const double rgb_xyz[3][3], bool multiThread) { - int W = src->W; - int H = src->H; + const int W = src->W; + const int H = src->H; + float rgb_xyzf[3][3]; + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + rgb_xyzf[i][j] = rgb_xyz[i][j]; + } + } + +#ifdef __SSE2__ + vfloat rgb_xyzv[3][3]; + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + rgb_xyzv[i][j] = F2V(rgb_xyzf[i][j]); + } + } +#endif #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif @@ -58,17 +73,47 @@ inline void copyAndClamp(const LabImage *src, unsigned char *dst, const double r float* rb = src->b[i]; int ix = i * 3 * W; - float R, G, B; - float x_, y_, z_; - - for (int j = 0; j < W; ++j) { +#ifdef __SSE2__ + float rbuffer[W] ALIGNED16; + float gbuffer[W] ALIGNED16; + float bbuffer[W] ALIGNED16; + int j = 0; + for (; j < W - 3; j += 4) { + vfloat R, G, B; + vfloat x_, y_, z_; + Color::Lab2XYZ(LVFU(rL[j]), LVFU(ra[j]), LVFU(rb[j]), x_, y_, z_ ); + Color::xyz2rgb(x_, y_, z_, R, G, B, rgb_xyzv); + STVF(rbuffer[j], Color::gamma2curve[R]); + STVF(gbuffer[j], Color::gamma2curve[G]); + STVF(bbuffer[j], Color::gamma2curve[B]); + } + for (; j < W; ++j) { + float R, G, B; + float x_, y_, z_; Color::Lab2XYZ(rL[j], ra[j], rb[j], x_, y_, z_ ); - Color::xyz2rgb(x_, y_, z_, R, G, B, rgb_xyz); + Color::xyz2rgb(x_, y_, z_, R, G, B, rgb_xyzf); + rbuffer[j] = Color::gamma2curve[R]; + gbuffer[j] = Color::gamma2curve[G]; + bbuffer[j] = Color::gamma2curve[B]; + } + for (int j = 0; j < W; ++j) { + dst[ix++] = uint16ToUint8Rounded(rbuffer[j]); + dst[ix++] = uint16ToUint8Rounded(gbuffer[j]); + dst[ix++] = uint16ToUint8Rounded(bbuffer[j]); + } + +#else + for (int j = 0; j < W; ++j) { + float R, G, B; + float x_, y_, z_; + Color::Lab2XYZ(rL[j], ra[j], rb[j], x_, y_, z_ ); + Color::xyz2rgb(x_, y_, z_, R, G, B, rgb_xyzf); dst[ix++] = uint16ToUint8Rounded(Color::gamma2curve[R]); dst[ix++] = uint16ToUint8Rounded(Color::gamma2curve[G]); dst[ix++] = uint16ToUint8Rounded(Color::gamma2curve[B]); } +#endif } } @@ -151,8 +196,6 @@ void ImProcFunctions::lab2monitorRgb(LabImage* lab, Image8* image) // otherwise divide by 327.68, convert to xyz and apply the RGB transform, before converting with gamma2curve Image8* ImProcFunctions::lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool consider_histogram_settings) { - //gamutmap(lab); - if (cx < 0) { cx = 0; } From 1318935a870a32610f5a06e29b673aaa472e6170 Mon Sep 17 00:00:00 2001 From: Floessie Date: Sun, 25 Oct 2020 18:24:30 +0100 Subject: [PATCH 168/185] Better handle thumbnail generation of extreme aspect ratio images (fixes #3794) * Backport fix taken from ART * Enforce minimal thumbnail size of 1x1 px in two places, prevents divison by zero and empty image generation --- rtengine/rtthumbnail.cc | 27 +++++++++++++++++++-------- rtgui/batchqueue.cc | 5 +++-- rtgui/batchqueueentry.cc | 11 +++++++---- rtgui/filebrowserentry.cc | 25 +++++++++++-------------- rtgui/filecatalog.cc | 5 +++-- rtgui/options.cc | 6 ++++++ rtgui/options.h | 1 + rtgui/thumbbrowserentrybase.cc | 30 +++++++++++++----------------- rtgui/thumbbrowserentrybase.h | 2 +- rtgui/thumbnail.cc | 25 +++++++++++++++++-------- rtgui/thumbnail.h | 2 +- 11 files changed, 82 insertions(+), 57 deletions(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 357ad3a69..7d0f40f70 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -205,11 +205,6 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, ImageIO* img = imgSrc.getImageIO(); - // agriggio -- hotfix for #3794, to be revised once a proper solution is implemented - if (std::max(img->getWidth(), img->getHeight()) / std::min(img->getWidth(), img->getHeight()) >= 10) { - return nullptr; - } - Thumbnail* tpp = new Thumbnail (); unsigned char* data; @@ -235,15 +230,29 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, h = img->getHeight(); tpp->scale = 1.; } else { - if (fixwh == 1) { + if (fixwh < 0 && w > 0 && h > 0) { + const int ww = h * img->getWidth() / img->getHeight(); + const int hh = w * img->getHeight() / img->getWidth(); + if (ww <= w) { + w = ww; + tpp->scale = static_cast(img->getHeight()) / h; + } else { + h = hh; + tpp->scale = static_cast(img->getWidth()) / w; + } + } else if (fixwh == 1) { w = h * img->getWidth() / img->getHeight(); - tpp->scale = (double)img->getHeight() / h; + tpp->scale = static_cast(img->getHeight()) / h; } else { h = w * img->getHeight() / img->getWidth(); - tpp->scale = (double)img->getWidth() / w; + tpp->scale = static_cast(img->getWidth()) / w; } } + // Precaution to prevent division by zero later on + if (h < 1) h = 1; + if (w < 1) w = 1; + // bilinear interpolation if (tpp->thumbImg) { delete tpp->thumbImg; @@ -1178,6 +1187,8 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT rwidth = int (size_t (thumbImg->getWidth()) * size_t (rheight) / size_t (thumbImg->getHeight())); } + if (rwidth < 1) rwidth = 1; + if (rheight < 1) rheight = 1; Imagefloat* baseImg = resizeTo (rwidth, rheight, interp, thumbImg); diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index fc1fc855e..19da96fb5 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -344,8 +344,9 @@ bool BatchQueue::loadBatchQueue () auto job = rtengine::ProcessingJob::create (source, thumb->getType () == FT_Raw, pparams, fast); - const auto prevh = getMaxThumbnailHeight (); - const auto prevw = thumb->getThumbnailWidth(prevh, &pparams); + auto prevh = getMaxThumbnailHeight(); + auto prevw = prevh; + thumb->getThumbnailSize(prevw, prevh, &pparams); auto entry = new BatchQueueEntry (job, pparams, source, prevw, prevh, thumb, options.overwriteOutputFile); thumb->decreaseRef (); // Removing the refCount acquired by cacheMgr->getEntry diff --git a/rtgui/batchqueueentry.cc b/rtgui/batchqueueentry.cc index 90079b2cc..31a6f40c7 100644 --- a/rtgui/batchqueueentry.cc +++ b/rtgui/batchqueueentry.cc @@ -106,8 +106,12 @@ void BatchQueueEntry::refreshThumbnailImage () void BatchQueueEntry::calcThumbnailSize () { - prew = preh * origpw / origph; + if (prew > options.maxThumbnailWidth) { + const float s = static_cast(options.maxThumbnailWidth) / prew; + prew = options.maxThumbnailWidth; + preh = std::max(preh * s, 1); + } } @@ -261,9 +265,8 @@ void BatchQueueEntry::_updateImage (guint8* img, int w, int h) MYWRITERLOCK(l, lockRW); prew = w; - assert (preview == nullptr); - preview = new guint8 [prew * preh * 3]; - memcpy (preview, img, prew * preh * 3); + preview.resize(prew * preh * 3); + std::copy(img, img + preview.size(), preview.begin()); if (parent) { parent->redrawNeeded (this); diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index cbe31726d..432296f38 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -116,9 +116,12 @@ void FileBrowserEntry::refreshQuickThumbnailImage () void FileBrowserEntry::calcThumbnailSize () { - if (thumbnail) { - prew = thumbnail->getThumbnailWidth(preh); + int ow = prew, oh = preh; + thumbnail->getThumbnailSize(prew, preh); + if (ow != prew || oh != preh || preview.size() != static_cast(prew * preh * 3)) { + preview.clear(); + } } } @@ -255,22 +258,16 @@ void FileBrowserEntry::_updateImage(rtengine::IImage8* img, double s, const rten bool rotated = false; if (preh == img->getHeight()) { - const bool resize = !preview || prew != img->getWidth(); prew = img->getWidth (); // Check if image has been rotated since last time - rotated = preview && newLandscape != landscape; + rotated = !preview.empty() && newLandscape != landscape; - if (resize) { - if (preview) { - delete [] preview; - } - preview = new guint8 [prew * preh * 3]; - } - memcpy(preview, img->getData(), prew * preh * 3); + preview.resize(prew * preh * 3); + std::copy(img->getData(), img->getData() + preview.size(), preview.begin()); { - GThreadLock lock; - updateBackBuffer (); + GThreadLock lock; + updateBackBuffer (); } } @@ -601,7 +598,7 @@ bool FileBrowserEntry::onArea (CursorArea a, int x, int y) { MYREADERLOCK(l, lockRW); - if (!drawable || !preview) { + if (!drawable || preview.empty()) { return false; } diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index 34d6c8aa3..08bcc276b 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -1228,8 +1228,9 @@ void FileCatalog::developRequested(const std::vector& tbe, bo rtengine::ProcessingJob* pjob = rtengine::ProcessingJob::create (fbe->filename, th->getType() == FT_Raw, params, fastmode && options.fastexport_use_fast_pipeline); - const int ph = BatchQueue::calcMaxThumbnailHeight(); - const int pw = th->getThumbnailWidth(ph); + int pw; + int ph = BatchQueue::calcMaxThumbnailHeight(); + th->getThumbnailSize (pw, ph); // processThumbImage is the processing intensive part, but adding to queue must be ordered //#pragma omp ordered diff --git a/rtgui/options.cc b/rtgui/options.cc index 46d9b9ca5..06ca5420f 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -400,6 +400,7 @@ void Options::setDefaults() overwriteOutputFile = false; // if TRUE, existing output JPGs/PNGs are overwritten, instead of adding ..-1.jpg, -2.jpg etc. theme = "RawTherapee"; maxThumbnailHeight = 250; + maxThumbnailWidth = 800; maxCacheEntries = 20000; thumbInterp = 1; autoSuffix = true; @@ -1019,6 +1020,10 @@ void Options::readFromFile(Glib::ustring fname) maxThumbnailHeight = keyFile.get_integer("File Browser", "MaxPreviewHeight"); } + if (keyFile.has_key("File Browser", "MaxPreviewWidth")) { + maxThumbnailWidth = keyFile.get_integer("File Browser", "MaxPreviewWidth"); + } + if (keyFile.has_key("File Browser", "MaxCacheEntries")) { maxCacheEntries = keyFile.get_integer("File Browser", "MaxCacheEntries"); } @@ -2114,6 +2119,7 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_integer("File Browser", "ThumbnailSizeQueue", thumbSizeQueue); keyFile.set_integer("File Browser", "SameThumbSize", sameThumbSize); keyFile.set_integer("File Browser", "MaxPreviewHeight", maxThumbnailHeight); + keyFile.set_integer("File Browser", "MaxPreviewWidth", maxThumbnailWidth); keyFile.set_integer("File Browser", "MaxCacheEntries", maxCacheEntries); Glib::ArrayHandle pext = parseExtensions; keyFile.set_string_list("File Browser", "ParseExtensions", pext); diff --git a/rtgui/options.h b/rtgui/options.h index d2e0c0543..f7bf80a98 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -281,6 +281,7 @@ public: CPBKeyType CPBKeys; // Custom Profile Builder's key type int editorToSendTo; int maxThumbnailHeight; + int maxThumbnailWidth; std::size_t maxCacheEntries; int thumbInterp; // 0: nearest, 1: bilinear std::vector parseExtensions; // List containing all extensions type diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index 3840c8bf9..0c71cea2c 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -135,7 +135,6 @@ ThumbBrowserEntryBase::ThumbBrowserEntryBase (const Glib::ustring& fname) : textGap(6), sideMargin(8), lowerMargin(8), - preview(nullptr), dispname(Glib::path_get_basename(fname)), buttonSet(nullptr), width(0), @@ -171,7 +170,6 @@ ThumbBrowserEntryBase::ThumbBrowserEntryBase (const Glib::ustring& fname) : ThumbBrowserEntryBase::~ThumbBrowserEntryBase () { - delete[] preview; delete buttonSet; } @@ -207,7 +205,7 @@ void ThumbBrowserEntryBase::updateBackBuffer () bbSelected = selected; bbFramed = framed; - bbPreview = preview; + bbPreview = preview.data(); Cairo::RefPtr cc = Cairo::Context::create(surface); @@ -237,16 +235,20 @@ void ThumbBrowserEntryBase::updateBackBuffer () if (buttonSet) { int tmp; - buttonSet->getAllocatedDimensions (tmp, bsHeight); + buttonSet->getAllocatedDimensions(tmp, bsHeight); } + int infow, infoh; + getTextSizes(infow, infoh); + // draw preview frame //backBuffer->draw_rectangle (cc, false, (exp_width-prew)/2, upperMargin+bsHeight, prew+1, preh+1); // draw thumbnail image - if (preview) { + if (!preview.empty()) { prex = borderWidth + (exp_width - prew) / 2; - prey = upperMargin + bsHeight + borderWidth; - backBuffer->copyRGBCharData(preview, 0, 0, prew, preh, prew * 3, prex, prey); + const int hh = exp_height - (upperMargin + bsHeight + borderWidth + infoh + lowerMargin); + prey = upperMargin + bsHeight + borderWidth + std::max((hh - preh) / 2, 0); + backBuffer->copyRGBCharData(preview.data(), 0, 0, prew, preh, prew * 3, prex, prey); } customBackBufferUpdate (cc); @@ -255,9 +257,6 @@ void ThumbBrowserEntryBase::updateBackBuffer () bbIcons = getIconsOnImageArea (); bbSpecificityIcons = getSpecificityIconsOnImageArea (); - int infow, infoh; - getTextSizes (infow, infoh); - int iofs_x = 4, iofs_y = 4; int istartx = prex; int istarty = prey; @@ -356,7 +355,7 @@ void ThumbBrowserEntryBase::updateBackBuffer () textposx_dt = 0; } - textposy = upperMargin + bsHeight + 2 * borderWidth + preh + borderWidth + textGap; + textposy = exp_height - lowerMargin - infoh; textw = exp_width - 2 * textGap; if (selected) { @@ -556,10 +555,7 @@ void ThumbBrowserEntryBase::resize (int h) } if (preh != old_preh || prew != old_prew) { // if new thumbnail height or new orientation - if (preview) { - delete [] preview; - preview = nullptr; - } + preview.clear(); refreshThumbnailImage (); } else if (backBuffer) { backBuffer->setDirty(true); // This will force a backBuffer update on queue_draw @@ -620,7 +616,7 @@ void ThumbBrowserEntryBase::draw (Cairo::RefPtr cc) bbHeight = backBuffer->getHeight(); } - if (!backBuffer || selected != bbSelected || framed != bbFramed || preview != bbPreview + if (!backBuffer || selected != bbSelected || framed != bbFramed || preview.data() != bbPreview || exp_width != bbWidth || exp_height != bbHeight || getIconsOnImageArea () != bbIcons || getSpecificityIconsOnImageArea() != bbSpecificityIcons || backBuffer->isDirty()) { @@ -680,7 +676,7 @@ rtengine::Coord2D ThumbBrowserEntryBase::getPosInImgSpace (int x, int y) const { rtengine::Coord2D coord(-1., -1.); - if (preview) { + if (!preview.empty()) { x -= ofsX + startx; y -= ofsY + starty; diff --git a/rtgui/thumbbrowserentrybase.h b/rtgui/thumbbrowserentrybase.h index dbc6cf73e..764f806fd 100644 --- a/rtgui/thumbbrowserentrybase.h +++ b/rtgui/thumbbrowserentrybase.h @@ -59,7 +59,7 @@ protected: MyRWMutex lockRW; // Locks access to all image thumb changing actions - guint8* preview; // holds the preview image. used in updateBackBuffer. TODO Olli: Make a cache to reduce mem significantly + std::vector preview; // holds the preview image. used in updateBackBuffer. Glib::ustring dispname; diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index c1884edeb..324a0c0c1 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -121,7 +121,7 @@ void Thumbnail::_generateThumbnailImage () tpp = nullptr; delete [] lastImg; lastImg = nullptr; - tw = -1; + tw = options.maxThumbnailWidth; th = options.maxThumbnailHeight; imgRatio = -1.; @@ -138,20 +138,20 @@ void Thumbnail::_generateThumbnailImage () if (ext == "jpg" || ext == "jpeg") { infoFromImage (fname); - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1, pparams->wb.equal); + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal); if (tpp) { cfs.format = FT_Jpeg; } } else if (ext == "png") { - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1, pparams->wb.equal); + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal); if (tpp) { cfs.format = FT_Png; } } else if (ext == "tif" || ext == "tiff") { infoFromImage (fname); - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1, pparams->wb.equal); + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal); if (tpp) { cfs.format = FT_Tiff; @@ -589,10 +589,13 @@ void Thumbnail::decreaseRef () cachemgr->closeThumbnail (this); } -int Thumbnail::getThumbnailWidth (const int h, const rtengine::procparams::ProcParams *pparams) const +void Thumbnail::getThumbnailSize(int &w, int &h, const rtengine::procparams::ProcParams *pparams) { + MyMutex::MyLock lock(mutex); + int tw_ = tw; int th_ = th; + float imgRatio_ = imgRatio; if (pparams) { @@ -617,10 +620,16 @@ int Thumbnail::getThumbnailWidth (const int h, const rtengine::procparams::ProcP } } - if (imgRatio_ > 0.f) { - return imgRatio_ * h; + if (imgRatio_ > 0.) { + w = imgRatio_ * static_cast(h); } else { - return tw_ * h / th_; + w = tw_ * h / th_; + } + + if (w > options.maxThumbnailWidth) { + const float s = static_cast(options.maxThumbnailWidth) / w; + w = options.maxThumbnailWidth; + h = std::max(h * s, 1); } } diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index c22c80cea..aee5ee0a6 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -119,7 +119,7 @@ public: // unsigned char* getThumbnailImage (int &w, int &h, int fixwh=1); // fixwh = 0: fix w and calculate h, =1: fix h and calculate w rtengine::IImage8* processThumbImage (const rtengine::procparams::ProcParams& pparams, int h, double& scale); rtengine::IImage8* upgradeThumbImage (const rtengine::procparams::ProcParams& pparams, int h, double& scale); - int getThumbnailWidth (int h, const rtengine::procparams::ProcParams *pparams = nullptr) const; + void getThumbnailSize (int &w, int &h, const rtengine::procparams::ProcParams *pparams = nullptr); void getFinalSize (const rtengine::procparams::ProcParams& pparams, int& w, int& h); void getOriginalSize (int& w, int& h); From 79affc6462bdd88ac117547029c6beba3e74cd49 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 26 Oct 2020 07:55:52 +0100 Subject: [PATCH 169/185] Ciecam - various improvment labels and tooltip (#5966) * Add tooltip * Change global labels tooltip ciecam * Added tooltip and frame * Change various tooltips * Two changes tooltip ciecam * Change label suuround source * Change typo in tooltip --- rtdata/languages/default | 36 +++++++++++++++++++++++------------- rtgui/colorappearance.cc | 26 ++++++++++++++++++++++---- 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 010fe69f4..42734a093 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1904,6 +1904,7 @@ TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Ed TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode. TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically. TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance +TP_COLORAPP_ADAPSCEN_TOOLTIP;It corresponds to the luminance at the time of the shooting in candelas per m2, calculated automatically from the exif data. TP_COLORAPP_ALGO;Algorithm TP_COLORAPP_ALGO_ALL;All TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1913,33 +1914,37 @@ TP_COLORAPP_ALGO_TOOLTIP;Lets you choose between parameter subsets or all parame TP_COLORAPP_BADPIXSL;Hot/bad pixel filter TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. TP_COLORAPP_BRIGHT;Brightness (Q) -TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 is the amount of perceived light emanating from a stimulus and differs from L*a*b* and RGB brightness. TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. TP_COLORAPP_CHROMA;Chroma (C) TP_COLORAPP_CHROMA_M;Colorfulness (M) -TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. +TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 is the perceived amount of hue in relation to gray, an indicator that a stimulus appears to be more or less colored. TP_COLORAPP_CHROMA_S;Saturation (S) -TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. -TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 differs from L*a*b* and RGB chroma. +TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 corresponds to the coloring of a stimulus in relation to its own brightness, differs from L*a*b* and RGB saturation. +TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 corresponds to the "coloring" of a stimulus relative to the clarity of a stimulus that appears white under identical conditions, differs from L*a*b* and RGB chroma. TP_COLORAPP_CIECAT_DEGREE;CAT02 adaptation -TP_COLORAPP_CONTRAST;Contrast (J) +TP_COLORAPP_CONTRAST;Contrast (J), TP_COLORAPP_CONTRAST_Q;Contrast (Q) -TP_COLORAPP_CONTRAST_Q_TOOLTIP;Differs from L*a*b* and RGB contrast. -TP_COLORAPP_CONTRAST_TOOLTIP;Differs from L*a*b* and RGB contrast. +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Contrast (Q) based on brightness, differs from L*a*b* and RGB contrast. +TP_COLORAPP_CONTRAST_TOOLTIP;Contrast (J) based on lightness, differs from L*a*b* and RGB contrast. TP_COLORAPP_CURVEEDITOR1;Tone curve 1 -TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of J or Q after CIECAM02.\n\nJ and Q are not shown in the main histogram panel.\n\nFor final output refer to the main histogram panel. +TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM02.\nIf the "CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of J or Q after CIECAM02.\n\nJ and Q are not shown in the main histogram panel.\n\nFor final output refer to the main histogram panel. TP_COLORAPP_CURVEEDITOR2;Tone curve 2 TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Same usage as with the second exposure tone curve. TP_COLORAPP_CURVEEDITOR3;Color curve -TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. +TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, S or M after CIECAM02.\n\nC, S and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. +TP_COLORAPP_DEGREE_TOOLTIP;CAT02 is a chromatic adaptation, it converts the values of an image whose white point is that of a given illuminant (for example D65), into new values whose white point is that of the new illuminant - see WP Model (for example D50 or D55). +TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02 is a chromatic adaptation, it converts the values of an image whose white point is that of a given illuminant (for example D50), into new values whose white point is that of the new illuminant - see WP model (for example D75). TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] TP_COLORAPP_GAMUT;Gamut control (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. +TP_COLORAPP_GEN;Settings - Preset +TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM02 color appearance model, which was designed to better simulate how human vision perceives colors under different lighting conditions, e.g., against different backgrounds.\nIt takes into account the environment of each color and modifies its appearance to get as close as possible to human perception.\nIt also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. TP_COLORAPP_HUE;Hue (h) -TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. TP_COLORAPP_IL41;D41 +TP_COLORAPP_HUE_TOOLTIP;Hue (h) is the degree to which a stimulus can be described as similar to a color described as red, green, blue and yellow. TP_COLORAPP_IL50;D50 TP_COLORAPP_IL55;D55 TP_COLORAPP_IL60;D60 @@ -1949,12 +1954,12 @@ TP_COLORAPP_ILA;Incandescent StdA 2856K TP_COLORAPP_ILFREE;Free TP_COLORAPP_ILLUM;Illuminant TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and lattitude. -TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 +TP_COLORAPP_LABEL;Color Appearance & Lighting (CIECAM02) TP_COLORAPP_LABEL_CAM02;Image Adjustments TP_COLORAPP_LABEL_SCENE;Scene Conditions TP_COLORAPP_LABEL_VIEWING;Viewing Conditions TP_COLORAPP_LIGHT;Lightness (J) -TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 is the clarity of a stimulus relative to the clarity of a stimulus that appears white under similar viewing conditions, differs from L*a*b* and RGB lightness. TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) TP_COLORAPP_MODEL;WP Model TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. @@ -1964,12 +1969,14 @@ TP_COLORAPP_PRESETCAT02;Preset cat02 automatic TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou can change illuminant shooting conditions.\nYou must change Cat02 adaptation Viewing conditions if need.\nYou can change Temperature and Tint Viewing conditions if need, and other settings if need. TP_COLORAPP_RSTPRO;Red & skin-tones protection TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. +TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a "normal" area. Normal" means average or standard conditions and data, i.e. without taking into account CIECAM corrections. TP_COLORAPP_SURROUND;Surround TP_COLORAPP_SURROUND_AVER;Average TP_COLORAPP_SURROUND_DARK;Dark TP_COLORAPP_SURROUND_DIM;Dim TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) -TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment. The image will become slightly bright.\n\nDark: Dark environment. The image will become more bright.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very bright. +TP_COLORAPP_SURROUNDSRC;Surround - Smart Lighting +TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment. The image will become slightly bright.\n\nDark: Dark environment. The image will become more bright.\n\nExtremly Dark: Extremly dark environment. The image will become very bright. TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness TP_COLORAPP_TCMODE_CHROMA;Chroma @@ -1985,8 +1992,11 @@ TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2 TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). +TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, ...), as well as its environment. This process will take the data coming from process "Image Adjustments" and "bring" it to the support in such a way that the viewing conditions and its environment are taken into account. TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] TP_COLORAPP_WBRT;WB [RT] + [output] +TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. A gray at 18% corresponds to a background luminance expressed in CIE L of 50%.\nThis data must take into account the average luminance of the image +TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. A gray at 18% corresponds to a background luminance expressed in CIE L of 50%.\nThis data is calculated from the average luminance of the image TP_COLORTONING_AB;o C/L TP_COLORTONING_AUTOSAT;Automatic TP_COLORTONING_BALANCE;Balance diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 864a01a22..b4d5459ce 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -224,6 +224,13 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" EvCATillum = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ILLUM"); EvCATcomplex = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_CATCOMPLEX"); //preset button cat02 + Gtk::Frame *genFrame; + Gtk::VBox *genVBox; + genFrame = Gtk::manage (new Gtk::Frame (M ("TP_COLORAPP_GEN")) ); + genFrame->set_label_align (0.025, 0.5); + genFrame->set_tooltip_markup (M ("TP_COLORAPP_GEN_TOOLTIP")); + genVBox = Gtk::manage ( new Gtk::VBox()); + genVBox->set_spacing (2); complexmethod = Gtk::manage (new MyComboBoxText ()); complexmethod->append(M("TP_WAVELET_COMPNORMAL")); @@ -234,13 +241,16 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" Gtk::Label* const complexLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_COMPLEXLAB") + ":")); complexHBox->pack_start(*complexLabel, Gtk::PACK_SHRINK, 4); complexHBox->pack_start(*complexmethod); - pack_start (*complexHBox, Gtk::PACK_SHRINK); + genVBox->pack_start (*complexHBox, Gtk::PACK_SHRINK); presetcat02 = Gtk::manage (new Gtk::CheckButton (M ("TP_COLORAPP_PRESETCAT02"))); presetcat02->set_tooltip_markup (M("TP_COLORAPP_PRESETCAT02_TIP")); presetcat02conn = presetcat02->signal_toggled().connect( sigc::mem_fun(*this, &ColorAppearance::presetcat02pressed)); - pack_start (*presetcat02, Gtk::PACK_SHRINK); + genVBox->pack_start (*presetcat02, Gtk::PACK_SHRINK); + + genFrame->add (*genVBox); + pack_start (*genFrame, Gtk::PACK_EXPAND_WIDGET, 4); // ----------------------- Process #1: Converting to CIECAM @@ -252,11 +262,12 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" p1Frame = Gtk::manage (new Gtk::Frame (M ("TP_COLORAPP_LABEL_SCENE")) ); p1Frame->set_label_align (0.025, 0.5); - + p1Frame->set_tooltip_markup (M ("TP_COLORAPP_SOURCEF_TOOLTIP")); p1VBox = Gtk::manage ( new Gtk::VBox()); p1VBox->set_spacing (2); degree = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CIECAT_DEGREE"), 0., 100., 1., 90.)); + degree->set_tooltip_markup (M ("TP_COLORAPP_DEGREE_TOOLTIP")); degree->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); @@ -271,7 +282,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" Gtk::HBox* surrHBox1 = Gtk::manage (new Gtk::HBox ()); surrHBox1->set_spacing (2); surrHBox1->set_tooltip_markup (M ("TP_COLORAPP_SURSOURCE_TOOLTIP")); - Gtk::Label* surrLabel1 = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_SURROUND") + ":")); + Gtk::Label* surrLabel1 = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_SURROUNDSRC") + ":")); surrHBox1->pack_start (*surrLabel1, Gtk::PACK_SHRINK); surrsrc = Gtk::manage (new MyComboBoxText ()); surrsrc->append (M ("TP_COLORAPP_SURROUND_AVER")); @@ -343,12 +354,14 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" adapscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ABSOLUTELUMINANCE"), MINLA0, MAXLA0, 0.01, 1997.4, NULL, NULL, &wbSlider2la, &wbla2Slider)); adapscen->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + adapscen->set_tooltip_markup (M ("TP_COLORAPP_ADAPSCEN_TOOLTIP")); adapscen->throwOnButtonRelease(); adapscen->addAutoButton(); p1VBox->pack_start (*adapscen); ybscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_MEANLUMINANCE"), 1, 90, 1, 18)); + ybscen->set_tooltip_markup (M ("TP_COLORAPP_YBSCEN_TOOLTIP")); ybscen->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); @@ -603,6 +616,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" p3Frame = Gtk::manage (new Gtk::Frame (M ("TP_COLORAPP_LABEL_VIEWING")) ); // "Editing viewing conditions" ??? p3Frame->set_label_align (0.025, 0.5); + p3Frame->set_tooltip_markup (M ("TP_COLORAPP_VIEWINGF_TOOLTIP")); p3VBox = Gtk::manage ( new Gtk::VBox()); p3VBox->set_spacing (2); @@ -628,6 +642,8 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" degreeout->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); degreeout->throwOnButtonRelease(); + degreeout->set_tooltip_markup (M ("TP_COLORAPP_DEGREOUT_TOOLTIP")); + degreeout->addAutoButton (M ("TP_COLORAPP_CAT02ADAPTATION_TOOLTIP")); p3VBox->pack_start (*degreeout); /* @@ -639,6 +655,8 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" tempout = Gtk::manage (new Adjuster (M ("TP_WBALANCE_TEMPERATURE"), MINTEMP0, MAXTEMP0, 5, CENTERTEMP0, itempR1, itempL1, &wbSlider2Temp, &wbTemp2Slider)); greenout = Gtk::manage (new Adjuster (M ("TP_WBALANCE_GREEN"), MINGREEN0, MAXGREEN0, 0.001, 1.0, igreenR1, igreenL1)); ybout = Gtk::manage (new Adjuster (M ("TP_COLORAPP_MEANLUMINANCE"), 5, 90, 1, 18)); + ybout->set_tooltip_markup (M ("TP_COLORAPP_YBOUT_TOOLTIP")); + tempout->set_tooltip_markup (M ("TP_COLORAPP_TEMP2_TOOLTIP")); tempout->throwOnButtonRelease(); tempout->addAutoButton (M ("TP_COLORAPP_TEMPOUT_TOOLTIP")); From 0bca993c738139a72397c357934e8f675ea0cd88 Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 26 Oct 2020 08:55:25 +0100 Subject: [PATCH 170/185] Fixed crash in Log encoding when WhiteEv is near zero --- rtengine/improcfun.h | 2 +- rtengine/iplocallab.cc | 12 +++++++++--- rtgui/locallabtools2.cc | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index e44780a13..a237e7c82 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -263,7 +263,7 @@ public: //3 functions from Alberto Griggio, adapted J.Desmis 2019 void filmGrain(Imagefloat *rgb, int isogr, int strengr, int scalegr, int bfw, int bfh); - void log_encode(Imagefloat *rgb, const struct local_params & lp, bool multiThread, int bfw, int bfh); + void log_encode(Imagefloat *rgb, struct local_params & lp, bool multiThread, int bfw, int bfh); void getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, float *blackev, float *whiteev, bool *Autogr, int fw, int fh, float xsta, float xend, float ysta, float yend, int SCALE); void MSRLocal(int call, int sp, bool fftw, int lum, float** reducDE, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, float** luminance, const float* const *originalLuminance, diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index dfba8a4c2..08c9e4d68 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -1561,7 +1561,7 @@ float find_gray(float source_gray, float target_gray) // basic log encoding taken from ACESutil.Lin_to_Log2, from // https://github.com/ampas/aces-dev // (as seen on pixls.us) -void ImProcFunctions::log_encode(Imagefloat *rgb, const struct local_params & lp, bool multiThread, int bfw, int bfh) +void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool multiThread, int bfw, int bfh) { /* J.Desmis 12 2019 small adaptations to local adjustments @@ -1570,7 +1570,13 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, const struct local_params & lp // BENCHFUN const float gray = lp.sourcegray / 100.f; const float shadows_range = lp.blackev; - const float dynamic_range = lp.whiteev - lp.blackev; + if(lp.whiteev < 0.5f) { + lp.whiteev = 0.5f; + } + float dynamic_range = lp.whiteev - lp.blackev; + if (dynamic_range < 0.5f) { + dynamic_range = 0.5f; + } const float noise = pow_F(2.f, -16.f); const float log2 = xlogf(lp.baselog); const float base = lp.targetgray > 1 && lp.targetgray < 100 && dynamic_range > 0 ? find_gray(std::abs(lp.blackev) / dynamic_range, lp.targetgray / 100.f) : 0.f; @@ -1830,7 +1836,7 @@ void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, } } -void tone_eq(array2D &R, array2D &G, array2D &B, const struct local_params & lp, const Glib::ustring &workingProfile, double scale, bool multithread) +void tone_eq(array2D &R, array2D &G, array2D &B, const struct local_params & lp, const Glib::ustring &workingProfile, double scale, bool multithread) // adapted from the tone equalizer of darktable /* Copyright 2019 Alberto Griggio diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index 38f5a756d..bc07769da 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -4655,7 +4655,7 @@ LocallabLog::LocallabLog(): autocompute(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_LOGAUTO")))), logPFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGPFRA")))), blackEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLACK_EV"), -16.0, 0.0, 0.1, -5.0))), - whiteEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 0.0, 32.0, 0.1, 10.0))), + whiteEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 0.5, 32.0, 0.1, 10.0))), fullimage(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FULLIMAGE")))), Autogray(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AUTOGRAY")))), sourceGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_GRAY"), 1.0, 100.0, 0.1, 10.0))), From 75f44d3f2beb4680ae6d69ed9fb56fbb48c710d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 26 Oct 2020 11:25:47 +0100 Subject: [PATCH 171/185] Fix LTO and _FORTIFY_SOURCE=2 warnings (fixes #5965) Tested with GCC 9 and 10 on AMD64. --- rtengine/dcraw.cc | 4 ++-- rtengine/histmatching.cc | 2 +- rtengine/myfile.h | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index ed2eea212..fd9f9211b 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -1399,7 +1399,7 @@ void CLASS nikon_load_raw() void CLASS nikon_yuv_load_raw() { - int row, col, yuv[4], rgb[3], b, c; + int row, col, yuv[4] = {}, rgb[3], b, c; UINT64 bitbuf=0; for (row=0; row < raw_height; row++) @@ -5620,7 +5620,7 @@ nf: order = 0x4949; if (tag == 2 && strstr(make,"NIKON") && !iso_speed) iso_speed = (get2(),get2()); if ((tag == 0x25 || tag == 0x28) && strstr(make,"NIKON") && !iso_speed) { // Nikon ISOInfo Tags/ISO & ISO2 - uchar iso[1]; + uchar iso[1] = {}; fread (iso, 1, 1, ifp); iso_speed = 100 * pow(2,(float)iso[0]/12.0-5); } diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 0053cb0d4..d3c5d0190 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -279,7 +279,7 @@ void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, st { RawMetaDataLocation rml; eSensorType sensor_type; - int w, h; + int w = 0, h = 0; std::unique_ptr thumb(Thumbnail::loadQuickFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, true, true)); if (!thumb) { if (settings->verbose) { diff --git a/rtengine/myfile.h b/rtengine/myfile.h index 423edea9a..34b90c525 100644 --- a/rtengine/myfile.h +++ b/rtengine/myfile.h @@ -107,13 +107,13 @@ inline int getc (IMFILE* f) return fgetc(f); } -inline int fread (void* dst, int es, int count, IMFILE* f) +inline int fread (void* dst, size_t es, size_t count, IMFILE* f) { - int s = es * count; - int avail = f->size - f->pos; + size_t s = es * count; + size_t avail = static_cast(f->size) - static_cast(f->pos); - if (s <= avail) { + if (static_cast(s) <= static_cast(avail)) { memcpy (dst, f->data + f->pos, s); f->pos += s; From 69f7f5b8a685c47604fad01fcd6400eff2a8f73e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 26 Oct 2020 11:32:11 +0100 Subject: [PATCH 172/185] Fix compilation with gtkmm 3.22 (fixes #5969) --- rtgui/histogrampanel.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index d7e9bbc69..83db36cb4 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -106,9 +106,11 @@ HistogramPanel::HistogramPanel () : gfxGrid->add(*histogramArea); gfxGrid->attach_next_to( *histogramRGBAreaVert, *histogramArea, - options.histogramPosition == 1 ? Gtk::POS_RIGHT : Gtk::POS_LEFT + options.histogramPosition == 1 ? Gtk::POS_RIGHT : Gtk::POS_LEFT, + 1, + 1 ); - gfxGrid->attach_next_to(*histogramRGBAreaHori, *histogramArea, Gtk::POS_BOTTOM); + gfxGrid->attach_next_to(*histogramRGBAreaHori, *histogramArea, Gtk::POS_BOTTOM, 1, 1); histogramRGBAreaHori->set_no_show_all(); histogramRGBAreaVert->set_no_show_all(); @@ -275,7 +277,7 @@ HistogramPanel::HistogramPanel () : } scopeOptions->set_image(*Gtk::manage(new RTImage("histogram-ellipsis-small.png"))); showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); - + setExpandAlignProperties(showRed , false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); setExpandAlignProperties(showGreen, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); setExpandAlignProperties(showBlue , false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); @@ -652,7 +654,7 @@ void HistogramPanel::reorder (Gtk::PositionType align) buttonGrid->unreference(); gfxGrid->remove(*histogramRGBAreaVert); - gfxGrid->attach_next_to(*histogramRGBAreaVert, *histogramArea, Gtk::POS_LEFT); + gfxGrid->attach_next_to(*histogramRGBAreaVert, *histogramArea, Gtk::POS_LEFT, 1, 1); persistentButtons->reference(); removeIfThere(buttonGrid, persistentButtons, false); @@ -1296,7 +1298,7 @@ void HistogramArea::updateBackBuffer () } else if (options.histogramScopeType == ScopeType::VECTORSCOPE_HC || options.histogramScopeType == ScopeType::VECTORSCOPE_HS) { // Vectorscope has no gridlines. } else if (options.histogramDrawMode == 0) { - for (int i = 1; i < nrOfHGridPartitions; i++) { + for (int i = 1; i < nrOfHGridPartitions; i++) { cr->move_to (padding, i * static_cast(h) / nrOfHGridPartitions + 0.5); cr->line_to (w - padding, i * static_cast(h) / nrOfHGridPartitions + 0.5); cr->stroke (); From f4f7d1f16d34376e58f7076ee4daf715422ff80f Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 26 Oct 2020 15:12:42 +0100 Subject: [PATCH 173/185] Others change to label tooltip ciecam --- rtdata/languages/default | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 42734a093..4ae3a3edc 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1920,8 +1920,8 @@ TP_COLORAPP_CHROMA;Chroma (C) TP_COLORAPP_CHROMA_M;Colorfulness (M) TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 is the perceived amount of hue in relation to gray, an indicator that a stimulus appears to be more or less colored. TP_COLORAPP_CHROMA_S;Saturation (S) -TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 corresponds to the coloring of a stimulus in relation to its own brightness, differs from L*a*b* and RGB saturation. -TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 corresponds to the "coloring" of a stimulus relative to the clarity of a stimulus that appears white under identical conditions, differs from L*a*b* and RGB chroma. +TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 corresponds to the color of a stimulus in relation to its own brightness, differs from L*a*b* and RGB saturation. +TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 corresponds to the color of a stimulus relative to the clarity of a stimulus that appears white under identical conditions, differs from L*a*b* and RGB chroma. TP_COLORAPP_CIECAT_DEGREE;CAT02 adaptation TP_COLORAPP_CONTRAST;Contrast (J), TP_COLORAPP_CONTRAST_Q;Contrast (Q) @@ -1966,7 +1966,7 @@ TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's TP_COLORAPP_NEUTRAL;Reset TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values TP_COLORAPP_PRESETCAT02;Preset cat02 automatic -TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou can change illuminant shooting conditions.\nYou must change Cat02 adaptation Viewing conditions if need.\nYou can change Temperature and Tint Viewing conditions if need, and other settings if need. +TP_COLORAPP_PRESETCAT02_TIP;Set combobox, sliders, temp, green so that Cat02 automatic is preset.\nYou can change illuminant shooting conditions.\nYou must change Cat02 adaptation Viewing conditions if needed.\nYou can change Temperature and Tint Viewing conditions if needed, and other settings if needed. TP_COLORAPP_RSTPRO;Red & skin-tones protection TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a "normal" area. Normal" means average or standard conditions and data, i.e. without taking into account CIECAM corrections. @@ -1975,7 +1975,7 @@ TP_COLORAPP_SURROUND_AVER;Average TP_COLORAPP_SURROUND_DARK;Dark TP_COLORAPP_SURROUND_DIM;Dim TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) -TP_COLORAPP_SURROUNDSRC;Surround - Smart Lighting +TP_COLORAPP_SURROUNDSRC;Surround - Scene Lighting TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment. The image will become slightly bright.\n\nDark: Dark environment. The image will become more bright.\n\nExtremly Dark: Extremly dark environment. The image will become very bright. TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness From 445505aa4d9ad7251e333ab6bb388462915c28ee Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 27 Oct 2020 06:33:09 +0100 Subject: [PATCH 174/185] Wavelet residual highlight - LA log encoding crash and label --- rtdata/languages/default | 2 +- rtengine/iplocallab.cc | 8 ++++---- rtgui/locallabtools2.cc | 8 +++++--- rtgui/wavelet.cc | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 4ae3a3edc..5cff0da90 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2542,7 +2542,7 @@ TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform TP_LOCALLAB_FFTW2;ƒ - Use Fast Fourier Transform (TIF, JPG,..) TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements) TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform -TP_LOCALLAB_FULLIMAGE;Calculate the dark-Ev & white-Ev values for the entire image +TP_LOCALLAB_FULLIMAGE;Dark-Ev & white-Ev for the entire image TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the entire image. TP_LOCALLAB_GAM;Gamma TP_LOCALLAB_GAMFRA;Tone response curve (TRC) diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 08c9e4d68..a37f34f59 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -1570,12 +1570,12 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool // BENCHFUN const float gray = lp.sourcegray / 100.f; const float shadows_range = lp.blackev; - if(lp.whiteev < 0.5f) { - lp.whiteev = 0.5f; + if(lp.whiteev < 1.f) { + lp.whiteev = 1.f; } float dynamic_range = lp.whiteev - lp.blackev; - if (dynamic_range < 0.5f) { - dynamic_range = 0.5f; + if (dynamic_range < 1.f) { + dynamic_range = 1.f; } const float noise = pow_F(2.f, -16.f); const float log2 = xlogf(lp.baselog); diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index bc07769da..77fd08b0d 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -4655,7 +4655,7 @@ LocallabLog::LocallabLog(): autocompute(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_LOGAUTO")))), logPFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGPFRA")))), blackEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLACK_EV"), -16.0, 0.0, 0.1, -5.0))), - whiteEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 0.5, 32.0, 0.1, 10.0))), + whiteEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 1., 32.0, 0.1, 10.0))), fullimage(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FULLIMAGE")))), Autogray(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AUTOGRAY")))), sourceGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_GRAY"), 1.0, 100.0, 0.1, 10.0))), @@ -4669,10 +4669,10 @@ LocallabLog::LocallabLog(): // Parameter Log encoding specific widgets autoconn = autocompute->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::autocomputeToggled)); - blackEv->setLogScale(2, -8); + // blackEv->setLogScale(2, -8); blackEv->setAdjusterListener(this); - whiteEv->setLogScale(16, 0); + // whiteEv->setLogScale(16, 0); whiteEv->setAdjusterListener(this); fullimageConn = fullimage->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::fullimageChanged)); @@ -4800,7 +4800,9 @@ void LocallabLog::read(const rtengine::procparams::ProcParams* pp, const ParamsE autocompute->set_active(spot.autocompute); blackEv->setValue(spot.blackEv); + whiteEv->setValue(spot.whiteEv); + if(whiteEv->getValue() < 1.) whiteEv->setValue(1.); fullimage->set_active(spot.fullimage); Autogray->set_active(spot.Autogray); sourceGray->setValue(spot.sourceGray); diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index c7647798a..909b906ad 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -93,7 +93,7 @@ Wavelet::Wavelet() : offset(Gtk::manage(new Adjuster(M("TP_WAVELET_WAVOFFSET"), 0.33, 1.66, 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), lowthr(Gtk::manage(new Adjuster(M("TP_WAVELET_WAVLOWTHR"), 20., 100., 0.5, 40.))), rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), -100, 100, 1, 0))), - resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), -100, 100, 1, 0))), + resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), 0, 100, 1, 0))), reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), resblur(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLUR"), 0, 100, 1, 0))), resblurc(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLURC"), 0, 100, 1, 0))), From 85bd06445496a0ebc502f1cbb9a3c9efe4204465 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 27 Oct 2020 09:55:04 +0100 Subject: [PATCH 175/185] Fixed enable denoise wavelet level - enable denoise chroma --- rtengine/FTblockDN.cc | 5 ++++- rtengine/ipwavelet.cc | 21 ++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index bef60e59a..0f431c645 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -2377,6 +2377,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition& Wavelet bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition& WaveletCoeffs_L, wavelet_decomposition& WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels) { int maxlvl = WaveletCoeffs_L.maxlevel(); + printf("Ftblockdn ab bishrink\n"); if (local == 1) { maxlvl = 6; //for local denoise @@ -2458,6 +2459,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition& Wavele float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); if (lvl == maxlvl - 1) { + //printf("Shrink ab bis\n"); ShrinkAllAB(WaveletCoeffs_L, WaveletCoeffs_ab, buffer, lvl, dir, noisevarchrom, noisevar_ab, useNoiseCCurve, autoch, denoiseMethodRgb, madL[lvl], nullptr, 0, madab[lvl], true); } else { //simple wavelet shrinkage @@ -2617,7 +2619,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition& WaveletCoeffs_L float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels)//mod JD { - + printf("Ftblockdn ab std\n"); int maxlvl = WaveletCoeffs_L.maxlevel(); if (local == 1) { @@ -2780,6 +2782,7 @@ void ImProcFunctions::ShrinkAllAB(wavelet_decomposition& WaveletCoeffs_L, wavele { //simple wavelet shrinkage const float eps = 0.01f; + // printf("Shrink ab simple\n"); if (autoch && noisevar_ab <= 0.001f) { noisevar_ab = 0.02f; diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 613e74723..ace33c7a1 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -578,7 +578,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.chromfi = 0.1f * waparams.chromfi; cp.chromco = 0.1f * waparams.chromco; cp.ballum = waparams.ballum; - + printf("wavparfi=%f\n", cp.chromfi); cp.conres = waparams.rescon; cp.conresH = waparams.resconH; cp.radius = waparams.radius; @@ -1041,13 +1041,13 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } - if (!exblurL && cp.contrast == 0.f && cp.blurres == 0.f && !cp.tonemap && !cp.resena && !cp.chromena && !cp.finena && !cp.edgeena && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels + if (!exblurL && cp.contrast == 0.f && cp.blurres == 0.f && !cp.noiseena && !cp.tonemap && !cp.resena && !cp.chromena && !cp.finena && !cp.edgeena && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels while (levwavL > 0 && cp.mul[levwavL - 1] == 0.f) { // cp.mul[level] == 0.f means no changes to level levwavL--; } } - if (levwavL == 6 && cp.noiseena) { + if (levwavL == 6 && cp.noiseena && cp.chromfi == 0.f) { cp.chromfi = 0.01f; } @@ -1552,6 +1552,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float noisecfb = cp.chromfi; float noiseccb = cp.chromco; + printf("nf=%f\n", noisecfr); if (cp.balchrom < 0.f) { noisecfb = cp.chromfi - 0.1f * cp.balchrom; @@ -1574,7 +1575,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (noiseccb < 0.f) { noiseccb = 0.0001f; } - + printf("chroR=%f chrocB=%f\n", noisecfr, noisecfb); int edge = 2; variC[0] = SQR(noisecfr); variC[1] = SQR(noisecfr); @@ -1770,7 +1771,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (!hhutili) { //always a or b int levwava = levwav; - if (!exblurab && cp.chrores == 0.f && cp.blurcres == 0.f && !cp.tonemap && !cp.resena && !cp.chromena && !cp.finena && !cp.edgeena&& params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels + if (!exblurab && cp.chrores == 0.f && cp.blurcres == 0.f && !cp.noiseena && !cp.tonemap && !cp.resena && !cp.chromena && !cp.finena && !cp.edgeena&& params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels while (levwava > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwava - 1] == 0.f)) || (cp.CHmet != 2 && (levwava == 10 || (!cp.curv || cp.mulC[levwava - 1] == 0.f))))) && (!cp.opaRG || levwava == 10 || (cp.opaRG && cp.mulopaRG[levwava - 1] == 0.f)) && ((levwava == 10 || (cp.CHSLmet == 1 && cp.mulC[levwava - 1] == 0.f)))) { levwava--; } @@ -1798,7 +1799,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); - } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ + } else if (cp.chromfi > 0.f && cp.chromco >= 0.f){ WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); @@ -1816,7 +1817,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const int levwavb = levwav; - if (!exblurab && cp.chrores == 0.f && cp.blurcres == 0.f && !cp.tonemap && !cp.resena && !cp.chromena && !cp.finena && !cp.edgeena && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels + if (!exblurab && cp.chrores == 0.f && cp.blurcres == 0.f && !cp.noiseena && !cp.tonemap && !cp.resena && !cp.chromena && !cp.finena && !cp.edgeena && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels while (levwavb > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavb - 1] == 0.f)) || (cp.CHmet != 2 && (levwavb == 10 || (!cp.curv || cp.mulC[levwavb - 1] == 0.f))))) && (!cp.opaBY || levwavb == 10 || (cp.opaBY && cp.mulopaBY[levwavb - 1] == 0.f)) && ((levwavb == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavb - 1] == 0.f)))) { levwavb--; } @@ -1845,9 +1846,11 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (!bdecomp->memory_allocation_failed()) { // if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f )) { if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.quamet == 0)) { - WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); - } else if (cp.chromfi > 0.f && cp.chromco >= 2.f){ + printf("Denoise ab\n"); + } else if (cp.chromfi > 0.f && cp.chromco > 0.f){ + printf("Denoise ab agressive\n"); + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); } From 784be4a5e84794886fbdcad7eb2f42b02f2ad4b3 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 27 Oct 2020 10:57:15 +0100 Subject: [PATCH 176/185] Suppress warning --- rtengine/FTblockDN.cc | 2 -- rtengine/ipwavelet.cc | 24 +++++++++++------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 0f431c645..66f12b668 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -2619,7 +2619,6 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition& WaveletCoeffs_L float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels)//mod JD { - printf("Ftblockdn ab std\n"); int maxlvl = WaveletCoeffs_L.maxlevel(); if (local == 1) { @@ -2782,7 +2781,6 @@ void ImProcFunctions::ShrinkAllAB(wavelet_decomposition& WaveletCoeffs_L, wavele { //simple wavelet shrinkage const float eps = 0.01f; - // printf("Shrink ab simple\n"); if (autoch && noisevar_ab <= 0.001f) { noisevar_ab = 0.02f; diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index ace33c7a1..fe6b7be29 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -578,7 +578,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.chromfi = 0.1f * waparams.chromfi; cp.chromco = 0.1f * waparams.chromco; cp.ballum = waparams.ballum; - printf("wavparfi=%f\n", cp.chromfi); cp.conres = waparams.rescon; cp.conresH = waparams.resconH; cp.radius = waparams.radius; @@ -1552,7 +1551,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float noisecfb = cp.chromfi; float noiseccb = cp.chromco; - printf("nf=%f\n", noisecfr); if (cp.balchrom < 0.f) { noisecfb = cp.chromfi - 0.1f * cp.balchrom; @@ -1575,7 +1573,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (noiseccb < 0.f) { noiseccb = 0.0001f; } - printf("chroR=%f chrocB=%f\n", noisecfr, noisecfb); int edge = 2; variC[0] = SQR(noisecfr); variC[1] = SQR(noisecfr); @@ -1799,7 +1796,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); - } else if (cp.chromfi > 0.f && cp.chromco >= 0.f){ + } else if (cp.noiseena && ((cp.chromfi > 0.f && cp.chromco >= 0.f) && cp.quamet == 1 )){ WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); @@ -1847,12 +1844,17 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f )) { if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.quamet == 0)) { WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); - printf("Denoise ab\n"); - } else if (cp.chromfi > 0.f && cp.chromco > 0.f){ - printf("Denoise ab agressive\n"); + if (settings->verbose) { + printf("Denoise ab standard\n"); + } + } else if (cp.noiseena && ((cp.chromfi > 0.f && cp.chromco >= 0.f) && cp.quamet == 1 )){ WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + if (settings->verbose) { + printf("Denoise ab bishrink\n"); + } + } Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab, wavNestedLevels); @@ -1911,9 +1913,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const if (usechrom) { Ldecomp->reconstruct(labco->data, cp.strength); } -// if (settings->verbose) { -// printf("OK END\n"); -// } } } @@ -2185,7 +2184,6 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } //end hue -// printf("LEVWAV=%i\n", levwavL); if (thrend > 0.f) { //2 decomposition LL after guidefilter and dst before (perhaps dst no need) @@ -3743,7 +3741,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float maxkoeLi, bool lipschitz, float edghig = settings->edghi;//increase or reduce "reinforce" float edglow = settings->edglo;//increase or reduce "reduce" float limrad = settings->limrad;//threshold action in function radius (rad) - printf("edghi=%f edglo=%f limrad=%f\n", edghig, edglow, limrad); + // printf("edghi=%f edglo=%f limrad=%f\n", edghig, edglow, limrad); // value *= beta; float edge = 1.f; float lim0 = limrad; //arbitrary limit for low radius and level between 2 or 3 to 30 maxi @@ -3769,7 +3767,7 @@ void ImProcFunctions::ContAllL(float *koeLi[12], float maxkoeLi, bool lipschitz, float bk = al0; float koef = ak * level + bk; //modulate for levels : more levels high, more koef low ==> concentrated action on low levels, without or near for high levels float expkoef = -std::pow(std::fabs(rad - lev), koef); //reduce effect for high levels - printf("repart=%f\n", repart); + // printf("repart=%f\n", repart); if (cp.reinforce == 3) { if (rad < (lim0 / 60.f) && level == 0) { From aae90a0ad3dfe49442ae1a2082c0cfb5126b88d4 Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 27 Oct 2020 19:51:04 +0100 Subject: [PATCH 177/185] Small changes to settings Log encoding --- rtengine/iplocallab.cc | 4 ++-- rtgui/locallabtools2.cc | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index a37f34f59..729a0bb0c 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -1570,8 +1570,8 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool // BENCHFUN const float gray = lp.sourcegray / 100.f; const float shadows_range = lp.blackev; - if(lp.whiteev < 1.f) { - lp.whiteev = 1.f; + if(lp.whiteev < 1.5f) { + lp.whiteev = 1.5f; } float dynamic_range = lp.whiteev - lp.blackev; if (dynamic_range < 1.f) { diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index 77fd08b0d..00f36cd9c 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -4655,13 +4655,13 @@ LocallabLog::LocallabLog(): autocompute(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_LOGAUTO")))), logPFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGPFRA")))), blackEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLACK_EV"), -16.0, 0.0, 0.1, -5.0))), - whiteEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 1., 32.0, 0.1, 10.0))), + whiteEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 1.5, 32.0, 0.1, 10.0))), fullimage(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FULLIMAGE")))), Autogray(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AUTOGRAY")))), sourceGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_GRAY"), 1.0, 100.0, 0.1, 10.0))), targetGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TARGET_GRAY"), 5.0, 80.0, 0.1, 18.0))), detail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0., 1., 0.01, 0.6))), - baselog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BASELOG"), 1.3, 8., 0.05, 2., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + baselog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BASELOG"), 1.4, 8., 0.05, 2., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), sensilog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), strlog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -2.0, 2.0, 0.05, 0.))), anglog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))) @@ -4802,7 +4802,9 @@ void LocallabLog::read(const rtengine::procparams::ProcParams* pp, const ParamsE blackEv->setValue(spot.blackEv); whiteEv->setValue(spot.whiteEv); - if(whiteEv->getValue() < 1.) whiteEv->setValue(1.); + if(whiteEv->getValue() < 1.5){ + whiteEv->setValue(1.5); + } fullimage->set_active(spot.fullimage); Autogray->set_active(spot.Autogray); sourceGray->setValue(spot.sourceGray); From ca5d6e44ee94442d06cf0bdbdb6e115d90bd0ce1 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 28 Oct 2020 16:38:17 +0100 Subject: [PATCH 178/185] LA Log encoding clamp values --- rtengine/color.cc | 1 + rtengine/iplocallab.cc | 24 ++++++++++++++++++------ rtgui/locallabtools.cc | 1 + rtgui/locallabtools2.cc | 11 ++++++----- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index 23f1ad9f6..de6f6f64b 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1553,6 +1553,7 @@ void Color::calcGamma (double pwr, double ts, GammaValues &gamma) gamma[4] = g[4]; gamma[5] = g[5]; gamma[6] = 0.; + printf("g0=%f g1=%f g2=%f g3=%f g4=%f g5=%f\n", g[0], g[1], g[2], g[3], g[4], g[5] ); } void Color::gammaf2lut (LUTf &gammacurve, float gamma, float start, float slope, float divisor, float factor) { diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 729a0bb0c..b9f256dc8 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -1570,12 +1570,14 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool // BENCHFUN const float gray = lp.sourcegray / 100.f; const float shadows_range = lp.blackev; + /* if(lp.whiteev < 1.5f) { lp.whiteev = 1.5f; } + */ float dynamic_range = lp.whiteev - lp.blackev; - if (dynamic_range < 1.f) { - dynamic_range = 1.f; + if (dynamic_range < 0.5f) { + dynamic_range = 0.5f; } const float noise = pow_F(2.f, -16.f); const float log2 = xlogf(lp.baselog); @@ -1654,9 +1656,14 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool if (m > noise) { float mm = apply(m); float f = mm / m; + f = min(f, 1000000.f); + r *= f; b *= f; g *= f; + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } assert(r == r); @@ -1710,13 +1717,18 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool // float t2 = norm(r, g, b); float f2 = apply(t2) / t2; f = intp(blend, f, f2); - assert(std::isfinite(f)); + f = min(f, 1000000.f); + + // assert(std::isfinite(f)); r *= f; g *= f; b *= f; - assert(std::isfinite(r)); - assert(std::isfinite(g)); - assert(std::isfinite(b)); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); + // assert(std::isfinite(r)); + // assert(std::isfinite(g)); + // assert(std::isfinite(b)); } } } diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc index f9dbab2eb..68908b33a 100644 --- a/rtgui/locallabtools.cc +++ b/rtgui/locallabtools.cc @@ -3611,6 +3611,7 @@ LocallabShadow::LocallabShadow(): blurSHde->setAdjusterListener(this); gamSH->setAdjusterListener(this); + sloSH->setLogScale(16, 0); sloSH->setAdjusterListener(this); diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index 00f36cd9c..c2535ed0a 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -4655,13 +4655,13 @@ LocallabLog::LocallabLog(): autocompute(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_LOGAUTO")))), logPFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGPFRA")))), blackEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLACK_EV"), -16.0, 0.0, 0.1, -5.0))), - whiteEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 1.5, 32.0, 0.1, 10.0))), + whiteEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 0., 32.0, 0.1, 10.0))), fullimage(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FULLIMAGE")))), Autogray(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AUTOGRAY")))), sourceGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_GRAY"), 1.0, 100.0, 0.1, 10.0))), targetGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TARGET_GRAY"), 5.0, 80.0, 0.1, 18.0))), detail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0., 1., 0.01, 0.6))), - baselog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BASELOG"), 1.4, 8., 0.05, 2., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + baselog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BASELOG"), 1.3, 8., 0.05, 2., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), sensilog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), strlog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -2.0, 2.0, 0.05, 0.))), anglog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))) @@ -4669,10 +4669,10 @@ LocallabLog::LocallabLog(): // Parameter Log encoding specific widgets autoconn = autocompute->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::autocomputeToggled)); - // blackEv->setLogScale(2, -8); + blackEv->setLogScale(2, -8); blackEv->setAdjusterListener(this); - // whiteEv->setLogScale(16, 0); + whiteEv->setLogScale(16, 0); whiteEv->setAdjusterListener(this); fullimageConn = fullimage->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::fullimageChanged)); @@ -4802,9 +4802,10 @@ void LocallabLog::read(const rtengine::procparams::ProcParams* pp, const ParamsE blackEv->setValue(spot.blackEv); whiteEv->setValue(spot.whiteEv); - if(whiteEv->getValue() < 1.5){ +/* if(whiteEv->getValue() < 1.5){ whiteEv->setValue(1.5); } +*/ fullimage->set_active(spot.fullimage); Autogray->set_active(spot.Autogray); sourceGray->setValue(spot.sourceGray); From 6f7f41237e861bc101500f9e5c0a7a88e69896e3 Mon Sep 17 00:00:00 2001 From: Desmis Date: Wed, 28 Oct 2020 16:49:55 +0100 Subject: [PATCH 179/185] Suppress warning in console --- rtengine/color.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index de6f6f64b..11a94d1dc 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1553,7 +1553,9 @@ void Color::calcGamma (double pwr, double ts, GammaValues &gamma) gamma[4] = g[4]; gamma[5] = g[5]; gamma[6] = 0.; - printf("g0=%f g1=%f g2=%f g3=%f g4=%f g5=%f\n", g[0], g[1], g[2], g[3], g[4], g[5] ); + // if (rtengine::settings->verbose) { + // printf("g0=%f g1=%f g2=%f g3=%f g4=%f g5=%f\n", g[0], g[1], g[2], g[3], g[4], g[5]); + // } } void Color::gammaf2lut (LUTf &gammacurve, float gamma, float start, float slope, float divisor, float factor) { From 393c9f3461a3726c2d5c6e637ab385149b95ff01 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 29 Oct 2020 11:57:30 +0100 Subject: [PATCH 180/185] Change GUI labels -Log encoding --- rtdata/languages/default | 7 ++++--- rtengine/iplocallab.cc | 6 +----- rtgui/locallabtools.h | 1 + rtgui/locallabtools2.cc | 12 +++++++++--- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5cff0da90..2213978b6 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2626,7 +2626,8 @@ TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic rang TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of Dynamic Range i.e. Black Ev and White Ev TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process : 1) Dynamic Range calculation 2) Manual adjustment -TP_LOCALLAB_LOGFRA;Source Gray Point +TP_LOCALLAB_LOGFRA;Source +TP_LOCALLAB_LOG2FRA;Target TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the Source Gray Point for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\n Takes into account exposure compensation in the main-menu Exposure tab. TP_LOCALLAB_LOGLIN;Logarithm mode TP_LOCALLAB_LOGPFRA;Relative Exposure Levels @@ -2849,7 +2850,7 @@ TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts TP_LOCALLAB_SOFTRETI_TOOLTIP;Take into account deltaE to improve Transmission map TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 -TP_LOCALLAB_SOURCE_GRAY;Value +TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) TP_LOCALLAB_SPECCASE;Specific cases TP_LOCALLAB_SPECIAL;Special use of RGB curves TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. “Scope”, masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. @@ -2875,7 +2876,7 @@ TP_LOCALLAB_STYPE;Shape method TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. TP_LOCALLAB_SYM;Symmetrical (mouse) TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) -TP_LOCALLAB_TARGET_GRAY;Target gray point +TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) TP_LOCALLAB_THRES;Threshold structure TP_LOCALLAB_THRESDELTAE;ΔE scope threshold TP_LOCALLAB_THRESRETI;Threshold diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index b9f256dc8..8f4c17a39 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -1570,11 +1570,7 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool // BENCHFUN const float gray = lp.sourcegray / 100.f; const float shadows_range = lp.blackev; - /* - if(lp.whiteev < 1.5f) { - lp.whiteev = 1.5f; - } - */ + float dynamic_range = lp.whiteev - lp.blackev; if (dynamic_range < 0.5f) { dynamic_range = 0.5f; diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index 4ae593225..d66f6ab33 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -1197,6 +1197,7 @@ private: Gtk::CheckButton* const fullimage; Gtk::CheckButton* const Autogray; Adjuster* const sourceGray; + Gtk::Frame* const log2Frame; Adjuster* const targetGray; Adjuster* const detail; Adjuster* const baselog; diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index c2535ed0a..918d1897c 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -4659,6 +4659,7 @@ LocallabLog::LocallabLog(): fullimage(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FULLIMAGE")))), Autogray(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AUTOGRAY")))), sourceGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_GRAY"), 1.0, 100.0, 0.1, 10.0))), + log2Frame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOG2FRA")))), targetGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TARGET_GRAY"), 5.0, 80.0, 0.1, 18.0))), detail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0., 1., 0.01, 0.6))), baselog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BASELOG"), 1.3, 8., 0.05, 2., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), @@ -4707,11 +4708,16 @@ LocallabLog::LocallabLog(): ToolParamBlock* const logFBox = Gtk::manage(new ToolParamBlock()); logFBox->pack_start(*Autogray); logFBox->pack_start(*sourceGray); + logFBox->pack_start(*baselog); logFrame->add(*logFBox); pack_start(*logFrame); - pack_start(*targetGray); - pack_start(*detail); - pack_start(*baselog); + log2Frame->set_label_align(0.025, 0.5); + ToolParamBlock* const logP2Box = Gtk::manage(new ToolParamBlock()); + logP2Box->pack_start(*targetGray); + logP2Box->pack_start(*detail); + log2Frame->add(*logP2Box); + pack_start(*log2Frame); +// pack_start(*baselog); pack_start(*sensilog); Gtk::Frame* const gradlogFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GRADLOGFRA"))); gradlogFrame->set_label_align(0.025, 0.5); From 021db69b80833429ac377b25ad81149b3aede114 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 29 Oct 2020 12:31:33 +0100 Subject: [PATCH 181/185] Another label change Log encoding --- rtdata/languages/default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 2213978b6..bb33ef2ff 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2348,7 +2348,7 @@ TP_LOCALLAB_BALAN;ab-L balance (ΔE) TP_LOCALLAB_BALANEXP;Laplacian balance TP_LOCALLAB_BALANH;C-H balance (ΔE) TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise -TP_LOCALLAB_BASELOG;Logarithm base +TP_LOCALLAB_BASELOG;Shadows range (logarithm base) TP_LOCALLAB_BILATERAL;Bilateral filter TP_LOCALLAB_BLACK_EV;Black Ev TP_LOCALLAB_BLCO;Chrominance only From 95df31b29628f05d555e04ea7bb0d67f1e94dd8c Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 29 Oct 2020 15:08:20 +0100 Subject: [PATCH 182/185] added cat02 adpatation to log encoding --- rtdata/languages/default | 13 +++++++++++++ rtengine/iplocallab.cc | 14 ++++++++++++-- rtengine/procevents.h | 1 + rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 3 ++- rtgui/locallabtools.h | 1 + rtgui/locallabtools2.cc | 13 +++++++++++++ rtgui/paramsedited.cc | 7 +++++++ rtgui/paramsedited.h | 1 + 10 files changed, 55 insertions(+), 3 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index bb33ef2ff..15303048a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1096,6 +1096,17 @@ HISTORY_MSG_840;Local - CL Curve HISTORY_MSG_841;Local - LC curve HISTORY_MSG_842;Local - Contrast Threshold HISTORY_MSG_843;Local - Radius +HISTORY_MSG_845;Local - Log encoding +HISTORY_MSG_846;Local - Log encoding auto +HISTORY_MSG_847;Local - Log encoding Source +HISTORY_MSG_849;Local - Log encoding Source auto +HISTORY_MSG_850;Local - Log encoding B_Ev +HISTORY_MSG_851;Local - Log encoding W_Ev +HISTORY_MSG_852;Local - Log encoding Target +HISTORY_MSG_853;Local - Log encodind loc contrast +HISTORY_MSG_854;Local - Log encodind Scope +HISTORY_MSG_855;Local - Log encoding Entire image +HISTORY_MSG_856;Local - Log encoding Shadows range HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle @@ -1166,6 +1177,7 @@ HISTORY_MSG_956;Local - CH Curve HISTORY_MSG_957;Local - Denoise mode HISTORY_MSG_958;Local - Show/hide settings HISTORY_MSG_959;Local - Inverse blur +HISTORY_MSG_960;Local - Log encoding - cat02 HISTORY_MSG_BLSHAPE;Blur by level HISTORY_MSG_BLURCWAV;Blur chroma HISTORY_MSG_BLURWAV;Blur luminance @@ -2386,6 +2398,7 @@ TP_LOCALLAB_BUTTON_DEL;Delete TP_LOCALLAB_BUTTON_DUPL;Duplicate TP_LOCALLAB_BUTTON_REN;Rename TP_LOCALLAB_BUTTON_VIS;Show/Hide +TP_LOCALLAB_CATAD;Chromatic adaptation - Cat02 TP_LOCALLAB_CBDL;Contrast by Detail Levels TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 8f4c17a39..53d37ecad 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -2088,14 +2088,21 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab) double Xwout, Zwout; double Xwsc, Zwsc; - int tempo; + int tempo = 5000; if (params->locallab.spots.at(sp).warm > 0) { tempo = 5000 - 30 * params->locallab.spots.at(sp).warm; - } else { + } else if (params->locallab.spots.at(sp).warm < 0){ tempo = 5000 - 49 * params->locallab.spots.at(sp).warm; } + if (params->locallab.spots.at(sp).catad > 0) { + tempo = 5000 - 30 * params->locallab.spots.at(sp).catad; + } else if (params->locallab.spots.at(sp).catad < 0){ + tempo = 5000 - 49 * params->locallab.spots.at(sp).catad; + } + + ColorTemp::temp2mulxyz(params->wb.temperature, params->wb.method, Xw, Zw); //compute white Xw Yw Zw : white current WB ColorTemp::temp2mulxyz(tempo, "Custom", Xwout, Zwout); ColorTemp::temp2mulxyz(5000, "Custom", Xwsc, Zwsc); @@ -9686,6 +9693,9 @@ void ImProcFunctions::Lab_Local( log_encode(tmpImage.get(), lp, multiThread, bfw, bfh); rgb2lab(*(tmpImage.get()), *bufexpfin, params->icm.workingProfile); tmpImage.reset(); + if (params->locallab.spots.at(sp).catad != 0) { + ImProcFunctions::ciecamloc_02float(sp, bufexpfin.get()); + } //here begin graduated filter //first solution "easy" but we can do other with log_encode...to see the results diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 7c711a3da..b9d815612 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -982,6 +982,7 @@ enum ProcEventCode { EvlocallabquaMethod = 956, Evlocallabhishow = 957, Evlocallabinvbl = 958, + Evlocallabcatad = 959, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 0528f0e49..574123762 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -3838,6 +3838,7 @@ LocallabParams::LocallabSpot::LocallabSpot() : autocompute(false), sourceGray(10.), targetGray(18.), + catad(0.), Autogray(true), fullimage(true), blackEv(-5.0), @@ -4415,6 +4416,7 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && autocompute == other.autocompute && sourceGray == other.sourceGray && targetGray == other.targetGray + && catad == other.catad && Autogray == other.Autogray && fullimage == other.fullimage && blackEv == other.blackEv @@ -5949,6 +5951,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->autocompute, "Locallab", "Autocompute_" + index_str, spot.autocompute, keyFile); saveToKeyfile(!pedited || spot_edited->sourceGray, "Locallab", "SourceGray_" + index_str, spot.sourceGray, keyFile); saveToKeyfile(!pedited || spot_edited->targetGray, "Locallab", "TargetGray_" + index_str, spot.targetGray, keyFile); + saveToKeyfile(!pedited || spot_edited->catad, "Locallab", "Catad_" + index_str, spot.catad, keyFile); saveToKeyfile(!pedited || spot_edited->Autogray, "Locallab", "Autogray_" + index_str, spot.Autogray, keyFile); saveToKeyfile(!pedited || spot_edited->fullimage, "Locallab", "Fullimage_" + index_str, spot.fullimage, keyFile); saveToKeyfile(!pedited || spot_edited->blackEv, "Locallab", "BlackEv_" + index_str, spot.blackEv, keyFile); @@ -7725,6 +7728,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Autocompute_" + index_str, pedited, spot.autocompute, spotEdited.autocompute); assignFromKeyfile(keyFile, "Locallab", "SourceGray_" + index_str, pedited, spot.sourceGray, spotEdited.sourceGray); assignFromKeyfile(keyFile, "Locallab", "TargetGray_" + index_str, pedited, spot.targetGray, spotEdited.targetGray); + assignFromKeyfile(keyFile, "Locallab", "Catad_" + index_str, pedited, spot.catad, spotEdited.catad); assignFromKeyfile(keyFile, "Locallab", "AutoGray_" + index_str, pedited, spot.Autogray, spotEdited.Autogray); assignFromKeyfile(keyFile, "Locallab", "Fullimage_" + index_str, pedited, spot.fullimage, spotEdited.fullimage); assignFromKeyfile(keyFile, "Locallab", "BlackEv_" + index_str, pedited, spot.blackEv, spotEdited.blackEv); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 7cf8bf4a2..53a008a29 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1425,6 +1425,7 @@ struct LocallabParams { bool autocompute; double sourceGray; double targetGray; + double catad; bool Autogray; bool fullimage; double blackEv; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 255d080ac..6daf01621 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -985,7 +985,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // EvlocallabCHshape LUMINANCECURVE, //EvlocallabquaMethod LUMINANCECURVE, //Evlocallabhishow - LUMINANCECURVE // Evlocallabinvbl + LUMINANCECURVE, // Evlocallabinvbl + LUMINANCECURVE // Evlocallabcatad }; diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index d66f6ab33..ff4062f0f 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -1200,6 +1200,7 @@ private: Gtk::Frame* const log2Frame; Adjuster* const targetGray; Adjuster* const detail; + Adjuster* const catad; Adjuster* const baselog; Adjuster* const sensilog; Adjuster* const strlog; diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index 918d1897c..67917c700 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -4662,6 +4662,7 @@ LocallabLog::LocallabLog(): log2Frame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOG2FRA")))), targetGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TARGET_GRAY"), 5.0, 80.0, 0.1, 18.0))), detail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0., 1., 0.01, 0.6))), + catad(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CATAD"), -100., 100., 0.5, 0.))), baselog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BASELOG"), 1.3, 8., 0.05, 2., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), sensilog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), strlog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -2.0, 2.0, 0.05, 0.))), @@ -4686,6 +4687,8 @@ LocallabLog::LocallabLog(): detail->setAdjusterListener(this); + catad->setAdjusterListener(this); + baselog->setAdjusterListener(this); sensilog->setAdjusterListener(this); @@ -4715,6 +4718,7 @@ LocallabLog::LocallabLog(): ToolParamBlock* const logP2Box = Gtk::manage(new ToolParamBlock()); logP2Box->pack_start(*targetGray); logP2Box->pack_start(*detail); + logP2Box->pack_start(*catad); log2Frame->add(*logP2Box); pack_start(*log2Frame); // pack_start(*baselog); @@ -4849,6 +4853,7 @@ void LocallabLog::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi spot.Autogray = Autogray->get_active(); spot.sourceGray = sourceGray->getValue(); spot.targetGray = targetGray->getValue(); + spot.catad = catad->getValue(); spot.detail = detail->getValue(); spot.baselog = baselog->getValue(); spot.sensilog = sensilog->getIntValue(); @@ -4871,6 +4876,7 @@ void LocallabLog::setDefaults(const rtengine::procparams::ProcParams* defParams, whiteEv->setDefault(defSpot.whiteEv); sourceGray->setDefault(defSpot.sourceGray); targetGray->setDefault(defSpot.targetGray); + catad->setDefault(defSpot.catad); detail->setDefault(defSpot.detail); baselog->setDefault(defSpot.baselog); sensilog->setDefault((double)defSpot.sensilog); @@ -4912,6 +4918,13 @@ void LocallabLog::adjusterChanged(Adjuster* a, double newval) } } + if (a == catad) { + if (listener) { + listener->panelChanged(Evlocallabcatad, + catad->getTextValue() + " (" + escapeHtmlChars(spotName) + ")"); + } + } + if (a == detail) { if (listener) { listener->panelChanged(Evlocallabdetail, diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 94d706dc7..ae756feeb 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1497,6 +1497,7 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).autocompute = locallab.spots.at(j).autocompute && pSpot.autocompute == otherSpot.autocompute; locallab.spots.at(j).sourceGray = locallab.spots.at(j).sourceGray && pSpot.sourceGray == otherSpot.sourceGray; locallab.spots.at(j).targetGray = locallab.spots.at(j).targetGray && pSpot.targetGray == otherSpot.targetGray; + locallab.spots.at(j).catad = locallab.spots.at(j).catad && pSpot.catad == otherSpot.catad; locallab.spots.at(j).Autogray = locallab.spots.at(j).Autogray && pSpot.Autogray == otherSpot.Autogray; locallab.spots.at(j).fullimage = locallab.spots.at(j).fullimage && pSpot.fullimage == otherSpot.fullimage; locallab.spots.at(j).blackEv = locallab.spots.at(j).blackEv && pSpot.blackEv == otherSpot.blackEv; @@ -4855,6 +4856,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).targetGray = mods.locallab.spots.at(i).targetGray; } + if (locallab.spots.at(i).catad) { + toEdit.locallab.spots.at(i).catad = mods.locallab.spots.at(i).catad; + } + if (locallab.spots.at(i).Autogray) { toEdit.locallab.spots.at(i).Autogray = mods.locallab.spots.at(i).Autogray; } @@ -6641,6 +6646,7 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : autocompute(v), sourceGray(v), targetGray(v), + catad(v), Autogray(v), fullimage(v), blackEv(v), @@ -7136,6 +7142,7 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) autocompute = v; sourceGray = v; targetGray = v; + catad = v; Autogray = v; fullimage = v; blackEv = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 0cacef527..2a50b2cf1 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -833,6 +833,7 @@ public: bool autocompute; bool sourceGray; bool targetGray; + bool catad; bool Autogray; bool fullimage; bool blackEv; From 7d763f7df24cbaafd3ad2b015712bc720fb198d5 Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 29 Oct 2020 17:01:41 +0100 Subject: [PATCH 183/185] LA Add forgoten history messages --- rtdata/languages/default | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index 15303048a..f0c4a64ac 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1107,6 +1107,35 @@ HISTORY_MSG_853;Local - Log encodind loc contrast HISTORY_MSG_854;Local - Log encodind Scope HISTORY_MSG_855;Local - Log encoding Entire image HISTORY_MSG_856;Local - Log encoding Shadows range +HISTORY_MSG_857;Local - Wavelet blur residual +HISTORY_MSG_858;Local - Wavelet blur luminance only +HISTORY_MSG_859;Local - Wavelet max blur +HISTORY_MSG_860;Local - Wavelet blur levels +HISTORY_MSG_861;Local - Wavelet contrast levels +HISTORY_MSG_862;Local - Wavelet contrast attenuation +HISTORY_MSG_863;Local - Wavelet merge original image +HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +HISTORY_MSG_865;Local - Wavelet dir contrast delta +HISTORY_MSG_866;Local - Wavelet dir compression +HISTORY_MSG_869;Local - Denoise by level + +HISTORY_MSG_870;Local - Wavelet mask curve H +HISTORY_MSG_871;Local - Wavelet mask curve C +HISTORY_MSG_872;Local - Wavelet mask curve L +HISTORY_MSG_873;Local - Wavelet mask +HISTORY_MSG_875;Local - Wavelet mask blend +HISTORY_MSG_876;Local - Wavelet mask smooth +HISTORY_MSG_877;Local - Wavelet mask chroma +HISTORY_MSG_878;Local - Wavelet mask contrast curve +HISTORY_MSG_879;Local - Wavelet contrast chroma +HISTORY_MSG_880;Local - Wavelet blur chroma +HISTORY_MSG_881;Local - Wavelet contrast offset +HISTORY_MSG_882;Local - Wavelet blur +HISTORY_MSG_883;Local - Wavelet contrast by level +HISTORY_MSG_884;Local - Wavelet dir contrast +HISTORY_MSG_885;Local - Wavelet tone mapping +HISTORY_MSG_886;Local - Wavelet tone mapping compress +HISTORY_MSG_887;Local - Wavelet tone mapping compress residual HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle From 7fd5707061fb940d3586831b7d10d5d0313c4b2b Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 2 Nov 2020 13:54:34 +0100 Subject: [PATCH 184/185] Local adjustments - Log encoding - addition of ciecam processes (#5973) * First LA log encoding ciecam * Some changes hide show and tooltip * Change label - tooltip * Change max slider shadow * Fixed bad behavior cat02 adaptation in some cases * Another fix Cat02 GUI * LA log encode add ciecam saturation * LA log encoding - added contrast J ciecam * LA Log encode various changes GUI labels tooltips * Change 2 tooltips * Clean code --- rtdata/languages/default | 29 +++- rtengine/improccoordinator.cc | 9 +- rtengine/improcfun.h | 4 +- rtengine/iplocallab.cc | 249 ++++++++++++++++++++++++++++++---- rtengine/procevents.h | 6 + rtengine/procparams.cc | 24 ++++ rtengine/procparams.h | 6 + rtengine/refreshmap.cc | 8 +- rtengine/rtengine.h | 2 +- rtgui/locallab.cc | 4 +- rtgui/locallab.h | 2 +- rtgui/locallabtools.h | 18 ++- rtgui/locallabtools2.cc | 230 +++++++++++++++++++++++++++++-- rtgui/paramsedited.cc | 42 ++++++ rtgui/paramsedited.h | 6 + 15 files changed, 584 insertions(+), 55 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index f0c4a64ac..656ade3cb 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1118,7 +1118,6 @@ HISTORY_MSG_864;Local - Wavelet dir contrast attenuation HISTORY_MSG_865;Local - Wavelet dir contrast delta HISTORY_MSG_866;Local - Wavelet dir compression HISTORY_MSG_869;Local - Denoise by level - HISTORY_MSG_870;Local - Wavelet mask curve H HISTORY_MSG_871;Local - Wavelet mask curve C HISTORY_MSG_872;Local - Wavelet mask curve L @@ -1204,9 +1203,15 @@ HISTORY_MSG_954;Local - Show-hide tools HISTORY_MSG_955;Local - Enable Spot HISTORY_MSG_956;Local - CH Curve HISTORY_MSG_957;Local - Denoise mode -HISTORY_MSG_958;Local - Show/hide settings HISTORY_MSG_959;Local - Inverse blur +HISTORY_MSG_958;Local - Show/hide settings HISTORY_MSG_960;Local - Log encoding - cat02 +HISTORY_MSG_961;Local - Log encoding Ciecam +HISTORY_MSG_962;Local - Log encoding Absolute luminance source +HISTORY_MSG_963;Local - Log encoding Absolute luminance target +HISTORY_MSG_964;Local - Log encoding Surround +HISTORY_MSG_965;Local - Log encoding Saturation s +HISTORY_MSG_966;Local - Log encoding Contrast J HISTORY_MSG_BLSHAPE;Blur by level HISTORY_MSG_BLURCWAV;Blur chroma HISTORY_MSG_BLURWAV;Blur luminance @@ -2446,6 +2451,9 @@ TP_LOCALLAB_CHROMASKCOL;Chroma TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). TP_LOCALLAB_CHROMASK_TOOLTIP;You can use this slider to desaturated background (inverse mask - curve near 0).\nAlso to attenuate or enhance the action of a mask on the chroma TP_LOCALLAB_CHRRT;Chroma +TP_LOCALLAB_CIEC;Use Ciecam environment parameters +//TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM02 color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nOnly the third Ciecam process (Viewing conditions - Target) is taken into account, as well as part of the second (contrast J, saturation s) , as well as some data from the first process (Scene conditions - Source) which is used for the Log encoding.\nIt also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM02 color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of the shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. TP_LOCALLAB_CIRCRADIUS;Spot size TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for treating foliage.\nHigh values may be useful for treating skin TP_LOCALLAB_CLARICRES;Merge chroma @@ -2473,6 +2481,7 @@ TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping TP_LOCALLAB_COMPRESS_TOOLTIP;Use if necessary the module 'Clarity & Sharp mask and Blend & Soften Images' by adjusting 'Soft radius' to reduce artifacts. TP_LOCALLAB_CONTCOL;Contrast threshold TP_LOCALLAB_CONTFRA;Contrast by level +TP_LOCALLAB_CONTL;Contrast (J) TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. TP_LOCALLAB_CONTRAST;Contrast TP_LOCALLAB_CONTRASTCURVMASK1_TOOLTIP;Allows you to freely modify the contrast of the mask (gamma & slope), instead of using a continuous & progressive curve. However it can create artifacts that have to be dealt with using the “Smooth radius” or “Laplacian threshold sliders”. @@ -2667,15 +2676,23 @@ TP_LOCALLAB_LOGAUTO;Automatic TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and Source Gray Point (if "Automatic Source Gray Point” enabled).\nPress the button again to adjust the automatically calculated values. TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of Dynamic Range i.e. Black Ev and White Ev +TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM02 takes into account the increase in perceived coloration with luminance. +TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +TP_LOCALLAB_LOGCATAD_TOOLTIP;The chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance is far from reference D50.\nAdapts colors to the illuminant of the output device. TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process : 1) Dynamic Range calculation 2) Manual adjustment -TP_LOCALLAB_LOGFRA;Source -TP_LOCALLAB_LOG2FRA;Target -TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the Source Gray Point for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\n Takes into account exposure compensation in the main-menu Exposure tab. +TP_LOCALLAB_LOGFRA;Scene Conditions +TP_LOCALLAB_LOG1FRA;Image Adjustments +TP_LOCALLAB_LOG2FRA;Viewing Conditions +TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the Source Gray Point for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nTakes into account exposure compensation in the main-menu Exposure tab.\nAlso calculates the absolute luminance at the time of the shooting. +TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables (mainly Contrast 'J' and Saturation 's'). TP_LOCALLAB_LOGLIN;Logarithm mode TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM02 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium and highlights tones +TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estimated gray point value of the image. TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can adjust this value to suit. TP_LOCALLAB_LOG_TOOLNAME;Log Encoding - 0 +TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer,..), as well as its environment. TP_LOCALLAB_LUM;Curves LL - CC TP_LOCALLAB_LUMADARKEST;Darkest TP_LOCALLAB_LUMASK;Background color for luminance and color masks @@ -2815,6 +2832,7 @@ TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted TP_LOCALLAB_ROW_NVIS;Not visible TP_LOCALLAB_ROW_VIS;Visible TP_LOCALLAB_SATUR;Saturation +TP_LOCALLAB_SATURV;Saturation (s) TP_LOCALLAB_SAVREST;Save - Restore Current Image TP_LOCALLAB_SCALEGR;Scale TP_LOCALLAB_SCALERETI;Scale @@ -2892,6 +2910,7 @@ TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts TP_LOCALLAB_SOFTRETI_TOOLTIP;Take into account deltaE to improve Transmission map TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6 +TP_LOCALLAB_SOURCE_ABS;Absolute luminance TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) TP_LOCALLAB_SPECCASE;Specific cases TP_LOCALLAB_SPECIAL;Special use of RGB curves diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index f9c4b786c..a564676ef 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -745,6 +745,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) float *sourceg = nullptr; sourceg = new float[sizespot]; + float *sourceab = nullptr; + sourceab = new float[sizespot]; float *targetg = nullptr; targetg = new float[sizespot]; bool *log = nullptr; @@ -777,6 +779,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) blackev[sp] = params->locallab.spots.at(sp).blackEv; whiteev[sp] = params->locallab.spots.at(sp).whiteEv; sourceg[sp] = params->locallab.spots.at(sp).sourceGray; + sourceab[sp] = params->locallab.spots.at(sp).sourceabs; Autogr[sp] = params->locallab.spots.at(sp).Autogray; targetg[sp] = params->locallab.spots.at(sp).targetGray; locx[sp] = params->locallab.spots.at(sp).loc.at(0) / 2000.0; @@ -806,14 +809,15 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) xend = 1.f; } - ipf.getAutoLogloc(sp, imgsrc, sourceg, blackev, whiteev, Autogr, fw, fh, xsta, xend, ysta, yend, SCALE); + ipf.getAutoLogloc(sp, imgsrc, sourceg, blackev, whiteev, Autogr, sourceab, fw, fh, xsta, xend, ysta, yend, SCALE); params->locallab.spots.at(sp).blackEv = blackev[sp]; params->locallab.spots.at(sp).whiteEv = whiteev[sp]; params->locallab.spots.at(sp).sourceGray = sourceg[sp]; + params->locallab.spots.at(sp).sourceabs = sourceab[sp]; if (locallListener) { - locallListener->logencodChanged(blackev[sp], whiteev[sp], sourceg[sp], targetg[sp]); + locallListener->logencodChanged(blackev[sp], whiteev[sp], sourceg[sp], sourceab[sp], targetg[sp]); } } } @@ -829,6 +833,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) delete [] whiteev; delete [] blackev; delete [] targetg; + delete [] sourceab; delete [] sourceg; delete [] log; delete [] autocomput; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index a237e7c82..3f0d2c0e4 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -175,7 +175,7 @@ public: void moyeqt(Imagefloat* working, float &moyS, float &eqty); void luminanceCurve(LabImage* lold, LabImage* lnew, const LUTf &curve); - void ciecamloc_02float(int sp, LabImage* lab); + void ciecamloc_02float(int sp, LabImage* lab, int call); void ciecam_02float(CieImage* ncie, float adap, int pW, int pwb, LabImage* lab, const procparams::ProcParams* params, const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3, @@ -264,7 +264,7 @@ public: //3 functions from Alberto Griggio, adapted J.Desmis 2019 void filmGrain(Imagefloat *rgb, int isogr, int strengr, int scalegr, int bfw, int bfh); void log_encode(Imagefloat *rgb, struct local_params & lp, bool multiThread, int bfw, int bfh); - void getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, float *blackev, float *whiteev, bool *Autogr, int fw, int fh, float xsta, float xend, float ysta, float yend, int SCALE); + void getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, float *blackev, float *whiteev, bool *Autogr, float *sourceab, int fw, int fh, float xsta, float xend, float ysta, float yend, int SCALE); void MSRLocal(int call, int sp, bool fftw, int lum, float** reducDE, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, float** luminance, const float* const *originalLuminance, const int width, const int height, int bfwr, int bfhr, const procparams::LocallabParams &loc, const int skip, const LocretigainCurve &locRETgainCcurve, const LocretitransCurve &locRETtransCcurve, diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc index 53d37ecad..a6e46b53a 100644 --- a/rtengine/iplocallab.cc +++ b/rtengine/iplocallab.cc @@ -36,7 +36,6 @@ #include "rt_algo.h" #include "settings.h" #include "../rtgui/options.h" - #include "utils.h" #ifdef _OPENMP #include @@ -1576,7 +1575,8 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool dynamic_range = 0.5f; } const float noise = pow_F(2.f, -16.f); - const float log2 = xlogf(lp.baselog); + // const float log2 = xlogf(lp.baselog); + const float log2 = xlogf(2.f); const float base = lp.targetgray > 1 && lp.targetgray < 100 && dynamic_range > 0 ? find_gray(std::abs(lp.blackev) / dynamic_range, lp.targetgray / 100.f) : 0.f; const float linbase = rtengine::max(base, 0.f); TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); @@ -1731,7 +1731,7 @@ void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool } } -void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, float *blackev, float *whiteev, bool *Autogr, int fw, int fh, float xsta, float xend, float ysta, float yend, int SCALE) +void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, float *blackev, float *whiteev, bool *Autogr, float *sourceab, int fw, int fh, float xsta, float xend, float ysta, float yend, int SCALE) { //BENCHFUN //adpatation to local adjustments Jacques Desmis 12 2019 @@ -1837,10 +1837,41 @@ void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, } } } - const float gray = sourceg[sp] / 100.f; whiteev[sp] = xlogf(maxVal / gray) / log2; blackev[sp] = whiteev[sp] - dynamic_range; + + + //calculate La - Absolute luminance shooting + + const FramesMetaData* metaData = imgsrc->getMetaData(); + int imgNum = 0; + + if (imgsrc->isRAW()) { + if (imgsrc->getSensorType() == ST_BAYER) { + imgNum = rtengine::LIM(params->raw.bayersensor.imageNum, 0, metaData->getFrameCount() - 1); + } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) { + //imgNum = rtengine::LIM(params->raw.xtranssensor.imageNum, 0, metaData->getFrameCount() - 1); + } + } + + float fnum = metaData->getFNumber(imgNum); // F number + float fiso = metaData->getISOSpeed(imgNum) ; // ISO + float fspeed = metaData->getShutterSpeed(imgNum) ; // Speed + double fcomp = metaData->getExpComp(imgNum); // Compensation +/- + double adap; + + if (fnum < 0.3f || fiso < 5.f || fspeed < 0.00001f) { //if no exif data or wrong + adap = 2000.; + } else { + double E_V = fcomp + std::log2(double ((fnum * fnum) / fspeed / (fiso / 100.f))); + E_V += params->toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV + E_V += std::log2(params->raw.expos); // exposure raw white point ; log2 ==> linear to EV + adap = pow(2.0, E_V - 3.0); // cd / m2 + // end calculation adaptation scene luminosity + } + + sourceab[sp] = adap; } } @@ -2072,11 +2103,13 @@ void tone_eq(array2D &R, array2D &G, array2D &B, const str } -void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab) +void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab, int call) { - //be careful quasi duplicate with branch cat02wb //BENCHFUN - + bool ciec = false; + if (params->locallab.spots.at(sp).ciecam && params->locallab.spots.at(sp).explog && call == 1) { + ciec = true; + } int width = lab->W, height = lab->H; float Yw; Yw = 1.0f; @@ -2088,18 +2121,119 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab) double Xwout, Zwout; double Xwsc, Zwsc; - int tempo = 5000; + LUTu hist16J; + //for J light and contrast + LUTf CAMBrightCurveJ; + CAMBrightCurveJ(32768, LUT_CLIP_ABOVE); + CAMBrightCurveJ.dirty = true; - if (params->locallab.spots.at(sp).warm > 0) { - tempo = 5000 - 30 * params->locallab.spots.at(sp).warm; - } else if (params->locallab.spots.at(sp).warm < 0){ - tempo = 5000 - 49 * params->locallab.spots.at(sp).warm; + if (CAMBrightCurveJ.dirty) { + hist16J(32768); + hist16J.clear(); + + double sum = 0.0; // use double precision for large summations + +#ifdef _OPENMP + const int numThreads = min(max(width * height / 65536, 1), omp_get_max_threads()); + #pragma omp parallel num_threads(numThreads) if(numThreads>1) +#endif + { + LUTu hist16Jthr; + hist16Jthr(hist16J.getSize()); + hist16Jthr.clear(); + +#ifdef _OPENMP + #pragma omp for reduction(+:sum) +#endif + + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { //rough correspondence between L and J + float currL = lab->L[i][j] / 327.68f; + float koef; //rough correspondence between L and J + + if (currL > 50.f) { + if (currL > 70.f) { + if (currL > 80.f) { + if (currL > 85.f) { + koef = 0.97f; + } else { + koef = 0.93f; + } + } else { + koef = 0.87f; + } + } else { + if (currL > 60.f) { + koef = 0.85f; + } else { + koef = 0.8f; + } + } + } else { + if (currL > 10.f) { + if (currL > 20.f) { + if (currL > 40.f) { + koef = 0.75f; + } else { + koef = 0.7f; + } + } else { + koef = 0.9f; + } + } else { + koef = 1.0; + } + } + + hist16Jthr[(int)((koef * lab->L[i][j]))]++; //evaluate histogram luminance L # J + sum += static_cast(koef) * static_cast(lab->L[i][j]); //evaluate mean J to calculate Yb + //sum not used, but perhaps... + } + } + +#ifdef _OPENMP + #pragma omp critical +#endif + { + hist16J += hist16Jthr; + } + } +#ifdef _OPENMP + static_cast(numThreads); // to silence cppcheck warning +#endif + + //evaluate lightness, contrast + } + + + + + + float contL = 0.f; + if (ciec) { + contL = 0.6f *params->locallab.spots.at(sp).contl;//0.6 less effect, no need 1. + + if (CAMBrightCurveJ.dirty) { + Ciecam02::curveJfloat(0.f, contL, hist16J, CAMBrightCurveJ); //contrast J + CAMBrightCurveJ /= 327.68f; + CAMBrightCurveJ.dirty = false; + } + } + int tempo = 5000; + if(params->locallab.spots.at(sp).expvibrance && call == 2) { + if (params->locallab.spots.at(sp).warm > 0) { + tempo = 5000 - 30 * params->locallab.spots.at(sp).warm; + } else if (params->locallab.spots.at(sp).warm < 0){ + tempo = 5000 - 70 * params->locallab.spots.at(sp).warm; + } } - if (params->locallab.spots.at(sp).catad > 0) { - tempo = 5000 - 30 * params->locallab.spots.at(sp).catad; - } else if (params->locallab.spots.at(sp).catad < 0){ - tempo = 5000 - 49 * params->locallab.spots.at(sp).catad; + if(ciec) { + if (params->locallab.spots.at(sp).catad > 0) { + tempo = 5000 - 30 * params->locallab.spots.at(sp).catad; + } else if (params->locallab.spots.at(sp).catad < 0){ + tempo = 5000 - 70 * params->locallab.spots.at(sp).catad; + } } @@ -2113,8 +2247,25 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab) nc = 1.00f; //viewing condition for surround f2 = 1.0f, c2 = 0.69f, nc2 = 1.0f; - //with which algorithm - // alg = 0; + if(ciec) { + //viewing condition for surround + if (params->locallab.spots.at(sp).surround == "Average") { + f2 = 1.0f, c2 = 0.69f, nc2 = 1.0f; + } else if (params->locallab.spots.at(sp).surround == "Dim") { + f2 = 0.9f; + c2 = 0.59f; + nc2 = 0.9f; + } else if (params->locallab.spots.at(sp).surround == "Dark") { + f2 = 0.8f; + c2 = 0.525f; + nc2 = 0.8f; + } else if (params->locallab.spots.at(sp).surround == "ExtremelyDark") { + f2 = 0.8f; + c2 = 0.41f; + nc2 = 0.8f; + } + } + xwd = 100.0 * Xwout; @@ -2126,18 +2277,42 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab) yws = 100.f; - yb2 = 18; //La and la2 = ambiant luminosity scene and viewing la = 400.f; - const float la2 = 400.f; + float la2 = 400.f; + if(ciec) { + la = params->locallab.spots.at(sp).sourceabs; + + la2 = params->locallab.spots.at(sp).targabs; + } + const float pilot = 2.f; const float pilotout = 2.f; //algoritm's params - // const float rstprotection = 100. ;//- params->colorappearance.rstprotection; - LUTu hist16J; LUTu hist16Q; float yb = 18.f; + yb2 = 18; + if(ciec) { + yb = params->locallab.spots.at(sp).targetGray;//target because we are after Log encoding + + yb2 = params->locallab.spots.at(sp).targetGray; + } + + float schr = 0.f; + + if (ciec) { + schr = params->locallab.spots.at(sp).saturl; + + if (schr > 0.f) { + schr = schr / 2.f; //divide sensibility for saturation + } + + if (schr == -100.f) { + schr = -99.8f; + } + } + float d, dj; // const int gamu = 0; //(params->colorappearance.gamut) ? 1 : 0; @@ -2145,7 +2320,11 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab) yw = 100.f * Yw; zw = 100.0 * Zw; float xw1 = xws, yw1 = yws, zw1 = zws, xw2 = xwd, yw2 = ywd, zw2 = zwd; - +/* + xw1 = 96.46f; //use RT WB; CAT 02 is used for output device (see prefreneces) + yw1 = 100.0f; + zw1 = 82.445f; +*/ float cz, wh, pfl; Ciecam02::initcam1float(yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c); // const float chr = 0.f; @@ -2156,6 +2335,8 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab) const float reccmcz = 1.f / (c2 * czj); #endif const float pow1n = pow_F(1.64f - pow_F(0.29f, nj), 0.73f); + const float coe = pow_F(fl, 0.25f); + const float QproFactor = (0.4f / c) * (aw + 4.0f) ; #ifdef __SSE2__ int bufferLength = ((width + 3) / 4) * 4; // bufferLength has to be a multiple of 4 @@ -2267,7 +2448,21 @@ void ImProcFunctions::ciecamloc_02float(int sp, LabImage* lab) spro = s; /* */ - + if(ciec) { + Jpro = CAMBrightCurveJ[Jpro * 327.68f]; //CIECAM02 + contrast + float sres; + float rstprotection = 50.f;//arbitrary 50% protection skin tones + float Sp = spro / 100.0f; + float parsat = 1.5f; //parsat=1.5 =>saturation ; 1.8 => chroma ; 2.5 => colorfullness (personal evaluation) + Ciecam02::curvecolorfloat(schr, Sp, sres, parsat); + float dred = 100.f; // in C mode + float protect_red = 80.0f; // in C mode + dred = 100.0f * sqrtf((dred * coe) / Qpro); + protect_red = 100.0f * sqrtf((protect_red * coe) / Qpro); + Color::skinredfloat(Jpro, hpro, sres, Sp, dred, protect_red, 0, rstprotection, 100.f, spro); + Qpro = QproFactor * sqrtf(Jpro); + Cpro = (spro * spro * Qpro) / (10000.0f); + } //retrieve values C,J...s C = Cpro; @@ -9693,8 +9888,8 @@ void ImProcFunctions::Lab_Local( log_encode(tmpImage.get(), lp, multiThread, bfw, bfh); rgb2lab(*(tmpImage.get()), *bufexpfin, params->icm.workingProfile); tmpImage.reset(); - if (params->locallab.spots.at(sp).catad != 0) { - ImProcFunctions::ciecamloc_02float(sp, bufexpfin.get()); + if (params->locallab.spots.at(sp).ciecam) { + ImProcFunctions::ciecamloc_02float(sp, bufexpfin.get(), 1); } //here begin graduated filter @@ -10819,7 +11014,7 @@ void ImProcFunctions::Lab_Local( ImProcFunctions::vibrance(bufexpfin.get(), vibranceParams, params->toneCurve.hrenabled, params->icm.workingProfile); if (params->locallab.spots.at(sp).warm != 0) { - ImProcFunctions::ciecamloc_02float(sp, bufexpfin.get()); + ImProcFunctions::ciecamloc_02float(sp, bufexpfin.get(), 2); } diff --git a/rtengine/procevents.h b/rtengine/procevents.h index b9d815612..22b967ee7 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -983,6 +983,12 @@ enum ProcEventCode { Evlocallabhishow = 957, Evlocallabinvbl = 958, Evlocallabcatad = 959, + Evlocallabciecam = 960, + Evlocallabsourceabs = 961, + Evlocallabtargabs = 962, + Evlocallabsurround = 963, + Evlocallabsaturl = 964, + Evlocallabcontl = 965, NUMOFEVENTS }; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 574123762..7a56248bf 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -3837,14 +3837,20 @@ LocallabParams::LocallabSpot::LocallabSpot() : explog(false), autocompute(false), sourceGray(10.), + sourceabs(2000.), + targabs(16.), targetGray(18.), catad(0.), + saturl(0.), + contl(0.), Autogray(true), fullimage(true), + ciecam(false), blackEv(-5.0), whiteEv(10.0), detail(0.6), sensilog(60), + surround("Average"), baselog(2.), strlog(0.0), anglog(0.0), @@ -4415,15 +4421,21 @@ bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const && explog == other.explog && autocompute == other.autocompute && sourceGray == other.sourceGray + && sourceabs == other.sourceabs + && targabs == other.targabs && targetGray == other.targetGray && catad == other.catad + && saturl == other.saturl + && contl == other.contl && Autogray == other.Autogray && fullimage == other.fullimage + && ciecam == other.ciecam && blackEv == other.blackEv && whiteEv == other.whiteEv && detail == other.detail && sensilog == other.sensilog && baselog == other.baselog + && surround == other.surround && strlog == other.strlog && anglog == other.anglog // mask @@ -5950,15 +5962,21 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || spot_edited->explog, "Locallab", "Explog_" + index_str, spot.explog, keyFile); saveToKeyfile(!pedited || spot_edited->autocompute, "Locallab", "Autocompute_" + index_str, spot.autocompute, keyFile); saveToKeyfile(!pedited || spot_edited->sourceGray, "Locallab", "SourceGray_" + index_str, spot.sourceGray, keyFile); + saveToKeyfile(!pedited || spot_edited->sourceabs, "Locallab", "Sourceabs_" + index_str, spot.sourceabs, keyFile); + saveToKeyfile(!pedited || spot_edited->targabs, "Locallab", "Targabs_" + index_str, spot.targabs, keyFile); saveToKeyfile(!pedited || spot_edited->targetGray, "Locallab", "TargetGray_" + index_str, spot.targetGray, keyFile); saveToKeyfile(!pedited || spot_edited->catad, "Locallab", "Catad_" + index_str, spot.catad, keyFile); + saveToKeyfile(!pedited || spot_edited->saturl, "Locallab", "Saturl_" + index_str, spot.saturl, keyFile); + saveToKeyfile(!pedited || spot_edited->contl, "Locallab", "Contl_" + index_str, spot.contl, keyFile); saveToKeyfile(!pedited || spot_edited->Autogray, "Locallab", "Autogray_" + index_str, spot.Autogray, keyFile); saveToKeyfile(!pedited || spot_edited->fullimage, "Locallab", "Fullimage_" + index_str, spot.fullimage, keyFile); + saveToKeyfile(!pedited || spot_edited->ciecam, "Locallab", "Ciecam_" + index_str, spot.ciecam, keyFile); saveToKeyfile(!pedited || spot_edited->blackEv, "Locallab", "BlackEv_" + index_str, spot.blackEv, keyFile); saveToKeyfile(!pedited || spot_edited->whiteEv, "Locallab", "WhiteEv_" + index_str, spot.whiteEv, keyFile); saveToKeyfile(!pedited || spot_edited->detail, "Locallab", "Detail_" + index_str, spot.detail, keyFile); saveToKeyfile(!pedited || spot_edited->sensilog, "Locallab", "Sensilog_" + index_str, spot.sensilog, keyFile); saveToKeyfile(!pedited || spot_edited->baselog, "Locallab", "Baselog_" + index_str, spot.baselog, keyFile); + saveToKeyfile(!pedited || spot_edited->surround, "Locallab", "Surround_" + index_str, spot.surround, keyFile); saveToKeyfile(!pedited || spot_edited->strlog, "Locallab", "Strlog_" + index_str, spot.strlog, keyFile); saveToKeyfile(!pedited || spot_edited->anglog, "Locallab", "Anglog_" + index_str, spot.anglog, keyFile); } @@ -7727,15 +7745,21 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Locallab", "Autocompute_" + index_str, pedited, spot.autocompute, spotEdited.autocompute); assignFromKeyfile(keyFile, "Locallab", "SourceGray_" + index_str, pedited, spot.sourceGray, spotEdited.sourceGray); + assignFromKeyfile(keyFile, "Locallab", "Sourceabs_" + index_str, pedited, spot.sourceabs, spotEdited.sourceabs); + assignFromKeyfile(keyFile, "Locallab", "Targabs_" + index_str, pedited, spot.targabs, spotEdited.targabs); assignFromKeyfile(keyFile, "Locallab", "TargetGray_" + index_str, pedited, spot.targetGray, spotEdited.targetGray); assignFromKeyfile(keyFile, "Locallab", "Catad_" + index_str, pedited, spot.catad, spotEdited.catad); + assignFromKeyfile(keyFile, "Locallab", "Saturl_" + index_str, pedited, spot.saturl, spotEdited.saturl); + assignFromKeyfile(keyFile, "Locallab", "Contl_" + index_str, pedited, spot.contl, spotEdited.contl); assignFromKeyfile(keyFile, "Locallab", "AutoGray_" + index_str, pedited, spot.Autogray, spotEdited.Autogray); assignFromKeyfile(keyFile, "Locallab", "Fullimage_" + index_str, pedited, spot.fullimage, spotEdited.fullimage); + assignFromKeyfile(keyFile, "Locallab", "Ciecam_" + index_str, pedited, spot.ciecam, spotEdited.ciecam); assignFromKeyfile(keyFile, "Locallab", "BlackEv_" + index_str, pedited, spot.blackEv, spotEdited.blackEv); assignFromKeyfile(keyFile, "Locallab", "WhiteEv_" + index_str, pedited, spot.whiteEv, spotEdited.whiteEv); assignFromKeyfile(keyFile, "Locallab", "Detail_" + index_str, pedited, spot.detail, spotEdited.detail); assignFromKeyfile(keyFile, "Locallab", "Sensilog_" + index_str, pedited, spot.sensilog, spotEdited.sensilog); assignFromKeyfile(keyFile, "Locallab", "Baselog_" + index_str, pedited, spot.baselog, spotEdited.baselog); + assignFromKeyfile(keyFile, "Locallab", "Surround_" + index_str, pedited, spot.surround, spotEdited.surround); assignFromKeyfile(keyFile, "Locallab", "Strlog_" + index_str, pedited, spot.strlog, spotEdited.strlog); assignFromKeyfile(keyFile, "Locallab", "Anglog_" + index_str, pedited, spot.anglog, spotEdited.anglog); // mask diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 53a008a29..1ba0f5e80 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1424,14 +1424,20 @@ struct LocallabParams { bool explog; bool autocompute; double sourceGray; + double sourceabs; + double targabs; double targetGray; double catad; + double saturl; + double contl; bool Autogray; bool fullimage; + bool ciecam; double blackEv; double whiteEv; double detail; int sensilog; + Glib::ustring surround; double baselog; double strlog; double anglog; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 6daf01621..593e5b9c9 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -986,7 +986,13 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, //EvlocallabquaMethod LUMINANCECURVE, //Evlocallabhishow LUMINANCECURVE, // Evlocallabinvbl - LUMINANCECURVE // Evlocallabcatad + LUMINANCECURVE, // Evlocallabcatad + LUMINANCECURVE, // Evlocallabciecam + LUMINANCECURVE, // Evlocallabsourceabs + LUMINANCECURVE, // Evlocallabtargabs + LUMINANCECURVE, // Evlocallabsurround + LUMINANCECURVE, // Evlocallabsaturl + LUMINANCECURVE // Evlocallabcontl }; diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 6f6baccd4..74214737e 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -439,7 +439,7 @@ public: virtual ~LocallabListener() = default; virtual void refChanged(const std::vector &ref, int selspot) = 0; virtual void minmaxChanged(const std::vector &minmax, int selspot) = 0; - virtual void logencodChanged(const float blackev, const float whiteev, const float sourceg, const float targetg) = 0; + virtual void logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg) = 0; }; class AutoColorTonListener diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 1710a060f..5ca46bc99 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -1017,10 +1017,10 @@ void Locallab::minmaxChanged(const std::vector &minmax, int } } -void Locallab::logencodChanged(const float blackev, const float whiteev, const float sourceg, const float targetg) +void Locallab::logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg) { // Update Locallab Log Encoding accordingly - explog->updateAutocompute(blackev, whiteev, sourceg, targetg); + explog->updateAutocompute(blackev, whiteev, sourceg, sourceab, targetg); } void Locallab::refChanged(const std::vector &ref, int selspot) diff --git a/rtgui/locallab.h b/rtgui/locallab.h index 44e408d49..a6491ebd6 100644 --- a/rtgui/locallab.h +++ b/rtgui/locallab.h @@ -141,7 +141,7 @@ public: void minmaxChanged(const std::vector &minmax, int selspot) override; // Locallab Log Encoding autocompute function - void logencodChanged(const float blackev, const float whiteev, const float sourceg, const float targetg) override; + void logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg) override; // Locallab tools mask background management function void refChanged(const std::vector &ref, int selspot) override; diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h index ff4062f0f..ff8d6e6f6 100644 --- a/rtgui/locallabtools.h +++ b/rtgui/locallabtools.h @@ -1190,27 +1190,39 @@ class LocallabLog: public LocallabTool { private: + Gtk::CheckButton* const ciecam; Gtk::ToggleButton* const autocompute; Gtk::Frame* const logPFrame; Adjuster* const blackEv; Adjuster* const whiteEv; Gtk::CheckButton* const fullimage; + Gtk::Frame* const logFrame; Gtk::CheckButton* const Autogray; Adjuster* const sourceGray; + Adjuster* const sourceabs; + Gtk::Frame* const log1Frame; Gtk::Frame* const log2Frame; Adjuster* const targetGray; Adjuster* const detail; Adjuster* const catad; + Adjuster* const contl; + Adjuster* const saturl; + Adjuster* const targabs; + MyComboBoxText* const surround; + Gtk::HBox* const surrHBox; + Adjuster* const baselog; Adjuster* const sensilog; Adjuster* const strlog; Adjuster* const anglog; - sigc::connection autoconn, fullimageConn, AutograyConn; + sigc::connection autoconn, ciecamconn, fullimageConn, AutograyConn; + sigc::connection surroundconn; public: LocallabLog(); void updateAdviceTooltips(const bool showTooltips) override; + void surroundChanged(); void disableListener() override; void enableListener() override; @@ -1219,7 +1231,7 @@ public: void setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; void adjusterChanged(Adjuster* a, double newval) override; - void updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float targetg); + void updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg); private: void enabledChanged() override; @@ -1227,8 +1239,10 @@ private: void autocomputeToggled(); void fullimageChanged(); void AutograyChanged(); + void ciecamChanged(); void updateLogGUI(); + void updateLogGUI2(); }; diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc index 67917c700..a87e35786 100644 --- a/rtgui/locallabtools2.cc +++ b/rtgui/locallabtools2.cc @@ -4652,18 +4652,28 @@ LocallabLog::LocallabLog(): LocallabTool(this, M("TP_LOCALLAB_LOG_TOOLNAME"), M("TP_LOCALLAB_LOG"), false, false), // Log encoding specific widgets + ciecam(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_CIEC")))), autocompute(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_LOGAUTO")))), logPFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGPFRA")))), blackEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLACK_EV"), -16.0, 0.0, 0.1, -5.0))), whiteEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 0., 32.0, 0.1, 10.0))), fullimage(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FULLIMAGE")))), + logFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGFRA")))), Autogray(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AUTOGRAY")))), sourceGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_GRAY"), 1.0, 100.0, 0.1, 10.0))), + sourceabs(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_ABS"), 0.01, 16384.0, 0.01, 2000.0))), + log1Frame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOG1FRA")))), log2Frame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOG2FRA")))), targetGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TARGET_GRAY"), 5.0, 80.0, 0.1, 18.0))), detail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0., 1., 0.01, 0.6))), - catad(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CATAD"), -100., 100., 0.5, 0.))), - baselog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BASELOG"), 1.3, 8., 0.05, 2., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + catad(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CATAD"), -100., 100., 0.5, 0., Gtk::manage(new RTImage("circle-blue-small.png")), Gtk::manage(new RTImage("circle-orange-small.png"))))), + contl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CONTL"), -100., 100., 0.5, 0.))), + saturl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SATURV"), -100., 100., 0.5, 0.))), + targabs(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_ABS"), 0.01, 16384.0, 0.01, 16.0))), + surround(Gtk::manage (new MyComboBoxText ())), + surrHBox(Gtk::manage(new Gtk::HBox())), + + baselog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BASELOG"), 1.3, 3., 0.05, 2., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), sensilog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), strlog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -2.0, 2.0, 0.05, 0.))), anglog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))) @@ -4676,6 +4686,7 @@ LocallabLog::LocallabLog(): whiteEv->setLogScale(16, 0); whiteEv->setAdjusterListener(this); + ciecamconn = ciecam->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::ciecamChanged)); fullimageConn = fullimage->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::fullimageChanged)); @@ -4683,12 +4694,24 @@ LocallabLog::LocallabLog(): sourceGray->setAdjusterListener(this); + sourceabs->setLogScale(500, 0); + + sourceabs->setAdjusterListener(this); + targetGray->setAdjusterListener(this); detail->setAdjusterListener(this); catad->setAdjusterListener(this); + saturl->setAdjusterListener(this); + + contl->setAdjusterListener(this); + + targabs->setLogScale(500, 0); + + targabs->setAdjusterListener(this); + baselog->setAdjusterListener(this); sensilog->setAdjusterListener(this); @@ -4697,7 +4720,21 @@ LocallabLog::LocallabLog(): anglog->setAdjusterListener(this); +// Gtk::HBox* surrHBox = Gtk::manage (new Gtk::HBox ()); + surrHBox->set_spacing (2); + surrHBox->set_tooltip_markup (M ("TP_COLORAPP_SURROUND_TOOLTIP")); + Gtk::Label* surrLabel = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_SURROUND") + ":")); + surrHBox->pack_start (*surrLabel, Gtk::PACK_SHRINK); + surround->append (M ("TP_COLORAPP_SURROUND_AVER")); + surround->append (M ("TP_COLORAPP_SURROUND_DIM")); + surround->append (M ("TP_COLORAPP_SURROUND_DARK")); + surround->append (M ("TP_COLORAPP_SURROUND_EXDARK")); + surround->set_active (0); + surrHBox->pack_start (*surround); + surroundconn = surround->signal_changed().connect ( sigc::mem_fun (*this, &LocallabLog::surroundChanged) ); + // Add Log encoding specific widgets to GUI + pack_start(*ciecam); logPFrame->set_label_align(0.025, 0.5); ToolParamBlock* const logPBox = Gtk::manage(new ToolParamBlock()); logPBox->pack_start(*autocompute); @@ -4706,19 +4743,28 @@ LocallabLog::LocallabLog(): logPBox->pack_start(*fullimage); logPFrame->add(*logPBox); pack_start(*logPFrame); - Gtk::Frame* const logFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGFRA"))); +// Gtk::Frame* const logFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGFRA"))); logFrame->set_label_align(0.025, 0.5); ToolParamBlock* const logFBox = Gtk::manage(new ToolParamBlock()); logFBox->pack_start(*Autogray); logFBox->pack_start(*sourceGray); - logFBox->pack_start(*baselog); + logFBox->pack_start(*sourceabs); +// logFBox->pack_start(*baselog); logFrame->add(*logFBox); pack_start(*logFrame); - log2Frame->set_label_align(0.025, 0.5); + log1Frame->set_label_align(0.025, 0.5); + ToolParamBlock* const logP1Box = Gtk::manage(new ToolParamBlock()); + logP1Box->pack_start(*detail); + logP1Box->pack_start(*contl); + logP1Box->pack_start(*saturl); + log1Frame->add(*logP1Box); + pack_start(*log1Frame); + log2Frame->set_label_align(0.025, 0.5); ToolParamBlock* const logP2Box = Gtk::manage(new ToolParamBlock()); logP2Box->pack_start(*targetGray); - logP2Box->pack_start(*detail); + logP2Box->pack_start(*targabs); logP2Box->pack_start(*catad); + logP2Box->pack_start (*surrHBox); log2Frame->add(*logP2Box); pack_start(*log2Frame); // pack_start(*baselog); @@ -4737,31 +4783,44 @@ void LocallabLog::updateAdviceTooltips(const bool showTooltips) if (showTooltips) { exp->set_tooltip_text(M("TP_LOCALLAB_LOGENCOD_TOOLTIP")); logPFrame->set_tooltip_text(M("TP_LOCALLAB_LOGFRAME_TOOLTIP")); + logFrame->set_tooltip_text(M("TP_LOCALLAB_LOGSCENE_TOOLTIP")); + log1Frame->set_tooltip_text(M("TP_LOCALLAB_LOGIMAGE_TOOLTIP")); + log2Frame->set_tooltip_text(M("TP_LOCALLAB_LOGVIEWING_TOOLTIP")); autocompute->set_tooltip_text(M("TP_LOCALLAB_LOGAUTO_TOOLTIP")); // blackEv->set_tooltip_text(M("TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP")); // whiteEv->set_tooltip_text(M("TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP")); blackEv->set_tooltip_text(""); whiteEv->set_tooltip_text(""); sourceGray->set_tooltip_text(""); - targetGray->set_tooltip_text(M("TP_LOCALLAB_LOGTARGGREY_TOOLTIP")); + sourceabs->set_tooltip_text(M("TP_COLORAPP_ADAPSCEN_TOOLTIP")); + targabs->set_tooltip_text(M("TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP")); + targetGray->set_tooltip_text(M("TP_COLORAPP_YBOUT_TOOLTIP")); baselog->set_tooltip_text(M("TP_LOCALLAB_LOGBASE_TOOLTIP")); strlog->set_tooltip_text(M("TP_LOCALLAB_GRADGEN_TOOLTIP")); anglog->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); - + contl->set_tooltip_text(M("TP_LOCALLAB_LOGCONTL_TOOLTIP")); + saturl->set_tooltip_text(M("TP_LOCALLAB_LOGSATURL_TOOLTIP")); + detail->set_tooltip_text(M("TP_LOCALLAB_LOGDETAIL_TOOLTIP")); + catad->set_tooltip_text(M("TP_LOCALLAB_LOGCATAD_TOOLTIP")); // detail->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); // Autogray->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); // sensilog->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); - detail->set_tooltip_text(""); Autogray->set_tooltip_text(""); sensilog->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); fullimage->set_tooltip_text(M("TP_LOCALLAB_FULLIMAGELOG_TOOLTIP")); + ciecam->set_tooltip_text(M("TP_LOCALLAB_CIECAMLOG_TOOLTIP")); } else { exp->set_tooltip_text(""); logPFrame->set_tooltip_text(""); + logFrame->set_tooltip_text(""); + log1Frame->set_tooltip_text(""); + log2Frame->set_tooltip_text(""); autocompute->set_tooltip_text(""); blackEv->set_tooltip_text(""); whiteEv->set_tooltip_text(""); sourceGray->set_tooltip_text(""); + sourceabs->set_tooltip_text(""); + targabs->set_tooltip_text(""); targetGray->set_tooltip_text(""); baselog->set_tooltip_text(""); strlog->set_tooltip_text(""); @@ -4770,7 +4829,10 @@ void LocallabLog::updateAdviceTooltips(const bool showTooltips) Autogray->set_tooltip_text(""); sensilog->set_tooltip_text(""); fullimage->set_tooltip_text(""); - + ciecam->set_tooltip_text(""); + contl->set_tooltip_text(""); + saturl->set_tooltip_text(""); + catad->set_tooltip_text(""); } } @@ -4780,6 +4842,8 @@ void LocallabLog::disableListener() autoconn.block(true); fullimageConn.block(true); + ciecamconn.block(true); + surroundconn.block (true); AutograyConn.block(true); } @@ -4789,6 +4853,8 @@ void LocallabLog::enableListener() autoconn.block(false); fullimageConn.block(false); + ciecamconn.block(false); + surroundconn.block (false); AutograyConn.block(false); } @@ -4816,9 +4882,25 @@ void LocallabLog::read(const rtengine::procparams::ProcParams* pp, const ParamsE whiteEv->setValue(1.5); } */ + if (spot.surround == "Average") { + surround->set_active (0); + } else if (spot.surround == "Dim") { + surround->set_active (1); + } else if (spot.surround == "Dark") { + surround->set_active (2); + } else if (spot.surround == "ExtremelyDark") { + surround->set_active (3); + } + + ciecam->set_active(spot.ciecam); fullimage->set_active(spot.fullimage); Autogray->set_active(spot.Autogray); sourceGray->setValue(spot.sourceGray); + sourceabs->setValue(spot.sourceabs); + catad->setValue(spot.catad); + saturl->setValue(spot.saturl); + contl->setValue(spot.contl); + targabs->setValue(spot.targabs); targetGray->setValue(spot.targetGray); detail->setValue(spot.detail); baselog->setValue(spot.baselog); @@ -4832,6 +4914,7 @@ void LocallabLog::read(const rtengine::procparams::ProcParams* pp, const ParamsE // Update Log Encoding GUI according to autocompute button state updateLogGUI(); + updateLogGUI2(); // Note: No need to manage pedited as batch mode is deactivated for Locallab } @@ -4850,15 +4933,32 @@ void LocallabLog::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedi spot.blackEv = blackEv->getValue(); spot.whiteEv = whiteEv->getValue(); spot.fullimage = fullimage->get_active(); + spot.ciecam = ciecam->get_active(); spot.Autogray = Autogray->get_active(); spot.sourceGray = sourceGray->getValue(); + spot.sourceabs = sourceabs->getValue(); + spot.targabs = targabs->getValue(); spot.targetGray = targetGray->getValue(); spot.catad = catad->getValue(); + spot.saturl = saturl->getValue(); + spot.contl = contl->getValue(); spot.detail = detail->getValue(); spot.baselog = baselog->getValue(); spot.sensilog = sensilog->getIntValue(); spot.strlog = strlog->getValue(); spot.anglog = anglog->getValue(); + + + if (surround->get_active_row_number() == 0) { + spot.surround = "Average"; + } else if (surround->get_active_row_number() == 1) { + spot.surround = "Dim"; + } else if (surround->get_active_row_number() == 2) { + spot.surround = "Dark"; + } else if (surround->get_active_row_number() == 3) { + spot.surround = "ExtremelyDark"; + } + } // Note: No need to manage pedited as batch mode is deactivated for Locallab @@ -4875,8 +4975,12 @@ void LocallabLog::setDefaults(const rtengine::procparams::ProcParams* defParams, blackEv->setDefault(defSpot.blackEv); whiteEv->setDefault(defSpot.whiteEv); sourceGray->setDefault(defSpot.sourceGray); + sourceabs->setDefault(defSpot.sourceabs); + targabs->setDefault(defSpot.targabs); targetGray->setDefault(defSpot.targetGray); catad->setDefault(defSpot.catad); + saturl->setDefault(defSpot.saturl); + contl->setDefault(defSpot.contl); detail->setDefault(defSpot.detail); baselog->setDefault(defSpot.baselog); sensilog->setDefault((double)defSpot.sensilog); @@ -4911,6 +5015,20 @@ void LocallabLog::adjusterChanged(Adjuster* a, double newval) } } + if (a == sourceabs) { + if (listener) { + listener->panelChanged(Evlocallabsourceabs, + sourceabs->getTextValue() + " (" + escapeHtmlChars(spotName) + ")"); + } + } + + if (a == targabs) { + if (listener) { + listener->panelChanged(Evlocallabtargabs, + targabs->getTextValue() + " (" + escapeHtmlChars(spotName) + ")"); + } + } + if (a == targetGray) { if (listener) { listener->panelChanged(EvlocallabtargetGray, @@ -4925,6 +5043,20 @@ void LocallabLog::adjusterChanged(Adjuster* a, double newval) } } + if (a == saturl) { + if (listener) { + listener->panelChanged(Evlocallabsaturl, + saturl->getTextValue() + " (" + escapeHtmlChars(spotName) + ")"); + } + } + + if (a == contl) { + if (listener) { + listener->panelChanged(Evlocallabcontl, + contl->getTextValue() + " (" + escapeHtmlChars(spotName) + ")"); + } + } + if (a == detail) { if (listener) { listener->panelChanged(Evlocallabdetail, @@ -4962,10 +5094,10 @@ void LocallabLog::adjusterChanged(Adjuster* a, double newval) } } -void LocallabLog::updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float targetg) +void LocallabLog::updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg) { idle_register.add( - [this, blackev, whiteev, sourceg, targetg]() -> bool { + [this, blackev, whiteev, sourceg, sourceab, targetg]() -> bool { GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected // Update adjuster values according to autocomputed ones @@ -4974,6 +5106,7 @@ void LocallabLog::updateAutocompute(const float blackev, const float whiteev, co blackEv->setValue(blackev); whiteEv->setValue(whiteev); sourceGray->setValue(sourceg); + sourceabs->setValue(sourceab); targetGray->setValue(targetg); enableListener(); @@ -4998,6 +5131,16 @@ void LocallabLog::enabledChanged() } } +void LocallabLog::surroundChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(Evlocallabsurround, + surround->get_active_text() + " (" + escapeHtmlChars(spotName) + ")"); + } + } +} + void LocallabLog::autocomputeToggled() { // Update Log Encoding GUI according to autocompute button state @@ -5016,6 +5159,43 @@ void LocallabLog::autocomputeToggled() } } +void LocallabLog::ciecamChanged() +{ + if(ciecam->get_active()){ + /* sourceabs->set_sensitive(true); + targabs->set_sensitive(true); + catad->set_sensitive(true); + surrHBox->set_sensitive(true); + */ + sourceabs->show(); + targabs->show(); + catad->show(); + saturl->show(); + contl->show(); + surrHBox->show(); + } else { + sourceabs->hide(); + targabs->hide(); + saturl->hide(); + contl->hide(); + catad->hide(); + surrHBox->hide(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (ciecam->get_active()) { + listener->panelChanged(Evlocallabciecam, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(spotName) + ")"); + } else { + listener->panelChanged(Evlocallabciecam, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(spotName) + ")"); + } + } + } +} + + void LocallabLog::fullimageChanged() { if (isLocActivated && exp->getEnabled()) { @@ -5046,16 +5226,42 @@ void LocallabLog::AutograyChanged() } } +void LocallabLog::updateLogGUI2() +{ + if(ciecam->get_active()){ + sourceabs->show(); + targabs->show(); + catad->show(); + saturl->show(); + contl->show(); + surrHBox->show(); + } else { + sourceabs->hide(); + targabs->hide(); + catad->hide(); + saturl->hide(); + contl->hide(); + surrHBox->hide(); + } +} + + void LocallabLog::updateLogGUI() { if (autocompute->get_active()) { blackEv->set_sensitive(false); whiteEv->set_sensitive(false); sourceGray->set_sensitive(false); + sourceabs->set_sensitive(false); } else { blackEv->set_sensitive(true); whiteEv->set_sensitive(true); sourceGray->set_sensitive(true); + if(ciecam->get_active()){ + sourceabs->set_sensitive(true); + } else { + sourceabs->set_sensitive(false); + } } } diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index ae756feeb..fbe9d7315 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1496,13 +1496,19 @@ void ParamsEdited::initFrom(const std::vector& locallab.spots.at(j).explog = locallab.spots.at(j).explog && pSpot.explog == otherSpot.explog; locallab.spots.at(j).autocompute = locallab.spots.at(j).autocompute && pSpot.autocompute == otherSpot.autocompute; locallab.spots.at(j).sourceGray = locallab.spots.at(j).sourceGray && pSpot.sourceGray == otherSpot.sourceGray; + locallab.spots.at(j).sourceabs = locallab.spots.at(j).sourceabs && pSpot.sourceabs == otherSpot.sourceabs; + locallab.spots.at(j).targabs = locallab.spots.at(j).targabs && pSpot.targabs == otherSpot.targabs; locallab.spots.at(j).targetGray = locallab.spots.at(j).targetGray && pSpot.targetGray == otherSpot.targetGray; locallab.spots.at(j).catad = locallab.spots.at(j).catad && pSpot.catad == otherSpot.catad; + locallab.spots.at(j).saturl = locallab.spots.at(j).saturl && pSpot.saturl == otherSpot.saturl; + locallab.spots.at(j).contl = locallab.spots.at(j).contl && pSpot.contl == otherSpot.contl; locallab.spots.at(j).Autogray = locallab.spots.at(j).Autogray && pSpot.Autogray == otherSpot.Autogray; locallab.spots.at(j).fullimage = locallab.spots.at(j).fullimage && pSpot.fullimage == otherSpot.fullimage; + locallab.spots.at(j).ciecam = locallab.spots.at(j).ciecam && pSpot.ciecam == otherSpot.ciecam; locallab.spots.at(j).blackEv = locallab.spots.at(j).blackEv && pSpot.blackEv == otherSpot.blackEv; locallab.spots.at(j).whiteEv = locallab.spots.at(j).whiteEv && pSpot.whiteEv == otherSpot.whiteEv; locallab.spots.at(j).detail = locallab.spots.at(j).detail && pSpot.detail == otherSpot.detail; + locallab.spots.at(j).surround = locallab.spots.at(j).surround && pSpot.surround == otherSpot.surround; locallab.spots.at(j).sensilog = locallab.spots.at(j).sensilog && pSpot.sensilog == otherSpot.sensilog; locallab.spots.at(j).baselog = locallab.spots.at(j).baselog && pSpot.baselog == otherSpot.baselog; locallab.spots.at(j).strlog = locallab.spots.at(j).strlog && pSpot.strlog == otherSpot.strlog; @@ -4852,6 +4858,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).sourceGray = mods.locallab.spots.at(i).sourceGray; } + if (locallab.spots.at(i).sourceabs) { + toEdit.locallab.spots.at(i).sourceabs = mods.locallab.spots.at(i).sourceabs; + } + + if (locallab.spots.at(i).targabs) { + toEdit.locallab.spots.at(i).targabs = mods.locallab.spots.at(i).targabs; + } + if (locallab.spots.at(i).targetGray) { toEdit.locallab.spots.at(i).targetGray = mods.locallab.spots.at(i).targetGray; } @@ -4860,6 +4874,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).catad = mods.locallab.spots.at(i).catad; } + if (locallab.spots.at(i).saturl) { + toEdit.locallab.spots.at(i).saturl = mods.locallab.spots.at(i).saturl; + } + + if (locallab.spots.at(i).contl) { + toEdit.locallab.spots.at(i).contl = mods.locallab.spots.at(i).contl; + } + if (locallab.spots.at(i).Autogray) { toEdit.locallab.spots.at(i).Autogray = mods.locallab.spots.at(i).Autogray; } @@ -4868,6 +4890,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).fullimage = mods.locallab.spots.at(i).fullimage; } + if (locallab.spots.at(i).ciecam) { + toEdit.locallab.spots.at(i).ciecam = mods.locallab.spots.at(i).ciecam; + } + if (locallab.spots.at(i).blackEv) { toEdit.locallab.spots.at(i).blackEv = mods.locallab.spots.at(i).blackEv; } @@ -4888,6 +4914,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.locallab.spots.at(i).baselog = mods.locallab.spots.at(i).baselog; } + if (locallab.spots.at(i).surround) { + toEdit.locallab.spots.at(i).surround = mods.locallab.spots.at(i).surround; + } + if (locallab.spots.at(i).strlog) { toEdit.locallab.spots.at(i).strlog = mods.locallab.spots.at(i).strlog; } @@ -6645,13 +6675,19 @@ LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : explog(v), autocompute(v), sourceGray(v), + sourceabs(v), + targabs(v), targetGray(v), catad(v), + saturl(v), + contl(v), Autogray(v), fullimage(v), + ciecam(v), blackEv(v), whiteEv(v), detail(v), + surround(v), sensilog(v), baselog(v), strlog(v), @@ -7141,13 +7177,19 @@ void LocallabParamsEdited::LocallabSpotEdited::set(bool v) explog = v; autocompute = v; sourceGray = v; + sourceabs = v; + targabs = v; targetGray = v; catad = v; + saturl = v; + contl = v; Autogray = v; fullimage = v; + ciecam = v; blackEv = v; whiteEv = v; detail = v; + surround = v; sensilog = v; baselog = v; strlog = v; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 2a50b2cf1..a66399883 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -832,13 +832,19 @@ public: bool explog; bool autocompute; bool sourceGray; + bool sourceabs; + bool targabs; bool targetGray; bool catad; + bool saturl; + bool contl; bool Autogray; bool fullimage; + bool ciecam; bool blackEv; bool whiteEv; bool detail; + bool surround; bool sensilog; bool baselog; bool strlog; From 444027fcf969f840d331af96215c622420951fa9 Mon Sep 17 00:00:00 2001 From: rom9 <4711834+rom9@users.noreply.github.com> Date: Tue, 3 Nov 2020 00:43:26 +0100 Subject: [PATCH 185/185] Added missing calls to `show()` on the preprocessWB toolpanel when image type is raw (fixes #5978) --- rtgui/toolpanelcoord.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index b5d133775..30c3d22ef 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -364,6 +364,7 @@ void ToolPanelCoordinator::imageTypeChanged(bool isRaw, bool isBayer, bool isXtr bayerprocess->FoldableToolPanel::show(); bayerpreprocess->FoldableToolPanel::show(); rawcacorrection->FoldableToolPanel::show(); + preprocessWB->FoldableToolPanel::show(); preprocess->FoldableToolPanel::show(); flatfield->FoldableToolPanel::show(); filmNegative->FoldableToolPanel::show(); @@ -384,6 +385,7 @@ void ToolPanelCoordinator::imageTypeChanged(bool isRaw, bool isBayer, bool isXtr bayerprocess->FoldableToolPanel::hide(); bayerpreprocess->FoldableToolPanel::hide(); rawcacorrection->FoldableToolPanel::hide(); + preprocessWB->FoldableToolPanel::show(); preprocess->FoldableToolPanel::show(); flatfield->FoldableToolPanel::show(); filmNegative->FoldableToolPanel::show();