From 3a58704459a8e60ecca337a247331ac55b7672d3 Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Mon, 24 Nov 2014 18:08:55 +0200 Subject: Make whether to use OpenCL or not a global option Add a toggle to the "General" page. Change-Id: If35b1472032706b09a3bc3499c55cbd3ac2e13ac --- cui/source/options/optgdlg.cxx | 10 +++++ cui/source/options/optgdlg.hxx | 2 + cui/uiconfig/ui/optgeneralpage.ui | 41 ++++++++++++++++++ .../registry/schema/org/openoffice/Office/Calc.xcs | 7 ---- .../schema/org/openoffice/Office/Common.xcs | 7 ++++ sc/inc/calcconfig.hxx | 1 - sc/source/core/data/formulacell.cxx | 7 ++-- sc/source/core/tool/calcconfig.cxx | 3 -- sc/source/core/tool/formulagroup.cxx | 14 ++++--- sc/source/core/tool/formulaopt.cxx | 37 ++++------------ sc/source/core/tool/interpr5.cxx | 3 +- sc/source/ui/optdlg/calcoptionsdlg.cxx | 28 ------------- sc/source/ui/optdlg/calcoptionsdlg.hxx | 3 -- sc/source/ui/unoobj/docuno.cxx | 8 ++-- sc/uiconfig/scalc/ui/formulacalculationoptions.ui | 49 +++++----------------- 15 files changed, 98 insertions(+), 122 deletions(-) diff --git a/cui/source/options/optgdlg.cxx b/cui/source/options/optgdlg.cxx index e68743da2310..c449eb04b75a 100644 --- a/cui/source/options/optgdlg.cxx +++ b/cui/source/options/optgdlg.cxx @@ -209,6 +209,7 @@ OfaMiscTabPage::OfaMiscTabPage(vcl::Window* pParent, const SfxItemSet& rSet) get(m_pYearValueField, "year"); get(m_pToYearFT, "toyear"); get(m_pCollectUsageInfo, "collectusageinfo"); + get(m_pUseOpenCL, "useopencl"); if (m_pFileDlgCB->IsVisible() && SvtMiscOptions().IsUseSystemFileDialogReadOnly()) { @@ -301,6 +302,12 @@ bool OfaMiscTabPage::FillItemSet( SfxItemSet* rSet ) bModified = true; } + if (m_pUseOpenCL->IsValueChangedFromSaved()) + { + officecfg::Office::Common::Misc::UseOpenCL::set(m_pUseOpenCL->IsChecked(), batch); + bModified = true; + } + batch->commit(); return bModified; @@ -342,6 +349,9 @@ void OfaMiscTabPage::Reset( const SfxItemSet* rSet ) m_pCollectUsageInfo->Check(officecfg::Office::Common::Misc::CollectUsageInformation::get()); m_pCollectUsageInfo->SaveValue(); + + m_pUseOpenCL->Check(officecfg::Office::Common::Misc::UseOpenCL::get()); + m_pUseOpenCL->SaveValue(); } diff --git a/cui/source/options/optgdlg.hxx b/cui/source/options/optgdlg.hxx index 33534573502d..a6a7dac8df83 100644 --- a/cui/source/options/optgdlg.hxx +++ b/cui/source/options/optgdlg.hxx @@ -57,6 +57,8 @@ private: CheckBox* m_pCollectUsageInfo; + CheckBox* m_pUseOpenCL; + DECL_LINK( TwoFigureHdl, NumericField* ); DECL_LINK( TwoFigureConfigHdl, NumericField* ); DECL_LINK(HelpCheckHdl_Impl, void *); diff --git a/cui/uiconfig/ui/optgeneralpage.ui b/cui/uiconfig/ui/optgeneralpage.ui index b1447c59cecd..d3e801593ff0 100644 --- a/cui/uiconfig/ui/optgeneralpage.ui +++ b/cui/uiconfig/ui/optgeneralpage.ui @@ -370,5 +370,46 @@ 5 + + + True + False + 0 + none + + + True + False + 6 + 12 + + + Allow use of OpenCL + True + True + False + True + 0 + True + + + + + + + True + False + OpenCL + + + + + + + + 0 + 6 + + diff --git a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs index c7aac17a05ed..001654a5e30d 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs @@ -1344,13 +1344,6 @@ to those assigned in setOpenCLConfigToDefault() in sc/source/core/tool/calcconfig.cxx --> - - - - Whether to use OpenCL for formula computation, if available. - - true - diff --git a/officecfg/registry/schema/org/openoffice/Office/Common.xcs b/officecfg/registry/schema/org/openoffice/Office/Common.xcs index edede779b640..74a25aa4811f 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Common.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Common.xcs @@ -5553,6 +5553,13 @@ false + + + Determines whether OpenCL can be used, when available, to speed up + some operations. + + true + Determines if the limited, and awkward code producing diff --git a/sc/inc/calcconfig.hxx b/sc/inc/calcconfig.hxx index 2b93fa3bb171..0a27d1b3be1a 100644 --- a/sc/inc/calcconfig.hxx +++ b/sc/inc/calcconfig.hxx @@ -96,7 +96,6 @@ struct SC_DLLPUBLIC ScCalcConfig StringConversion meStringConversion; bool mbEmptyStringAsZero:1; - bool mbOpenCLEnabled:1; bool mbOpenCLSubsetOnly:1; bool mbOpenCLAutoSelect:1; OUString maOpenCLDevice; diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx index 667be87983eb..f8a6c9cbce36 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -59,6 +59,7 @@ #include #include #include +#include #include @@ -419,7 +420,7 @@ ScFormulaCellGroup::ScFormulaCellGroup() : meKernelState(sc::OpenCLKernelNone) { #if ENABLE_THREADED_OPENCL_KERNEL_COMPILATION - if (ScInterpreter::GetGlobalConfig().mbOpenCLEnabled) + if (officecfg::Office::Common::Misc::UseOpenCL::get()) { osl::MutexGuard aGuard(getOpenCLCompilationThreadMutex()); if (snCount++ == 0) @@ -435,7 +436,7 @@ ScFormulaCellGroup::ScFormulaCellGroup() : ScFormulaCellGroup::~ScFormulaCellGroup() { #if ENABLE_THREADED_OPENCL_KERNEL_COMPILATION - if (ScInterpreter::GetGlobalConfig().mbOpenCLEnabled) + if (officecfg::Office::Common::Misc::UseOpenCL::get()) { osl::MutexGuard aGuard(getOpenCLCompilationThreadMutex()); if (--snCount == 0 && sxCompilationThread.is()) @@ -3667,7 +3668,7 @@ ScFormulaCell::CompareState ScFormulaCell::CompareByTokenArray( ScFormulaCell& r bool ScFormulaCell::InterpretFormulaGroup() { - if (!ScInterpreter::GetGlobalConfig().mbOpenCLEnabled) + if (!officecfg::Office::Common::Misc::UseOpenCL::get()) return false; if (!mxGroup || !pCode) diff --git a/sc/source/core/tool/calcconfig.cxx b/sc/source/core/tool/calcconfig.cxx index 7c9ace9bb868..ede5570dee02 100644 --- a/sc/source/core/tool/calcconfig.cxx +++ b/sc/source/core/tool/calcconfig.cxx @@ -35,7 +35,6 @@ void ScCalcConfig::setOpenCLConfigToDefault() // Note that these defaults better be kept in sync with those in // officecfg/registry/schema/org/openoffice/Office/Calc.xcs. // Crazy. - mbOpenCLEnabled = true; mbOpenCLSubsetOnly = true; mbOpenCLAutoSelect = true; mnOpenCLMinimumFormulaGroupSize = 100; @@ -99,7 +98,6 @@ bool ScCalcConfig::operator== (const ScCalcConfig& r) const return meStringRefAddressSyntax == r.meStringRefAddressSyntax && meStringConversion == r.meStringConversion && mbEmptyStringAsZero == r.mbEmptyStringAsZero && - mbOpenCLEnabled == r.mbOpenCLEnabled && mbOpenCLSubsetOnly == r.mbOpenCLSubsetOnly && mbOpenCLAutoSelect == r.mbOpenCLAutoSelect && maOpenCLDevice == r.maOpenCLDevice && @@ -147,7 +145,6 @@ std::ostream& operator<<(std::ostream& rStream, const ScCalcConfig& rConfig) "StringRefAddressSyntax=" << rConfig.meStringRefAddressSyntax << "," "StringConversion=" << rConfig.meStringConversion << "," "EmptyStringAsZero=" << (rConfig.mbEmptyStringAsZero?"Y":"N") << "," - "OpenCLEnabled=" << (rConfig.mbOpenCLEnabled?"Y":"N") << "," "OpenCLSubsetOnly=" << (rConfig.mbOpenCLSubsetOnly?"Y":"N") << "," "OpenCLAutoSelect=" << (rConfig.mbOpenCLAutoSelect?"Y":"N") << "," "OpenCLDevice='" << rConfig.maOpenCLDevice << "'," diff --git a/sc/source/core/tool/formulagroup.cxx b/sc/source/core/tool/formulagroup.cxx index ab84aa7d82c4..e7a61259fd18 100644 --- a/sc/source/core/tool/formulagroup.cxx +++ b/sc/source/core/tool/formulagroup.cxx @@ -20,6 +20,7 @@ #include "globalnames.hxx" #include +#include #include #include @@ -522,7 +523,7 @@ FormulaGroupInterpreter *FormulaGroupInterpreter::getStatic() if ( !msInstance ) { const ScCalcConfig& rConfig = ScInterpreter::GetGlobalConfig(); - if (rConfig.mbOpenCLEnabled) + if (officecfg::Office::Common::Misc::UseOpenCL::get()) switchOpenCLDevice(rConfig.maOpenCLDevice, rConfig.mbOpenCLAutoSelect, false); if ( !msInstance ) // software fallback @@ -549,7 +550,7 @@ void FormulaGroupInterpreter::fillOpenCLInfo(std::vector& rP bool FormulaGroupInterpreter::switchOpenCLDevice(const OUString& rDeviceId, bool bAutoSelect, bool bForceEvaluation) { - bool bOpenCLEnabled = ScInterpreter::GetGlobalConfig().mbOpenCLEnabled; + bool bOpenCLEnabled = officecfg::Office::Common::Misc::UseOpenCL::get(); if (!bOpenCLEnabled || rDeviceId == OPENCL_SOFTWARE_DEVICE_CONFIG_NAME) { if(msInstance) @@ -576,7 +577,7 @@ bool FormulaGroupInterpreter::switchOpenCLDevice(const OUString& rDeviceId, bool msInstance = NULL; #if HAVE_FEATURE_OPENCL - if ( ScInterpreter::GetGlobalConfig().mbOpenCLEnabled ) + if ( officecfg::Office::Common::Misc::UseOpenCL::get() ) { msInstance = new sc::opencl::FormulaGroupInterpreterOpenCL(); return msInstance != NULL; @@ -591,7 +592,7 @@ void FormulaGroupInterpreter::getOpenCLDeviceInfo(sal_Int32& rDeviceId, sal_Int3 { rDeviceId = -1; rPlatformId = -1; - bool bOpenCLEnabled = ScInterpreter::GetGlobalConfig().mbOpenCLEnabled; + bool bOpenCLEnabled = officecfg::Office::Common::Misc::UseOpenCL::get(); if(!bOpenCLEnabled) return; @@ -608,8 +609,11 @@ void FormulaGroupInterpreter::getOpenCLDeviceInfo(sal_Int32& rDeviceId, sal_Int3 void FormulaGroupInterpreter::enableOpenCL(bool bEnable, bool bEnableCompletely, const std::set& rSubsetToEnable) { + boost::shared_ptr batch(comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Misc::UseOpenCL::set(bEnable, batch); + batch->commit(); + ScCalcConfig aConfig = ScInterpreter::GetGlobalConfig(); - aConfig.mbOpenCLEnabled = bEnable; aConfig.mbOpenCLSubsetOnly = !bEnableCompletely; aConfig.maOpenCLSubsetOpCodes = rSubsetToEnable; ScInterpreter::SetGlobalConfig(aConfig); diff --git a/sc/source/core/tool/formulaopt.cxx b/sc/source/core/tool/formulaopt.cxx index 9f05a01ec2d5..85966530a4dc 100644 --- a/sc/source/core/tool/formulaopt.cxx +++ b/sc/source/core/tool/formulaopt.cxx @@ -200,15 +200,14 @@ SfxPoolItem* ScTpFormulaItem::Clone( SfxItemPool * ) const #define SCFORMULAOPT_EMPTY_OUSTRING_AS_ZERO 7 #define SCFORMULAOPT_OOXML_RECALC 8 #define SCFORMULAOPT_ODF_RECALC 9 -#define SCFORMULAOPT_OPENCL_ENABLED 10 -#define SCFORMULAOPT_OPENCL_AUTOSELECT 11 -#define SCFORMULAOPT_OPENCL_DEVICE 12 -#define SCFORMULAOPT_OPENCL_SUBSET_ONLY 13 -#define SCFORMULAOPT_OPENCL_MIN_SIZE 14 -#define SCFORMULAOPT_OPENCL_SUBSET_OPS 15 -#define SCFORMULAOPT_OPENCL_BLACKLIST 16 -#define SCFORMULAOPT_OPENCL_WHITELIST 17 -#define SCFORMULAOPT_COUNT 18 +#define SCFORMULAOPT_OPENCL_AUTOSELECT 10 +#define SCFORMULAOPT_OPENCL_DEVICE 11 +#define SCFORMULAOPT_OPENCL_SUBSET_ONLY 12 +#define SCFORMULAOPT_OPENCL_MIN_SIZE 13 +#define SCFORMULAOPT_OPENCL_SUBSET_OPS 14 +#define SCFORMULAOPT_OPENCL_BLACKLIST 15 +#define SCFORMULAOPT_OPENCL_WHITELIST 16 +#define SCFORMULAOPT_COUNT 17 Sequence ScFormulaCfg::GetPropertyNames() { @@ -224,7 +223,6 @@ Sequence ScFormulaCfg::GetPropertyNames() "Syntax/EmptyStringAsZero", // SCFORMULAOPT_EMPTY_OUSTRING_AS_ZERO "Load/OOXMLRecalcMode", // SCFORMULAOPT_OOXML_RECALC "Load/ODFRecalcMode", // SCFORMULAOPT_ODF_RECALC - "Calculation/OpenCL", // SCFORMULAOPT_OPENCL_ENABLED "Calculation/OpenCLAutoSelect", // SCFORMULAOPT_OPENCL_AUTOSELECT "Calculation/OpenCLDevice", // SCFORMULAOPT_OPENCL_DEVICE "Calculation/OpenCLSubsetOnly", // SCFORMULAOPT_OPENCL_SUBSET_ONLY @@ -255,7 +253,6 @@ ScFormulaCfg::PropsToIds ScFormulaCfg::GetPropNamesToId() SCFORMULAOPT_EMPTY_OUSTRING_AS_ZERO, SCFORMULAOPT_OOXML_RECALC, SCFORMULAOPT_ODF_RECALC, - SCFORMULAOPT_OPENCL_ENABLED, SCFORMULAOPT_OPENCL_AUTOSELECT, SCFORMULAOPT_OPENCL_DEVICE, SCFORMULAOPT_OPENCL_SUBSET_ONLY, @@ -542,17 +539,6 @@ void ScFormulaCfg::UpdateFromProperties( const Sequence& aNames ) SetODFRecalcOptions(eOpt); } break; - case SCFORMULAOPT_OPENCL_ENABLED: - { - bool bVal = GetCalcConfig().mbOpenCLEnabled; - pValues[nProp] >>= bVal; -#if 0 // Don't remove please. - // The intent here is that tml when running CppunitTest_sc_opencl_test turns this on. - bVal = sal_True; -#endif - GetCalcConfig().mbOpenCLEnabled = bVal; - } - break; case SCFORMULAOPT_OPENCL_AUTOSELECT: { bool bVal = GetCalcConfig().mbOpenCLAutoSelect; @@ -716,13 +702,6 @@ void ScFormulaCfg::Commit() pValues[nProp] <<= nVal; } break; - case SCFORMULAOPT_OPENCL_ENABLED: - { - bool bVal = GetCalcConfig().mbOpenCLEnabled; - pValues[nProp] <<= bVal; - bSetOpenCL = bVal; - } - break; case SCFORMULAOPT_OPENCL_AUTOSELECT: { bool bVal = GetCalcConfig().mbOpenCLAutoSelect; diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx index 1f2e4a165e0e..05936fa29696 100644 --- a/sc/source/core/tool/interpr5.cxx +++ b/sc/source/core/tool/interpr5.cxx @@ -23,6 +23,7 @@ #include #include +#include #include #include "interpre.hxx" @@ -908,7 +909,7 @@ void ScInterpreter::ScMatInv() SCSIZE nC, nR; pMat->GetDimensions(nC, nR); - if (maCalcConfig.mbOpenCLEnabled) + if (officecfg::Office::Common::Misc::UseOpenCL::get()) { ScMatrixRef xResMat = sc::FormulaGroupInterpreter::getStatic()->inverseMatrix(*pMat); if (xResMat) diff --git a/sc/source/ui/optdlg/calcoptionsdlg.cxx b/sc/source/ui/optdlg/calcoptionsdlg.cxx index f65697011628..dbf390a688a1 100644 --- a/sc/source/ui/optdlg/calcoptionsdlg.cxx +++ b/sc/source/ui/optdlg/calcoptionsdlg.cxx @@ -39,7 +39,6 @@ typedef enum { CALC_OPTION_STRING_CONVERSION, CALC_OPTION_EMPTY_AS_ZERO, CALC_OPTION_REF_SYNTAX, - CALC_OPTION_ENABLE_OPENCL, CALC_OPTION_ENABLE_OPENCL_SUBSET, CALC_OPTION_OPENCL_MIN_SIZE, CALC_OPTION_OPENCL_SUBSET_OPS, @@ -206,9 +205,6 @@ ScCalcOptionsDialog::ScCalcOptionsDialog(vcl::Window* pParent, const ScCalcConfi maCaptionEmptyStringAsZero = get("empty_str_as_zero_caption")->GetText(); maDescEmptyStringAsZero = get("empty_str_as_zero_desc")->GetText(); - maCaptionOpenCLEnabled = get("opencl_enabled")->GetText(); - maDescOpenCLEnabled = get("opencl_enabled_desc")->GetText(); - maCaptionOpenCLSubsetEnabled = get("opencl_subset_enabled")->GetText(); maDescOpenCLSubsetEnabled = get("opencl_subset_enabled_desc")->GetText(); @@ -387,7 +383,6 @@ void ScCalcOptionsDialog::FillOptionsList() } #if HAVE_FEATURE_OPENCL - pModel->Insert(createItem(maCaptionOpenCLEnabled,toString(maConfig.mbOpenCLEnabled))); pModel->Insert(createItem(maCaptionOpenCLSubsetEnabled,toString(maConfig.mbOpenCLSubsetOnly))); pModel->Insert(createItem(maCaptionOpenCLMinimumFormulaSize,toString(maConfig.mnOpenCLMinimumFormulaGroupSize))); pModel->Insert(createItem(maCaptionOpenCLSubsetOpCodes,ScOpCodeSetToSymbolicString(maConfig.maOpenCLSubsetOpCodes))); @@ -480,7 +475,6 @@ void ScCalcOptionsDialog::SelectionChanged() // booleans case CALC_OPTION_EMPTY_AS_ZERO: - case CALC_OPTION_ENABLE_OPENCL: case CALC_OPTION_ENABLE_OPENCL_SUBSET: { mpLbOptionEdit->Hide(); @@ -508,19 +502,6 @@ void ScCalcOptionsDialog::SelectionChanged() break; // nothing } } - else if ( nSelectedPos == CALC_OPTION_ENABLE_OPENCL ) - { - bValue = maConfig.mbOpenCLEnabled; - mpFtAnnotation->SetText(maDescOpenCLEnabled); - mpOpenclInfoList->GetParent()->Show(); - setOptimalLayoutSize(); - if(bValue) - mpOpenclInfoList->GetParent()->Enable(); - else - mpOpenclInfoList->GetParent()->Disable(); - - OpenCLAutomaticSelectionChanged(); - } else if ( nSelectedPos == CALC_OPTION_ENABLE_OPENCL_SUBSET ) { bValue = maConfig.mbOpenCLSubsetOnly; @@ -663,7 +644,6 @@ void ScCalcOptionsDialog::ListOptionValueChanged() break; case CALC_OPTION_EMPTY_AS_ZERO: - case CALC_OPTION_ENABLE_OPENCL: case CALC_OPTION_ENABLE_OPENCL_SUBSET: case CALC_OPTION_OPENCL_MIN_SIZE: case CALC_OPTION_OPENCL_SUBSET_OPS: @@ -730,14 +710,6 @@ void ScCalcOptionsDialog::RadioValueChanged() case CALC_OPTION_EMPTY_AS_ZERO: maConfig.mbEmptyStringAsZero = mbSelectedEmptyStringAsZero = bValue; break; - case CALC_OPTION_ENABLE_OPENCL: - maConfig.mbOpenCLEnabled = bValue; - if(bValue) - mpOpenclInfoList->GetParent()->Enable(); - else - mpOpenclInfoList->GetParent()->Disable(); - OpenCLAutomaticSelectionChanged(); - break; case CALC_OPTION_ENABLE_OPENCL_SUBSET: maConfig.mbOpenCLSubsetOnly = bValue; break; diff --git a/sc/source/ui/optdlg/calcoptionsdlg.hxx b/sc/source/ui/optdlg/calcoptionsdlg.hxx index 705873cde91c..5c483b02976f 100644 --- a/sc/source/ui/optdlg/calcoptionsdlg.hxx +++ b/sc/source/ui/optdlg/calcoptionsdlg.hxx @@ -119,9 +119,6 @@ private: OUString maCaptionEmptyStringAsZero; OUString maDescEmptyStringAsZero; - OUString maCaptionOpenCLEnabled; - OUString maDescOpenCLEnabled; - OUString maCaptionOpenCLSubsetEnabled; OUString maDescOpenCLSubsetEnabled; diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index aa555196f025..94a06f050073 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -2324,17 +2324,19 @@ void ScModelObj::HandleCalculateEvents() sal_Bool ScModelObj::isOpenCLEnabled() throw (uno::RuntimeException, std::exception) { - return ScInterpreter::GetGlobalConfig().mbOpenCLEnabled; + return officecfg::Office::Common::Misc::UseOpenCL::get(); } void ScModelObj::enableOpenCL(sal_Bool bEnable) throw (uno::RuntimeException, std::exception) { + boost::shared_ptr batch(comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Misc::UseOpenCL::set(bEnable, batch); + batch->commit(); + ScCalcConfig aConfig = ScInterpreter::GetGlobalConfig(); if (bEnable) aConfig.setOpenCLConfigToDefault(); - else - aConfig.mbOpenCLEnabled = false; ScInterpreter::SetGlobalConfig(aConfig); } diff --git a/sc/uiconfig/scalc/ui/formulacalculationoptions.ui b/sc/uiconfig/scalc/ui/formulacalculationoptions.ui index decce435cc0e..0cdaaabc0270 100644 --- a/sc/uiconfig/scalc/ui/formulacalculationoptions.ui +++ b/sc/uiconfig/scalc/ui/formulacalculationoptions.ui @@ -569,34 +569,6 @@ 1 - - - False - True - Enable OpenCL for some formula computation - - - 0 - 15 - 1 - 1 - - - - - False - True - This option enables some sorts of simple formula expressions to be executed using OpenCL if it is available on your system. - True - 56 - - - 0 - 16 - 1 - 1 - - False @@ -605,7 +577,7 @@ 0 - 17 + 15 1 1 @@ -620,7 +592,7 @@ 0 - 18 + 16 1 1 @@ -633,7 +605,7 @@ 0 - 19 + 17 1 1 @@ -648,7 +620,7 @@ 0 - 20 + 18 1 1 @@ -661,7 +633,7 @@ 0 - 21 + 19 1 1 @@ -676,7 +648,7 @@ 0 - 22 + 20 1 1 @@ -689,7 +661,7 @@ 0 - 23 + 21 1 1 @@ -704,7 +676,7 @@ 0 - 24 + 22 1 1 @@ -717,7 +689,7 @@ 0 - 25 + 23 1 1 @@ -732,7 +704,7 @@ 0 - 26 + 25 1 1 @@ -954,7 +926,6 @@ - -- cgit