formula/source/core/api/token.cxx | 81 ++++++++++- include/formula/token.hxx | 17 ++ include/formula/tokenarray.hxx | 7 sc/qa/unit/data/functions/spreadsheet/fods/let.fods | 143 ++++++++++++++------ sc/source/core/inc/interpre.hxx | 5 sc/source/core/tool/compiler.cxx | 2 sc/source/core/tool/interpr1.cxx | 92 ++++++------ sc/source/core/tool/interpr4.cxx | 3 8 files changed, 250 insertions(+), 100 deletions(-)
New commits: commit acc00651a64298d337c2e3fbe61f6e97318541ac Author: Balazs Varga <balazs.varga.ext...@allotropia.de> AuthorDate: Mon Feb 24 17:07:27 2025 +0100 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Mar 6 15:09:03 2025 +0100 Related: tdf#164997 - sc refactor and optimize LET function calculation Fix crash because of missing new svStringName from ConvertMatrixParameters Change-Id: Ifd3b67c5709476058412cddeae53b695a83cb5a9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182095 Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> Tested-by: Jenkins Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182334 diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx index ec15ec351b77..5cedce9a176b 100644 --- a/sc/source/core/tool/interpr4.cxx +++ b/sc/source/core/tool/interpr4.cxx @@ -1478,6 +1478,7 @@ bool ScInterpreter::ConvertMatrixParameters() { case svDouble: case svString: + case svStringName: case svSingleRef: case svExternalSingleRef: case svMissing: commit b05bdbfefe04139c265744df829cae459497add0 Author: Balazs Varga <balazs.varga.ext...@allotropia.de> AuthorDate: Fri Feb 14 12:03:59 2025 +0100 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Mar 6 15:08:55 2025 +0100 tdf#164997 - sc refactor and optimize LET function calculation With the original solution the embeded LET function into another functions caused unexpected error values. Such as: IFERROR(LET(...)...) gave error for non-error LET result Change-Id: I5f09a8771ce38492269cfeb567b9c3357cfd510c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181662 Reviewed-by: Balazs Varga <balazs.varga.ext...@allotropia.de> Tested-by: Jenkins Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181764 diff --git a/formula/source/core/api/token.cxx b/formula/source/core/api/token.cxx index 1167b3ebcd0d..10f91aad2450 100644 --- a/formula/source/core/api/token.cxx +++ b/formula/source/core/api/token.cxx @@ -789,6 +789,24 @@ FormulaToken* FormulaTokenArray::ReplaceToken( sal_uInt16 nOffset, FormulaToken* } } +FormulaToken* FormulaTokenArray::ReplaceRPNToken( sal_uInt16 nOffset, FormulaToken* t ) +{ + if (nOffset < nRPN) + { + CheckToken(*t); + t->IncRef(); + FormulaToken* p = pRPN[nOffset]; + pRPN[nOffset] = t; + p->DecRef(); // may be dead now + return t; + } + else + { + t->DeleteIfZeroRef(); + return nullptr; + } +} + sal_uInt16 FormulaTokenArray::RemoveToken( sal_uInt16 nOffset, sal_uInt16 nCount ) { if (nOffset < nLen) @@ -888,6 +906,11 @@ FormulaToken* FormulaTokenArray::AddString( const svl::SharedString& rStr ) return Add( new FormulaStringToken( rStr ) ); } +FormulaToken* FormulaTokenArray::AddStringName( const svl::SharedString& rStr ) +{ + return Add( new FormulaStringNameToken( rStr ) ); +} + FormulaToken* FormulaTokenArray::AddDouble( double fVal ) { return Add( new FormulaDoubleToken( fVal ) ); @@ -1619,13 +1642,13 @@ void FormulaTokenArray::ReinternStrings( svl::SharedStringPool& rPool ) /*----------------------------------------------------------------------*/ -FormulaTokenIterator::Item::Item(const FormulaTokenArray* pArray, short pc, short stop) : - pArr(pArray), nPC(pc), nStop(stop) +FormulaTokenIterator::Item::Item(const FormulaTokenArray* pArray, short pc, short stop, bool lambda) : + pArr(pArray), nPC(pc), nStop(stop), bLambda(lambda) { } FormulaTokenIterator::FormulaTokenIterator( const FormulaTokenArray& rArr ) - : maStack{ FormulaTokenIterator::Item(&rArr, -1, SHRT_MAX) } + : maStack{ FormulaTokenIterator::Item(&rArr, -1, SHRT_MAX, false) } { } @@ -1635,7 +1658,7 @@ FormulaTokenIterator::~FormulaTokenIterator() void FormulaTokenIterator::Push( const FormulaTokenArray* pArr ) { - FormulaTokenIterator::Item item(pArr, -1, SHRT_MAX); + FormulaTokenIterator::Item item(pArr, -1, SHRT_MAX, false); maStack.push_back(item); } @@ -1645,12 +1668,23 @@ void FormulaTokenIterator::Pop() maStack.pop_back(); } +void FormulaTokenIterator::FrontPop() +{ + maStack.erase(maStack.begin()); +} + +void FormulaTokenIterator::Lambda(bool bOpt) +{ + maStack.back().bLambda = bOpt; +} + void FormulaTokenIterator::Reset() { while( maStack.size() > 1 ) maStack.pop_back(); - maStack.back().nPC = -1; + if (!maStack.back().bLambda) + maStack.back().nPC = -1; } FormulaToken* FormulaTokenArrayPlainIterator::GetNextName() @@ -1669,12 +1703,12 @@ FormulaToken* FormulaTokenArrayPlainIterator::GetNextName() FormulaToken* FormulaTokenArrayPlainIterator::GetNextStringName() { - if (mpFTA->GetArray()) + if (mpFTA->GetCode()) { - while (mnIndex < mpFTA->GetLen()) + while (mnIndex < mpFTA->GetCodeLen()) { - FormulaToken* t = mpFTA->GetArray()[mnIndex++]; - if (t->GetType() == svString && t->GetOpCode() == ocStringName) + FormulaToken* t = mpFTA->GetCode()[ mnIndex++ ]; + if (t->GetType() == svStringName) return t; } } @@ -2000,6 +2034,35 @@ bool FormulaStringOpToken::operator==( const FormulaToken& r ) const return FormulaByteToken::operator==( r ) && maString == r.GetString(); } +FormulaStringNameToken::FormulaStringNameToken( svl::SharedString r ) : + FormulaToken( svStringName ), maString(std::move( r )) +{ +} + +FormulaStringNameToken::FormulaStringNameToken( const FormulaStringNameToken& r ) : + FormulaToken( r ), maString( r.maString ) { +} + +FormulaToken* FormulaStringNameToken::Clone() const +{ + return new FormulaStringNameToken(*this); +} + +const svl::SharedString& FormulaStringNameToken::GetString() const +{ + return maString; +} + +void FormulaStringNameToken::SetString( const svl::SharedString& rStr ) +{ + maString = rStr; +} + +bool FormulaStringNameToken::operator==( const FormulaToken& r ) const +{ + return FormulaToken::operator==( r ) && maString == r.GetString(); +} + sal_uInt16 FormulaIndexToken::GetIndex() const { return nIndex; } void FormulaIndexToken::SetIndex( sal_uInt16 n ) { nIndex = n; } sal_Int16 FormulaIndexToken::GetSheet() const { return mnSheet; } diff --git a/include/formula/token.hxx b/include/formula/token.hxx index 89043877a4fd..d497f8e5d3f7 100644 --- a/include/formula/token.hxx +++ b/include/formula/token.hxx @@ -50,6 +50,7 @@ enum StackVar : sal_uInt8 svByte, svDouble, svString, + svStringName, svSingleRef, svDoubleRef, svMatrix, @@ -93,6 +94,7 @@ inline std::string StackVarEnumToString(StackVar const e) case svByte: return "Byte"; case svDouble: return "Double"; case svString: return "String"; + case svStringName: return "StringName"; case svSingleRef: return "SingleRef"; case svDoubleRef: return "DoubleRef"; case svMatrix: return "Matrix"; @@ -396,6 +398,21 @@ public: virtual bool operator==( const FormulaToken& rToken ) const override; }; +// FormulaStringNameToken +class FORMULA_DLLPUBLIC FormulaStringNameToken final : public FormulaToken +{ + svl::SharedString maString; +public: + FormulaStringNameToken(svl::SharedString r); + FormulaStringNameToken(const FormulaStringNameToken& r); + + virtual FormulaToken* Clone() const override; + virtual const svl::SharedString& GetString() const override; + virtual void SetString(const svl::SharedString& rStr) override; + virtual bool operator==(const FormulaToken& rToken) const override; +}; + + class FORMULA_DLLPUBLIC FormulaIndexToken final : public FormulaToken { private: diff --git a/include/formula/tokenarray.hxx b/include/formula/tokenarray.hxx index 98e1f4dbb17b..320937844bfa 100644 --- a/include/formula/tokenarray.hxx +++ b/include/formula/tokenarray.hxx @@ -271,6 +271,7 @@ public: token as well. */ FormulaToken* ReplaceToken( sal_uInt16 nOffset, FormulaToken*, ReplaceMode eMode ); + FormulaToken* ReplaceRPNToken( sal_uInt16 nOffset, FormulaToken* ); /** Remove a sequence of tokens from pCode array, and pRPN array if the tokens are referenced there. @@ -480,6 +481,7 @@ public: FormulaToken* AddToken( const FormulaToken& ); FormulaToken* AddString( const svl::SharedString& rStr ); + FormulaToken* AddStringName( const svl::SharedString& rStr ); FormulaToken* AddDouble( double fVal ); void AddExternal( const sal_Unicode* pStr ); /** Xcl import may play dirty tricks with OpCode!=ocExternal. @@ -540,8 +542,9 @@ class FORMULA_DLLPUBLIC FormulaTokenIterator const FormulaTokenArray* pArr; short nPC; short nStop; + bool bLambda; - Item(const FormulaTokenArray* arr, short pc, short stop); + Item(const FormulaTokenArray* arr, short pc, short stop, bool lambda); }; std::vector<Item> maStack; @@ -572,6 +575,8 @@ public: void Jump( short nStart, short nNext, short nStop = SHRT_MAX ); void Push( const FormulaTokenArray* ); void Pop(); + void FrontPop(); + void Lambda( bool bOpt ); /** Reconstruct the iterator afresh from a token array */ diff --git a/sc/qa/unit/data/functions/spreadsheet/fods/let.fods b/sc/qa/unit/data/functions/spreadsheet/fods/let.fods index 9e13c4556ed3..06a390722a77 100644 --- a/sc/qa/unit/data/functions/spreadsheet/fods/let.fods +++ b/sc/qa/unit/data/functions/spreadsheet/fods/let.fods @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> -<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:ooow="http://openoffice.org/200 4/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns :css3t="http://www.w3.org/TR/css3-text/" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.spreadsheet"> - <office:meta><meta:creation-date>2024-01-16T18:30:06.278000000</meta:creation-date><meta:editing-duration>PT7H29M10S</meta:editing-duration><meta:editing-cycles>111</meta:editing-cycles><meta:generator>LibreOfficeDev/24.8.0.0.alpha1$Windows_X86_64 LibreOffice_project/38dff367d75365eb75c80c73385ec818f9a5aabd</meta:generator><dc:date>2024-06-11T09:22:21.072000000</dc:date><meta:document-statistic meta:table-count="2" meta:cell-count="351" meta:object-count="0"/></office:meta> +<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:ooow="http://openoffice.org/200 4/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns :css3t="http://www.w3.org/TR/css3-text/" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" office:version="1.4" office:mimetype="application/vnd.oasis.opendocument.spreadsheet"> + <office:meta><meta:creation-date>2024-01-16T18:30:06.278000000</meta:creation-date><meta:editing-duration>PT7H32M50S</meta:editing-duration><meta:editing-cycles>112</meta:editing-cycles><meta:generator>LibreOfficeDev/25.8.0.0.alpha0$Windows_X86_64 LibreOffice_project/b0d4b4664a295631ce4d8dee2ceb5cd94ae12edb</meta:generator><dc:date>2025-02-14T10:53:13.361868000</dc:date><meta:document-statistic meta:table-count="2" meta:cell-count="367" meta:object-count="0"/></office:meta> <office:settings> <config:config-item-set config:name="ooo:view-settings"> <config:config-item config:name="VisibleAreaTop" config:type="int">0</config:config-item> @@ -30,13 +30,13 @@ <config:config-item config:name="IgnoreBreakAfterMultilineField" config:type="boolean">false</config:config-item> </config:config-item-map-entry> <config:config-item-map-entry config:name="Sheet2"> - <config:config-item config:name="CursorPositionX" config:type="int">7</config:config-item> - <config:config-item config:name="CursorPositionY" config:type="int">47</config:config-item> + <config:config-item config:name="CursorPositionX" config:type="int">9</config:config-item> + <config:config-item config:name="CursorPositionY" config:type="int">51</config:config-item> <config:config-item config:name="ActiveSplitRange" config:type="short">2</config:config-item> <config:config-item config:name="PositionLeft" config:type="int">0</config:config-item> <config:config-item config:name="PositionRight" config:type="int">0</config:config-item> <config:config-item config:name="PositionTop" config:type="int">0</config:config-item> - <config:config-item config:name="PositionBottom" config:type="int">0</config:config-item> + <config:config-item config:name="PositionBottom" config:type="int">12</config:config-item> <config:config-item config:name="ZoomType" config:type="short">0</config:config-item> <config:config-item config:name="ZoomValue" config:type="int">75</config:config-item> <config:config-item config:name="PageViewZoomValue" config:type="int">60</config:config-item> @@ -48,7 +48,7 @@ </config:config-item-map-entry> </config:config-item-map-named> <config:config-item config:name="ActiveTable" config:type="string">Sheet1</config:config-item> - <config:config-item config:name="HorizontalScrollbarWidth" config:type="int">2495</config:config-item> + <config:config-item config:name="HorizontalScrollbarWidth" config:type="int">1851</config:config-item> <config:config-item config:name="ZoomType" config:type="short">0</config:config-item> <config:config-item config:name="ZoomValue" config:type="int">75</config:config-item> <config:config-item config:name="PageViewZoomValue" config:type="int">60</config:config-item> @@ -59,7 +59,7 @@ <config:config-item config:name="ShowFormulasMarks" config:type="boolean">false</config:config-item> <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item> <config:config-item config:name="GridColor" config:type="int">12632256</config:config-item> - <config:config-item config:name="FormulaBarHeight" config:type="short">1</config:config-item> + <config:config-item config:name="ShowPageBreaks" config:type="boolean">true</config:config-item> <config:config-item config:name="HasColumnRowHeaders" config:type="boolean">true</config:config-item> <config:config-item config:name="HasSheetTabs" config:type="boolean">true</config:config-item> <config:config-item config:name="IsOutlineSymbolsSet" config:type="boolean">true</config:config-item> @@ -71,6 +71,7 @@ <config:config-item config:name="RasterSubdivisionX" config:type="int">1</config:config-item> <config:config-item config:name="RasterSubdivisionY" config:type="int">1</config:config-item> <config:config-item config:name="IsRasterAxisSynchronized" config:type="boolean">true</config:config-item> + <config:config-item config:name="FormulaBarHeight" config:type="short">1</config:config-item> <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item> <config:config-item config:name="LegacySingleLineFontwork" config:type="boolean">false</config:config-item> <config:config-item config:name="ConnectorUseSnapRect" config:type="boolean">false</config:config-item> @@ -110,7 +111,7 @@ <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item> <config:config-item config:name="PrinterName" config:type="string">Microsoft Print to PDF</config:config-item> <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item> - <config:config-item config:name="PrinterSetup" config:type="base64Binary">ZBb+/01pY3Jvc29mdCBQcmludCB0byBQREYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATWljcm9zb2Z0IFByaW50IFRvIFBERgAAAAAAAAAAAAAWAAEANhUAAAAAAAAEAAhSAAAEdAAAM1ROVwAAAAAKAE0AaQBjAHIAbwBzAG8AZgB0ACAAUAByAGkAbgB0ACAAdABvACAAUABEAEYAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAMG3ABQFAMvAQABAAkAmgs0CGQAAQAPAFgCAgABAFgCAwABAEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAIAAAABAAAA/////0dJUzQAAAAAAAAAAAAAAABESU5VIgDIACQDLBE/XXt+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAAFNNVEoAAAAAEAC4AHsAMAA4ADQARgAwADEARgBBAC0ARQA2ADMANAAtADQARAA3ADcALQA4ADMARQBFAC0AMAA3ADQAOAAxADcAQwAwADMANQA4ADEAfQAAAFJFU0RMTABVbmlyZXNETEwAUGFwZXJTaXplAEE0AE9yaWVudGF0aW9uAFBPUlRSQUlUAFJlc29sdXRpb24AUmVzT3B0aW9uMQBDb2xvck1vZGUAQ29sb3IAAAAAAAAAAAAAAAAAAAAAAAAsEQAAVjRETQEAAAAAAAAAnApwIhwAAADsAAAAAwAAAPoBTwg05ndNg+4HSBfANYHQAAAATAAAAAMAAAAACAAAAAAAAAAAAAADAAAAAAgAACoAAAAACAAAAwAAAEAAAABWAAAAABAAAEQAbwBjAHUAbQBlAG4AdABVAHMAZQByAFAAYQBzAHMAdwBvAHIAZAAAAEQAbwBjAHUAbQBlAG4AdABPAHcAbgBlAHIAUABhAHMAcwB3AG8AcgBkAAAARABvAGMAdQBtAGUAbgB0AEMAcgB5AHAAdABTA GUAYwB1AHIAaQB0AHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgBDT01QQVRfRFVQTEVYX01PREUTAER1cGxleE1vZGU6OlVua25vd24MAFBSSU5URVJfTkFNRRYATWljcm9zb2Z0IFByaW50IHRvIFBERgsARFJJVkVSX05BTUUWAE1pY3Jvc29mdCBQcmludCBUbyBQREY=</config:config-item> + <config:config-item config:name="PrinterSetup" config:type="base64Binary">bBb+/01pY3Jvc29mdCBQcmludCB0byBQREYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATWljcm9zb2Z0IFByaW50IFRvIFBERgAAAAAAAAAAAAAWAAEAPhUAAAAAAAAEAAhSAAAEdAAAM1ROVwAAAAAKAE0AaQBjAHIAbwBzAG8AZgB0ACAAUAByAGkAbgB0ACAAdABvACAAUABEAEYAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAMG3ABYFAMtAQABAAkAmgs0CGQAAQAPAFgCAgABAFgCAwABAEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAIAAAABAAAA/////0dJUzQAAAAAAAAAAAAAAABESU5VIgDQACwDLBHiXo1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAABkAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAFNNVEoAAAAAEADAAHsAMAA4ADQARgAwADEARgBBAC0ARQA2ADMANAAtADQARAA3ADcALQA4ADMARQBFAC0AMAA3ADQAOAAxADcAQwAwADMANQA4ADEAfQAAAFJFU0RMTABVbmlyZXNETEwAUGFwZXJTaXplAEE0AE9yaWVudGF0aW9uAFBPUlRSQUlUAFJlc29sdXRpb24AUmVzT3B0aW9uMQBDb2xvck1vZGUAQ29sb3IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwRAABWNERNAQAAAAAAAACcCnAiHAAAAOwAAAADAAAA+gFPCDTmd02D7gdIF8A1gdAAAABMAAAAAwAAAAAIAAAAAAAAAAAAAAMAAAAACAAAKgAAAAAIAAADAAAAQAAAAFYAAAAAEAAARABvAGMAdQBtAGUAbgB0AFUAcwBlAHIAUABhAHMAcwB3AG8AcgBkAAAARABvAGMAdQBtAGUAbgB0AE8AdwBuAGUAcgBQAGEAcwBzAHcAbwByAGQAAABEAG8AYwB1AG0AZQBuAHQAQwByA HkAcAB0AFMAZQBjAHUAcgBpAHQAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAENPTVBBVF9EVVBMRVhfTU9ERRMARHVwbGV4TW9kZTo6VW5rbm93bgwAUFJJTlRFUl9OQU1FFgBNaWNyb3NvZnQgUHJpbnQgdG8gUERGCwBEUklWRVJfTkFNRRYATWljcm9zb2Z0IFByaW50IFRvIFBERg==</config:config-item> <config:config-item config:name="RasterIsVisible" config:type="boolean">false</config:config-item> <config:config-item config:name="RasterResolutionX" config:type="int">1270</config:config-item> <config:config-item config:name="RasterResolutionY" config:type="int">1270</config:config-item> @@ -3039,33 +3040,33 @@ <number:boolean-style style:name="N99"> <number:boolean/> </number:boolean-style> - <style:style style:name="ce13" style:family="table-cell" style:parent-style-name="Default"> + <style:style style:name="ce10" style:family="table-cell" style:parent-style-name="Default"> <style:table-cell-properties fo:wrap-option="no-wrap"/> <style:text-properties fo:font-size="20pt" fo:font-weight="bold" style:font-size-asian="20pt" style:font-weight-asian="bold" style:font-size-complex="20pt" style:font-weight-complex="bold"/> </style:style> - <style:style style:name="ce16" style:family="table-cell" style:parent-style-name="Default"> + <style:style style:name="ce11" style:family="table-cell" style:parent-style-name="Default"> <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false"/> <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/> <style:text-properties fo:font-size="14pt" fo:font-weight="bold" style:font-size-asian="14pt" style:font-weight-asian="bold" style:font-size-complex="14pt" style:font-weight-complex="bold"/> </style:style> - <style:style style:name="ce20" style:family="table-cell" style:parent-style-name="Default"> + <style:style style:name="ce12" style:family="table-cell" style:parent-style-name="Default"> <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false"/> <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/> <style:text-properties fo:font-size="12pt" fo:font-weight="bold" style:font-size-asian="12pt" style:font-weight-asian="bold" style:font-size-complex="12pt" style:font-weight-complex="bold"/> </style:style> - <style:style style:name="ce22" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N99"> + <style:style style:name="ce14" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N99"> <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false"/> <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/> <style:map style:condition="cell-content()=""" style:apply-style-name="Default" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=1" style:apply-style-name="true" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=0" style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/> </style:style> - <style:style style:name="ce23" style:family="table-cell" style:parent-style-name="Default"> + <style:style style:name="ce21" style:family="table-cell" style:parent-style-name="Default"> <style:map style:condition="cell-content()=""" style:apply-style-name="Default" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=1" style:apply-style-name="true" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=0" style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/> </style:style> - <style:style style:name="ce24" style:family="table-cell" style:parent-style-name="Default"> + <style:style style:name="ce25" style:family="table-cell" style:parent-style-name="Default"> <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false"/> <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/> <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/> @@ -3073,42 +3074,42 @@ <style:map style:condition="cell-content()=1" style:apply-style-name="true" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=0" style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/> </style:style> - <style:style style:name="ce27" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N99"> + <style:style style:name="ce26" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N99"> <style:map style:condition="cell-content()=""" style:apply-style-name="Default" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=1" style:apply-style-name="true" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=0" style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/> </style:style> - <style:style style:name="ce28" style:family="table-cell" style:parent-style-name="Default"> + <style:style style:name="ce29" style:family="table-cell" style:parent-style-name="Default"> <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false"/> <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/> </style:style> - <style:style style:name="ce10" style:family="table-cell" style:parent-style-name="Default"> + <style:style style:name="ce13" style:family="table-cell" style:parent-style-name="Default"> <style:table-cell-properties fo:wrap-option="no-wrap"/> <style:text-properties fo:font-size="20pt" fo:font-weight="bold" style:font-size-asian="20pt" style:font-weight-asian="bold" style:font-size-complex="20pt" style:font-weight-complex="bold"/> </style:style> - <style:style style:name="ce11" style:family="table-cell" style:parent-style-name="Default"> + <style:style style:name="ce16" style:family="table-cell" style:parent-style-name="Default"> <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false"/> <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/> <style:text-properties fo:font-size="14pt" fo:font-weight="bold" style:font-size-asian="14pt" style:font-weight-asian="bold" style:font-size-complex="14pt" style:font-weight-complex="bold"/> </style:style> - <style:style style:name="ce12" style:family="table-cell" style:parent-style-name="Default"> + <style:style style:name="ce20" style:family="table-cell" style:parent-style-name="Default"> <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false"/> <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/> <style:text-properties fo:font-size="12pt" fo:font-weight="bold" style:font-size-asian="12pt" style:font-weight-asian="bold" style:font-size-complex="12pt" style:font-weight-complex="bold"/> </style:style> - <style:style style:name="ce14" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N99"> + <style:style style:name="ce22" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N99"> <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false"/> <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/> <style:map style:condition="cell-content()=""" style:apply-style-name="Default" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=1" style:apply-style-name="true" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=0" style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/> </style:style> - <style:style style:name="ce21" style:family="table-cell" style:parent-style-name="Default"> + <style:style style:name="ce23" style:family="table-cell" style:parent-style-name="Default"> <style:map style:condition="cell-content()=""" style:apply-style-name="Default" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=1" style:apply-style-name="true" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=0" style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/> </style:style> - <style:style style:name="ce25" style:family="table-cell" style:parent-style-name="Default"> + <style:style style:name="ce24" style:family="table-cell" style:parent-style-name="Default"> <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false"/> <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/> <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/> @@ -3116,12 +3117,12 @@ <style:map style:condition="cell-content()=1" style:apply-style-name="true" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=0" style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/> </style:style> - <style:style style:name="ce26" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N99"> + <style:style style:name="ce27" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N99"> <style:map style:condition="cell-content()=""" style:apply-style-name="Default" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=1" style:apply-style-name="true" style:base-cell-address="Sheet1.B3"/> <style:map style:condition="cell-content()=0" style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/> </style:style> - <style:style style:name="ce29" style:family="table-cell" style:parent-style-name="Default"> + <style:style style:name="ce28" style:family="table-cell" style:parent-style-name="Default"> <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false"/> <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/> </style:style> @@ -3204,7 +3205,7 @@ <text:p><text:sheet-name>???</text:sheet-name><text:s/>(<text:title>???</text:title>)</text:p> </style:region-left> <style:region-right> - <text:p><text:date style:data-style-name="N2" text:date-value="2024-06-11">0000.00.00</text:date>, <text:time style:data-style-name="N2" text:time-value="09:19:41.184000000">00:00:00</text:time></text:p> + <text:p><text:date style:data-style-name="N2" text:date-value="2025-02-14">0000.00.00</text:date>, <text:time style:data-style-name="N2" text:time-value="10:49:33.518964500">00:00:00</text:time></text:p> </style:region-right> </style:header> <style:header-left style:display="false"/> @@ -3221,10 +3222,10 @@ <table:calculation-settings table:automatic-find-labels="false" table:use-regular-expressions="false" table:use-wildcards="true"/> <table:table table:name="Sheet1" table:style-name="ta1"> <table:table-column table:style-name="co1" table:default-cell-style-name="Default"/> - <table:table-column table:style-name="co2" table:default-cell-style-name="ce21"/> + <table:table-column table:style-name="co2" table:default-cell-style-name="ce23"/> <table:table-column table:style-name="co3" table:default-cell-style-name="Default"/> <table:table-row table:style-name="ro1"> - <table:table-cell table:style-name="ce10" office:value-type="string" calcext:value-type="string"> + <table:table-cell table:style-name="ce13" office:value-type="string" calcext:value-type="string"> <text:p>LET Function</text:p> </table:table-cell> <table:table-cell table:style-name="Default"/> @@ -3236,10 +3237,10 @@ <table:table-cell/> </table:table-row> <table:table-row table:style-name="ro3"> - <table:table-cell table:style-name="ce11" office:value-type="string" calcext:value-type="string"> + <table:table-cell table:style-name="ce16" office:value-type="string" calcext:value-type="string"> <text:p>Result</text:p> </table:table-cell> - <table:table-cell table:style-name="ce14" table:formula="of:=AND([.B8:.B95])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean"> + <table:table-cell table:style-name="ce22" table:formula="of:=AND([.B8:.B95])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean"> <text:p>IGAZ</text:p> </table:table-cell> <table:table-cell/> @@ -3248,13 +3249,13 @@ <table:table-cell table:number-columns-repeated="3"/> </table:table-row> <table:table-row table:style-name="ro4"> - <table:table-cell table:style-name="ce12" office:value-type="string" calcext:value-type="string"> + <table:table-cell table:style-name="ce20" office:value-type="string" calcext:value-type="string"> <text:p>Sheet</text:p> </table:table-cell> - <table:table-cell table:style-name="ce25" office:value-type="string" calcext:value-type="string"> + <table:table-cell table:style-name="ce24" office:value-type="string" calcext:value-type="string"> <text:p>Result</text:p> </table:table-cell> - <table:table-cell table:style-name="ce12" office:value-type="string" calcext:value-type="string"> + <table:table-cell table:style-name="ce20" office:value-type="string" calcext:value-type="string"> <text:p>Description</text:p> </table:table-cell> </table:table-row> @@ -3262,16 +3263,16 @@ <table:table-cell office:value-type="float" office:value="2" calcext:value-type="float"> <text:p>2</text:p> </table:table-cell> - <table:table-cell table:style-name="ce14" table:formula="of:=AND([Sheet2.I2:.I211])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean"> + <table:table-cell table:style-name="ce22" table:formula="of:=AND([Sheet2.I2:.I211])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean"> <text:p>IGAZ</text:p> </table:table-cell> - <table:table-cell table:style-name="ce29" office:value-type="string" calcext:value-type="string"> + <table:table-cell table:style-name="ce28" office:value-type="string" calcext:value-type="string"> <text:p>Simple LET formulas with local references and values</text:p> </table:table-cell> </table:table-row> <table:table-row table:style-name="ro2" table:number-rows-repeated="20"> <table:table-cell/> - <table:table-cell table:style-name="ce26"/> + <table:table-cell table:style-name="ce27"/> <table:table-cell/> </table:table-row> <table:table-row table:style-name="ro2" table:number-rows-repeated="21"> @@ -4672,15 +4673,75 @@ <table:table-cell table:style-name="ce37"/> <table:table-cell table:number-columns-repeated="27"/> </table:table-row> - <table:table-row table:style-name="ro2" table:number-rows-repeated="2"> - <table:table-cell table:style-name="ce17"/> + <table:table-row table:style-name="ro2"> + <table:table-cell table:style-name="ce17" table:formula="of:=IFERROR(COM.MICROSOFT.LET(_xlpm.a_1;1;_xlpm.a_1);"ERROR")" office:value-type="float" office:value="1" calcext:value-type="float"> + <text:p>1</text:p> + </table:table-cell> <table:table-cell table:number-columns-repeated="3"/> - <table:table-cell table:style-name="ce17"/> + <table:table-cell table:style-name="ce17" office:value-type="float" office:value="1" calcext:value-type="float"> + <text:p>1</text:p> + </table:table-cell> <table:table-cell table:number-columns-repeated="3"/> - <table:table-cell table:style-name="ce37"/> - <table:table-cell table:number-columns-repeated="27"/> + <table:table-cell table:style-name="ce37" table:formula="of:=([.A49]=[.E49])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean"> + <text:p>IGAZ</text:p> + </table:table-cell> + <table:table-cell table:formula="of:=FORMULA([.A49])" office:value-type="string" office:string-value="=IFERROR(LET(a_1;1;a_1);"ERROR")" calcext:value-type="string"> + <text:p>=IFERROR(LET(a_1;1;a_1);"ERROR")</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="26"/> </table:table-row> - <table:table-row table:style-name="ro2" table:number-rows-repeated="3"> + <table:table-row table:style-name="ro2"> + <table:table-cell table:style-name="ce17" table:formula="of:=SUM(COM.MICROSOFT.LET(_xlpm.a_1;SUM(5;4);_xlpm.a_1);2)" office:value-type="float" office:value="11" calcext:value-type="float"> + <text:p>11</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="3"/> + <table:table-cell table:style-name="ce17" office:value-type="float" office:value="11" calcext:value-type="float"> + <text:p>11</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="3"/> + <table:table-cell table:style-name="ce37" table:formula="of:=([.A50]=[.E50])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean"> + <text:p>IGAZ</text:p> + </table:table-cell> + <table:table-cell table:formula="of:=FORMULA([.A50])" office:value-type="string" office:string-value="=SUM(LET(a_1;SUM(5;4);a_1);2)" calcext:value-type="string"> + <text:p>=SUM(LET(a_1;SUM(5;4);a_1);2)</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="26"/> + </table:table-row> + <table:table-row table:style-name="ro2"> + <table:table-cell table:formula="of:=COM.MICROSOFT.LET(_xlpm.a_1;1;_xlpm.a_1)" office:value-type="float" office:value="1" calcext:value-type="float"> + <text:p>1</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="3"/> + <table:table-cell office:value-type="float" office:value="1" calcext:value-type="float"> + <text:p>1</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="3"/> + <table:table-cell table:style-name="ce37" table:formula="of:=([.A51]=[.E51])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean"> + <text:p>IGAZ</text:p> + </table:table-cell> + <table:table-cell table:formula="of:=FORMULA([.A51])" office:value-type="string" office:string-value="=LET(a_1;1;a_1)" calcext:value-type="string"> + <text:p>=LET(a_1;1;a_1)</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="26"/> + </table:table-row> + <table:table-row table:style-name="ro2"> + <table:table-cell table:formula="of:=COM.MICROSOFT.LET(_xlpm.avg; AVERAGE([.O2:.R2]); IF(_xlpm.avg>249; "Excellent"; "No good"))" office:value-type="string" office:string-value="No good" calcext:value-type="string"> + <text:p>No good</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="3"/> + <table:table-cell office:value-type="string" calcext:value-type="string"> + <text:p>No good</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="3"/> + <table:table-cell table:style-name="ce37" table:formula="of:=([.A52]=[.E52])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean"> + <text:p>IGAZ</text:p> + </table:table-cell> + <table:table-cell table:formula="of:=FORMULA([.A52])" office:value-type="string" office:string-value="=LET(avg; AVERAGE(O2:R2); IF(avg>249; "Excellent"; "No good"))" calcext:value-type="string"> + <text:p>=LET(avg; AVERAGE(O2:R2); IF(avg>249; "Excellent"; "No good"))</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="26"/> + </table:table-row> + <table:table-row table:style-name="ro2"> <table:table-cell table:number-columns-repeated="8"/> <table:table-cell table:style-name="ce37"/> <table:table-cell table:number-columns-repeated="27"/> diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx index 1630e8c6b794..e0b99568324c 100644 --- a/sc/source/core/inc/interpre.hxx +++ b/sc/source/core/inc/interpre.hxx @@ -516,9 +516,10 @@ private: sc::RangeMatrix GetRangeMatrix(); // Get tokens at specific parameters for LET (lambda) function - void getTokensAtParameter( std::unique_ptr<ScTokenArray>& pTokens, short nPos ); static void replaceNamesToResult( const std::unordered_map<OUString, formula::FormulaToken*>& rResultIndexes, - std::unique_ptr<ScTokenArray>& pTokens ); + std::unique_ptr<ScTokenArray>& pTokens, short nStartPos, short nEndPos ); + std::unique_ptr<ScTokenArray> checkPushTokens( const std::unique_ptr<ScTokenArray>& pTokens, + short nStartPos, short nEndPos ); void ScTableOp(); // repeated operations diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 9fffacba570f..8d925b7e909c 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -5158,7 +5158,7 @@ ScRangeData* ScCompiler::GetRangeData( const FormulaToken& rToken ) const bool ScCompiler::HandleStringName() { ScTokenArray* pNew = new ScTokenArray(rDoc); - pNew->AddString(mpToken->GetString()); + pNew->AddStringName(mpToken->GetString()); PushTokenArray(pNew, true); return GetToken(); } diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index 2b6d990570bd..80dea68bb357 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -8975,44 +8975,34 @@ void ScInterpreter::ScUnique() } } -void ScInterpreter::getTokensAtParameter( std::unique_ptr<ScTokenArray>& pTokens, short nPos ) +void ScInterpreter::replaceNamesToResult( const std::unordered_map<OUString, formula::FormulaToken*>& rResultIndexes, + std::unique_ptr<ScTokenArray>& pTokens, short nStartPos, short nEndPos ) { - sal_uInt16 nOpen = 0; - sal_uInt16 nSepCount = 0; - formula::FormulaTokenArrayPlainIterator aIter(*pArr); - formula::FormulaToken* t = aIter.First(); - for (t = aIter.NextNoSpaces(); t; t = aIter.NextNoSpaces()) + formula::FormulaTokenArrayPlainIterator aIterResult(*pTokens); + aIterResult.Jump(nStartPos + 1); + for (FormulaToken* t = aIterResult.GetNextStringName(); t; t = aIterResult.GetNextStringName()) { - OpCode aOpCode = t->GetOpCode(); - formula::StackVar aIntType = t->GetType(); - if ((aOpCode == ocOpen || aOpCode == ocArrayOpen || aOpCode == ocTableRefOpen) && aIntType == formula::StackVar::svSep) - nOpen++; - else if ((aOpCode == ocClose || aOpCode == ocArrayClose || aOpCode == ocTableRefClose) && aIntType == formula::StackVar::svSep) - nOpen--; - else if (aOpCode == ocSep && aIntType == formula::StackVar::svSep && nOpen == 1) - { - nSepCount++; - continue; - } - - if (nSepCount == nPos && nOpen > 0) - { - pTokens->AddToken(*t->Clone()); - } + if (aIterResult.GetIndex() > nEndPos) + break; + auto iRes = rResultIndexes.find(t->GetString().getString()); + if (iRes != rResultIndexes.end()) + pTokens->ReplaceRPNToken(aIterResult.GetIndex() - 1, iRes->second->Clone()); } } -void ScInterpreter::replaceNamesToResult(const std::unordered_map<OUString, formula::FormulaToken*>& rResultIndexes, - std::unique_ptr<ScTokenArray>& pTokens ) +std::unique_ptr<ScTokenArray> ScInterpreter::checkPushTokens(const std::unique_ptr<ScTokenArray>& pTokens, short nStartPos, short nEndPos) { formula::FormulaTokenArrayPlainIterator aIterResult(*pTokens); - for (FormulaToken* t = aIterResult.GetNextStringName(); t; t = aIterResult.GetNextStringName()) + aIterResult.Jump(nStartPos + 1); + unique_ptr<ScTokenArray> pTempTokens(new ScTokenArray(mrDoc)); + for (FormulaToken* t = aIterResult.NextRPN(); t; t = aIterResult.NextRPN()) { - auto iRes = rResultIndexes.find(t->GetString().getString()); - if (iRes != rResultIndexes.end()) - pTokens->ReplaceToken(aIterResult.GetIndex() - 1, iRes->second->Clone(), - FormulaTokenArray::ReplaceMode::CODE_ONLY); + if (aIterResult.GetIndex() > nEndPos) + break; + + pTempTokens->AddToken(*t->Clone()); } + return pTempTokens; } void ScInterpreter::ScLet() @@ -9031,7 +9021,8 @@ void ScInterpreter::ScLet() OUString aStrName; std::unordered_map<OUString, formula::FormulaToken*> nResultIndexes; formula::FormulaTokenArrayPlainIterator aIter(*pArr); - unique_ptr<ScTokenArray> pValueTokens(new ScTokenArray(mrDoc)); + // clone tokens for replacing string name tokens + unique_ptr<ScTokenArray> pValueTokens = pArr->Clone(); // name and function pairs parameter while (nJumpCount > 1) @@ -9054,17 +9045,21 @@ void ScInterpreter::ScLet() } nJumpCount--; - // get value tokens - getTokensAtParameter(pValueTokens, nOrgJumpCount - nJumpCount); - nJumpCount--; - // replace names with result tokens - replaceNamesToResult(nResultIndexes, pValueTokens); + replaceNamesToResult(nResultIndexes, pValueTokens, pJump[nOrgJumpCount - nJumpCount], pJump[nOrgJumpCount - nJumpCount + 1]); + + unique_ptr<ScTokenArray> pTempTokens = checkPushTokens(pValueTokens, pJump[nOrgJumpCount - nJumpCount], pJump[nOrgJumpCount - nJumpCount + 1]); // calculate the inner results unless we already have a push result token - if (pValueTokens->GetLen() == 1 && pValueTokens->GetArray()[0]->GetOpCode() == ocPush) + if (pTempTokens->GetLen() == 0) + { + PushIllegalParameter(); + aCode.Jump(pJump[nOrgJumpCount], pJump[nOrgJumpCount]); + return; + } + else if (pTempTokens->GetLen() == 1 && pTempTokens->GetArray()[0]->GetOpCode() == ocPush) { - if (!nResultIndexes.insert(std::make_pair(aStrName, pValueTokens->GetArray()[0]->Clone())).second) + if (!nResultIndexes.insert(std::make_pair(aStrName, pTempTokens->GetArray()[0]->Clone())).second) { PushIllegalParameter(); aCode.Jump(pJump[nOrgJumpCount], pJump[nOrgJumpCount]); @@ -9073,11 +9068,15 @@ void ScInterpreter::ScLet() } else { - ScCompiler aComp(mrDoc, aPos, *pValueTokens, mrDoc.GetGrammar(), false, false, &mrContext); - aComp.CompileTokenArray(); ScInterpreter aInt(mrDoc.GetFormulaCell(aPos), mrDoc, mrContext, aPos, *pValueTokens); + aInt.aCode.Jump(pJump[nOrgJumpCount - nJumpCount], pJump[nOrgJumpCount - nJumpCount + 1], pJump[nOrgJumpCount - nJumpCount + 1]); + while (aInt.aCode.HasStacked()) + aInt.aCode.FrontPop(); + aInt.aCode.Lambda(true); + sfx2::LinkManager aNewLinkMgr(mrDoc.GetDocumentShell()); aInt.SetLinkManager(&aNewLinkMgr); + formula::StackVar aIntType = aInt.Interpret(); if (aIntType == formula::svMatrixCell) @@ -9101,20 +9100,20 @@ void ScInterpreter::ScLet() } } } - pValueTokens->Clear(); + nJumpCount--; } // last parameter: calculation - getTokensAtParameter(pValueTokens, nOrgJumpCount - nJumpCount); - nJumpCount--; - // replace names with result tokens - replaceNamesToResult(nResultIndexes, pValueTokens); + replaceNamesToResult(nResultIndexes, pValueTokens, pJump[nOrgJumpCount - nJumpCount], pJump[nOrgJumpCount - nJumpCount + 1]); // calculate the final result - ScCompiler aComp(mrDoc, aPos, *pValueTokens, mrDoc.GetGrammar(), false, false, &mrContext); - aComp.CompileTokenArray(); ScInterpreter aInt(mrDoc.GetFormulaCell(aPos), mrDoc, mrContext, aPos, *pValueTokens); + aInt.aCode.Jump(pJump[nOrgJumpCount - nJumpCount], pJump[nOrgJumpCount - nJumpCount + 1], pJump[nOrgJumpCount - nJumpCount + 1]); + while (aInt.aCode.HasStacked()) + aInt.aCode.FrontPop(); + aInt.aCode.Lambda(true); + sfx2::LinkManager aNewLinkMgr(mrDoc.GetDocumentShell()); aInt.SetLinkManager(&aNewLinkMgr); formula::StackVar aIntType = aInt.Interpret(); @@ -9137,6 +9136,7 @@ void ScInterpreter::ScLet() } } + nJumpCount--; pValueTokens.reset(); aCode.Jump(pJump[nOrgJumpCount], pJump[nOrgJumpCount]); } diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx index fcc58c364ec4..ec15ec351b77 100644 --- a/sc/source/core/tool/interpr4.cxx +++ b/sc/source/core/tool/interpr4.cxx @@ -827,6 +827,7 @@ const svl::SharedString & ScInterpreter::PopString() nGlobalError = p->GetError(); break; case svString: + case svStringName: return p->GetString(); case svEmptyCell: case svMissing: @@ -2383,6 +2384,7 @@ svl::SharedString ScInterpreter::GetString() return GetStringFromDouble( PopDouble() ); } case svString: + case svStringName: return PopString(); case svSingleRef: {