summaryrefslogtreecommitdiff
path: root/oox
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2009-12-01 17:50:41 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2009-12-01 17:50:41 +0000
commitb74da05a4f48c5f33e09ba8aad43051981addcfe (patch)
treeffc9fea9dede1f7f321aef9510cc9f4400317a02 /oox
parent79a07b4395cc9d0caac5dd7bf33a7d6c2467e32b (diff)
parent037e707750f507c7d4932f13217ac6e9f9d83117 (diff)
chartshapes: merge with DEV300 m62
Diffstat (limited to 'oox')
-rw-r--r--oox/inc/oox/core/binarycodec.hxx33
-rw-r--r--oox/inc/oox/core/binaryfilterbase.hxx5
-rw-r--r--oox/inc/oox/core/fasttokenhandler.hxx28
-rw-r--r--oox/inc/oox/core/filterbase.hxx37
-rw-r--r--oox/inc/oox/core/filterdetect.hxx168
-rw-r--r--oox/inc/oox/core/xmlfilterbase.hxx21
-rw-r--r--oox/inc/oox/drawingml/color.hxx32
-rw-r--r--oox/inc/oox/drawingml/customshapeproperties.hxx2
-rw-r--r--oox/inc/oox/drawingml/drawingmltypes.hxx8
-rw-r--r--oox/inc/oox/drawingml/fillproperties.hxx22
-rw-r--r--oox/inc/oox/drawingml/lineproperties.hxx17
-rw-r--r--oox/inc/oox/dump/dumperbase.hxx50
-rw-r--r--oox/inc/oox/export/drawingml.hxx115
-rw-r--r--oox/inc/oox/export/shapes.hxx165
-rw-r--r--oox/inc/oox/export/utils.hxx73
-rw-r--r--oox/inc/oox/export/vmlexport.hxx118
-rw-r--r--oox/inc/oox/helper/containerhelper.hxx73
-rw-r--r--oox/inc/oox/helper/helper.hxx3
-rw-r--r--oox/inc/oox/helper/propertymap.hxx14
-rw-r--r--oox/inc/oox/ole/axcontrolhelper.hxx2
-rw-r--r--oox/inc/oox/ppt/pptimport.hxx5
-rw-r--r--oox/inc/oox/token/propertylist.hxx53
-rw-r--r--oox/inc/oox/token/tokenmap.hxx84
-rw-r--r--oox/inc/oox/vml/vmldrawing.hxx4
-rw-r--r--oox/inc/oox/vml/vmlformatting.hxx187
-rw-r--r--oox/inc/oox/vml/vmlshape.hxx30
-rw-r--r--oox/inc/oox/vml/vmlshapecontainer.hxx22
-rw-r--r--oox/inc/oox/vml/vmlshapecontext.hxx6
-rw-r--r--oox/inc/oox/xls/biffcodec.hxx111
-rw-r--r--oox/inc/oox/xls/biffhelper.hxx6
-rw-r--r--oox/inc/oox/xls/biffinputstream.hxx5
-rw-r--r--oox/inc/oox/xls/chartsheetfragment.hxx4
-rw-r--r--oox/inc/oox/xls/defnamesbuffer.hxx38
-rw-r--r--oox/inc/oox/xls/drawingfragment.hxx6
-rw-r--r--oox/inc/oox/xls/excelfilter.hxx30
-rw-r--r--oox/inc/oox/xls/excelhandlers.hxx29
-rw-r--r--oox/inc/oox/xls/externallinkbuffer.hxx30
-rw-r--r--oox/inc/oox/xls/formulabase.hxx164
-rw-r--r--oox/inc/oox/xls/richstring.hxx6
-rw-r--r--oox/inc/oox/xls/stylesbuffer.hxx140
-rw-r--r--oox/inc/oox/xls/themebuffer.hxx2
-rw-r--r--oox/inc/oox/xls/viewsettings.hxx12
-rw-r--r--oox/inc/oox/xls/workbookfragment.hxx2
-rw-r--r--oox/inc/oox/xls/workbookhelper.hxx17
-rw-r--r--oox/inc/oox/xls/workbooksettings.hxx19
-rw-r--r--oox/inc/oox/xls/worksheetbuffer.hxx56
-rw-r--r--oox/inc/oox/xls/worksheetfragment.hxx4
-rw-r--r--oox/inc/oox/xls/worksheethelper.hxx7
-rw-r--r--oox/prj/build.lst2
-rw-r--r--oox/prj/d.lst23
-rw-r--r--oox/source/core/binarycodec.cxx23
-rw-r--r--oox/source/core/binaryfilterbase.cxx17
-rw-r--r--oox/source/core/fasttokenhandler.cxx95
-rw-r--r--oox/source/core/filterbase.cxx198
-rw-r--r--oox/source/core/filterdetect.cxx535
-rw-r--r--oox/source/core/makefile.mk5
-rw-r--r--oox/source/core/xmlfilterbase.cxx237
-rw-r--r--oox/source/drawingml/chart/objectformatter.cxx4
-rw-r--r--oox/source/drawingml/chart/typegroupconverter.cxx49
-rw-r--r--oox/source/drawingml/clrschemecontext.cxx1
-rw-r--r--oox/source/drawingml/color.cxx582
-rw-r--r--oox/source/drawingml/customshapeproperties.cxx2
-rw-r--r--oox/source/drawingml/fillproperties.cxx60
-rw-r--r--oox/source/drawingml/fillpropertiesgroupcontext.cxx13
-rw-r--r--oox/source/drawingml/lineproperties.cxx153
-rw-r--r--oox/source/drawingml/linepropertiescontext.cxx6
-rw-r--r--oox/source/drawingml/shape.cxx6
-rw-r--r--oox/source/drawingml/table/tablecell.cxx7
-rw-r--r--oox/source/drawingml/textcharacterproperties.cxx1
-rw-r--r--oox/source/drawingml/textparagraphproperties.cxx1
-rw-r--r--oox/source/dump/biffdumper.cxx122
-rw-r--r--oox/source/dump/biffdumper.ini41
-rw-r--r--oox/source/dump/dumperbase.cxx55
-rw-r--r--oox/source/dump/pptxdumper.cxx4
-rw-r--r--oox/source/dump/xlsbdumper.cxx10
-rw-r--r--oox/source/dump/xlsbdumper.ini3
-rw-r--r--oox/source/export/README2
-rw-r--r--oox/source/export/drawingml.cxx1404
-rw-r--r--oox/source/export/makefile.mk27
-rw-r--r--oox/source/export/preset-definitions-to-shape-types.pl1242
-rw-r--r--oox/source/export/presetShapeDefinitions.xml19915
-rw-r--r--oox/source/export/presetTextWarpDefinitions.xml1885
-rw-r--r--oox/source/export/shapes.cxx998
-rw-r--r--oox/source/export/vmlexport.cxx840
-rw-r--r--oox/source/helper/propertymap.cxx24
-rw-r--r--oox/source/helper/zipstorage.cxx16
-rw-r--r--oox/source/ole/axcontrolhelper.cxx10
-rw-r--r--oox/source/ppt/animvariantcontext.cxx1
-rw-r--r--oox/source/ppt/pptimport.cxx20
-rw-r--r--oox/source/ppt/slidepersist.cxx4
-rw-r--r--oox/source/ppt/timenodelistcontext.cxx1
-rw-r--r--oox/source/shape/FastTokenHandlerService.hxx19
-rw-r--r--oox/source/shape/ShapeFilterBase.cxx5
-rw-r--r--oox/source/shape/ShapeFilterBase.hxx3
-rw-r--r--oox/source/token/gentoken.pl14
-rw-r--r--oox/source/token/properties.txt1
-rw-r--r--oox/source/token/propertylist.cxx14
-rw-r--r--oox/source/token/tokenmap.cxx95
-rw-r--r--oox/source/token/tokens.txt16
-rw-r--r--oox/source/vml/makefile.mk1
-rw-r--r--oox/source/vml/vmldrawing.cxx5
-rw-r--r--oox/source/vml/vmldrawingfragment.cxx4
-rw-r--r--oox/source/vml/vmlformatting.cxx585
-rw-r--r--oox/source/vml/vmlshape.cxx173
-rw-r--r--oox/source/vml/vmlshapecontext.cxx152
-rw-r--r--oox/source/xls/biffcodec.cxx289
-rw-r--r--oox/source/xls/chartsheetfragment.cxx4
-rw-r--r--oox/source/xls/commentsbuffer.cxx39
-rw-r--r--oox/source/xls/defnamesbuffer.cxx146
-rw-r--r--oox/source/xls/drawingfragment.cxx42
-rw-r--r--oox/source/xls/excelfilter.cxx64
-rw-r--r--oox/source/xls/excelhandlers.cxx135
-rw-r--r--oox/source/xls/externallinkbuffer.cxx188
-rw-r--r--oox/source/xls/externallinkfragment.cxx6
-rw-r--r--oox/source/xls/formulabase.cxx934
-rw-r--r--oox/source/xls/formulaparser.cxx14
-rw-r--r--oox/source/xls/pivotcachebuffer.cxx4
-rw-r--r--oox/source/xls/pivottablebuffer.cxx2
-rw-r--r--oox/source/xls/richstring.cxx12
-rw-r--r--oox/source/xls/stylesbuffer.cxx586
-rw-r--r--oox/source/xls/themebuffer.cxx8
-rw-r--r--oox/source/xls/viewsettings.cxx29
-rw-r--r--oox/source/xls/workbookfragment.cxx135
-rw-r--r--oox/source/xls/workbookhelper.cxx42
-rw-r--r--oox/source/xls/workbooksettings.cxx47
-rw-r--r--oox/source/xls/worksheetbuffer.cxx161
-rw-r--r--oox/source/xls/worksheetfragment.cxx4
-rw-r--r--oox/source/xls/worksheethelper.cxx86
-rw-r--r--oox/source/xls/worksheetsettings.cxx15
-rw-r--r--oox/util/makefile.mk17
-rw-r--r--oox/workben/pagesize/excel_pagesize.txt66
-rwxr-xr-xoox/workben/pagesize/parsePageSize.py78
132 files changed, 32252 insertions, 2697 deletions
diff --git a/oox/inc/oox/core/binarycodec.hxx b/oox/inc/oox/core/binarycodec.hxx
index bb33c214f42d..767b9c2be936 100644
--- a/oox/inc/oox/core/binarycodec.hxx
+++ b/oox/inc/oox/core/binarycodec.hxx
@@ -34,11 +34,26 @@
#include <rtl/cipher.h>
#include <rtl/digest.h>
+namespace oox { class AttributeList; }
+
namespace oox {
namespace core {
// ============================================================================
+class CodecHelper
+{
+public:
+ /** Returns the password hash if it is in the required 16-bit limit. */
+ static sal_uInt16 getPasswordHash( const AttributeList& rAttribs, sal_Int32 nElement );
+
+private:
+ CodecHelper();
+ ~CodecHelper();
+};
+
+// ============================================================================
+
/** Encodes and decodes data from/to protected MS Office documents.
Implements a simple XOR encoding/decoding algorithm used in MS Office
@@ -182,12 +197,12 @@ public:
@param pnPassData
Unicode character array containing the password. Must be zero
terminated, which results in a maximum length of 15 characters.
- @param pnUnique
- Unique document identifier read from or written to the file.
+ @param pnSalt
+ Random salt data block read from or written to the file.
*/
void initKey(
const sal_uInt16 pnPassData[ 16 ],
- const sal_uInt8 pnUnique[ 16 ] );
+ const sal_uInt8 pnSalt[ 16 ] );
/** Verifies the validity of the password using the passed salt data.
@@ -195,17 +210,17 @@ public:
The codec must be initialized with the initKey() function before
this function can be used.
- @param pnSaltData
- Salt data block read from the file.
- @param pnSaltDigest
- Salt digest read from the file.
+ @param pnVerifier
+ Verifier block read from the file.
+ @param pnVerifierHash
+ Verifier hash read from the file.
@return
True = test was successful.
*/
bool verifyKey(
- const sal_uInt8 pnSaltData[ 16 ],
- const sal_uInt8 pnSaltDigest[ 16 ] );
+ const sal_uInt8 pnVerifier[ 16 ],
+ const sal_uInt8 pnVerifierHash[ 16 ] );
/** Rekeys the codec using the specified counter.
diff --git a/oox/inc/oox/core/binaryfilterbase.hxx b/oox/inc/oox/core/binaryfilterbase.hxx
index ce2c4f2c31d7..c051934f550c 100644
--- a/oox/inc/oox/core/binaryfilterbase.hxx
+++ b/oox/inc/oox/core/binaryfilterbase.hxx
@@ -49,8 +49,9 @@ public:
private:
virtual StorageRef implCreateStorage(
- ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStream,
- ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& rxOutStream ) const;
+ const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStream ) const;
+ virtual StorageRef implCreateStorage(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& rxOutStream ) const;
};
typedef ::rtl::Reference< BinaryFilterBase > BinaryFilterRef;
diff --git a/oox/inc/oox/core/fasttokenhandler.hxx b/oox/inc/oox/core/fasttokenhandler.hxx
index 3944011507b2..45709f9da401 100644
--- a/oox/inc/oox/core/fasttokenhandler.hxx
+++ b/oox/inc/oox/core/fasttokenhandler.hxx
@@ -28,27 +28,41 @@
*
************************************************************************/
-#ifndef OOX_FASTTOKENHANDLER_HXX
-#define OOX_FASTTOKENHANDLER_HXX
+#ifndef OOX_CORE_FASTTOKENHANDLER_HXX
+#define OOX_CORE_FASTTOKENHANDLER_HXX
#include <com/sun/star/xml/sax/XFastTokenHandler.hpp>
#include <cppuhelper/implbase1.hxx>
+namespace oox { class TokenMap; }
+
namespace oox {
+namespace core {
+
+// ============================================================================
+/** Wrapper implementing the com.sun.star.xml.sax.XFastTokenHandler API interface
+ that provides access to the tokens generated from the internal token name list.
+ */
class FastTokenHandler : public ::cppu::WeakImplHelper1< ::com::sun::star::xml::sax::XFastTokenHandler >
{
public:
explicit FastTokenHandler();
virtual ~FastTokenHandler();
- virtual ::sal_Int32 SAL_CALL getToken( const ::rtl::OUString& Identifier ) throw (::com::sun::star::uno::RuntimeException);
- virtual ::rtl::OUString SAL_CALL getIdentifier( ::sal_Int32 Token ) throw (::com::sun::star::uno::RuntimeException);
- virtual ::com::sun::star::uno::Sequence< ::sal_Int8 > SAL_CALL getUTF8Identifier( ::sal_Int32 Token ) throw (::com::sun::star::uno::RuntimeException);
- virtual ::sal_Int32 SAL_CALL getTokenFromUTF8( const ::com::sun::star::uno::Sequence< ::sal_Int8 >& Identifier ) throw (::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getToken( const ::rtl::OUString& rIdentifier ) throw (::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getIdentifier( sal_Int32 nToken ) throw (::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getUTF8Identifier( sal_Int32 nToken ) throw (::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getTokenFromUTF8( const ::com::sun::star::uno::Sequence< sal_Int8 >& Identifier ) throw (::com::sun::star::uno::RuntimeException);
+
+private:
+ const TokenMap& mrTokenMap; /// Reference to global token map singleton.
};
-}
+// ============================================================================
+
+} // namespace core
+} // namespace oox
#endif
diff --git a/oox/inc/oox/core/filterbase.hxx b/oox/inc/oox/core/filterbase.hxx
index 001b537444c1..adfb8d6d0941 100644
--- a/oox/inc/oox/core/filterbase.hxx
+++ b/oox/inc/oox/core/filterbase.hxx
@@ -44,7 +44,7 @@
#include <cppuhelper/implbase5.hxx>
#include "oox/helper/binarystreambase.hxx"
#include "oox/helper/storagebase.hxx"
-#include <oox/dllapi.h>
+#include "oox/dllapi.h"
namespace com { namespace sun { namespace star {
namespace lang { class XMultiServiceFactory; }
@@ -58,6 +58,11 @@ namespace com { namespace sun { namespace star {
namespace graphic { class XGraphic; }
} } }
+namespace comphelper {
+ class IDocPasswordVerifier;
+ class MediaDescriptor;
+}
+
namespace oox {
class GraphicHelper;
class ModelObjectHelper;
@@ -110,6 +115,9 @@ public:
const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >&
getGlobalFactory() const;
+ /** Returns the media descriptor. */
+ ::comphelper::MediaDescriptor& getMediaDescriptor() const;
+
/** Returns the document model (always existing). */
const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >&
getModel() const;
@@ -190,8 +198,17 @@ public:
sal_Int32 convertScreenPixelX( double fPixelX ) const;
/** Converts the passed value from vertical screen pixels to 1/100 mm. */
sal_Int32 convertScreenPixelY( double fPixelY ) const;
+
/** Returns a system color specified by the passed XML token identifier. */
- sal_Int32 getSystemColor( sal_Int32 nToken, sal_Int32 nDefaultRgb = -1 ) const;
+ sal_Int32 getSystemColor( sal_Int32 nToken, sal_Int32 nDefaultRgb = API_RGB_TRANSPARENT ) const;
+ /** Derived classes may implement to resolve a scheme color from the passed XML token identifier. */
+ virtual sal_Int32 getSchemeColor( sal_Int32 nToken ) const;
+ /** Derived classes may implement to resolve a palette index to an RGB color. */
+ virtual sal_Int32 getPaletteColor( sal_Int32 nPaletteIdx ) const;
+
+ /** Requests a password from the media descriptor or from the user. On
+ success, the password will be inserted into the media descriptor. */
+ ::rtl::OUString requestPassword( ::comphelper::IDocPasswordVerifier& rVerifier ) const;
/** Imports the raw binary data from the specified stream.
@return True, if the data could be imported from the stream. */
@@ -251,19 +268,29 @@ public:
// com.sun.star.document.XFilter interface --------------------------------
virtual sal_Bool SAL_CALL filter(
- const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rDescriptor )
+ const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rMediaDescSeq )
throw( ::com::sun::star::uno::RuntimeException );
virtual void SAL_CALL cancel()
throw( ::com::sun::star::uno::RuntimeException );
// ------------------------------------------------------------------------
+protected:
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >
+ implGetInputStream( ::comphelper::MediaDescriptor& rMediaDesc ) const;
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >
+ implGetOutputStream( ::comphelper::MediaDescriptor& rMediaDesc ) const;
+
private:
+ void setMediaDescriptor(
+ const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rMediaDescSeq );
+
virtual ::rtl::OUString implGetImplementationName() const = 0;
virtual StorageRef implCreateStorage(
- ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStream,
- ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& rxOutStream ) const = 0;
+ const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStream ) const = 0;
+ virtual StorageRef implCreateStorage(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& rxOutStream ) const = 0;
private:
::std::auto_ptr< FilterBaseImpl > mxImpl;
diff --git a/oox/inc/oox/core/filterdetect.hxx b/oox/inc/oox/core/filterdetect.hxx
new file mode 100644
index 000000000000..bd9e3a84ff3a
--- /dev/null
+++ b/oox/inc/oox/core/filterdetect.hxx
@@ -0,0 +1,168 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: filterdetect.hxx,v $
+ * $Revision: 1.1 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef OOX_CORE_FILTERDETECT_HXX
+#define OOX_CORE_FILTERDETECT_HXX
+
+#include <vector>
+#include <com/sun/star/document/XExtendedFilterDetection.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/xml/sax/XFastDocumentHandler.hpp>
+#include <cppuhelper/implbase1.hxx>
+#include <cppuhelper/implbase2.hxx>
+#include "oox/dllapi.h"
+
+namespace com { namespace sun { namespace star {
+ namespace io { class XInputStream; }
+} } }
+
+namespace comphelper { class MediaDescriptor; }
+namespace oox { class AttributeList; }
+
+namespace oox {
+namespace core {
+
+// ============================================================================
+
+/** Document handler specifically designed for detecting OOXML file formats.
+
+ It takes a reference to the filter string object via its constructor, and
+ puts the name of the detected filter to it, if it successfully finds one.
+ */
+class FilterDetectDocHandler : public ::cppu::WeakImplHelper1< ::com::sun::star::xml::sax::XFastDocumentHandler >
+{
+public:
+ explicit FilterDetectDocHandler( ::rtl::OUString& rFilter );
+ virtual ~FilterDetectDocHandler();
+
+ // XFastDocumentHandler
+ virtual void SAL_CALL startDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setDocumentLocator( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XLocator >& xLocator ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
+
+ // XFastContextHandler
+ virtual void SAL_CALL startFastElement( sal_Int32 nElement, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL startUnknownElement( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL endFastElement( sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL endUnknownElement( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< XFastContextHandler > SAL_CALL createUnknownChildContext( const ::rtl::OUString& Namespace, const ::rtl::OUString& Name, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL characters( const ::rtl::OUString& aChars ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL ignorableWhitespace( const ::rtl::OUString& aWhitespaces ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL processingInstruction( const ::rtl::OUString& aTarget, const ::rtl::OUString& aData ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
+
+private:
+ void parseRelationship( const AttributeList& rAttribs );
+
+ ::rtl::OUString getFilterNameFromContentType( const ::rtl::OUString& rContentType ) const;
+ void parseContentTypesDefault( const AttributeList& rAttribs );
+ void parseContentTypesOverride( const AttributeList& rAttribs );
+
+private:
+ typedef ::std::vector< sal_Int32 > ContextVector;
+
+ ::rtl::OUString& mrFilterName;
+ ContextVector maContextStack;
+ ::rtl::OUString maTargetPath;
+};
+
+// ============================================================================
+
+class OOX_DLLPUBLIC FilterDetect : public ::cppu::WeakImplHelper2< ::com::sun::star::document::XExtendedFilterDetection, ::com::sun::star::lang::XServiceInfo >
+{
+public:
+ explicit FilterDetect( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory );
+ virtual ~FilterDetect();
+
+ /** Tries to extract an unencrypted ZIP package from the passed media
+ descriptor.
+
+ First, this function checks if the input stream provided by the media
+ descriptor property 'InputStream' contains a ZIP package. If yes, this
+ stream is returned.
+
+ Second, this function checks if the 'ComponentData' property exists and
+ contains a sequence of com.sun.star.beans.NamedValue. If yes, a named
+ value is searched with the name 'DecryptedPackage' and a value of type
+ com.sun.star.io.XStream. If the input stream provided by this XStream
+ contains a ZIP package, this input stream is returned.
+
+ Third, this function checks if the input stream of the media descriptor
+ contains an OLE package. If yes, it checks the existence of the streams
+ 'EncryptionInfo' and 'EncyptedPackage' and tries to decrypt the package
+ into a temporary file. This may include requesting a password from the
+ media descriptor property 'Password' or from the user, using the
+ interaction handler provided by the descriptor. On success, and if the
+ decrypted package is a ZIP package, the XStream of the temporary file
+ is stored in the property 'ComponentData' of the media descriptor and
+ its input stream is returned.
+ */
+ ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >
+ extractUnencryptedPackage( ::comphelper::MediaDescriptor& rMediaDesc ) const;
+
+ // com.sun.star.lang.XServiceInfo interface -------------------------------
+
+ virtual ::rtl::OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException );
+ virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& rServiceName ) throw( ::com::sun::star::uno::RuntimeException );
+ virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException );
+
+ // com.sun.star.document.XExtendedFilterDetection interface ---------------
+
+ /** Detects MS Office 2007 file types and supports package decryption.
+
+ The following file types are detected:
+ - MS Word 2007 XML Document (*.docx, *.docm)
+ - MS Word 2007 XML Template (*.dotx, *.dotm)
+ - MS Excel 2007 XML Document (*.xlsx, *.xlsm)
+ - MS Excel 2007 BIFF12 Document (*.xlsb)
+ - MS Excel 2007 XML Template (*.xltx, *.xltm)
+ - MS Powerpoint 2007 XML Document (*.pptx, *.pptm)
+ - MS Powerpoint 2007 XML Template (*.potx, *.potm)
+
+ If the package is encrypted, the detection tries to decrypt it into a
+ temporary file. The user may be asked for a password. The XStream
+ interface of the temporary file will be stored in the 'ComponentData'
+ property of the passed media descriptor.
+ */
+ virtual ::rtl::OUString SAL_CALL detect(
+ ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rMediaDescSeq )
+ throw( ::com::sun::star::uno::RuntimeException );
+
+private:
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxFactory;
+};
+
+// ============================================================================
+
+} // namespace core
+} // namespace oox
+
+#endif
+
diff --git a/oox/inc/oox/core/xmlfilterbase.hxx b/oox/inc/oox/core/xmlfilterbase.hxx
index 40fc54bb5039..510b00ea81fc 100644
--- a/oox/inc/oox/core/xmlfilterbase.hxx
+++ b/oox/inc/oox/core/xmlfilterbase.hxx
@@ -44,6 +44,7 @@
namespace com { namespace sun { namespace star {
namespace container { class XNameContainer; }
+ namespace document { class XDocumentProperties; }
namespace xml { namespace sax { class XLocator; } }
namespace xml { namespace sax { class XFastDocumentHandler; } }
} } }
@@ -86,9 +87,6 @@ public:
virtual const ::oox::drawingml::Theme*
getCurrentTheme() const = 0;
- /** Has to be implemented by each filter to resolve scheme colors. */
- virtual sal_Int32 getSchemeClr( sal_Int32 nColorSchemeToken ) const = 0;
-
/** Has to be implemented by each filter to return the collection of VML shapes. */
virtual ::oox::vml::Drawing* getVmlDrawing() = 0;
@@ -195,10 +193,23 @@ public:
inline ::rtl::OString GetUniqueIdOString() { return ::rtl::OString::valueOf( mnMaxDocId++ ); }
inline ::rtl::OUString GetUniqueIdOUString() { return ::rtl::OUString::valueOf( mnMaxDocId++ ); }
+ /** Write the document properties into into the current OPC package.
+
+ @param xProperties The document properties to export.
+
+ @return *this
+ */
+ XmlFilterBase& exportDocumentProperties( ::com::sun::star::uno::Reference< ::com::sun::star::document::XDocumentProperties > xProperties );
+
+protected:
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >
+ implGetInputStream( ::comphelper::MediaDescriptor& rMediaDesc ) const;
+
private:
virtual StorageRef implCreateStorage(
- ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStream,
- ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& rxOutStream ) const;
+ const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStream ) const;
+ virtual StorageRef implCreateStorage(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& rxOutStream ) const;
private:
::std::auto_ptr< XmlFilterBaseImpl > mxImpl;
diff --git a/oox/inc/oox/drawingml/color.hxx b/oox/inc/oox/drawingml/color.hxx
index 91fddf0be69f..b1de124adad5 100644
--- a/oox/inc/oox/drawingml/color.hxx
+++ b/oox/inc/oox/drawingml/color.hxx
@@ -34,10 +34,11 @@
#include <vector>
#include <boost/shared_ptr.hpp>
#include <sal/types.h>
+#include <rtl/instance.hxx>
+#include <rtl/ustring.hxx>
+#include "oox/helper/helper.hxx"
-namespace oox { namespace core {
- class XmlFilterBase;
-} }
+namespace oox { namespace core { class FilterBase; } }
namespace oox {
namespace drawingml {
@@ -50,6 +51,11 @@ public:
Color();
~Color();
+ /** Returns the RGB value for the passed DrawingML color token, or nDefaultRgb on error. */
+ static sal_Int32 getDmlPresetColor( sal_Int32 nToken, sal_Int32 nDefaultRgb );
+ /** Returns the RGB value for the passed VML color token, or nDefaultRgb on error. */
+ static sal_Int32 getVmlPresetColor( sal_Int32 nToken, sal_Int32 nDefaultRgb );
+
/** Sets the color to unused state. */
void setUnused();
/** Sets an RGB value (hexadecimal RRGGBB) from the a:srgbClr element. */
@@ -64,6 +70,8 @@ public:
void setSchemeClr( sal_Int32 nToken );
/** Sets a system color from the a:sysClr element. */
void setSysClr( sal_Int32 nToken, sal_Int32 nLastRgb );
+ /** Sets a palette color index. */
+ void setPaletteClr( sal_Int32 nPaletteIdx );
/** Inserts the passed color transformation. */
void addTransformation( sal_Int32 nElement, sal_Int32 nValue = -1 );
@@ -71,17 +79,21 @@ public:
void addChartTintTransformation( double fTint );
/** Inserts Excel specific color tint (-1.0...0.0 = shade, 0.0...1.0 = tint). */
void addExcelTintTransformation( double fTint );
+ /** Removes all color transformations. */
+ void clearTransformations();
+ /** Removes transparence from the color. */
+ void clearTransparence();
/** Overwrites this color with the passed color, if it is used. */
inline void assignIfUsed( const Color& rColor ) { if( rColor.isUsed() ) *this = rColor; }
- /** Removes transparence from the color. */
- void clearTransparence();
/** Returns true, if the color is initialized. */
bool isUsed() const { return meMode != COLOR_UNUSED; }
+ /** Returns true, if the color is a placeholder color in theme style lists. */
+ bool isPlaceHolder() const { return meMode == COLOR_PH; }
/** Returns the final RGB color value.
@param nPhClr Actual color for the phClr placeholder color used in theme style lists. */
- sal_Int32 getColor( const ::oox::core::XmlFilterBase& rFilter, sal_Int32 nPhClr = -1 ) const;
+ sal_Int32 getColor( const ::oox::core::FilterBase& rFilter, sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const;
/** Returns true, if the color has a transparence set. */
bool hasTransparence() const;
@@ -89,6 +101,9 @@ public:
sal_Int16 getTransparence() const;
private:
+ /** Internal helper for getColor(). */
+ void setResolvedRgb( sal_Int32 nRgb ) const;
+
/** Converts the color components to RGB values. */
void toRgb() const;
/** Converts the color components to CRGB values (gamma corrected percentage). */
@@ -104,8 +119,9 @@ private:
COLOR_CRGB, /// Relative RGB (r/g/b: 0...100000).
COLOR_HSL, /// HSL (hue: 0...21600000, sat/lum: 0...100000).
COLOR_SCHEME, /// Color from scheme.
- COLOR_PH, /// Placeholder color in theme style lists.
+ COLOR_PALETTE, /// Color from application defined palette.
COLOR_SYSTEM, /// Color from system palette.
+ COLOR_PH, /// Placeholder color in theme style lists.
COLOR_FINAL /// Finalized RGB color.
};
@@ -120,7 +136,7 @@ private:
mutable ColorMode meMode; /// Current color mode.
mutable TransformVec maTransforms; /// Color transformations.
- mutable sal_Int32 mnC1; /// Red, red%, hue, scheme token, system token, or final RGB.
+ mutable sal_Int32 mnC1; /// Red, red%, hue, scheme token, palette index, system token, or final RGB.
mutable sal_Int32 mnC2; /// Green, green%, saturation, or system default RGB.
mutable sal_Int32 mnC3; /// Blue, blue%, or luminance.
sal_Int32 mnAlpha; /// Alpha value (color opacity).
diff --git a/oox/inc/oox/drawingml/customshapeproperties.hxx b/oox/inc/oox/drawingml/customshapeproperties.hxx
index 17a308a6331c..9857a75e4836 100644
--- a/oox/inc/oox/drawingml/customshapeproperties.hxx
+++ b/oox/inc/oox/drawingml/customshapeproperties.hxx
@@ -72,7 +72,7 @@ public:
virtual ~CustomShapeProperties();
void apply( const CustomShapePropertiesPtr& );
- void pushToPropSet( const ::oox::core::XmlFilterBase& rFilterBase,
+ void pushToPropSet( const ::oox::core::FilterBase& rFilterBase,
const ::com::sun::star::uno::Reference < ::com::sun::star::beans::XPropertySet > & xPropSet,
const ::com::sun::star::uno::Reference < ::com::sun::star::drawing::XShape > & xShape) const;
diff --git a/oox/inc/oox/drawingml/drawingmltypes.hxx b/oox/inc/oox/drawingml/drawingmltypes.hxx
index 59c803d9ddad..77c9e535e3b7 100644
--- a/oox/inc/oox/drawingml/drawingmltypes.hxx
+++ b/oox/inc/oox/drawingml/drawingmltypes.hxx
@@ -43,6 +43,14 @@ namespace drawingml {
// ============================================================================
+const sal_Int32 PER_PERCENT = 1000;
+const sal_Int32 MAX_PERCENT = 100 * PER_PERCENT;
+
+const sal_Int32 PER_DEGREE = 60000;
+const sal_Int32 MAX_DEGREE = 360 * PER_DEGREE;
+
+// ============================================================================
+
struct LineProperties;
typedef ::boost::shared_ptr< LineProperties > LinePropertiesPtr;
diff --git a/oox/inc/oox/drawingml/fillproperties.hxx b/oox/inc/oox/drawingml/fillproperties.hxx
index 9190b87e0e53..9504da617083 100644
--- a/oox/inc/oox/drawingml/fillproperties.hxx
+++ b/oox/inc/oox/drawingml/fillproperties.hxx
@@ -159,18 +159,20 @@ struct FillProperties
/** Writes the properties to the passed property map. */
void pushToPropMap(
PropertyMap& rPropMap,
- const FillPropertyIds& rPropIds,
- const ::oox::core::XmlFilterBase& rFilter,
+ const ::oox::core::FilterBase& rFilter,
ModelObjectHelper& rModelObjHelper,
- sal_Int32 nShapeRotation, sal_Int32 nPhClr ) const;
+ const FillPropertyIds& rPropIds = DEFAULT_IDS,
+ sal_Int32 nShapeRotation = 0,
+ sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const;
/** Writes the properties to the passed property set. */
void pushToPropSet(
PropertySet& rPropSet,
- const FillPropertyIds& rPropIds,
- const ::oox::core::XmlFilterBase& rFilter,
+ const ::oox::core::FilterBase& rFilter,
ModelObjectHelper& rModelObjHelper,
- sal_Int32 nShapeRotation, sal_Int32 nPhClr ) const;
+ const FillPropertyIds& rPropIds = DEFAULT_IDS,
+ sal_Int32 nShapeRotation = 0,
+ sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const;
};
// ============================================================================
@@ -185,14 +187,14 @@ struct GraphicProperties
/** Writes the properties to the passed property map. */
void pushToPropMap(
PropertyMap& rPropMap,
- const ::oox::core::XmlFilterBase& rFilter,
- sal_Int32 nPhClr ) const;
+ const ::oox::core::FilterBase& rFilter,
+ sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const;
/** Writes the properties to the passed property set. */
void pushToPropSet(
PropertySet& rPropSet,
- const ::oox::core::XmlFilterBase& rFilter,
- sal_Int32 nPhClr ) const;
+ const ::oox::core::FilterBase& rFilter,
+ sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const;
};
// ============================================================================
diff --git a/oox/inc/oox/drawingml/lineproperties.hxx b/oox/inc/oox/drawingml/lineproperties.hxx
index 2aa9ac7fedeb..db337c520092 100644
--- a/oox/inc/oox/drawingml/lineproperties.hxx
+++ b/oox/inc/oox/drawingml/lineproperties.hxx
@@ -86,11 +86,16 @@ struct LineArrowProperties
struct LineProperties
{
+ typedef ::std::pair< sal_Int32, sal_Int32 > DashStop;
+ typedef ::std::vector< DashStop > DashStopVector;
+
LineArrowProperties maStartArrow; /// Start line arrow style.
LineArrowProperties maEndArrow; /// End line arrow style.
FillProperties maLineFill; /// Line fill (solid, gradient, ...).
+ DashStopVector maCustomDash; /// User-defined line dash style.
OptValue< sal_Int32 > moLineWidth; /// Line width (EMUs).
OptValue< sal_Int32 > moPresetDash; /// Preset dash (OOXML token).
+ OptValue< sal_Int32 > moLineCompound; /// Line compound type (OOXML token).
OptValue< sal_Int32 > moLineCap; /// Line cap (OOXML token).
OptValue< sal_Int32 > moLineJoint; /// Line joint type (OOXML token).
@@ -102,18 +107,18 @@ struct LineProperties
/** Writes the properties to the passed property map. */
void pushToPropMap(
PropertyMap& rPropMap,
- const LinePropertyIds& rPropIds,
- const ::oox::core::XmlFilterBase& rFilter,
+ const ::oox::core::FilterBase& rFilter,
ModelObjectHelper& rModelObjHelper,
- sal_Int32 nPhClr ) const;
+ const LinePropertyIds& rPropIds = DEFAULT_IDS,
+ sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const;
/** Writes the properties to the passed property map. */
void pushToPropSet(
PropertySet& rPropSet,
- const LinePropertyIds& rPropIds,
- const ::oox::core::XmlFilterBase& rFilter,
+ const ::oox::core::FilterBase& rFilter,
ModelObjectHelper& rModelObjHelper,
- sal_Int32 nPhClr ) const;
+ const LinePropertyIds& rPropIds = DEFAULT_IDS,
+ sal_Int32 nPhClr = API_RGB_TRANSPARENT ) const;
};
// ============================================================================
diff --git a/oox/inc/oox/dump/dumperbase.hxx b/oox/inc/oox/dump/dumperbase.hxx
index 9128d89d0f41..b4f88a21638d 100644
--- a/oox/inc/oox/dump/dumperbase.hxx
+++ b/oox/inc/oox/dump/dumperbase.hxx
@@ -41,6 +41,7 @@
#include <rtl/ustrbuf.hxx>
#include <com/sun/star/uno/Reference.hxx>
#include <com/sun/star/util/DateTime.hpp>
+#include <comphelper/mediadescriptor.hxx>
#include "oox/helper/helper.hxx"
#include "oox/helper/storagebase.hxx"
#include "oox/helper/binaryinputstream.hxx"
@@ -57,6 +58,10 @@ namespace com { namespace sun { namespace star {
namespace lang { class XMultiServiceFactory; }
} } }
+namespace comphelper {
+ class IDocPasswordVerifier;
+}
+
namespace oox {
class BinaryOutputStream;
}
@@ -891,7 +896,8 @@ public:
const ::rtl::OUString& rFileName,
const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory,
const StorageRef& rxRootStrg,
- const ::rtl::OUString& rSysFileName );
+ const ::rtl::OUString& rSysFileName,
+ ::comphelper::MediaDescriptor& rMediaDesc );
virtual ~SharedConfigData();
@@ -908,6 +914,9 @@ public:
void eraseNameList( const ::rtl::OUString& rListName );
NameListRef getNameList( const ::rtl::OUString& rListName ) const;
+ ::rtl::OUString requestPassword( ::comphelper::IDocPasswordVerifier& rVerifier );
+ inline bool isPasswordCancelled() const { return mbPwCancelled; }
+
protected:
virtual bool implIsValid() const;
virtual void implProcessConfigItemStr(
@@ -930,11 +939,13 @@ private:
::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxFactory;
StorageRef mxRootStrg;
::rtl::OUString maSysFileName;
+ ::comphelper::MediaDescriptor& mrMediaDesc;
ConfigFileSet maConfigFiles;
ConfigDataMap maConfigData;
NameListMap maNameLists;
::rtl::OUString maConfigPath;
bool mbLoaded;
+ bool mbPwCancelled;
};
// ----------------------------------------------------------------------------
@@ -972,7 +983,8 @@ public:
const sal_Char* pcEnvVar,
const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory,
const StorageRef& rxRootStrg,
- const ::rtl::OUString& rSysFileName );
+ const ::rtl::OUString& rSysFileName,
+ ::comphelper::MediaDescriptor& rMediaDesc );
virtual ~Config();
@@ -1003,6 +1015,9 @@ public:
template< typename Type >
bool hasName( const NameListWrapper& rListWrp, Type nKey ) const;
+ ::rtl::OUString requestPassword( ::comphelper::IDocPasswordVerifier& rVerifier );
+ bool isPasswordCancelled() const;
+
protected:
inline explicit Config() {}
void construct( const Config& rParent );
@@ -1013,7 +1028,8 @@ protected:
const sal_Char* pcEnvVar,
const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFactory,
const StorageRef& rxRootStrg,
- const ::rtl::OUString& rSysFileName );
+ const ::rtl::OUString& rSysFileName,
+ ::comphelper::MediaDescriptor& rMediaDesc );
virtual bool implIsValid() const;
virtual const ::rtl::OUString* implGetOption( const ::rtl::OUString& rKey ) const;
@@ -1847,11 +1863,6 @@ class RecordObjectBase : public InputObjectBase
protected:
inline explicit RecordObjectBase() {}
- inline sal_Int64 getRecPos() const { return mnRecPos; }
- inline sal_Int64 getRecId() const { return mnRecId; }
- inline sal_Int64 getRecSize() const { return mnRecSize; }
- inline NameListRef getRecNames() const { return maRecNames.getNameList( cfg() ); }
-
using InputObjectBase::construct;
void construct(
const ObjectBase& rParent,
@@ -1867,6 +1878,14 @@ protected:
const String& rRecNames,
const String& rSimpleRecs = EMPTY_STRING );
+ inline sal_Int64 getRecPos() const { return mnRecPos; }
+ inline sal_Int64 getRecId() const { return mnRecId; }
+ inline sal_Int64 getRecSize() const { return mnRecSize; }
+ inline NameListRef getRecNames() const { return maRecNames.getNameList( cfg() ); }
+
+ inline void setBinaryOnlyMode( bool bBinaryOnly ) { mbBinaryOnly = bBinaryOnly; }
+ inline bool isBinaryOnlyMode() const { return mbBinaryOnly; }
+
virtual bool implIsValid() const;
virtual void implDump();
@@ -1890,6 +1909,7 @@ private:
sal_Int64 mnRecId;
sal_Int64 mnRecSize;
bool mbShowRecPos;
+ bool mbBinaryOnly;
};
// ============================================================================
@@ -1947,6 +1967,7 @@ public:
virtual ~DumperBase();
bool isImportEnabled() const;
+ bool isImportCancelled() const;
protected:
inline explicit DumperBase() {}
@@ -1961,12 +1982,13 @@ protected:
} // namespace dump
} // namespace oox
-#define OOX_DUMP_FILE( DumperClassName ) \
-do { \
- DumperClassName aDumper( *this ); \
- aDumper.dump(); \
- if( !aDumper.isImportEnabled() ) \
- return aDumper.isValid(); \
+#define OOX_DUMP_FILE( DumperClassName ) \
+do { \
+ DumperClassName aDumper( *this ); \
+ aDumper.dump(); \
+ bool bCancelled = aDumper.isImportCancelled(); \
+ if( !aDumper.isImportEnabled() || bCancelled ) \
+ return aDumper.isValid() && !bCancelled; \
} while( false )
#else // OOX_INCLUDE_DUMPER
diff --git a/oox/inc/oox/export/drawingml.hxx b/oox/inc/oox/export/drawingml.hxx
new file mode 100644
index 000000000000..0859b15136d9
--- /dev/null
+++ b/oox/inc/oox/export/drawingml.hxx
@@ -0,0 +1,115 @@
+#ifndef _OOX_EXPORT_DRAWINGML_HXX_
+#define _OOX_EXPORT_DRAWINGML_HXX_
+
+#include <oox/dllapi.h>
+#include <sax/fshelper.hxx>
+#include <rtl/strbuf.hxx>
+#include <com/sun/star/awt/FontDescriptor.hpp>
+#include <com/sun/star/uno/XReference.hpp>
+#include <tools/poly.hxx>
+#include <svx/escherex.hxx>
+
+class Graphic;
+class String;
+
+namespace com { namespace sun { namespace star {
+namespace beans {
+ class XPropertySet;
+ class XPropertyState;
+}
+namespace drawing {
+ class XShape;
+}
+namespace text {
+ class XTextContent;
+ class XTextRange;
+}
+}}}
+
+namespace oox {
+namespace core {
+ class XmlFilterBase;
+}
+
+namespace drawingml {
+
+class OOX_DLLPUBLIC DrawingML {
+public:
+ enum DocumentType { DOCUMENT_DOCX, DOCUMENT_PPTX, DOCUMENT_XLSX };
+
+private:
+ ::sax_fastparser::FSHelperPtr mpFS;
+ ::oox::core::XmlFilterBase* mpFB;
+
+ static int mnImageCounter;
+
+ /// To specify where write eg. the images to (like 'ppt', or 'word' - according to the OPC).
+ DocumentType meDocumentType;
+
+protected:
+ ::com::sun::star::uno::Any mAny;
+
+ bool GetProperty( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, String aName );
+ bool GetPropertyAndState( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet,
+ ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState > rXPropState,
+ String aName, ::com::sun::star::beans::PropertyState& eState );
+ const char* GetFieldType( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > rRun );
+
+ rtl::OUString WriteImage( const rtl::OUString& rURL );
+
+public:
+ DrawingML( ::sax_fastparser::FSHelperPtr pFS, ::oox::core::XmlFilterBase* pFB = NULL, DocumentType eDocumentType = DOCUMENT_PPTX ) : mpFS( pFS ), mpFB( pFB ), meDocumentType( eDocumentType ) {}
+ void SetFS( ::sax_fastparser::FSHelperPtr pFS ) { mpFS = pFS; }
+ ::sax_fastparser::FSHelperPtr GetFS() { return mpFS; }
+ ::oox::core::XmlFilterBase* GetFB() { return mpFB; }
+
+ rtl::OUString WriteImage( const Graphic &rGraphic );
+
+ void WriteColor( sal_uInt32 nColor );
+ void WriteGradientStop( sal_uInt16 nStop, sal_uInt32 nColor );
+ void WriteLineArrow( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, sal_Bool bLineStart );
+ void WriteConnectorConnections( EscherConnectorListEntry& rConnectorEntry, sal_Int32 nStartID, sal_Int32 nEndID );
+
+ void WriteSolidFill( sal_uInt32 nColor );
+ void WriteSolidFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet );
+ void WriteGradientFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet );
+ void WriteBlipFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, String sURLPropName, sal_Int32 nXmlNamespace );
+ void WriteBlipFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet, String sURLPropName );
+ void WriteOutline( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet );
+ void WriteStretch();
+
+ ::rtl::OUString WriteBlip( ::rtl::OUString& rURL );
+ void WriteBlipMode( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet );
+
+ void WriteShapeTransformation( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > rXShape,
+ sal_Bool bFlipH = false, sal_Bool bFlipV = false, sal_Int32 nRotation = 0 );
+ void WriteTransformation( const Rectangle& rRectangle,
+ sal_Bool bFlipH = false, sal_Bool bFlipV = false, sal_Int32 nRotation = 0 );
+
+ void WriteText( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > rXShape );
+ void WriteParagraph( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > rParagraph );
+ void WriteParagraphProperties( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > rParagraph );
+ void WriteParagraphNumbering( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > rXPropSet,
+ sal_Int16 nLevel );
+ void WriteRun( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > rRun );
+ void WriteRunProperties( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > rRun );
+
+ void WritePresetShape( const char* pShape );
+ void WritePresetShape( const char* pShape, MSO_SPT eShapeType, sal_Bool bPredefinedHandlesUsed, sal_Int32 nAdjustmentsWhichNeedsToBeConverted, const ::com::sun::star::beans::PropertyValue& rProp );
+ void WritePolyPolygon( const PolyPolygon& rPolyPolygon );
+
+ static void ResetCounters();
+
+ void GetUUID( ::rtl::OStringBuffer& rBuffer );
+
+ static sal_Unicode SubstituteBullet( sal_Unicode cBulletId, ::com::sun::star::awt::FontDescriptor& rFontDesc );
+
+ sal_uInt32 ColorWithIntensity( sal_uInt32 nColor, sal_uInt32 nIntensity );
+
+ static const char* GetAlignment( sal_Int32 nAlignment );
+};
+
+}
+}
+
+#endif
diff --git a/oox/inc/oox/export/shapes.hxx b/oox/inc/oox/export/shapes.hxx
new file mode 100644
index 000000000000..40b87c43316a
--- /dev/null
+++ b/oox/inc/oox/export/shapes.hxx
@@ -0,0 +1,165 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile$
+ * $Revision$
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OOX_EXPORT_SHAPES_HXX_
+#define _OOX_EXPORT_SHAPES_HXX_
+
+#include <oox/dllapi.h>
+#include <com/sun/star/uno/XReference.hpp>
+#include <oox/export/drawingml.hxx>
+#include <sax/fshelper.hxx>
+#include <vcl/mapmod.hxx>
+#include <hash_map>
+
+namespace com { namespace sun { namespace star {
+namespace beans {
+ class XPropertySet;
+}
+namespace drawing {
+ class XShape;
+ class XShapes;
+}
+}}}
+
+namespace oox { namespace drawingml {
+
+class OOX_DLLPUBLIC ShapeExport : public DrawingML {
+private:
+ sal_Int32 mnXmlNamespace;
+ sal_Int32 mnShapeIdMax, mnPictureIdMax;
+ Fraction maFraction;
+ MapMode maMapModeSrc, maMapModeDest;
+
+ ::com::sun::star::awt::Size MapSize( const ::com::sun::star::awt::Size& ) const;
+
+ struct ShapeCheck
+ {
+ bool operator()( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape> s1, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape> s2 ) const
+ {
+ return s1 == s2;
+ }
+ };
+
+ struct ShapeHash
+ {
+ std::hash<const char*> maHashFunction;
+
+ size_t operator()( const ::com::sun::star::uno::Reference < ::com::sun::star::drawing::XShape > ) const;
+ };
+
+ typedef std::hash_map< const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape>, sal_Int32, ShapeHash, ShapeCheck> ShapeHashMap;
+ ShapeHashMap maShapeMap;
+
+public:
+ ShapeExport( sal_Int32 nXmlNamespace, ::sax_fastparser::FSHelperPtr pFS, ::oox::core::XmlFilterBase* pFB = NULL, DocumentType eDocumentType = DOCUMENT_PPTX );
+ virtual ~ShapeExport() {}
+
+ sal_Int32 GetXmlNamespace() const;
+ ShapeExport& SetXmlNamespace( sal_Int32 nXmlNamespace );
+
+ static sal_Bool NonEmptyText( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+
+ virtual ShapeExport&
+ WriteBezierShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, sal_Bool bClosed );
+ virtual ShapeExport&
+ WriteClosedBezierShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+ virtual ShapeExport&
+ WriteConnectorShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+ virtual ShapeExport&
+ WriteCustomShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+ virtual ShapeExport&
+ WriteEllipseShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+ virtual ShapeExport&
+ WriteFill( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xPropSet );
+ virtual ShapeExport&
+ WriteGraphicObjectShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+ virtual ShapeExport&
+ WriteLineShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+ virtual ShapeExport&
+ WriteNonVisualDrawingProperties( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, const char* sName );
+ virtual ShapeExport&
+ WriteNonVisualProperties( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+ virtual ShapeExport&
+ WriteOpenBezierShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+ virtual ShapeExport&
+ WriteRectangleShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+
+ /**
+ * Write the DrawingML for a particular shape.
+ *
+ * <p>This is the member function you want. It performs the type lookup and
+ * invokes the appropriate corresponding Write*() method for the specific
+ * type.</p>
+ *
+ * <p>To write an XShape, XShape::getShapeType() is called to determine
+ * the shape type, and the corresponding method in this table is
+ * invoked:</p>
+ *
+ * <table>
+ * <tr><th>Shape Type</th><th>Method</th></tr>
+ * <tr><td><tt>com.sun.star.drawing.ClosedBezierShape</tt></td> <td>ShapeExport::WriteClosedBezierShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.CustomShape</tt></td> <td>ShapeExport::WriteCustomShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.EllipseShape</tt></td> <td>ShapeExport::WriteEllipseShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.GraphicObjectShape</tt></td> <td>ShapeExport::WriteGraphicObjectShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.LineShape</tt></td> <td>ShapeExport::WriteLineShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.OpenBezierShape</tt></td> <td>ShapeExport::WriteOpenBezierShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.RectangleShape</tt></td> <td>ShapeExport::WriteRectangleShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.TextShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.DateTimeShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.FooterShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.HeaderShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.NotesShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.OutlinerShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.SlideNumberShape</tt></td><td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.TitleTextShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * </table>
+ *
+ * <p>If the shape type is not recognized, then
+ * <tt>ShapeExport::WriteUnknownShape</tt> is called.</p>
+ *
+ * @param xShape The shape to export as DrawingML.
+ * @return <tt>*this</tt>
+ */
+ virtual ShapeExport&
+ WriteShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+ virtual ShapeExport&
+ WriteTextBox( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+ virtual ShapeExport&
+ WriteTextShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+ virtual ShapeExport&
+ WriteUnknownShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
+
+ sal_Int32 GetNewShapeID( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > rShape );
+ sal_Int32 GetShapeID( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > rShape );
+};
+
+}}
+
+#endif /* ndef _OOX_EXPORT_SHAPES_HXX_ */
diff --git a/oox/inc/oox/export/utils.hxx b/oox/inc/oox/export/utils.hxx
new file mode 100644
index 000000000000..50631053dc8d
--- /dev/null
+++ b/oox/inc/oox/export/utils.hxx
@@ -0,0 +1,73 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile$
+ * $Revision$
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OOX_EXPORT_UTILS_HXX_
+#define _OOX_EXPORT_UTILS_HXX_
+
+#define S(x) String( RTL_CONSTASCII_USTRINGPARAM( x ) )
+#define US(x) OUString( RTL_CONSTASCII_USTRINGPARAM( x ))
+#define I32S(x) OString::valueOf( (sal_Int32) x ).getStr()
+#define I64S(x) OString::valueOf( (sal_Int64) x ).getStr()
+#define H32S(x) OString::valueOf( (sal_Int32) x, 16 ).getStr()
+#define H64S(x) OString::valueOf( (sal_Int64) x, 16 ).getStr()
+#define IS(x) OString::valueOf( x ).getStr()
+#define USS(x) OUStringToOString( x, RTL_TEXTENCODING_UTF8 ).getStr()
+#define ST(x) ByteString( x, RTL_TEXTENCODING_UTF8 ).GetBuffer()
+
+#ifndef DBG
+# if OSL_DEBUG_LEVEL > 0
+# define DBG(x) x
+# else
+# define DBG(x)
+# endif
+#endif
+
+// ---------------------------------------------------------------------------------------------
+
+static inline sal_Int64 PPTtoEMU( INT32 nPPT )
+{
+ return (sal_Int64)( (double)nPPT * 1587.5 );
+}
+
+// ---------------------------------------------------------------------------------------------
+
+static inline sal_Int64 MM100toEMU( INT32 nMM100 )
+{
+ return (sal_Int64)nMM100 * 360;
+}
+
+// ---------------------------------------------------------------------------------------------
+
+static inline sal_Int64 TwipsToEMU( sal_Int32 nTwips )
+{
+ return sal_Int64( nTwips ) * 635;
+}
+
+#endif
diff --git a/oox/inc/oox/export/vmlexport.hxx b/oox/inc/oox/export/vmlexport.hxx
new file mode 100644
index 000000000000..f349b99f466f
--- /dev/null
+++ b/oox/inc/oox/export/vmlexport.hxx
@@ -0,0 +1,118 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile$
+ * $Revision$
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <oox/dllapi.h>
+#include <sax/fshelper.hxx>
+#include <svx/escherex.hxx>
+
+namespace rtl {
+ class OString;
+ class OStringBuffer;
+}
+
+namespace oox {
+
+namespace vml {
+
+class OOX_DLLPUBLIC VMLExport : public EscherEx
+{
+ /// Fast serializer to output the data
+ ::sax_fastparser::FSHelperPtr m_pSerializer;
+
+ /// Fill the shape attributes as they come.
+ ::sax_fastparser::FastAttributeList *m_pShapeAttrList;
+
+ /// Remember the shape type.
+ sal_uInt32 m_nShapeType;
+
+ /// Remember the shape flags.
+ sal_uInt32 m_nShapeFlags;
+
+ /// Remember style, the most important shape attribute ;-)
+ rtl::OStringBuffer *m_pShapeStyle;
+
+ /// Remember which shape types we had already written.
+ bool *m_pShapeTypeWritten;
+
+public:
+ VMLExport( ::sax_fastparser::FSHelperPtr pSerializer );
+ virtual ~VMLExport();
+
+ ::sax_fastparser::FSHelperPtr
+ GetFS() { return m_pSerializer; }
+
+ /// Export the sdr object as VML.
+ ///
+ /// Call this when you need to export the object as VML.
+ using EscherEx::AddSdrObject;
+
+protected:
+ /// Add an attribute to the generated <v:shape/> element.
+ ///
+ /// This should be called from within StartShape() to ensure that the
+ /// added attribute is preserved.
+ void AddShapeAttribute( sal_Int32 nAttribute, const rtl::OString& sValue );
+
+ /// Start the shape for which we just collected the information.
+ ///
+ /// Returns the element's tag number, -1 means we wrote nothing.
+ virtual sal_Int32 StartShape();
+
+ /// End the shape.
+ ///
+ /// The parameter is just what we got from StartShape().
+ virtual void EndShape( sal_Int32 nShapeElement );
+
+ virtual void Commit( EscherPropertyContainer& rProps, const Rectangle& rRect );
+
+private:
+
+ virtual void OpenContainer( UINT16 nEscherContainer, int nRecInstance = 0 );
+ virtual void CloseContainer();
+
+ virtual UINT32 EnterGroup( const String& rShapeName, const Rectangle* pBoundRect = 0 );
+ virtual void LeaveGroup();
+
+ virtual void AddShape( UINT32 nShapeType, UINT32 nShapeFlags, UINT32 nShapeId = 0 );
+
+private:
+ /// Create an OString representing the id from a numerical id.
+ static rtl::OString ShapeIdString( sal_uInt32 nId );
+
+ /// Add starting and ending point of a line to the m_pShapeAttrList.
+ void AddLineDimensions( const Rectangle& rRectangle );
+
+ /// Add position and size to the OStringBuffer.
+ void AddRectangleDimensions( rtl::OStringBuffer& rBuffer, const Rectangle& rRectangle );
+};
+
+} // namespace vml
+
+} // namespace oox
diff --git a/oox/inc/oox/helper/containerhelper.hxx b/oox/inc/oox/helper/containerhelper.hxx
index be3736e92a47..b79d243bef01 100644
--- a/oox/inc/oox/helper/containerhelper.hxx
+++ b/oox/inc/oox/helper/containerhelper.hxx
@@ -91,7 +91,7 @@ public:
template< typename FunctorType >
inline void forEach( const FunctorType& rFunctor ) const
{
- ::std::for_each( this->begin(), this->end(), Functor< FunctorType >( rFunctor ) );
+ ::std::for_each( this->begin(), this->end(), ForEachFunctor< FunctorType >( rFunctor ) );
}
/** Calls the passed member function of ObjType on every contained object. */
@@ -115,13 +115,30 @@ public:
forEach( ::boost::bind( pFunc, _1, aParam1, aParam2 ) );
}
+ /** Searches for an element by using the passed functor that takes a
+ constant reference of the object type (const ObjType&). */
+ template< typename FunctorType >
+ inline value_type findIf( const FunctorType& rFunctor ) const
+ {
+ typename container_type::const_iterator aIt = ::std::find_if( this->begin(), this->end(), FindFunctor< FunctorType >( rFunctor ) );
+ return (aIt == this->end()) ? value_type() : *aIt;
+ }
+
private:
template< typename FunctorType >
- struct Functor
+ struct ForEachFunctor
{
const FunctorType& mrFunctor;
- inline explicit Functor( const FunctorType& rFunctor ) : mrFunctor( rFunctor ) {}
- inline void operator()( const value_type& rValue ) const { mrFunctor( *rValue ); }
+ inline explicit ForEachFunctor( const FunctorType& rFunctor ) : mrFunctor( rFunctor ) {}
+ inline void operator()( const value_type& rxValue ) const { if( rxValue.get() ) mrFunctor( *rxValue ); }
+ };
+
+ template< typename FunctorType >
+ struct FindFunctor
+ {
+ const FunctorType& mrFunctor;
+ inline explicit FindFunctor( const FunctorType& rFunctor ) : mrFunctor( rFunctor ) {}
+ inline bool operator()( const value_type& rxValue ) const { return rxValue.get() && mrFunctor( *rxValue ); }
};
inline const value_type* getRef( sal_Int32 nIndex ) const
@@ -170,7 +187,7 @@ public:
template< typename FunctorType >
inline void forEach( const FunctorType& rFunctor ) const
{
- ::std::for_each( this->begin(), this->end(), Functor< FunctorType >( rFunctor ) );
+ ::std::for_each( this->begin(), this->end(), ForEachFunctor< FunctorType >( rFunctor ) );
}
/** Calls the passed member function of ObjType on every contained object. */
@@ -194,13 +211,53 @@ public:
forEach( ::boost::bind( pFunc, _1, aParam1, aParam2 ) );
}
+ /** Calls the passed functor for every contained object. Passes the key as
+ first argument and the object reference as second argument to rFunctor. */
+ template< typename FunctorType >
+ inline void forEachWithKey( const FunctorType& rFunctor ) const
+ {
+ ::std::for_each( this->begin(), this->end(), ForEachFunctorWithKey< FunctorType >( rFunctor ) );
+ }
+
+ /** Calls the passed member function of ObjType on every contained object.
+ Passes the object key as argument to the member function. */
+ template< typename FuncType >
+ inline void forEachMemWithKey( FuncType pFunc ) const
+ {
+ forEachWithKey( ::boost::bind( pFunc, _2, _1 ) );
+ }
+
+ /** Calls the passed member function of ObjType on every contained object.
+ Passes the object key as first argument to the member function. */
+ template< typename FuncType, typename ParamType >
+ inline void forEachMemWithKey( FuncType pFunc, ParamType aParam ) const
+ {
+ forEachWithKey( ::boost::bind( pFunc, _2, _1, aParam ) );
+ }
+
+ /** Calls the passed member function of ObjType on every contained object.
+ Passes the object key as first argument to the member function. */
+ template< typename FuncType, typename ParamType1, typename ParamType2 >
+ inline void forEachMemWithKey( FuncType pFunc, ParamType1 aParam1, ParamType2 aParam2 ) const
+ {
+ forEachWithKey( ::boost::bind( pFunc, _2, _1, aParam1, aParam2 ) );
+ }
+
private:
template< typename FunctorType >
- struct Functor
+ struct ForEachFunctor
+ {
+ const FunctorType& mrFunctor;
+ inline explicit ForEachFunctor( const FunctorType& rFunctor ) : mrFunctor( rFunctor ) {}
+ inline void operator()( const value_type& rValue ) const { if( rValue.second.get() ) mrFunctor( *rValue.second ); }
+ };
+
+ template< typename FunctorType >
+ struct ForEachFunctorWithKey
{
const FunctorType& mrFunctor;
- inline explicit Functor( const FunctorType& rFunctor ) : mrFunctor( rFunctor ) {}
- inline void operator()( const value_type& rValue ) const { mrFunctor( *rValue.second ); }
+ inline explicit ForEachFunctorWithKey( const FunctorType& rFunctor ) : mrFunctor( rFunctor ) {}
+ inline void operator()( const value_type& rValue ) const { if( rValue.second.get() ) mrFunctor( rValue.first, *rValue.second ); }
};
inline const mapped_type* getRef( key_type nKey ) const
diff --git a/oox/inc/oox/helper/helper.hxx b/oox/inc/oox/helper/helper.hxx
index d6e2286fd8ac..f08f807da2a2 100644
--- a/oox/inc/oox/helper/helper.hxx
+++ b/oox/inc/oox/helper/helper.hxx
@@ -104,7 +104,8 @@ inline ReturnType getLimitedValue( Type nValue, Type nMin, Type nMax )
template< typename ReturnType, typename Type >
inline ReturnType getIntervalValue( Type nValue, Type nBegin, Type nEnd )
{
- BOOST_STATIC_ASSERT( ::std::numeric_limits< Type >::is_integer );
+// this BOOST_STATIC_ASSERT fails with suncc
+// BOOST_STATIC_ASSERT( ::std::numeric_limits< Type >::is_integer );
Type nInterval = nEnd - nBegin;
Type nCount = (nValue < nBegin) ? -((nBegin - nValue - 1) / nInterval + 1) : ((nValue - nBegin) / nInterval);
return static_cast< ReturnType >( nValue - nCount * nInterval );
diff --git a/oox/inc/oox/helper/propertymap.hxx b/oox/inc/oox/helper/propertymap.hxx
index a3e84c4b73fe..58a769adbb48 100644
--- a/oox/inc/oox/helper/propertymap.hxx
+++ b/oox/inc/oox/helper/propertymap.hxx
@@ -44,13 +44,7 @@ namespace com { namespace sun { namespace star { namespace beans {
namespace oox {
-// ============================================================================
-
-/** A vector that contains all predefined property names used in the filters. */
-struct PropertyNamesList : public ::std::vector< ::rtl::OUString >
-{
- explicit PropertyNamesList();
-};
+struct PropertyList;
// ============================================================================
@@ -66,6 +60,9 @@ typedef ::std::map< sal_Int32, ::com::sun::star::uno::Any > PropertyMapBase;
class PropertyMap : public PropertyMapBase
{
public:
+ explicit PropertyMap();
+ ~PropertyMap();
+
/** Returns the name of the passed property identifier. */
static const ::rtl::OUString& getPropertyName( sal_Int32 nPropId );
@@ -94,6 +91,9 @@ public:
/** Creates and fills a new instance supporting the XPropertySet interface. */
::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
makePropertySet() const;
+
+private:
+ const PropertyList* mpPropNames;
};
// ============================================================================
diff --git a/oox/inc/oox/ole/axcontrolhelper.hxx b/oox/inc/oox/ole/axcontrolhelper.hxx
index 392a24a2704e..713cbcae362e 100644
--- a/oox/inc/oox/ole/axcontrolhelper.hxx
+++ b/oox/inc/oox/ole/axcontrolhelper.hxx
@@ -83,8 +83,6 @@ protected:
/** Derived classes returns the UNO form of the current context. Called exactly once. */
virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >
createControlForm() const = 0;
- /** Derived classes may implement to resolve a palette index to an RGB color. */
- virtual sal_Int32 getPaletteColor( sal_uInt16 nPaletteIdx ) const;
private:
const ::oox::core::FilterBase& mrFilter;
diff --git a/oox/inc/oox/ppt/pptimport.hxx b/oox/inc/oox/ppt/pptimport.hxx
index d865e48c2569..d6c1d899ac35 100644
--- a/oox/inc/oox/ppt/pptimport.hxx
+++ b/oox/inc/oox/ppt/pptimport.hxx
@@ -56,10 +56,9 @@ public:
virtual bool importDocument() throw();
virtual bool exportDocument() throw();
- virtual const ::oox::drawingml::Theme* getCurrentTheme() const;
-
- virtual sal_Int32 getSchemeClr( sal_Int32 nColorSchemeToken ) const;
+ virtual sal_Int32 getSchemeColor( sal_Int32 nToken ) const;
+ virtual const ::oox::drawingml::Theme* getCurrentTheme() const;
virtual ::oox::vml::Drawing* getVmlDrawing();
virtual const oox::drawingml::table::TableStyleListPtr getTableStyles();
virtual ::oox::drawingml::chart::ChartConverter& getChartConverter();
diff --git a/oox/inc/oox/token/propertylist.hxx b/oox/inc/oox/token/propertylist.hxx
new file mode 100644
index 000000000000..abc776c348f6
--- /dev/null
+++ b/oox/inc/oox/token/propertylist.hxx
@@ -0,0 +1,53 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: propertylist.hxx,v $
+ * $Revision: 1.1 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef OOX_TOKEN_PROPERTYLIST_HXX
+#define OOX_TOKEN_PROPERTYLIST_HXX
+
+#include <vector>
+#include <rtl/ustring.hxx>
+
+namespace oox {
+
+// ============================================================================
+
+/** A vector that contains all predefined property names used in the filters. */
+struct PropertyList : public ::std::vector< ::rtl::OUString >
+{
+ explicit PropertyList();
+ ~PropertyList();
+};
+
+// ============================================================================
+
+} // namespace oox
+
+#endif
+
diff --git a/oox/inc/oox/token/tokenmap.hxx b/oox/inc/oox/token/tokenmap.hxx
new file mode 100644
index 000000000000..e4dd0be121ce
--- /dev/null
+++ b/oox/inc/oox/token/tokenmap.hxx
@@ -0,0 +1,84 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: fasttokenhandler.hxx,v $
+ * $Revision: 1.4 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef OOX_TOKEN_TOKENMAP_HXX
+#define OOX_TOKEN_TOKENMAP_HXX
+
+#include <vector>
+#include <rtl/instance.hxx>
+#include <rtl/ustring.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+
+namespace oox {
+
+// ============================================================================
+
+class TokenMap
+{
+public:
+ explicit TokenMap();
+ ~TokenMap();
+
+ /** Returns the Unicode name of the passed token identifier. */
+ ::rtl::OUString getUnicodeTokenName( sal_Int32 nToken ) const;
+
+ /** Returns the token identifier for the passed Unicode token name. */
+ sal_Int32 getTokenFromUnicode( const ::rtl::OUString& rUnicodeName ) const;
+
+ /** Returns the UTF8 name of the passed token identifier as byte sequence. */
+ ::com::sun::star::uno::Sequence< sal_Int8 >
+ getUtf8TokenName( sal_Int32 nToken ) const;
+
+ /** Returns the token identifier for the passed UTF8 token name. */
+ sal_Int32 getTokenFromUtf8(
+ const ::com::sun::star::uno::Sequence< sal_Int8 >& rUtf8Name ) const;
+
+private:
+ struct TokenName
+ {
+ ::rtl::OUString maUniName;
+ ::com::sun::star::uno::Sequence< sal_Int8 > maUtf8Name;
+ };
+ typedef ::std::vector< TokenName > TokenNameVector;
+
+ TokenNameVector maTokenNames;
+
+};
+
+// ============================================================================
+
+struct StaticTokenMap : public ::rtl::Static< TokenMap, StaticTokenMap > {};
+
+// ============================================================================
+
+} // namespace oox
+
+#endif
+
diff --git a/oox/inc/oox/vml/vmldrawing.hxx b/oox/inc/oox/vml/vmldrawing.hxx
index 4be185bbcd2a..f0bd75046c37 100644
--- a/oox/inc/oox/vml/vmldrawing.hxx
+++ b/oox/inc/oox/vml/vmldrawing.hxx
@@ -47,6 +47,7 @@ namespace oox { namespace ole { class AxControlHelper; } }
namespace oox {
namespace vml {
+class ShapeBase;
class ShapeContainer;
struct ShapeClientData;
@@ -133,6 +134,9 @@ public:
/** Returns the registered info structure for a form control, if extant. */
const ControlInfo* getControlInfo( const ::rtl::OUString& rShapeId ) const;
+ /** Derived classes may disable conversion of specific shapes. */
+ virtual bool isShapeSupported( const ShapeBase& rShape ) const;
+
/** Derived classes may calculate the shape rectangle from a non-standard
anchor information string. */
virtual bool convertShapeClientAnchor(
diff --git a/oox/inc/oox/vml/vmlformatting.hxx b/oox/inc/oox/vml/vmlformatting.hxx
new file mode 100644
index 000000000000..b37da4daa28c
--- /dev/null
+++ b/oox/inc/oox/vml/vmlformatting.hxx
@@ -0,0 +1,187 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: vmlformatting.hxx,v $
+ * $Revision: 1.1 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef OOX_VML_VMLFORMATTING_HXX
+#define OOX_VML_VMLFORMATTING_HXX
+
+#include "oox/helper/helper.hxx"
+
+namespace oox { class PropertyMap; }
+namespace oox { namespace core { class FilterBase; } }
+
+namespace oox {
+namespace vml {
+
+// ============================================================================
+
+typedef ::std::pair< sal_Int32, sal_Int32 > Int32Pair;
+typedef ::std::pair< double, double > DoublePair;
+
+// ============================================================================
+
+class ConversionHelper
+{
+public:
+ /** Returns two values contained in rValue separated by cSep.
+ */
+ static bool separatePair(
+ ::rtl::OUString& orValue1, ::rtl::OUString& orValue2,
+ const ::rtl::OUString& rValue, sal_Unicode cSep );
+
+ /** Returns the boolean value from the passed string of a VML attribute.
+ Supported values: 'f', 't', 'false', 'true'. False for anything else.
+ */
+ static bool decodeBool( const ::rtl::OUString& rValue );
+
+ /** Converts the passed VML percentage measure string to a normalized
+ floating-point value.
+
+ @param rValue The VML percentage value. This is a floating-point value
+ with optional following '%' sign. If the '%' sign is missing, the
+ floating point value will be returned unmodified. If the '%' sign
+ is present, the value will be divided by 100.
+ */
+ static double decodePercent(
+ const ::rtl::OUString& rValue,
+ double fDefValue );
+
+ /** Converts the passed VML measure string to EMU (English Metric Units).
+
+ @param rFilter The core filter object needed to perform pixel
+ conversion according to the current output device.
+
+ @param rValue The VML measure value. This is a floating-point value
+ with optional measure string following the value.
+
+ @param nRefValue Reference value needed for percentage measure.
+
+ @param bPixelX Set to true if the value is oriented horizontally (e.g.
+ X coordinates, widths). Set to false if the value is oriented
+ vertically (e.g. Y coordinates, heights). This is needed because
+ output devices may specify different width and height for a pixel.
+
+ @param bDefaultAsPixel Set to true if omitted measure unit means
+ pixel. Set to false if omitted measure unit means EMU.
+ */
+ static sal_Int32 decodeMeasureToEmu(
+ const ::oox::core::FilterBase& rFilter,
+ const ::rtl::OUString& rValue,
+ sal_Int32 nRefValue,
+ bool bPixelX,
+ bool bDefaultAsPixel );
+
+ /** Converts the passed VML measure string to 1/100 mm.
+
+ @param rFilter See above.
+ @param rValue See above.
+ @param nRefValue See above.
+ @param bPixelX See above.
+ @param bDefaultAsPixel See above.
+ */
+ static sal_Int32 decodeMeasureToHmm(
+ const ::oox::core::FilterBase& rFilter,
+ const ::rtl::OUString& rValue,
+ sal_Int32 nRefValue,
+ bool bPixelX,
+ bool bDefaultAsPixel );
+
+private:
+ ConversionHelper();
+ ~ConversionHelper();
+};
+
+// ============================================================================
+
+/** The stroke arrow model structure contains all properties for an line end arrow. */
+struct StrokeArrowModel
+{
+ OptValue< sal_Int32 > moArrowType;
+ OptValue< sal_Int32 > moArrowWidth;
+ OptValue< sal_Int32 > moArrowLength;
+
+ void assignUsed( const StrokeArrowModel& rSource );
+};
+
+// ============================================================================
+
+/** The stroke model structure contains all shape border properties. */
+struct StrokeModel
+{
+ OptValue< bool > moStroked; /// Shape border line on/off.
+ StrokeArrowModel maStartArrow; /// Start line arrow style.
+ StrokeArrowModel maEndArrow; /// End line arrow style.
+ OptValue< ::rtl::OUString > moColor; /// Solid line color.
+ OptValue< double > moOpacity; /// Solid line color opacity.
+ OptValue< ::rtl::OUString > moWeight; /// Line width.
+ OptValue< ::rtl::OUString > moDashStyle; /// Line dash (predefined or manually).
+ OptValue< sal_Int32 > moLineStyle; /// Line style (single, double, ...).
+ OptValue< sal_Int32 > moEndCap; /// Type of line end cap.
+ OptValue< sal_Int32 > moJoinStyle; /// Type of line join.
+
+ void assignUsed( const StrokeModel& rSource );
+
+ /** Writes the properties to the passed property map. */
+ void pushToPropMap(
+ PropertyMap& rPropMap,
+ const ::oox::core::FilterBase& rFilter ) const;
+};
+
+// ============================================================================
+
+/** The fill model structure contains all shape fill properties. */
+struct FillModel
+{
+ OptValue< bool > moFilled; /// Shape fill on/off.
+ OptValue< ::rtl::OUString > moColor; /// Solid fill color.
+ OptValue< double > moOpacity; /// Solid fill color opacity.
+ OptValue< ::rtl::OUString > moColor2; /// End color of gradient.
+ OptValue< double > moOpacity2; /// End color opycity of gradient.
+ OptValue< sal_Int32 > moType; /// Fill type.
+ OptValue< sal_Int32 > moAngle; /// Gradient rotation angle.
+ OptValue< double > moFocus; /// Linear gradient focus of second color.
+ OptValue< DoublePair > moFocusPos; /// Rectanguar gradient focus position of second color.
+ OptValue< DoublePair > moFocusSize; /// Rectanguar gradient focus size of second color.
+ OptValue< bool > moRotate; /// True = rotate gradient/bitmap with shape.
+
+ void assignUsed( const FillModel& rSource );
+
+ /** Writes the properties to the passed property map. */
+ void pushToPropMap(
+ PropertyMap& rPropMap,
+ const ::oox::core::FilterBase& rFilter ) const;
+};
+
+// ============================================================================
+
+} // namespace vml
+} // namespace oox
+
+#endif
+
diff --git a/oox/inc/oox/vml/vmlshape.hxx b/oox/inc/oox/vml/vmlshape.hxx
index f4719f4c1d97..323e643cee50 100644
--- a/oox/inc/oox/vml/vmlshape.hxx
+++ b/oox/inc/oox/vml/vmlshape.hxx
@@ -34,7 +34,7 @@
#include <memory>
#include <vector>
#include <com/sun/star/awt/Point.hpp>
-#include "oox/helper/helper.hxx"
+#include "oox/vml/vmlformatting.hxx"
namespace com { namespace sun { namespace star {
namespace awt { struct Rectangle; }
@@ -56,12 +56,10 @@ struct ShapeTypeModel
{
::rtl::OUString maShapeId; /// Unique identifier of the shape.
::rtl::OUString maName; /// Name of the shape, if present.
- OptValue< sal_Int32 > monShapeType; /// Builtin shape type identifier.
+ OptValue< sal_Int32 > moShapeType; /// Builtin shape type identifier.
- OptValue< sal_Int32 > monCoordLeft; /// Left position of coordinate system for children scaling.
- OptValue< sal_Int32 > monCoordTop; /// Top position of coordinate system for children scaling.
- OptValue< sal_Int32 > monCoordWidth; /// Width of coordinate system for children scaling.
- OptValue< sal_Int32 > monCoordHeight; /// Height of coordinate system for children scaling.
+ OptValue< Int32Pair > moCoordPos; /// Top-left position of coordinate system for children scaling.
+ OptValue< Int32Pair > moCoordSize; /// Size of coordinate system for children scaling.
::rtl::OUString maPosition; /// Position type of the shape.
::rtl::OUString maLeft; /// X position of the shape bounding box (number with unit).
::rtl::OUString maTop; /// Y position of the shape bounding box (number with unit).
@@ -70,11 +68,8 @@ struct ShapeTypeModel
::rtl::OUString maMarginLeft; /// X position of the shape bounding box to shape anchor (number with unit).
::rtl::OUString maMarginTop; /// Y position of the shape bounding box to shape anchor (number with unit).
- OptValue< bool > mobStroked; /// True or missing = solid border line.
- OptValue< ::rtl::OUString > moStrokeColor; /// Solid border color.
-
- OptValue< bool > mobFilled; /// True or missing = path is filled.
- OptValue< ::rtl::OUString > moFillColor; /// Solid fill color.
+ StrokeModel maStrokeModel; /// Border line formatting.
+ FillModel maFillModel; /// Shape fill formatting.
OptValue< ::rtl::OUString > moGraphicPath; /// Path to a graphic for this shape.
OptValue< ::rtl::OUString > moGraphicTitle; /// Title of the graphic.
@@ -131,7 +126,10 @@ struct ShapeClientData
::rtl::OUString maLinkedCell; /// Link to value cell associated to the control.
::rtl::OUString maSourceRange; /// Link to cell range used as data source for the control.
sal_Int32 mnObjType; /// Type of the shape.
+ sal_Int32 mnCol; /// Column index for spreadsheet cell note.
+ sal_Int32 mnRow; /// Row index for spreadsheet cell note.
bool mbPrintObject; /// True = print the object.
+ bool mbVisible; /// True = cell note is visible.
explicit ShapeClientData();
};
@@ -179,6 +177,11 @@ public:
const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes,
const ShapeParentAnchor* pParentAnchor = 0 ) const;
+ /** Converts position and formatting into the passed existing XShape. */
+ void convertFormatting(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rxShape,
+ const ShapeParentAnchor* pParentAnchor = 0 ) const;
+
protected:
explicit ShapeBase( const Drawing& rDrawing );
@@ -188,6 +191,11 @@ protected:
const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes,
const ::com::sun::star::awt::Rectangle& rShapeRect ) const = 0;
+ /** Calculates the final shape rectangle according to the passed anchor,
+ if present, otherwise according to the own anchor settings. */
+ ::com::sun::star::awt::Rectangle calcShapeRectangle(
+ const ShapeParentAnchor* pParentAnchor ) const;
+
/** Converts common shape properties such as formatting attributes. */
void convertShapeProperties(
const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rxShape ) const;
diff --git a/oox/inc/oox/vml/vmlshapecontainer.hxx b/oox/inc/oox/vml/vmlshapecontainer.hxx
index d8c9b575a6ad..caa8a1a59c6d 100644
--- a/oox/inc/oox/vml/vmlshapecontainer.hxx
+++ b/oox/inc/oox/vml/vmlshapecontainer.hxx
@@ -73,6 +73,7 @@ public:
/** Returns true, if this contaikner does not contain any shapes. */
inline bool empty() const { return maShapes.empty(); }
+
/** Returns the shape template with the passed identifier.
@param bDeep True = searches in all group shapes too. */
const ShapeType* getShapeTypeById( const ::rtl::OUString& rShapeId, bool bDeep ) const;
@@ -80,6 +81,15 @@ public:
@param bDeep True = searches in all group shapes too. */
const ShapeBase* getShapeById( const ::rtl::OUString& rShapeId, bool bDeep ) const;
+ /** Searches for a shape type by using the passed functor that takes a
+ constant reference of a ShapeType object. */
+ template< typename Functor >
+ const ShapeType* findShapeType( const Functor& rFunctor ) const;
+ /** Searches for a shape by using the passed functor that takes a constant
+ reference of a ShapeBase object. */
+ template< typename Functor >
+ const ShapeBase* findShape( const Functor& rFunctor ) const;
+
/** Returns the first shape in the collection (Word only). */
const ShapeBase* getFirstShape() const;
@@ -111,6 +121,18 @@ ShapeT& ShapeContainer::createShape()
return *xShape;
}
+template< typename Functor >
+const ShapeType* ShapeContainer::findShapeType( const Functor& rFunctor ) const
+{
+ return maTypes.findIf( rFunctor ).get();
+}
+
+template< typename Functor >
+const ShapeBase* ShapeContainer::findShape( const Functor& rFunctor ) const
+{
+ return maShapes.findIf( rFunctor ).get();
+}
+
// ============================================================================
} // namespace vml
diff --git a/oox/inc/oox/vml/vmlshapecontext.hxx b/oox/inc/oox/vml/vmlshapecontext.hxx
index 0cc0be1f963a..dbc5e1aa611d 100644
--- a/oox/inc/oox/vml/vmlshapecontext.hxx
+++ b/oox/inc/oox/vml/vmlshapecontext.hxx
@@ -70,7 +70,7 @@ class ShapeContextBase : public ::oox::core::ContextHandler2
{
public:
static ::oox::core::ContextHandlerRef
- createContext(
+ createShapeContext(
::oox::core::ContextHandler2Helper& rParent,
sal_Int32 nElement,
const AttributeList& rAttribs,
@@ -94,10 +94,6 @@ public:
onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs );
private:
- /** Processes the 'coordorigin' attribute. */
- void setCoordOrigin( const ::rtl::OUString& rCoordOrigin );
- /** Processes the 'coordsize' attribute. */
- void setCoordSize( const ::rtl::OUString& rCoordSize );
/** Processes the 'style' attribute. */
void setStyle( const ::rtl::OUString& rStyle );
diff --git a/oox/inc/oox/xls/biffcodec.hxx b/oox/inc/oox/xls/biffcodec.hxx
index 165a608d46fd..3fc5d77b474e 100644
--- a/oox/inc/oox/xls/biffcodec.hxx
+++ b/oox/inc/oox/xls/biffcodec.hxx
@@ -32,6 +32,7 @@
#define OOX_XLS_BIFFCODEC_HXX
#include <vector>
+#include <comphelper/docpasswordhelper.hxx>
#include "oox/core/binarycodec.hxx"
#include "oox/xls/workbookhelper.hxx"
@@ -40,29 +41,27 @@ namespace xls {
// ============================================================================
-const sal_Int32 CODEC_OK = 0;
-const sal_Int32 CODEC_ERROR_WRONG_PASS = 1;
-const sal_Int32 CODEC_ERROR_UNSUPP_CRYPT = 2;
-
const sal_Int64 BIFF_RCF_BLOCKSIZE = 1024;
// ============================================================================
/** Base class for BIFF stream decoders. */
-class BiffDecoderBase : public WorkbookHelper
+class BiffDecoderBase : public ::comphelper::IDocPasswordVerifier
{
public:
- explicit BiffDecoderBase( const WorkbookHelper& rHelper );
+ explicit BiffDecoderBase();
virtual ~BiffDecoderBase();
/** Derived classes return a clone of the decoder for usage in new streams. */
inline BiffDecoderBase* clone() { return implClone(); }
- /** Returns the current error code of the decoder. */
- inline sal_Int32 getErrorCode() const { return mnError; }
- /** Returns true, if the decoder has been constructed successfully.
- This means especially that construction happened with a valid password. */
- inline bool isValid() const { return mnError == CODEC_OK; }
+ /** Implementation of the ::comphelper::IDocPasswordVerifier interface,
+ calls the new virtual function implVerify(). */
+ virtual ::comphelper::DocPasswordVerifierResult
+ verifyPassword( const ::rtl::OUString& rPassword );
+
+ /** Returns true, if the decoder has been initialized correctly. */
+ inline bool isValid() const { return mbValid; }
/** Decodes nBytes bytes and writes encrypted data into the buffer pnDestData. */
void decode(
@@ -71,17 +70,14 @@ public:
sal_Int64 nStreamPos,
sal_uInt16 nBytes );
-protected:
- /** Copy constructor for cloning. */
- BiffDecoderBase( const BiffDecoderBase& rDecoder );
-
- /** Sets the decoder to a state showing whether the password was correct. */
- void setHasValidPassword( bool bValid );
-
private:
/** Derived classes return a clone of the decoder for usage in new streams. */
virtual BiffDecoderBase* implClone() = 0;
+ /** Derived classes implement password verification and initialization of
+ the decoder. */
+ virtual bool implVerify( const ::rtl::OUString& rPassword ) = 0;
+
/** Implementation of decryption of a memory block. */
virtual void implDecode(
sal_uInt8* pnDestData,
@@ -90,7 +86,7 @@ private:
sal_uInt16 nBytes ) = 0;
private:
- sal_Int32 mnError; /// Decoder error code.
+ bool mbValid; /// True = decoder is correctly initialized.
};
typedef ::boost::shared_ptr< BiffDecoderBase > BiffDecoderRef;
@@ -101,31 +97,18 @@ typedef ::boost::shared_ptr< BiffDecoderBase > BiffDecoderRef;
class BiffDecoder_XOR : public BiffDecoderBase
{
public:
- /** Constructs the decoder.
-
- Checks if the passed key and hash specify workbook protection. Asks for
- a password otherwise.
-
- @param nKey
- Password key from FILEPASS record to verify password.
- @param nHash
- Password hash value from FILEPASS record to verify password.
- */
- explicit BiffDecoder_XOR(
- const WorkbookHelper& rHelper,
- sal_uInt16 nKey, sal_uInt16 nHash );
+ explicit BiffDecoder_XOR( sal_uInt16 nKey, sal_uInt16 nHash );
private:
/** Copy constructor for cloning. */
BiffDecoder_XOR( const BiffDecoder_XOR& rDecoder );
- /** Initializes the wrapped codec object. After that, internal status can
- be querried with isValid(). */
- void init( const ::rtl::OString& rPass );
-
/** Returns a clone of the decoder for usage in new streams. */
virtual BiffDecoder_XOR* implClone();
+ /** Implements password verification and initialization of the decoder. */
+ virtual bool implVerify( const ::rtl::OUString& rPassword );
+
/** Implementation of decryption of a memory block. */
virtual void implDecode(
sal_uInt8* pnDestData,
@@ -135,7 +118,7 @@ private:
private:
::oox::core::BinaryCodec_XOR maCodec; /// Cipher algorithm implementation.
- ::rtl::OString maPass;
+ ::std::vector< sal_uInt8 > maPassword;
sal_uInt16 mnKey;
sal_uInt16 mnHash;
};
@@ -146,35 +129,21 @@ private:
class BiffDecoder_RCF : public BiffDecoderBase
{
public:
- /** Constructs the decoder.
-
- Checks if the passed salt data specifies workbook protection. Asks for
- a password otherwise.
-
- @param pnDocId
- Unique document identifier from FILEPASS record.
- @param pnSaltData
- Salt data from FILEPASS record.
- @param pnSaltHash
- Salt hash value from FILEPASS record.
- */
explicit BiffDecoder_RCF(
- const WorkbookHelper& rHelper,
- sal_uInt8 pnDocId[ 16 ],
- sal_uInt8 pnSaltData[ 16 ],
- sal_uInt8 pnSaltHash[ 16 ] );
+ sal_uInt8 pnSalt[ 16 ],
+ sal_uInt8 pnVerifier[ 16 ],
+ sal_uInt8 pnVerifierHash[ 16 ] );
private:
/** Copy constructor for cloning. */
BiffDecoder_RCF( const BiffDecoder_RCF& rDecoder );
- /** Initializes the wrapped codec object. After that, internal status can
- be querried with isValid(). */
- void init( const ::rtl::OUString& rPass );
-
/** Returns a clone of the decoder for usage in new streams. */
virtual BiffDecoder_RCF* implClone();
+ /** Implements password verification and initialization of the decoder. */
+ virtual bool implVerify( const ::rtl::OUString& rPassword );
+
/** Implementation of decryption of a memory block. */
virtual void implDecode(
sal_uInt8* pnDestData,
@@ -184,10 +153,10 @@ private:
private:
::oox::core::BinaryCodec_RCF maCodec; /// Cipher algorithm implementation.
- ::rtl::OUString maPass;
- ::std::vector< sal_uInt8 > maDocId;
- ::std::vector< sal_uInt8 > maSaltData;
- ::std::vector< sal_uInt8 > maSaltHash;
+ ::std::vector< sal_uInt16 > maPassword;
+ ::std::vector< sal_uInt8 > maSalt;
+ ::std::vector< sal_uInt8 > maVerifier;
+ ::std::vector< sal_uInt8 > maVerifierHash;
};
// ============================================================================
@@ -198,30 +167,16 @@ class BiffCodecHelper : public WorkbookHelper
public:
explicit BiffCodecHelper( const WorkbookHelper& rHelper );
- /** Returns the fixed password for workbook protection. */
- static const ::rtl::OString& getBiff5WbProtPassword();
- /** Returns the fixed password for workbook protection. */
- static const ::rtl::OUString& getBiff8WbProtPassword();
+ /** Implementation helper, reads the FILEPASS and returns a decoder object. */
+ static BiffDecoderRef implReadFilePass( BiffInputStream& rStrm, BiffType eBiff );
- /** Looks for a password provided via API, or queries it via GUI. */
- ::rtl::OUString queryPassword();
-
- /** Imports the FILEPASS record and sets a decoder at the stream. */
+ /** Imports the FILEPASS record, asks for a password and sets a decoder at the stream. */
bool importFilePass( BiffInputStream& rStrm );
/** Clones the contained decoder object if existing and sets it at the passed stream. */
void cloneDecoder( BiffInputStream& rStrm );
private:
- void importFilePass_XOR( BiffInputStream& rStrm );
- void importFilePass_RCF( BiffInputStream& rStrm );
- void importFilePass_Strong( BiffInputStream& rStrm );
- void importFilePass2( BiffInputStream& rStrm );
- void importFilePass8( BiffInputStream& rStrm );
-
-private:
BiffDecoderRef mxDecoder; /// The decoder for import filter.
- ::rtl::OUString maPassword; /// Password for stream encoder/decoder.
- bool mbHasPassword; /// True = password already querried.
};
// ============================================================================
diff --git a/oox/inc/oox/xls/biffhelper.hxx b/oox/inc/oox/xls/biffhelper.hxx
index 8d9aac767bba..60efb9e856a6 100644
--- a/oox/inc/oox/xls/biffhelper.hxx
+++ b/oox/inc/oox/xls/biffhelper.hxx
@@ -120,6 +120,7 @@ const sal_Int32 OOBIN_ID_EXTROW = 0x016E;
const sal_Int32 OOBIN_ID_EXTSHEETDATA = 0x016B;
const sal_Int32 OOBIN_ID_EXTERNALNAMEFLAGS = 0x024A;
const sal_Int32 OOBIN_ID_EXTSHEETNAMES = 0x0167;
+const sal_Int32 OOBIN_ID_FILESHARING = 0x0224;
const sal_Int32 OOBIN_ID_FILEVERSION = 0x0080;
const sal_Int32 OOBIN_ID_FILL = 0x002D;
const sal_Int32 OOBIN_ID_FILLS = 0x025B;
@@ -312,6 +313,7 @@ const sal_uInt16 BIFF_ID_CHPICFORMAT = 0x103C;
const sal_uInt16 BIFF_ID_CHPIE = 0x1019;
const sal_uInt16 BIFF_ID_CHPIEEXT = 0x1061;
const sal_uInt16 BIFF_ID_CHPIEFORMAT = 0x100B;
+const sal_uInt16 BIFF_ID_CHPIVOTFLAGS = 0x0859;
const sal_uInt16 BIFF5_ID_CHPIVOTREF = 0x1048;
const sal_uInt16 BIFF8_ID_CHPIVOTREF = 0x0858;
const sal_uInt16 BIFF_ID_CHPLOTFRAME = 0x1035;
@@ -369,6 +371,7 @@ const sal_uInt16 BIFF5_ID_EXTERNALNAME = 0x0023;
const sal_uInt16 BIFF_ID_EXTERNSHEET = 0x0017;
const sal_uInt16 BIFF_ID_EXTSST = 0x00FF;
const sal_uInt16 BIFF_ID_FILEPASS = 0x002F;
+const sal_uInt16 BIFF_ID_FILESHARING = 0x005B;
const sal_uInt16 BIFF2_ID_FONT = 0x0031;
const sal_uInt16 BIFF3_ID_FONT = 0x0231;
const sal_uInt16 BIFF5_ID_FONT = 0x0031;
@@ -388,6 +391,7 @@ const sal_uInt16 BIFF_ID_HYPERLINK = 0x01B8;
const sal_uInt16 BIFF3_ID_IMGDATA = 0x007F;
const sal_uInt16 BIFF8_ID_IMGDATA = 0x00E9;
const sal_uInt16 BIFF2_ID_INTEGER = 0x0002;
+const sal_uInt16 BIFF_ID_INTERFACEHDR = 0x00E1;
const sal_uInt16 BIFF_ID_ITERATION = 0x0011;
const sal_uInt16 BIFF_ID_IXFE = 0x0044;
const sal_uInt16 BIFF2_ID_LABEL = 0x0004;
@@ -467,6 +471,7 @@ const sal_uInt16 BIFF_ID_STANDARDWIDTH = 0x0099;
const sal_uInt16 BIFF2_ID_STRING = 0x0007;
const sal_uInt16 BIFF3_ID_STRING = 0x0207;
const sal_uInt16 BIFF_ID_STYLE = 0x0293;
+const sal_uInt16 BIFF_ID_STYLEEXT = 0x0892;
const sal_uInt16 BIFF_ID_SXEXT = 0x00DC;
const sal_uInt16 BIFF_ID_TOPMARGIN = 0x0028;
const sal_uInt16 BIFF_ID_TXO = 0x01B6;
@@ -477,6 +482,7 @@ const sal_uInt16 BIFF_ID_VERPAGEBREAKS = 0x001A;
const sal_uInt16 BIFF_ID_WINDOW1 = 0x003D;
const sal_uInt16 BIFF2_ID_WINDOW2 = 0x003E;
const sal_uInt16 BIFF3_ID_WINDOW2 = 0x023E;
+const sal_uInt16 BIFF_ID_WRITEACCESS = 0x005C;
const sal_uInt16 BIFF_ID_XCT = 0x0059;
const sal_uInt16 BIFF2_ID_XF = 0x0043;
const sal_uInt16 BIFF3_ID_XF = 0x0243;
diff --git a/oox/inc/oox/xls/biffinputstream.hxx b/oox/inc/oox/xls/biffinputstream.hxx
index e3109a1fafcc..a829bcec6e23 100644
--- a/oox/inc/oox/xls/biffinputstream.hxx
+++ b/oox/inc/oox/xls/biffinputstream.hxx
@@ -182,7 +182,10 @@ public:
/** Sets stream pointer to the start of the content of the specified record.
The handle of the current record can be received and stored using the
- function getRecHandle() for later usage with this function.
+ function getRecHandle() for later usage with this function. The record
+ handle is equivalent to the position of the underlying binary stream,
+ thus the function can be used to perform a hard seek to a specific
+ position, if it is sure that a record starts exactly at this position.
@return False = no record found (invalid handle passed).
*/
diff --git a/oox/inc/oox/xls/chartsheetfragment.hxx b/oox/inc/oox/xls/chartsheetfragment.hxx
index d1effba29166..3e6f5d9d7a6d 100644
--- a/oox/inc/oox/xls/chartsheetfragment.hxx
+++ b/oox/inc/oox/xls/chartsheetfragment.hxx
@@ -45,7 +45,7 @@ public:
const WorkbookHelper& rHelper,
const ::rtl::OUString& rFragmentPath,
ISegmentProgressBarRef xProgressBar,
- sal_Int32 nSheet );
+ sal_Int16 nSheet );
protected:
// oox.core.ContextHandler2Helper interface -------------------------------
@@ -76,7 +76,7 @@ public:
explicit BiffChartsheetFragment(
const BiffWorkbookFragmentBase& rParent,
ISegmentProgressBarRef xProgressBar,
- sal_Int32 nSheet );
+ sal_Int16 nSheet );
/** Imports the entire sheet fragment, returns true, if EOF record has been reached. */
virtual bool importFragment();
diff --git a/oox/inc/oox/xls/defnamesbuffer.hxx b/oox/inc/oox/xls/defnamesbuffer.hxx
index 88e4f7272d8e..88c83c0491b3 100644
--- a/oox/inc/oox/xls/defnamesbuffer.hxx
+++ b/oox/inc/oox/xls/defnamesbuffer.hxx
@@ -86,17 +86,12 @@ struct DefinedNameModel
class DefinedNameBase : public WorkbookHelper
{
public:
- explicit DefinedNameBase( const WorkbookHelper& rHelper, sal_Int32 nLocalSheet );
-
- /** Returns true, if this defined name is global in the document. */
- inline bool isGlobalName() const { return maModel.mnSheet < 0; }
+ explicit DefinedNameBase( const WorkbookHelper& rHelper );
/** Returns the original name as imported from or exported to the file. */
inline const ::rtl::OUString& getModelName() const { return maModel.maName; }
/** Returns the name as used in the Calc document. */
inline const ::rtl::OUString& getCalcName() const { return maCalcName; }
- /** Returns the 0-based sheet index for local names, or -1 for global names. */
- inline sal_Int32 getSheetIndex() const { return maModel.mnSheet; }
/** Returns the original name as imported from or exported to the file. */
const ::rtl::OUString& getUpcaseModelName() const;
@@ -105,21 +100,19 @@ public:
protected:
/** Imports the OOX formula string, using the passed formula context. */
- void importOoxFormula( FormulaContext& rContext );
+ void importOoxFormula( FormulaContext& rContext, sal_Int16 nBaseSheet );
/** Imports the OOBIN formula, using the passed formula context. */
- void importOobFormula( FormulaContext& rContext, RecordInputStream& rStrm );
+ void importOobFormula( FormulaContext& rContext, sal_Int16 nBaseSheet, RecordInputStream& rStrm );
/** Imports the BIFF formula, using the passed formula context. */
- void importBiffFormula( FormulaContext& rContext, BiffInputStream& rStrm, const sal_uInt16* pnFmlaSize = 0 );
+ void importBiffFormula( FormulaContext& rContext, sal_Int16 nBaseSheet, BiffInputStream& rStrm, const sal_uInt16* pnFmlaSize = 0 );
/** Tries to convert the passed token sequence to a SingleReference or ComplexReference. */
- void setReference( const ApiTokenSequence& rTokens );
+ void extractReference( const ApiTokenSequence& rTokens );
protected:
DefinedNameModel maModel; /// Model data for this defined name.
mutable ::rtl::OUString maUpModelName; /// Model name converted to uppercase ASCII.
::rtl::OUString maCalcName; /// Final name used in the Calc document.
-
-private:
::com::sun::star::uno::Any maRefAny; /// Single cell/range reference.
};
@@ -128,7 +121,7 @@ private:
class DefinedName : public DefinedNameBase
{
public:
- explicit DefinedName( const WorkbookHelper& rHelper, sal_Int32 nLocalSheet );
+ explicit DefinedName( const WorkbookHelper& rHelper );
/** Sets the attributes for this defined name from the passed attribute set. */
void importDefinedName( const AttributeList& rAttribs );
@@ -137,7 +130,7 @@ public:
/** Imports the defined name from a DEFINEDNAME record in the passed stream. */
void importDefinedName( RecordInputStream& rStrm );
/** Imports the defined name from a DEFINEDNAME record in the passed BIFF stream. */
- void importDefinedName( BiffInputStream& rStrm );
+ void importDefinedName( BiffInputStream& rStrm, sal_Int16 nCalcSheet );
/** Creates a defined name in the Calc document. */
void createNameObject();
@@ -148,9 +141,13 @@ public:
inline bool isBuiltinName() const { return mcBuiltinId != OOX_DEFNAME_UNKNOWN; }
/** Returns true, if this defined name is a macro function call. */
inline bool isMacroFunction() const { return maModel.mbMacro && maModel.mbFunction; }
+ /** Returns true, if this defined name is global in the document. */
+ inline bool isGlobalName() const { return mnCalcSheet < 0; }
/** Returns the token index used in API token arrays (com.sun.star.sheet.FormulaToken). */
inline sal_Int32 getTokenIndex() const { return mnTokenIndex; }
+ /** Returns the 0-based sheet index for local names, or -1 for global names. */
+ inline sal_Int16 getLocalCalcSheet() const { return mnCalcSheet; }
/** Tries to resolve the defined name to an absolute cell range. */
bool getAbsoluteRange( ::com::sun::star::table::CellRangeAddress& orRange ) const;
@@ -167,6 +164,7 @@ private:
::com::sun::star::uno::Reference< ::com::sun::star::sheet::XNamedRange >
mxNamedRange; /// XNamedRange interface of the defined name.
sal_Int32 mnTokenIndex; /// Name index used in API token array.
+ sal_Int16 mnCalcSheet; /// Calc sheet index for sheet-local names.
sal_Unicode mcBuiltinId; /// Identifier for built-in defined names.
StreamDataSeqPtr mxFormula; /// Formula data for OOBIN import.
BiffStreamPosPtr mxBiffStrm; /// Cached BIFF stream for formula import.
@@ -182,9 +180,9 @@ class DefinedNamesBuffer : public WorkbookHelper
public:
explicit DefinedNamesBuffer( const WorkbookHelper& rHelper );
- /** Sets the current sheet index for files with local defined names, e.g.
- BIFF4 workspaces. All created names initially will contain this index. */
- void setLocalSheetIndex( sal_Int32 nLocalSheet );
+ /** Sets the sheet index for local names (BIFF2-BIFF4 only). */
+ void setLocalCalcSheet( sal_Int16 nCalcSheet );
+
/** Imports a defined name from the passed attribute set. */
DefinedNameRef importDefinedName( const AttributeList& rAttribs );
/** Imports a defined name from a DEFINEDNAME record in the passed stream. */
@@ -203,7 +201,7 @@ public:
@param nSheet The sheet index for local names or -1 for global names.
If no local name is found, tries to find a matching global name.
@return Reference to the defined name or empty reference. */
- DefinedNameRef getByModelName( const ::rtl::OUString& rModelName, sal_Int32 nSheet = -1 ) const;
+ DefinedNameRef getByModelName( const ::rtl::OUString& rModelName, sal_Int16 nCalcSheet = -1 ) const;
private:
DefinedNameRef createDefinedName();
@@ -213,8 +211,8 @@ private:
typedef RefMap< sal_Int32, DefinedName > DefNameMap;
DefNameVector maDefNames; /// List of all defined names in insertion order.
- DefNameMap maDefNameMap; /// Maps all defined names by API token index. */
- sal_Int32 mnLocalSheet; /// Current sheet index for import of BIFF sheet-local names.
+ DefNameMap maDefNameMap; /// Maps all defined names by API token index.
+ sal_Int16 mnCalcSheet; /// Current sheet index for BIFF2-BIFF4 names (always sheet-local).
};
// ============================================================================
diff --git a/oox/inc/oox/xls/drawingfragment.hxx b/oox/inc/oox/xls/drawingfragment.hxx
index aa4945f799e3..2ee1622dd08b 100644
--- a/oox/inc/oox/xls/drawingfragment.hxx
+++ b/oox/inc/oox/xls/drawingfragment.hxx
@@ -164,6 +164,12 @@ class VmlDrawing : public ::oox::vml::Drawing, public WorksheetHelper
public:
explicit VmlDrawing( const WorksheetHelper& rHelper );
+ /** Returns the drawing shape for a cell note at the specified position. */
+ const ::oox::vml::ShapeBase* getNoteShape( const ::com::sun::star::table::CellAddress& rPos ) const;
+
+ /** Filters cell note shapes. */
+ virtual bool isShapeSupported( const ::oox::vml::ShapeBase& rShape ) const;
+
/** Calculates the shape rectangle from a cell anchor string. */
virtual bool convertShapeClientAnchor(
::com::sun::star::awt::Rectangle& orShapeRect,
diff --git a/oox/inc/oox/xls/excelfilter.hxx b/oox/inc/oox/xls/excelfilter.hxx
index ed6c32cdc463..28059fe30ce7 100644
--- a/oox/inc/oox/xls/excelfilter.hxx
+++ b/oox/inc/oox/xls/excelfilter.hxx
@@ -41,7 +41,23 @@ namespace xls {
class WorkbookHelper;
-class ExcelFilter : public ::oox::core::XmlFilterBase
+class ExcelFilterBase
+{
+protected:
+ explicit ExcelFilterBase();
+ virtual ~ExcelFilterBase();
+
+ void setWorkbookHelper( WorkbookHelper& rHelper );
+ WorkbookHelper& getWorkbookHelper() const;
+ void clearWorkbookHelper();
+
+private:
+ WorkbookHelper* mpHelper; /// Nonowning pointer to helper base.
+};
+
+// ============================================================================
+
+class ExcelFilter : public ::oox::core::XmlFilterBase, public ExcelFilterBase
{
public:
explicit ExcelFilter(
@@ -51,23 +67,21 @@ public:
virtual bool importDocument() throw();
virtual bool exportDocument() throw();
- virtual const ::oox::drawingml::Theme* getCurrentTheme() const;
- virtual sal_Int32 getSchemeClr( sal_Int32 nColorSchemeToken ) const;
+ virtual sal_Int32 getSchemeColor( sal_Int32 nToken ) const;
+ virtual sal_Int32 getPaletteColor( sal_Int32 nPaletteIdx ) const;
+ virtual const ::oox::drawingml::Theme* getCurrentTheme() const;
virtual ::oox::vml::Drawing* getVmlDrawing();
virtual const ::oox::drawingml::table::TableStyleListPtr getTableStyles();
virtual ::oox::drawingml::chart::ChartConverter& getChartConverter();
private:
virtual ::rtl::OUString implGetImplementationName() const;
-
-private:
- WorkbookHelper* mpHelper; /// Nonowning pointer to helper base.
};
// ============================================================================
-class ExcelBiffFilter : public ::oox::core::BinaryFilterBase
+class ExcelBiffFilter : public ::oox::core::BinaryFilterBase, public ExcelFilterBase
{
public:
explicit ExcelBiffFilter(
@@ -77,6 +91,8 @@ public:
virtual bool importDocument() throw();
virtual bool exportDocument() throw();
+ virtual sal_Int32 getPaletteColor( sal_Int32 nPaletteIdx ) const;
+
private:
virtual ::rtl::OUString implGetImplementationName() const;
};
diff --git a/oox/inc/oox/xls/excelhandlers.hxx b/oox/inc/oox/xls/excelhandlers.hxx
index 3b34a14963ec..a6619aa242c4 100644
--- a/oox/inc/oox/xls/excelhandlers.hxx
+++ b/oox/inc/oox/xls/excelhandlers.hxx
@@ -74,7 +74,7 @@ public:
ParentType& rParent,
ISegmentProgressBarRef xProgressBar,
WorksheetType eSheetType,
- sal_Int32 nSheet );
+ sal_Int16 nSheet );
template< typename ParentType >
explicit OoxWorksheetContextBase( ParentType& rParent );
@@ -84,7 +84,7 @@ public:
template< typename ParentType >
OoxWorksheetContextBase::OoxWorksheetContextBase( ParentType& rParent,
- ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int32 nSheet ) :
+ ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) :
::oox::core::ContextHandler2( rParent ),
WorksheetHelperRoot( rParent, xProgressBar, eSheetType, nSheet )
{
@@ -125,7 +125,7 @@ public:
const ::rtl::OUString& rFragmentPath,
ISegmentProgressBarRef xProgressBar,
WorksheetType eSheetType,
- sal_Int32 nSheet );
+ sal_Int16 nSheet );
explicit OoxWorksheetFragmentBase(
const WorksheetHelper& rHelper,
@@ -236,7 +236,7 @@ protected:
const ParentType& rParent,
ISegmentProgressBarRef xProgressBar,
WorksheetType eSheetType,
- sal_Int32 nSheet );
+ sal_Int16 nSheet );
template< typename ParentType >
explicit BiffWorksheetContextBase( const ParentType& rParent );
@@ -246,7 +246,7 @@ protected:
template< typename ParentType >
BiffWorksheetContextBase::BiffWorksheetContextBase( const ParentType& rParent,
- ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int32 nSheet ) :
+ ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) :
BiffContextHandler( rParent ),
WorksheetHelperRoot( rParent, xProgressBar, eSheetType, nSheet )
{
@@ -304,6 +304,17 @@ protected:
*/
BiffFragmentType startFragment( BiffType eBiff );
+ /** Starts a new fragment at a specific position in the workbbok stream and
+ returns the fragment type.
+
+ The passed record handle must specify the stream position of the BOF
+ record of the fragment substream. The function will try to start the
+ next record and read the contents of the BOF record, if extant.
+
+ @return Fragment type according to the imported BOF record.
+ */
+ BiffFragmentType startFragment( BiffType eBiff, sal_Int64 nRecHandle );
+
/** Skips the current fragment up to its trailing EOF record.
Skips all records until next EOF record. When this function returns,
@@ -316,6 +327,10 @@ protected:
@return True = stream points to the EOF record of the current fragment.
*/
bool skipFragment();
+
+private:
+ /** Implementation helper for the startFragment() functions. */
+ BiffFragmentType implStartFragment( BiffType eBiff );
};
// ============================================================================
@@ -346,7 +361,7 @@ protected:
const BiffWorkbookFragmentBase& rParent,
ISegmentProgressBarRef xProgressBar,
WorksheetType eSheetType,
- sal_Int32 nSheet );
+ sal_Int16 nSheet );
};
// ============================================================================
@@ -359,7 +374,7 @@ public:
explicit BiffSkipWorksheetFragment(
const BiffWorkbookFragmentBase& rParent,
ISegmentProgressBarRef xProgressBar,
- sal_Int32 nSheet );
+ sal_Int16 nSheet );
virtual bool importFragment();
};
diff --git a/oox/inc/oox/xls/externallinkbuffer.hxx b/oox/inc/oox/xls/externallinkbuffer.hxx
index a50170544813..a4ede4403fe3 100644
--- a/oox/inc/oox/xls/externallinkbuffer.hxx
+++ b/oox/inc/oox/xls/externallinkbuffer.hxx
@@ -70,9 +70,7 @@ class ExternalLink;
class ExternalName : public DefinedNameBase
{
public:
- explicit ExternalName(
- const ExternalLink& rParentLink,
- sal_Int32 nLocalSheet );
+ explicit ExternalName( const ExternalLink& rParentLink );
/** Appends the passed value to the result set. */
template< typename Type >
@@ -109,8 +107,10 @@ public:
/** Returns true, if the name refers to an OLE object. */
inline bool isOleObject() const { return maExtNameModel.mbOleObj; }
+#if 0
/** Returns the sheet cache index if this is a sheet-local external name. */
sal_Int32 getSheetCacheIndex() const;
+#endif
/** Returns the DDE item info needed by the XML formula parser. */
bool getDdeItemInfo(
@@ -123,6 +123,8 @@ public:
::rtl::OUString& orDdeItem );
private:
+ /** Tries to convert the passed token sequence to an ExternalReference. */
+ void extractExternalReference( const ApiTokenSequence& rTokens );
/** Sets the size of the result matrix. */
void setResultSize( sal_Int32 nColumns, sal_Int32 nRows );
@@ -265,14 +267,20 @@ public:
/** Returns the type of the external library if this is a library link. */
FunctionLibraryType getFuncLibraryType() const;
- /** Returns the internal sheet index or external sheet cache index for the passed sheet. */
- sal_Int32 getSheetIndex( sal_Int32 nTabId = 0 ) const;
- /** Returns the internal sheet range or range of external sheet caches for the passed sheet range (BIFF only). */
- void getSheetRange( LinkSheetRange& orSheetRange, sal_Int32 nTabId1, sal_Int32 nTabId2 ) const;
+ /** Returns the internal Calc sheet index or for the passed sheet. */
+ sal_Int16 getCalcSheetIndex( sal_Int32 nTabId = 0 ) const;
+
+ /** Returns the token index of the external document. */
+ sal_Int32 getDocumentLinkIndex() const;
+ /** Returns the external sheet cache index or for the passed sheet. */
+ sal_Int32 getSheetCacheIndex( sal_Int32 nTabId = 0 ) const;
/** Returns the sheet cache of the external sheet with the passed index. */
::com::sun::star::uno::Reference< ::com::sun::star::sheet::XExternalSheetCache >
- getExternalSheetCache( sal_Int32 nTabId );
+ getSheetCache( sal_Int32 nTabId ) const;
+
+ /** Returns the internal sheet range or range of external sheet caches for the passed sheet range (BIFF only). */
+ void getSheetRange( LinkSheetRange& orSheetRange, sal_Int32 nTabId1, sal_Int32 nTabId2 ) const;
/** Returns the external name with the passed zero-based index. */
ExternalNameRef getNameByIndex( sal_Int32 nIndex ) const;
@@ -289,7 +297,8 @@ private:
ExternalNameRef createExternalName();
private:
- typedef ::std::vector< sal_Int32 > IndexVector;
+ typedef ::std::vector< sal_Int16 > Int16Vector;
+ typedef ::std::vector< sal_Int32 > Int32Vector;
typedef RefVector< ExternalName > ExternalNameVector;
ExternalLinkType meLinkType; /// Type of this link object.
@@ -299,7 +308,8 @@ private:
::rtl::OUString maTargetUrl; /// Target link, DDE topic, OLE target.
::com::sun::star::uno::Reference< ::com::sun::star::sheet::XExternalDocLink >
mxDocLink; /// Interface for an external document.
- IndexVector maIndexes; /// Internal sheet indexes or external sheet cache indexes.
+ Int16Vector maCalcSheets; /// Internal sheet indexes.
+ Int32Vector maSheetCaches; /// External sheet cache indexes.
ExternalNameVector maExtNames; /// Defined names in external document.
};
diff --git a/oox/inc/oox/xls/formulabase.hxx b/oox/inc/oox/xls/formulabase.hxx
index b2e576d3fdd5..11a0be44600a 100644
--- a/oox/inc/oox/xls/formulabase.hxx
+++ b/oox/inc/oox/xls/formulabase.hxx
@@ -58,8 +58,6 @@ const size_t BIFF_TOKARR_MAXLEN = 4096; /// Maximum size of
// token class flags ----------------------------------------------------------
const sal_uInt8 BIFF_TOKCLASS_MASK = 0x60;
-const sal_uInt8 BIFF_TOKID_MASK = 0x1F;
-
const sal_uInt8 BIFF_TOKCLASS_NONE = 0x00; /// 00-1F: Base tokens.
const sal_uInt8 BIFF_TOKCLASS_REF = 0x20; /// 20-3F: Reference class tokens.
const sal_uInt8 BIFF_TOKCLASS_VAL = 0x40; /// 40-5F: Value class tokens.
@@ -69,6 +67,8 @@ const sal_uInt8 BIFF_TOKFLAG_INVALID = 0x80; /// This bit must be
// base token identifiers -----------------------------------------------------
+const sal_uInt8 BIFF_TOKID_MASK = 0x1F;
+
const sal_uInt8 BIFF_TOKID_NONE = 0x00; /// Placeholder for invalid token id.
const sal_uInt8 BIFF_TOKID_EXP = 0x01; /// Array or shared formula reference.
const sal_uInt8 BIFF_TOKID_TBL = 0x02; /// Multiple operation reference.
@@ -361,6 +361,115 @@ struct ApiOpCodes
sal_Int32 OPCODE_RANGE; /// Range operator.
};
+// Function parameter info ====================================================
+
+/** Enumerates validity modes for a function parameter. */
+enum FuncParamValidity
+{
+ FUNC_PARAM_NONE = 0, /// Default for an unspecified entry in a C-array.
+ FUNC_PARAM_REGULAR, /// Parameter supported by Calc and Excel.
+ FUNC_PARAM_CALCONLY, /// Parameter supported by Calc only.
+ FUNC_PARAM_EXCELONLY /// Parameter supported by Excel only.
+};
+
+/** Enumerates different types of token class conversion in function parameters. */
+enum FuncParamConversion
+{
+ FUNC_PARAMCONV_ORG, /// Use original class of current token.
+ FUNC_PARAMCONV_VAL, /// Convert tokens to VAL class.
+ FUNC_PARAMCONV_ARR, /// Convert tokens to ARR class.
+ FUNC_PARAMCONV_RPT, /// Repeat parent conversion in VALTYPE parameters.
+ FUNC_PARAMCONV_RPX, /// Repeat parent conversion in REFTYPE parameters.
+ FUNC_PARAMCONV_RPO /// Repeat parent conversion in operands of operators.
+};
+
+/** Structure that contains all needed information for a parameter in a
+ function.
+
+ The member meValid specifies which application supports the parameter. If
+ set to CALCONLY, import filters have to insert a default value for this
+ parameter, and export filters have to skip the parameter. If set to
+ EXCELONLY, import filters have to skip the parameter, and export filters
+ have to insert a default value for this parameter.
+
+ The member mbValType specifies whether the parameter requires tokens to be
+ of value type (VAL or ARR class).
+
+ If set to false, the parameter is called to be REFTYPE. Tokens with REF
+ default class can be inserted for the parameter (e.g. tAreaR tokens).
+
+ If set to true, the parameter is called to be VALTYPE. Tokens with REF
+ class need to be converted to VAL tokens first (e.g. tAreaR will be
+ converted to tAreaV), and further conversion is done according to this
+ new token class.
+
+ The member meConv specifies how to convert the current token class of the
+ token inserted for the parameter. If the token class is still REF this
+ means that the token has default REF class and the parameter is REFTYPE
+ (see member mbValType), the token will not be converted at all and remains
+ in REF class. Otherwise, token class conversion is depending on the actual
+ token class of the return value of the function containing this parameter.
+ The function may return REF class (tFuncR, tFuncVarR, tFuncCER), or it may
+ return VAL or ARR class (tFuncV, tFuncA, tFuncVarV, tFuncVarA, tFuncCEV,
+ tFuncCEA). Even if the function is able to return REF class, it may return
+ VAL or ARR class instead due to the VALTYPE data type of the parent
+ function parameter that calls the own function. Example: The INDIRECT
+ function returns REF class by default. But if called from a VALTYPE
+ function parameter, e.g. in the formula =ABS(INDIRECT("A1")), it returns
+ VAL or ARR class instead. Additionally, the repeating conversion types RPT
+ and RPX rely on the conversion executed for the function token class.
+
+ 1) ORG:
+ Use the original class of the token (VAL or ARR), regardless of any
+ conversion done for the function return class.
+
+ 2) VAL:
+ Convert ARR tokens to VAL class, regardless of any conversion done for
+ the function return class.
+
+ 3) ARR:
+ Convert VAL tokens to ARR class, regardless of any conversion done for
+ the function return class.
+
+ 4) RPT:
+ If the own function returns REF class (thus it is called from a REFTYPE
+ parameter, see above), and the parent conversion type (for the function
+ return class) was ORG, VAL, or ARR, ignore that conversion and always
+ use VAL conversion for the own token instead. If the parent conversion
+ type was RPT or RPX, repeat the conversion that would have been used if
+ the function would return value type.
+ If the own function returns value type (VAL or ARR class, see above),
+ and the parent conversion type (for the function return class) was ORG,
+ VAL, ARR, or RPT, repeat this conversion for the own token. If the
+ parent conversion type was RPX, always use ORG conversion type for the
+ own token instead.
+
+ 5) RPX:
+ This type of conversion only occurs in functions returning VAL class by
+ default. If the own token is value type, and the VAL return class of
+ the own function has been changed to ARR class (due to direct ARR
+ conversion, or due to ARR conversion repeated by RPT or RPX), set the
+ own token to ARR type. Otherwise use the original token type (VAL
+ conversion from parent parameter will not be repeated at all). If
+ nested functions have RPT or value-type RPX parameters, they will not
+ repeat this conversion type, but will use ORG conversion instead (see
+ description of RPT above).
+
+ 6) RPO:
+ This type of conversion is only used for the operands of all operators
+ (unary and binary arithmetic operators, comparison operators, and range
+ operators). It is not used for function parameters. On conversion, it
+ will be replaced by the last conversion type that was not the RPO
+ conversion. This leads to a slightly different behaviour than the RPT
+ conversion for operands in conjunction with a parent RPX conversion.
+ */
+struct FunctionParamInfo
+{
+ FuncParamValidity meValid; /// Parameter validity.
+ FuncParamConversion meConv; /// Token class conversion type.
+ bool mbValType; /// Data type (false = REFTYPE, true = VALTYPE).
+};
+
// function data ==============================================================
/** This enumeration contains constants for all known external libraries
@@ -373,23 +482,13 @@ enum FunctionLibraryType
// ----------------------------------------------------------------------------
-const sal_uInt8 FUNCINFO_MAXPARAM = 30; /// Maximum parameter count.
-
-const sal_uInt8 FUNCINFO_PARAM_EXCELONLY = 0x01; /// Flag for a parameter existing in Excel, but not in Calc.
-const sal_uInt8 FUNCINFO_PARAM_CALCONLY = 0x02; /// Flag for a parameter existing in Calc, but not in Excel.
-const sal_uInt8 FUNCINFO_PARAM_INVALID = 0x04; /// Flag for an invalid token class.
-
/** Represents information for a spreadsheet function.
- The member mpnParamClass contains an array of BIFF token classes for each
- parameter of the function. The last existing (non-null) value in this array
- is used for all following parameters used in a function. Additionally to
- the three actual token classes, this array may contain the special values
- FUNCINFO_PARAM_CALCONLY, FUNCINFO_PARAM_EXCELONLY, and
- FUNCINFO_PARAM_INVALID. The former two specify parameters only existing in
- one of the applications. FUNCINFO_PARAM_INVALID is simply a terminator for
- the array to prevent repetition of the last token class or special value
- for additional parameters.
+ The member mpParamInfos points to an array of type information structures
+ for all parameters of the function. The last initialized structure
+ describing a regular parameter (member meValid == EXC_PARAMVALID_ALWAYS) in
+ this array is used repeatedly for all following parameters supported by a
+ function.
*/
struct FunctionInfo
{
@@ -404,7 +503,8 @@ struct FunctionInfo
sal_uInt8 mnMinParamCount; /// Minimum number of parameters.
sal_uInt8 mnMaxParamCount; /// Maximum number of parameters.
sal_uInt8 mnRetClass; /// BIFF token class of the return value.
- const sal_uInt8* mpnParamClass; /// Expected BIFF token classes of parameters.
+ const FunctionParamInfo* mpParamInfos; /// Information about all parameters.
+ bool mbParamPairs; /// true = optional parameters are expected to appear in pairs.
bool mbVolatile; /// True = volatile function.
bool mbExternal; /// True = external function in Calc.
bool mbMacroFunc; /// True = macro sheet function or command.
@@ -415,28 +515,28 @@ typedef RefVector< FunctionInfo > FunctionInfoVector;
// function info parameter class iterator =====================================
-/** Iterator working on the mpnParamClass member of the FunctionInfo struct.
+/** Iterator working on the mpParamInfos member of the FunctionInfo struct.
This iterator can be used to iterate through the array containing the
- expected token classes of function parameters. This iterator repeats the
- last valid token class in the array - it stops automatically before the
- first empty array entry or before the end of the array, even for repeated
- calls to the increment operator.
+ token class conversion information of function parameters. This iterator
+ repeats the last valid structure in the array - it stops automatically
+ before the first empty array entry or before the end of the array, even for
+ repeated calls to the increment operator.
*/
-class FuncInfoParamClassIterator
+class FunctionParamInfoIterator
{
public:
- explicit FuncInfoParamClassIterator( const FunctionInfo& rFuncInfo );
-
- FuncInfoParamClassIterator& operator++();
+ explicit FunctionParamInfoIterator( const FunctionInfo& rFuncInfo );
- inline sal_uInt8 getParamClass() const { return *mpnParamClass; }
- inline sal_uInt8 isExcelOnlyParam() const { return getFlag( *mpnParamClass, FUNCINFO_PARAM_EXCELONLY ); }
- inline sal_uInt8 isCalcOnlyParam() const { return getFlag( *mpnParamClass, FUNCINFO_PARAM_CALCONLY ); }
+ const FunctionParamInfo& getParamInfo() const;
+ bool isCalcOnlyParam() const;
+ bool isExcelOnlyParam() const;
+ FunctionParamInfoIterator& operator++();
private:
- const sal_uInt8* mpnParamClass;
- const sal_uInt8* mpnParamClassEnd;
+ const FunctionParamInfo* mpParamInfo;
+ const FunctionParamInfo* mpParamInfoEnd;
+ bool mbParamPairs;
};
// base function provider =====================================================
diff --git a/oox/inc/oox/xls/richstring.hxx b/oox/inc/oox/xls/richstring.hxx
index 23a0801531ae..47a55e92c350 100644
--- a/oox/inc/oox/xls/richstring.hxx
+++ b/oox/inc/oox/xls/richstring.hxx
@@ -71,6 +71,9 @@ public:
/** Final processing after import of all strings. */
void finalizeImport();
+ /** Returns the text data of this portion. */
+ inline const ::rtl::OUString& getText() const { return maText; }
+
/** Converts the portion and appends it to the passed XText. */
void convert(
const ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >& rxText,
@@ -254,6 +257,9 @@ public:
/** Final processing after import of all strings. */
void finalizeImport();
+ /** Returns the plain text concatenated from all string portions. */
+ ::rtl::OUString getPlainText() const;
+
/** Converts the string and writes it into the passed XText. */
void convert(
const ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >& rxText,
diff --git a/oox/inc/oox/xls/stylesbuffer.hxx b/oox/inc/oox/xls/stylesbuffer.hxx
index 13890aec7223..c79ef46e5859 100644
--- a/oox/inc/oox/xls/stylesbuffer.hxx
+++ b/oox/inc/oox/xls/stylesbuffer.hxx
@@ -38,6 +38,7 @@
#include <com/sun/star/table/CellVertJustify.hpp>
#include <com/sun/star/table/TableBorder.hpp>
#include "oox/helper/containerhelper.hxx"
+#include "oox/drawingml/color.hxx"
#include "oox/xls/numberformatsbuffer.hxx"
namespace com { namespace sun { namespace star {
@@ -46,8 +47,6 @@ namespace com { namespace sun { namespace star {
namespace oox { class PropertySet; }
-#define OOX_XLS_USE_DEFAULT_STYLE 0
-
namespace oox {
namespace xls {
@@ -67,9 +66,6 @@ const sal_Int32 OOX_COLOR_FONTAUTO = 0x7FFF; /// Font auto color (sys
// ----------------------------------------------------------------------------
-const sal_Int32 API_RGB_TRANSPARENT = -1; /// Transparent color for API calls.
-const sal_Int32 API_RGB_BLACK = 0; /// Black color for API calls.
-
const sal_Int16 API_LINE_NONE = 0;
const sal_Int16 API_LINE_HAIR = 2;
const sal_Int16 API_LINE_THIN = 35;
@@ -85,11 +81,9 @@ const sal_Int8 API_ESCAPEHEIGHT_DEFAULT = 58; /// Relative character h
// ============================================================================
-class Color
+class Color : public ::oox::drawingml::Color
{
public:
- explicit Color();
-
/** Sets the color to automatic. */
void setAuto();
/** Sets the color to the passed RGB value. */
@@ -115,23 +109,7 @@ public:
void importColorRgb( BiffInputStream& rStrm );
/** Returns true, if the color is set to automatic. */
- bool isAuto() const;
- /** Returns the RGB value of the color, or nAuto for automatic colors. */
- sal_Int32 getColor( const WorkbookHelper& rHelper, sal_Int32 nAuto = API_RGB_TRANSPARENT ) const;
-
-private:
- enum ColorMode
- {
- COLOR_AUTO, /// Automatic color (dependent on context).
- COLOR_RGB, /// Hexadecimal RGB color.
- COLOR_THEME, /// Indexed theme color.
- COLOR_INDEXED, /// Indexed palette color.
- COLOR_FINAL /// Finalized RGB color (resolved theme, applied tint).
- };
-
- mutable ColorMode meMode; /// Current color mode.
- mutable sal_Int32 mnValue; /// RGB value, palette index, scheme index.
- double mfTint; /// Color tint (darken/lighten).
+ inline bool isAuto() const { return isPlaceHolder(); }
};
// ----------------------------------------------------------------------------
@@ -817,8 +795,10 @@ public:
/** Final processing after import of all style settings. */
void finalizeImport();
- /** Creates the style sheet described by the DXF. */
- const ::rtl::OUString& createDxfStyle( sal_Int32 nDxfId );
+ /** Writes all formatting attributes to the passed property map. */
+ void writeToPropertyMap( PropertyMap& rPropMap ) const;
+ /** Writes all formatting attributes to the passed property set. */
+ void writeToPropertySet( PropertySet& rPropSet ) const;
private:
FontRef mxFont; /// Font data.
@@ -827,7 +807,6 @@ private:
ProtectionRef mxProtection; /// Protection data.
BorderRef mxBorder; /// Border data.
FillRef mxFill; /// Fill data.
- ::rtl::OUString maFinalName; /// Final style name used in API.
};
typedef ::boost::shared_ptr< Dxf > DxfRef;
@@ -848,11 +827,9 @@ struct CellStyleModel
explicit CellStyleModel();
/** Returns true, if this style is a builtin style. */
- inline bool isBuiltin() const { return mbBuiltin && (mnBuiltinId >= 0); }
+ bool isBuiltin() const;
/** Returns true, if this style represents the default document cell style. */
bool isDefaultStyle() const;
- /** Returns the style name used in the UI. */
- ::rtl::OUString createStyleName() const;
};
// ============================================================================
@@ -869,23 +846,67 @@ public:
/** Imports style settings from a STYLE record. */
void importStyle( BiffInputStream& rStrm );
- /** Returns true, if this style represents the default document cell style. */
- inline bool isDefaultStyle() const { return maModel.isDefaultStyle(); }
- /** Returns the XF identifier for this cell style. */
- inline sal_Int32 getXfId() const { return maModel.mnXfId; }
+ /** Creates the style sheet in the document described by this cell style object. */
+ void createCellStyle();
+ /** Stores tha passed final style name and creates the cell style, if it is
+ user-defined or modified built-in. */
+ void finalizeImport( const ::rtl::OUString& rFinalName );
- /** Creates the style sheet described by the style XF with the passed identifier. */
- const ::rtl::OUString& createCellStyle( sal_Int32 nXfId, bool bSkipDefaultBuiltin = false );
+ /** Returns the cell style model structure. */
+ inline const CellStyleModel& getModel() const { return maModel; }
+ /** Returns the final style name used in the document. */
+ inline const ::rtl::OUString& getFinalStyleName() const { return maFinalName; }
private:
CellStyleModel maModel;
- ::rtl::OUString maCalcName; /// Final style name used in API.
+ ::rtl::OUString maFinalName; /// Final style name used in API.
+ bool mbCreated; /// True = style sheet created.
};
typedef ::boost::shared_ptr< CellStyle > CellStyleRef;
// ============================================================================
+class CellStyleBuffer : public WorkbookHelper
+{
+public:
+ explicit CellStyleBuffer( const WorkbookHelper& rHelper );
+
+ /** Appends and returns a new named cell style object. */
+ CellStyleRef importCellStyle( const AttributeList& rAttribs );
+ /** Imports the CELLSTYLE record from the passed stream. */
+ CellStyleRef importCellStyle( RecordInputStream& rStrm );
+ /** Imports the STYLE record from the passed stream. */
+ CellStyleRef importStyle( BiffInputStream& rStrm );
+
+ /** Final processing after import of all style settings. */
+ void finalizeImport();
+
+ /** Returns the XF identifier associated to the default cell style. */
+ sal_Int32 getDefaultXfId() const;
+ /** Returns the default style sheet for unused cells. */
+ ::rtl::OUString getDefaultStyleName() const;
+ /** Creates the style sheet described by the style XF with the passed identifier. */
+ ::rtl::OUString createCellStyle( sal_Int32 nXfId ) const;
+
+private:
+ /** Inserts the passed cell style object into the internal maps. */
+ void insertCellStyle( CellStyleRef xCellStyle );
+ /** Creates the style sheet described by the passed cell style object. */
+ ::rtl::OUString createCellStyle( const CellStyleRef& rxCellStyle ) const;
+
+private:
+ typedef RefVector< CellStyle > CellStyleVector;
+ typedef RefMap< sal_Int32, CellStyle > CellStyleXfIdMap;
+
+ CellStyleVector maBuiltinStyles; /// All built-in cell styles.
+ CellStyleVector maUserStyles; /// All user defined cell styles.
+ CellStyleXfIdMap maStylesByXf; /// All cell styles, mapped by XF identifier.
+ CellStyleRef mxDefStyle; /// Default cell style.
+};
+
+// ============================================================================
+
class StylesBuffer : public WorkbookHelper
{
public:
@@ -960,15 +981,12 @@ public:
/** Returns the model of the default application font (used in the "Normal" cell style). */
const FontModel& getDefaultFontModel() const;
+ /** Returns the default style sheet for unused cells. */
+ ::rtl::OUString getDefaultStyleName() const;
/** Creates the style sheet described by the style XF with the passed identifier. */
- const ::rtl::OUString& createCellStyle( sal_Int32 nXfId ) const;
+ ::rtl::OUString createCellStyle( sal_Int32 nXfId ) const;
/** Creates the style sheet described by the DXF with the passed identifier. */
- const ::rtl::OUString& createDxfStyle( sal_Int32 nDxfId ) const;
-#if OOX_XLS_USE_DEFAULT_STYLE
-#else
- /** Returns the default style sheet for unused cells. */
- const ::rtl::OUString& getDefaultStyleName() const;
-#endif
+ ::rtl::OUString createDxfStyle( sal_Int32 nDxfId ) const;
/** Writes the font attributes of the specified font data to the passed property map. */
void writeFontToPropertyMap( PropertyMap& rPropMap, sal_Int32 nFontId ) const;
@@ -989,27 +1007,23 @@ public:
void writeStyleXfToPropertySet( PropertySet& rPropSet, sal_Int32 nXfId ) const;
private:
- void insertCellStyle( CellStyleRef xCellStyle );
-
-private:
- typedef RefVector< Font > FontVec;
- typedef RefVector< Border > BorderVec;
- typedef RefVector< Fill > FillVec;
- typedef RefVector< Xf > XfVec;
- typedef RefVector< Dxf > DxfVec;
- typedef RefMap< sal_Int32, CellStyle > CellStyleMap;
+ typedef RefVector< Font > FontVector;
+ typedef RefVector< Border > BorderVector;
+ typedef RefVector< Fill > FillVector;
+ typedef RefVector< Xf > XfVector;
+ typedef RefVector< Dxf > DxfVector;
+ typedef ::std::map< sal_Int32, ::rtl::OUString > DxfStyleMap;
ColorPalette maPalette; /// Color palette.
- FontVec maFonts; /// List of font objects.
+ FontVector maFonts; /// List of font objects.
NumberFormatsBuffer maNumFmts; /// List of all number format codes.
- BorderVec maBorders; /// List of cell border objects.
- FillVec maFills; /// List of cell area fill objects.
- XfVec maCellXfs; /// List of cell formats.
- XfVec maStyleXfs; /// List of cell styles.
- DxfVec maDxfs; /// List of differential cell styles.
- CellStyleMap maCellStyles; /// List of named cell styles.
- ::rtl::OUString maDefStyleName; /// API name of default cell style.
- sal_Int32 mnDefStyleXf; /// Style XF index of default cell style.
+ BorderVector maBorders; /// List of cell border objects.
+ FillVector maFills; /// List of cell area fill objects.
+ XfVector maCellXfs; /// List of cell formats.
+ XfVector maStyleXfs; /// List of cell styles.
+ CellStyleBuffer maCellStyles; /// All built-in and user defined cell styles.
+ DxfVector maDxfs; /// List of differential cell styles.
+ mutable DxfStyleMap maDxfStyles; /// Maps DXF identifiers to Calc style sheet names.
};
// ============================================================================
diff --git a/oox/inc/oox/xls/themebuffer.hxx b/oox/inc/oox/xls/themebuffer.hxx
index ca0a80d983fe..b1ee4b4ebc66 100644
--- a/oox/inc/oox/xls/themebuffer.hxx
+++ b/oox/inc/oox/xls/themebuffer.hxx
@@ -49,8 +49,6 @@ public:
/** Returns the theme color with the specified token identifier. */
sal_Int32 getColorByToken( sal_Int32 nToken ) const;
- /** Returns the theme color with the specified index. */
- sal_Int32 getColorByIndex( sal_Int32 nIndex ) const;
/** Returns the default font data for the current file type. */
inline const FontModel& getDefaultFontModel() const { return *mxDefFontModel; }
diff --git a/oox/inc/oox/xls/viewsettings.hxx b/oox/inc/oox/xls/viewsettings.hxx
index fceb1bc1a63c..f18d0371c6c2 100644
--- a/oox/inc/oox/xls/viewsettings.hxx
+++ b/oox/inc/oox/xls/viewsettings.hxx
@@ -92,6 +92,8 @@ struct SheetViewModel
sal_Int32 getNormalZoom() const;
/** Returns the zoom in pagebreak preview (returns default, if current value is 0). */
sal_Int32 getPageBreakZoom() const;
+ /** Returns the grid color as RGB value. */
+ sal_Int32 getGridColor( const ::oox::core::FilterBase& rFilter ) const;
/** Returns the selection data, if available, otherwise 0. */
const PaneSelectionModel* getPaneSelection( sal_Int32 nPaneId ) const;
@@ -186,23 +188,23 @@ public:
void importWindow1( BiffInputStream& rStrm );
/** Stores converted view settings for a specific worksheet. */
- void setSheetViewSettings( sal_Int32 nSheet,
+ void setSheetViewSettings( sal_Int16 nSheet,
const SheetViewModelRef& rxSheetView,
const ::com::sun::star::uno::Any& rProperties );
/** Converts all imported document view settings. */
void finalizeImport();
- /** Returns the index of the active sheet. */
- sal_Int32 getActiveSheetIndex() const;
+ /** Returns the Calc index of the active sheet. */
+ sal_Int16 getActiveCalcSheet() const;
private:
WorkbookViewModel& createWorkbookView();
private:
typedef RefVector< WorkbookViewModel > WorkbookViewModelVec;
- typedef RefMap< sal_Int32, SheetViewModel > SheetViewModelMap;
- typedef ::std::map< sal_Int32, ::com::sun::star::uno::Any > SheetPropertiesMap;
+ typedef RefMap< sal_Int16, SheetViewModel > SheetViewModelMap;
+ typedef ::std::map< sal_Int16, ::com::sun::star::uno::Any > SheetPropertiesMap;
WorkbookViewModelVec maBookViews; /// Workbook view models.
SheetViewModelMap maSheetViews; /// Active view model for each sheet.
diff --git a/oox/inc/oox/xls/workbookfragment.hxx b/oox/inc/oox/xls/workbookfragment.hxx
index a691fcf5cf57..d3925f9113d8 100644
--- a/oox/inc/oox/xls/workbookfragment.hxx
+++ b/oox/inc/oox/xls/workbookfragment.hxx
@@ -94,7 +94,7 @@ private:
/** Imports a sheet fragment with passed type from current stream position. */
bool importSheetFragment(
ISegmentProgressBar& rProgressBar,
- BiffFragmentType eFragment, sal_Int32 nSheet );
+ BiffFragmentType eFragment, sal_Int16 nCalcSheet );
};
// ============================================================================
diff --git a/oox/inc/oox/xls/workbookhelper.hxx b/oox/inc/oox/xls/workbookhelper.hxx
index 145fac0d3576..c42afce36945 100644
--- a/oox/inc/oox/xls/workbookhelper.hxx
+++ b/oox/inc/oox/xls/workbookhelper.hxx
@@ -169,6 +169,14 @@ enum FilterType
// ============================================================================
+/** Functor for case-insensitive string comparison, usable in maps etc. */
+struct IgnoreCaseCompare
+{
+ bool operator()( const ::rtl::OUString& rName1, const ::rtl::OUString& rName2 ) const;
+};
+
+// ============================================================================
+
class WorkbookData;
class WorkbookSettings;
class ViewSettings;
@@ -253,7 +261,7 @@ public:
/** Returns a reference to the specified spreadsheet in the document model. */
::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet >
- getSheetFromDoc( sal_Int32 nSheet ) const;
+ getSheetFromDoc( sal_Int16 nSheet ) const;
/** Returns a reference to the specified spreadsheet in the document model. */
::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet >
getSheetFromDoc( const ::rtl::OUString& rSheet ) const;
@@ -281,12 +289,11 @@ public:
createNamedRangeObject(
::rtl::OUString& orName,
sal_Int32 nNameFlags = 0 ) const;
- /** Creates a com.sun.star.style.Style object and returns its final name. */
+ /** Creates and returns a com.sun.star.style.Style object for cells or pages. */
::com::sun::star::uno::Reference< ::com::sun::star::style::XStyle >
createStyleObject(
::rtl::OUString& orStyleName,
- bool bPageStyle,
- bool bRenameOldExisting = false ) const;
+ bool bPageStyle ) const;
// buffers ----------------------------------------------------------------
@@ -359,7 +366,7 @@ public:
/** Enables workbook file mode, used for BIFF4 workspace files. */
void setIsWorkbookFile();
/** Recreates global buffers that are used per sheet in specific BIFF versions. */
- void createBuffersPerSheet();
+ void createBuffersPerSheet( sal_Int16 nSheet );
/** Returns the codec helper that stores the encoder/decoder object. */
BiffCodecHelper& getCodecHelper() const;
diff --git a/oox/inc/oox/xls/workbooksettings.hxx b/oox/inc/oox/xls/workbooksettings.hxx
index 683747c03ed6..81712bd5c5a1 100644
--- a/oox/inc/oox/xls/workbooksettings.hxx
+++ b/oox/inc/oox/xls/workbooksettings.hxx
@@ -40,6 +40,18 @@ namespace xls {
// ============================================================================
+/** Settings for workbook write protection. */
+struct FileSharingModel
+{
+ ::rtl::OUString maUserName; /// User who added the write protection password.
+ sal_uInt16 mnPasswordHash; /// Hash value of the write protection password.
+ bool mbRecommendReadOnly; /// True = recommend read-only mode on opening.
+
+ explicit FileSharingModel();
+};
+
+// ============================================================================
+
/** Global workbook settings. */
struct WorkbookSettingsModel
{
@@ -84,11 +96,15 @@ class WorkbookSettings : public WorkbookHelper
public:
explicit WorkbookSettings( const WorkbookHelper& rHelper );
+ /** Imports the fileSharing element containing write protection settings. */
+ void importFileSharing( const AttributeList& rAttribs );
/** Imports the workbookPr element containing global workbook settings. */
void importWorkbookPr( const AttributeList& rAttribs );
/** Imports the calcPr element containing workbook calculation settings. */
void importCalcPr( const AttributeList& rAttribs );
+ /** Imports the FILESHARING record containing write protection settings. */
+ void importFileSharing( RecordInputStream& rStrm );
/** Imports the WORKBOOKPR record containing global workbook settings. */
void importWorkbookPr( RecordInputStream& rStrm );
/** Imports the CALCPR record containing workbook calculation settings. */
@@ -96,6 +112,8 @@ public:
/** Sets the save external linked values flag, e.g. from the WSBOOL record. */
void setSaveExtLinkValues( bool bSaveExtLinks );
+ /** Imports the FILESHARING record. */
+ void importFileSharing( BiffInputStream& rStrm );
/** Imports the BOOKBOOL record. */
void importBookBool( BiffInputStream& rStrm );
/** Imports the CALCCOUNT record. */
@@ -136,6 +154,7 @@ private:
void setDateMode( bool bDateMode1904 );
private:
+ FileSharingModel maFileSharing;
WorkbookSettingsModel maBookSettings;
CalcSettingsModel maCalcSettings;
};
diff --git a/oox/inc/oox/xls/worksheetbuffer.hxx b/oox/inc/oox/xls/worksheetbuffer.hxx
index a4ebdedef7e2..c1f977f802ca 100644
--- a/oox/inc/oox/xls/worksheetbuffer.hxx
+++ b/oox/inc/oox/xls/worksheetbuffer.hxx
@@ -31,9 +31,8 @@
#ifndef OOX_XLS_WORKSHEETBUFFER_HXX
#define OOX_XLS_WORKSHEETBUFFER_HXX
-#include <vector>
-#include <map>
#include <utility>
+#include "oox/helper/containerhelper.hxx"
#include "oox/xls/workbookhelper.hxx"
namespace com { namespace sun { namespace star {
@@ -50,7 +49,7 @@ struct SheetInfoModel
{
::rtl::OUString maRelId; /// Relation identifier for the sheet substream.
::rtl::OUString maName; /// Original name of the sheet.
- ::rtl::OUString maFinalName; /// Final (converted) name of the sheet.
+ sal_Int64 mnBiffHandle; /// BIFF record handle of the sheet substream.
sal_Int32 mnSheetId; /// Sheet identifier.
sal_Int32 mnState; /// Visibility state.
@@ -70,6 +69,9 @@ class WorksheetBuffer : public WorkbookHelper
public:
explicit WorksheetBuffer( const WorkbookHelper& rHelper );
+ /** Returns the base file name without path and file extension. */
+ static ::rtl::OUString getBaseFileName( const ::rtl::OUString& rUrl );
+
/** Initializes the buffer for single sheet files (BIFF2-BIFF4). */
void initializeSingleSheet();
@@ -79,34 +81,50 @@ public:
void importSheet( RecordInputStream& rStrm );
/** Imports the SHEET record from the passed BIFF stream. */
void importSheet( BiffInputStream& rStrm );
-
/** Inserts a new empty sheet into the document. Looks for an unused name.
- @return Internal index of the new sheet. */
+ @return Index of the new sheet in the Calc document. */
sal_Int16 insertEmptySheet( const ::rtl::OUString& rPreferredName, bool bVisible );
/** Returns the number of original sheets contained in the workbook. */
- sal_Int32 getSheetCount() const;
- /** Returns the OOX relation identifier of the specified sheet. */
- ::rtl::OUString getSheetRelId( sal_Int32 nSheet ) const;
- /** Returns the finalized name of the specified sheet. */
- ::rtl::OUString getCalcSheetName( sal_Int32 nSheet ) const;
- /** Returns the finalized name of the sheet with the passed original name. */
- ::rtl::OUString getCalcSheetName( const ::rtl::OUString& rModelName ) const;
- /** Returns the index of the sheet with the passed original name. */
- sal_Int32 getCalcSheetIndex( const ::rtl::OUString& rModelName ) const;
+ sal_Int32 getWorksheetCount() const;
+ /** Returns the OOX relation identifier of the specified worksheet. */
+ ::rtl::OUString getWorksheetRelId( sal_Int32 nWorksheet ) const;
+ /** Returns the BIFF record handle of the associated sheet substream. */
+ sal_Int64 getBiffRecordHandle( sal_Int32 nWorksheet ) const;
+
+ /** Returns the Calc index of the specified worksheet. */
+ sal_Int16 getCalcSheetIndex( sal_Int32 nWorksheet ) const;
+ /** Returns the finalized name of the specified worksheet. */
+ ::rtl::OUString getCalcSheetName( sal_Int32 nWorksheet ) const;
+
+ /** Returns the Calc index of the sheet with the passed original worksheet name. */
+ sal_Int16 getCalcSheetIndex( const ::rtl::OUString& rWorksheetName ) const;
+ /** Returns the finalized name of the sheet with the passed worksheet name. */
+ ::rtl::OUString getCalcSheetName( const ::rtl::OUString& rWorksheetName ) const;
private:
- typedef ::std::pair< sal_Int16, ::rtl::OUString > IndexNamePair;
+ struct SheetInfo : public SheetInfoModel
+ {
+ ::rtl::OUString maCalcName;
+ ::rtl::OUString maCalcQuotedName;
+ sal_Int16 mnCalcSheet;
- const SheetInfoModel* getSheetInfo( sal_Int32 nSheet ) const;
+ explicit SheetInfo( const SheetInfoModel& rModel, sal_Int16 nCalcSheet, const ::rtl::OUString& rCalcName );
+ };
+
+ typedef ::std::pair< sal_Int16, ::rtl::OUString > IndexNamePair;
- IndexNamePair insertSheet( const ::rtl::OUString& rPreferredName, sal_Int16 nSheet, bool bVisible );
+ /** Creates a new sheet in the Calc document. Does not insert anything in the own lists. */
+ IndexNamePair createSheet( const ::rtl::OUString& rPreferredName, sal_Int32 nSheetPos, bool bVisible );
+ /** Creates a new sheet in the Calc document and inserts the related SheetInfo. */
void insertSheet( const SheetInfoModel& rModel );
private:
- typedef ::std::vector< SheetInfoModel > SheetInfoModelVec;
+ typedef RefVector< SheetInfo > SheetInfoVector;
+ SheetInfoVector maSheetInfos;
- SheetInfoModelVec maSheetInfos;
+ typedef RefMap< ::rtl::OUString, SheetInfo, IgnoreCaseCompare > SheetInfoMap;
+ SheetInfoMap maSheetInfosByName;
};
// ============================================================================
diff --git a/oox/inc/oox/xls/worksheetfragment.hxx b/oox/inc/oox/xls/worksheetfragment.hxx
index e5721265937f..110851ea9521 100644
--- a/oox/inc/oox/xls/worksheetfragment.hxx
+++ b/oox/inc/oox/xls/worksheetfragment.hxx
@@ -71,7 +71,7 @@ public:
const ::rtl::OUString& rFragmentPath,
ISegmentProgressBarRef xProgressBar,
WorksheetType eSheetType,
- sal_Int32 nSheet );
+ sal_Int16 nSheet );
protected:
// oox.core.ContextHandler2Helper interface -------------------------------
@@ -147,7 +147,7 @@ public:
const BiffWorkbookFragmentBase& rParent,
ISegmentProgressBarRef xProgressBar,
WorksheetType eSheetType,
- sal_Int32 nSheet );
+ sal_Int16 nSheet );
virtual ~BiffWorksheetFragment();
/** Imports the entire worksheet fragment, returns true, if EOF record has been reached. */
diff --git a/oox/inc/oox/xls/worksheethelper.hxx b/oox/inc/oox/xls/worksheethelper.hxx
index fc097783510b..7bb9b52ff117 100644
--- a/oox/inc/oox/xls/worksheethelper.hxx
+++ b/oox/inc/oox/xls/worksheethelper.hxx
@@ -175,8 +175,9 @@ struct PageBreakModel
/** Stores data about a hyperlink range. */
struct HyperlinkModel : public ::oox::ole::StdHlinkInfo
{
- ::com::sun::star::table::CellRangeAddress maRange;
- ::rtl::OUString maTooltip;
+ ::com::sun::star::table::CellRangeAddress
+ maRange; /// The cell area containing the hyperlink.
+ ::rtl::OUString maTooltip; /// Additional tooltip text.
explicit HyperlinkModel();
};
@@ -442,7 +443,7 @@ protected:
const WorkbookHelper& rHelper,
ISegmentProgressBarRef xProgressBar,
WorksheetType eSheetType,
- sal_Int32 nSheet );
+ sal_Int16 nSheet );
/** Constructs from another sheet helper, does not create a data object. */
explicit WorksheetHelperRoot(
diff --git a/oox/prj/build.lst b/oox/prj/build.lst
index 599b99227472..a1dfa584543c 100644
--- a/oox/prj/build.lst
+++ b/oox/prj/build.lst
@@ -1,4 +1,4 @@
-oox oox : vos cppu cppuhelper comphelper sal offapi sax basegfx tools BOOST:boost NULL
+oox oox : vos cppu cppuhelper comphelper sal offapi sax basegfx tools vcl BOOST:boost OPENSSL:openssl NULL
oox oox usr1 - all oox_mkout NULL
oox oox\prj get - all oox_prj NULL
oox oox\source\token nmake - all oox_token NULL
diff --git a/oox/prj/d.lst b/oox/prj/d.lst
index df4430bcd058..50ec05955ca6 100644
--- a/oox/prj/d.lst
+++ b/oox/prj/d.lst
@@ -1,10 +1,10 @@
mkdir: %_DEST%\inc%_EXT%\oox
-mkdir: %_DEST%\inc%_EXT%\oox\core
mkdir: %_DEST%\inc%_EXT%\oox\helper
-mkdir: %_DEST%\inc%_EXT%\oox\vml
+mkdir: %_DEST%\inc%_EXT%\oox\core
mkdir: %_DEST%\inc%_EXT%\oox\drawingml
mkdir: %_DEST%\inc%_EXT%\oox\drawingml\chart
mkdir: %_DEST%\inc%_EXT%\oox\drawingml\table
+mkdir: %_DEST%\inc%_EXT%\oox\vml
..\%__SRC%\misc\*.map %_DEST%\bin%_EXT%\*.map
..\%__SRC%\lib\ixo.lib %_DEST%\lib%_EXT%\ixo.lib
@@ -13,23 +13,24 @@ mkdir: %_DEST%\inc%_EXT%\oox\drawingml\table
..\%__SRC%\bin\*.dll %_DEST%\bin%_EXT%\*.dll
..\%__SRC%\lib\lib*.so %_DEST%\lib%_EXT%\lib*.so
..\%__SRC%\lib\i*.lib %_DEST%\lib%_EXT%\i*.lib
+..\%__SRC%\lib\*.dylib %_DEST%\lib%_EXT%\*.dylib
-..\inc\oox\dllapi.h %_DEST%\inc%_EXT%\oox\dllapi.h
-..\source\token\tokens.txt %_DEST%\inc%_EXT%\oox\token.txt
-..\inc\oox\core\filterbase.hxx %_DEST%\inc%_EXT%\oox\core\filterbase.hxx
-..\inc\oox\core\relations.hxx %_DEST%\inc%_EXT%\oox\core\relations.hxx
..\%__SRC%\inc\tokens.hxx %_DEST%\inc%_EXT%\oox\core\tokens.hxx
-..\inc\oox\core\xmlfilterbase.hxx %_DEST%\inc%_EXT%\oox\core\xmlfilterbase.hxx
+
+..\source\token\tokens.txt %_DEST%\inc%_EXT%\oox\token.txt
+..\inc\oox\dllapi.h %_DEST%\inc%_EXT%\oox\dllapi.h
..\inc\oox\helper\binarystreambase.hxx %_DEST%\inc%_EXT%\oox\helper\binarystreambase.hxx
..\inc\oox\helper\helper.hxx %_DEST%\inc%_EXT%\oox\helper\helper.hxx
..\inc\oox\helper\storagebase.hxx %_DEST%\inc%_EXT%\oox\helper\storagebase.hxx
..\inc\oox\helper\zipstorage.hxx %_DEST%\inc%_EXT%\oox\helper\zipstorage.hxx
-..\inc\oox\vml\drawing.hxx %_DEST%\inc%_EXT%\oox\vml\drawing.hxx
+..\inc\oox\core\filterbase.hxx %_DEST%\inc%_EXT%\oox\core\filterbase.hxx
+..\inc\oox\core\filterdetect.hxx %_DEST%\inc%_EXT%\oox\core\filterdetect.hxx
+..\inc\oox\core\relations.hxx %_DEST%\inc%_EXT%\oox\core\relations.hxx
+..\inc\oox\core\xmlfilterbase.hxx %_DEST%\inc%_EXT%\oox\core\xmlfilterbase.hxx
..\inc\oox\drawingml\chart\chartconverter.hxx %_DEST%\inc%_EXT%\oox\drawingml\chart\chartconverter.hxx
..\inc\oox\drawingml\table\tablestylelist.hxx %_DEST%\inc%_EXT%\oox\drawingml\table\tablestylelist.hxx
-..\inc\oox\vml\shape.hxx %_DEST%\inc%_EXT%\oox\vml\shape.hxx
-
-..\%__SRC%\lib\*.dylib %_DEST%\lib%_EXT%\*.dylib
+..\inc\oox\vml\vmldrawing.hxx %_DEST%\inc%_EXT%\oox\vml\vmldrawing.hxx
+..\inc\oox\vml\vmlshape.hxx %_DEST%\inc%_EXT%\oox\vml\vmlshape.hxx
dos: sh -c "if test %OS% = MACOSX; then create-bundle %_DEST%\lib%_EXT%\*.dylib; fi"
diff --git a/oox/source/core/binarycodec.cxx b/oox/source/core/binarycodec.cxx
index 78161b161aab..b6a7e92986b6 100644
--- a/oox/source/core/binarycodec.cxx
+++ b/oox/source/core/binarycodec.cxx
@@ -31,7 +31,7 @@
#include "oox/core/binarycodec.hxx"
#include <algorithm>
#include <string.h>
-#include <osl/diagnose.h>
+#include "oox/helper/attributelist.hxx"
namespace oox {
namespace core {
@@ -113,6 +113,15 @@ sal_uInt16 lclGetHash( const sal_uInt8* pnPassData, sal_Int32 nBufferSize )
// ============================================================================
+/*static*/ sal_uInt16 CodecHelper::getPasswordHash( const AttributeList& rAttribs, sal_Int32 nElement )
+{
+ sal_Int32 nPasswordHash = rAttribs.getIntegerHex( nElement, 0 );
+ OSL_ENSURE( (0 <= nPasswordHash) && (nPasswordHash <= SAL_MAX_UINT16), "CodecHelper::getPasswordHash - invalid password hash" );
+ return static_cast< sal_uInt16 >( ((0 <= nPasswordHash) && (nPasswordHash <= SAL_MAX_UINT16)) ? nPasswordHash : 0 );
+}
+
+// ============================================================================
+
BinaryCodec_XOR::BinaryCodec_XOR( CodecType eCodecType ) :
meCodecType( eCodecType ),
mnOffset( 0 ),
@@ -249,7 +258,7 @@ BinaryCodec_RCF::~BinaryCodec_RCF()
rtl_cipher_destroy( mhCipher );
}
-void BinaryCodec_RCF::initKey( const sal_uInt16 pnPassData[ 16 ], const sal_uInt8 pnUnique[ 16 ] )
+void BinaryCodec_RCF::initKey( const sal_uInt16 pnPassData[ 16 ], const sal_uInt8 pnSalt[ 16 ] )
{
// create little-endian key data array from password data
sal_uInt8 pnKeyData[ 64 ];
@@ -271,11 +280,11 @@ void BinaryCodec_RCF::initKey( const sal_uInt16 pnPassData[ 16 ], const sal_uInt
(void)rtl_digest_updateMD5( mhDigest, pnKeyData, sizeof( pnKeyData ) );
(void)rtl_digest_rawMD5( mhDigest, pnKeyData, RTL_DIGEST_LENGTH_MD5 );
- // update digest with key data and passed unique data
+ // update digest with key data and passed salt data
for( size_t nIndex = 0; nIndex < 16; ++nIndex )
{
rtl_digest_updateMD5( mhDigest, pnKeyData, 5 );
- rtl_digest_updateMD5( mhDigest, pnUnique, 16 );
+ rtl_digest_updateMD5( mhDigest, pnSalt, 16 );
}
// update digest with padding
@@ -292,7 +301,7 @@ void BinaryCodec_RCF::initKey( const sal_uInt16 pnPassData[ 16 ], const sal_uInt
(void)memset( pnKeyData, 0, sizeof( pnKeyData ) );
}
-bool BinaryCodec_RCF::verifyKey( const sal_uInt8 pnSaltData[ 16 ], const sal_uInt8 pnSaltDigest[ 16 ] )
+bool BinaryCodec_RCF::verifyKey( const sal_uInt8 pnVerifier[ 16 ], const sal_uInt8 pnVerifierHash[ 16 ] )
{
if( !startBlock( 0 ) )
return false;
@@ -301,7 +310,7 @@ bool BinaryCodec_RCF::verifyKey( const sal_uInt8 pnSaltData[ 16 ], const sal_uIn
sal_uInt8 pnBuffer[ 64 ];
// decode salt data into buffer
- rtl_cipher_decode( mhCipher, pnSaltData, 16, pnBuffer, sizeof( pnBuffer ) );
+ rtl_cipher_decode( mhCipher, pnVerifier, 16, pnBuffer, sizeof( pnBuffer ) );
pnBuffer[ 16 ] = 0x80;
(void)memset( pnBuffer + 17, 0, sizeof( pnBuffer ) - 17 );
@@ -312,7 +321,7 @@ bool BinaryCodec_RCF::verifyKey( const sal_uInt8 pnSaltData[ 16 ], const sal_uIn
rtl_digest_rawMD5( mhDigest, pnDigest, sizeof( pnDigest ) );
// decode original salt digest into buffer
- rtl_cipher_decode( mhCipher, pnSaltDigest, 16, pnBuffer, sizeof( pnBuffer ) );
+ rtl_cipher_decode( mhCipher, pnVerifierHash, 16, pnBuffer, sizeof( pnBuffer ) );
// compare buffer with computed digest
bool bResult = memcmp( pnBuffer, pnDigest, sizeof( pnDigest ) ) == 0;
diff --git a/oox/source/core/binaryfilterbase.cxx b/oox/source/core/binaryfilterbase.cxx
index 86e89318d476..c883284de664 100644
--- a/oox/source/core/binaryfilterbase.cxx
+++ b/oox/source/core/binaryfilterbase.cxx
@@ -51,15 +51,16 @@ BinaryFilterBase::~BinaryFilterBase()
{
}
-StorageRef BinaryFilterBase::implCreateStorage(
- Reference< XInputStream >& rxInStream, Reference< XStream >& rxOutStream ) const
+// private --------------------------------------------------------------------
+
+StorageRef BinaryFilterBase::implCreateStorage( const Reference< XInputStream >& rxInStream ) const
+{
+ return StorageRef( new OleStorage( getGlobalFactory(), rxInStream, true ) );
+}
+
+StorageRef BinaryFilterBase::implCreateStorage( const Reference< XStream >& rxOutStream ) const
{
- StorageRef xStorage;
- if( rxInStream.is() )
- xStorage.reset( new OleStorage( getGlobalFactory(), rxInStream, true ) );
- else if( rxOutStream.is() )
- xStorage.reset( new OleStorage( getGlobalFactory(), rxOutStream, true ) );
- return xStorage;
+ return StorageRef( new OleStorage( getGlobalFactory(), rxOutStream, true ) );
}
// ============================================================================
diff --git a/oox/source/core/fasttokenhandler.cxx b/oox/source/core/fasttokenhandler.cxx
new file mode 100644
index 000000000000..cb8841b7dc9f
--- /dev/null
+++ b/oox/source/core/fasttokenhandler.cxx
@@ -0,0 +1,95 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: tokenmap.cxx,v $
+ * $Revision: 1.4 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "oox/core/fasttokenhandler.hxx"
+#include <osl/mutex.hxx>
+#include "oox/token/tokenmap.hxx"
+
+using ::rtl::OUString;
+using ::osl::Mutex;
+using ::osl::MutexGuard;
+using ::com::sun::star::uno::Sequence;
+using ::com::sun::star::uno::RuntimeException;
+
+namespace oox {
+namespace core {
+
+// ============================================================================
+
+namespace {
+
+Mutex& lclGetTokenMutex()
+{
+ static Mutex aMutex;
+ return aMutex;
+}
+
+} // namespace
+
+// ============================================================================
+
+FastTokenHandler::FastTokenHandler() :
+ mrTokenMap( StaticTokenMap::get() )
+{
+}
+
+FastTokenHandler::~FastTokenHandler()
+{
+}
+
+sal_Int32 FastTokenHandler::getToken( const OUString& rIdentifier ) throw( RuntimeException )
+{
+ MutexGuard aGuard( lclGetTokenMutex() );
+ return mrTokenMap.getTokenFromUnicode( rIdentifier );
+}
+
+OUString FastTokenHandler::getIdentifier( sal_Int32 nToken ) throw( RuntimeException )
+{
+ MutexGuard aGuard( lclGetTokenMutex() );
+ return mrTokenMap.getUnicodeTokenName( nToken );
+}
+
+Sequence< sal_Int8 > FastTokenHandler::getUTF8Identifier( sal_Int32 nToken ) throw( RuntimeException )
+{
+ MutexGuard aGuard( lclGetTokenMutex() );
+ return mrTokenMap.getUtf8TokenName( nToken );
+}
+
+sal_Int32 FastTokenHandler::getTokenFromUTF8( const Sequence< sal_Int8 >& rIdentifier ) throw( RuntimeException )
+{
+ MutexGuard aGuard( lclGetTokenMutex() );
+ return mrTokenMap.getTokenFromUtf8( rIdentifier );
+}
+
+// ============================================================================
+
+} // namespace core
+} // namespace oox
+
diff --git a/oox/source/core/filterbase.cxx b/oox/source/core/filterbase.cxx
index 23363db46ed5..c5b423380e82 100644
--- a/oox/source/core/filterbase.cxx
+++ b/oox/source/core/filterbase.cxx
@@ -38,6 +38,7 @@
#include <osl/mutex.hxx>
#include <rtl/instance.hxx>
#include <rtl/uri.hxx>
+#include <comphelper/docpasswordhelper.hxx>
#include <comphelper/mediadescriptor.hxx>
#include "tokens.hxx"
#include "oox/helper/binaryinputstream.hxx"
@@ -58,7 +59,6 @@ using ::com::sun::star::uno::UNO_SET_THROW;
using ::com::sun::star::lang::IllegalArgumentException;
using ::com::sun::star::lang::XMultiServiceFactory;
using ::com::sun::star::lang::XComponent;
-using ::com::sun::star::beans::NamedValue;
using ::com::sun::star::beans::PropertyValue;
using ::com::sun::star::awt::DeviceInfo;
using ::com::sun::star::awt::XDevice;
@@ -72,6 +72,7 @@ using ::com::sun::star::task::XStatusIndicator;
using ::com::sun::star::task::XInteractionHandler;
using ::com::sun::star::graphic::XGraphic;
using ::comphelper::MediaDescriptor;
+using ::comphelper::SequenceAsHashMap;
using ::oox::ole::OleObjectHelper;
namespace oox {
@@ -88,7 +89,7 @@ public:
explicit DocumentOpenedGuard( const OUString& rUrl );
~DocumentOpenedGuard();
- inline bool isValid() const { return maUrl.getLength() > 0; }
+ inline bool isValid() const { return mbValid; }
private:
DocumentOpenedGuard( const DocumentOpenedGuard& );
@@ -99,15 +100,15 @@ private:
UrlSet& mrUrls;
OUString maUrl;
+ bool mbValid;
};
DocumentOpenedGuard::DocumentOpenedGuard( const OUString& rUrl ) :
mrUrls( UrlPool::get() )
{
::osl::MutexGuard aGuard( *this );
- OSL_ENSURE( (rUrl.getLength() == 0) || (mrUrls.count( rUrl ) == 0),
- "DocumentOpenedGuard::DocumentOpenedGuard - filter called recursively for this document" );
- if( (rUrl.getLength() > 0) && (mrUrls.count( rUrl ) == 0) )
+ mbValid = (rUrl.getLength() == 0) || (mrUrls.count( rUrl ) == 0);
+ if( mbValid && (rUrl.getLength() > 0) )
{
mrUrls.insert( rUrl );
maUrl = rUrl;
@@ -117,7 +118,7 @@ DocumentOpenedGuard::DocumentOpenedGuard( const OUString& rUrl ) :
DocumentOpenedGuard::~DocumentOpenedGuard()
{
::osl::MutexGuard aGuard( *this );
- if( isValid() )
+ if( maUrl.getLength() > 0 )
mrUrls.erase( maUrl );
}
@@ -125,6 +126,16 @@ DocumentOpenedGuard::~DocumentOpenedGuard()
// ============================================================================
+/** Specifies whether this filter is an import or export filter. */
+enum FilterDirection
+{
+ FILTERDIRECTION_UNKNOWN,
+ FILTERDIRECTION_IMPORT,
+ FILTERDIRECTION_EXPORT
+};
+
+// ----------------------------------------------------------------------------
+
struct FilterBaseImpl
{
typedef ::boost::shared_ptr< GraphicHelper > GraphicHelperRef;
@@ -132,9 +143,10 @@ struct FilterBaseImpl
typedef ::boost::shared_ptr< OleObjectHelper > OleObjHelperRef;
typedef ::std::map< OUString, Reference< XGraphic > > EmbeddedGraphicMap;
typedef ::std::map< sal_Int32, sal_Int32 > SystemPalette;
- typedef ::std::map< OUString, Any > ArgumentMap;
- MediaDescriptor maDescriptor;
+ FilterDirection meDirection;
+ SequenceAsHashMap maArguments;
+ MediaDescriptor maMediaDesc;
DeviceInfo maDeviceInfo;
OUString maFileUrl;
StorageRef mxStorage;
@@ -145,7 +157,6 @@ struct FilterBaseImpl
EmbeddedGraphicMap maEmbeddedGraphics; /// Maps all imported embedded graphics by their path.
SystemPalette maSystemPalette; /// Maps system colors (XML tokens) to RGB color values.
- ArgumentMap maArguments;
Reference< XMultiServiceFactory > mxGlobalFactory;
Reference< XModel > mxModel;
Reference< XMultiServiceFactory > mxModelFactory;
@@ -157,14 +168,16 @@ struct FilterBaseImpl
explicit FilterBaseImpl( const Reference< XMultiServiceFactory >& rxGlobalFactory );
void setDocumentModel( const Reference< XComponent >& rxComponent );
- void setMediaDescriptor( const Sequence< PropertyValue >& rDescriptor );
-
bool hasDocumentModel() const;
+
+ void initializeFilter();
+ void finalizeFilter();
};
// ----------------------------------------------------------------------------
FilterBaseImpl::FilterBaseImpl( const Reference< XMultiServiceFactory >& rxGlobalFactory ) :
+ meDirection( FILTERDIRECTION_UNKNOWN ),
mxGlobalFactory( rxGlobalFactory )
{
OSL_ENSURE( mxGlobalFactory.is(), "FilterBaseImpl::FilterBaseImpl - missing service factory" );
@@ -223,23 +236,39 @@ void FilterBaseImpl::setDocumentModel( const Reference< XComponent >& rxComponen
mxModelFactory.set( rxComponent, UNO_QUERY );
}
-void FilterBaseImpl::setMediaDescriptor( const Sequence< PropertyValue >& rDescriptor )
+bool FilterBaseImpl::hasDocumentModel() const
{
- maDescriptor = rDescriptor;
-
- maFileUrl = maDescriptor.getUnpackedValueOrDefault( MediaDescriptor::PROP_URL(), maFileUrl );
- mxInStream = maDescriptor.getUnpackedValueOrDefault( MediaDescriptor::PROP_INPUTSTREAM(), mxInStream );
- mxOutStream = maDescriptor.getUnpackedValueOrDefault( MediaDescriptor::PROP_STREAMFOROUTPUT(), mxOutStream );
- mxStatusIndicator = maDescriptor.getUnpackedValueOrDefault( MediaDescriptor::PROP_STATUSINDICATOR(), mxStatusIndicator );
- mxInteractionHandler = maDescriptor.getUnpackedValueOrDefault( MediaDescriptor::PROP_INTERACTIONHANDLER(), mxInteractionHandler );
+ return mxGlobalFactory.is() && mxModel.is() && mxModelFactory.is();
+}
- if( mxInStream.is() )
- maDescriptor.addInputStream();
+void FilterBaseImpl::initializeFilter()
+{
+ try
+ {
+ // lock the model controllers
+ mxModel->lockControllers();
+ }
+ catch( Exception& )
+ {
+ }
}
-bool FilterBaseImpl::hasDocumentModel() const
+void FilterBaseImpl::finalizeFilter()
{
- return mxGlobalFactory.is() && mxModel.is() && mxModelFactory.is();
+ try
+ {
+ // clear the 'ComponentData' property in the descriptor
+ MediaDescriptor::iterator aIt = maMediaDesc.find( MediaDescriptor::PROP_COMPONENTDATA() );
+ if( aIt != maMediaDesc.end() )
+ aIt->second.clear();
+ // write the descriptor back to the document model (adds the password)
+ mxModel->attachResource( maFileUrl, maMediaDesc.getAsConstPropertyValueList() );
+ // unlock the model controllers
+ mxModel->unlockControllers();
+ }
+ catch( Exception& )
+ {
+ }
}
// ============================================================================
@@ -255,19 +284,19 @@ FilterBase::~FilterBase()
bool FilterBase::isImportFilter() const
{
- return mxImpl->mxInStream.is();
+ return mxImpl->meDirection == FILTERDIRECTION_IMPORT;
}
bool FilterBase::isExportFilter() const
{
- return mxImpl->mxOutStream.is();
+ return mxImpl->meDirection == FILTERDIRECTION_EXPORT;
}
// ----------------------------------------------------------------------------
Any FilterBase::getArgument( const OUString& rArgName ) const
{
- FilterBaseImpl::ArgumentMap::const_iterator aIt = mxImpl->maArguments.find( rArgName );
+ SequenceAsHashMap::const_iterator aIt = mxImpl->maArguments.find( rArgName );
return (aIt == mxImpl->maArguments.end()) ? Any() : aIt->second;
}
@@ -276,6 +305,11 @@ const Reference< XMultiServiceFactory >& FilterBase::getGlobalFactory() const
return mxImpl->mxGlobalFactory;
}
+MediaDescriptor& FilterBase::getMediaDescriptor() const
+{
+ return mxImpl->maMediaDesc;
+}
+
const Reference< XModel >& FilterBase::getModel() const
{
return mxImpl->mxModel;
@@ -437,7 +471,27 @@ sal_Int32 FilterBase::getSystemColor( sal_Int32 nToken, sal_Int32 nDefaultRgb )
{
FilterBaseImpl::SystemPalette::const_iterator aIt = mxImpl->maSystemPalette.find( nToken );
OSL_ENSURE( aIt != mxImpl->maSystemPalette.end(), "FilterBase::getSystemColor - invalid token identifier" );
- return (aIt == mxImpl->maSystemPalette.end()) ? ((nDefaultRgb < 0) ? API_RGB_WHITE : nDefaultRgb) : aIt->second;
+ return (aIt == mxImpl->maSystemPalette.end()) ? nDefaultRgb : aIt->second;
+}
+
+sal_Int32 FilterBase::getSchemeColor( sal_Int32 /*nToken*/ ) const
+{
+ OSL_ENSURE( false, "FilterBase::getSchemeColor - scheme colors not implemented" );
+ return API_RGB_TRANSPARENT;
+}
+
+sal_Int32 FilterBase::getPaletteColor( sal_Int32 /*nPaletteIdx*/ ) const
+{
+ OSL_ENSURE( false, "FilterBase::getPaletteColor - palette colors not implemented" );
+ return API_RGB_TRANSPARENT;
+}
+
+OUString FilterBase::requestPassword( ::comphelper::IDocPasswordVerifier& rVerifier ) const
+{
+ ::std::vector< OUString > aDefaultPasswords;
+ aDefaultPasswords.push_back( CREATE_OUSTRING( "VelvetSweatshop" ) );
+ return ::comphelper::DocPasswordHelper::requestAndVerifyDocPassword(
+ rVerifier, mxImpl->maMediaDesc, ::comphelper::DocPasswordRequestType_MS, &aDefaultPasswords );
}
bool FilterBase::importBinaryData( StreamDataSequence& orDataSeq, const OUString& rStreamName )
@@ -508,17 +562,12 @@ Sequence< OUString > SAL_CALL FilterBase::getSupportedServiceNames() throw( Runt
void SAL_CALL FilterBase::initialize( const Sequence< Any >& rArgs ) throw( Exception, RuntimeException )
{
- if( rArgs.getLength() >= 2 )
+ if( rArgs.getLength() >= 2 ) try
+ {
+ mxImpl->maArguments << rArgs[ 1 ];
+ }
+ catch( Exception& )
{
- Sequence< NamedValue > aArgSeq;
- if( (rArgs[ 1 ] >>= aArgSeq) && aArgSeq.hasElements() )
- {
- const NamedValue* pArg = aArgSeq.getConstArray();
- const NamedValue* pEnd = pArg + aArgSeq.getLength();
- for( ; pArg < pEnd; ++pArg )
- if( pArg->Name.getLength() > 0 )
- mxImpl->maArguments[ pArg->Name ] = pArg->Value;
- }
}
}
@@ -529,6 +578,7 @@ void SAL_CALL FilterBase::setTargetDocument( const Reference< XComponent >& rxDo
mxImpl->setDocumentModel( rxDocument );
if( !mxImpl->hasDocumentModel() )
throw IllegalArgumentException();
+ mxImpl->meDirection = FILTERDIRECTION_IMPORT;
}
// com.sun.star.document.XExporter interface ----------------------------------
@@ -538,29 +588,41 @@ void SAL_CALL FilterBase::setSourceDocument( const Reference< XComponent >& rxDo
mxImpl->setDocumentModel( rxDocument );
if( !mxImpl->hasDocumentModel() )
throw IllegalArgumentException();
+ mxImpl->meDirection = FILTERDIRECTION_EXPORT;
}
// com.sun.star.document.XFilter interface ------------------------------------
-sal_Bool SAL_CALL FilterBase::filter( const Sequence< PropertyValue >& rDescriptor ) throw( RuntimeException )
+sal_Bool SAL_CALL FilterBase::filter( const Sequence< PropertyValue >& rMediaDescSeq ) throw( RuntimeException )
{
sal_Bool bRet = sal_False;
- if( mxImpl->hasDocumentModel() )
+ if( mxImpl->hasDocumentModel() && (mxImpl->meDirection != FILTERDIRECTION_UNKNOWN) )
{
- mxImpl->setMediaDescriptor( rDescriptor );
+ setMediaDescriptor( rMediaDescSeq );
DocumentOpenedGuard aOpenedGuard( mxImpl->maFileUrl );
if( aOpenedGuard.isValid() )
{
- mxImpl->mxStorage = implCreateStorage( mxImpl->mxInStream, mxImpl->mxOutStream );
- if( mxImpl->mxStorage.get() )
+ mxImpl->initializeFilter();
+ switch( mxImpl->meDirection )
{
- mxImpl->mxModel->lockControllers();
- if( mxImpl->mxInStream.is() )
- bRet = importDocument();
- else if( mxImpl->mxOutStream.is() )
- bRet = exportDocument();
- mxImpl->mxModel->unlockControllers();
+ case FILTERDIRECTION_UNKNOWN:
+ break;
+ case FILTERDIRECTION_IMPORT:
+ if( mxImpl->mxInStream.is() )
+ {
+ mxImpl->mxStorage = implCreateStorage( mxImpl->mxInStream );
+ bRet = mxImpl->mxStorage.get() && importDocument();
+ }
+ break;
+ case FILTERDIRECTION_EXPORT:
+ if( mxImpl->mxOutStream.is() )
+ {
+ mxImpl->mxStorage = implCreateStorage( mxImpl->mxOutStream );
+ bRet = mxImpl->mxStorage.get() && exportDocument();
+ }
+ break;
}
+ mxImpl->finalizeFilter();
}
}
return bRet;
@@ -570,6 +632,46 @@ void SAL_CALL FilterBase::cancel() throw( RuntimeException )
{
}
+// protected ------------------------------------------------------------------
+
+Reference< XInputStream > FilterBase::implGetInputStream( MediaDescriptor& rMediaDesc ) const
+{
+ return rMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_INPUTSTREAM(), Reference< XInputStream >() );
+}
+
+Reference< XStream > FilterBase::implGetOutputStream( MediaDescriptor& rMediaDesc ) const
+{
+ return rMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_STREAMFOROUTPUT(), Reference< XStream >() );
+}
+
+// private --------------------------------------------------------------------
+
+void FilterBase::setMediaDescriptor( const Sequence< PropertyValue >& rMediaDescSeq )
+{
+ mxImpl->maMediaDesc = rMediaDescSeq;
+
+ switch( mxImpl->meDirection )
+ {
+ case FILTERDIRECTION_UNKNOWN:
+ OSL_ENSURE( false, "FilterBase::setMediaDescriptor - invalid filter direction" );
+ break;
+ case FILTERDIRECTION_IMPORT:
+ mxImpl->maMediaDesc.addInputStream();
+ mxImpl->mxInStream = implGetInputStream( mxImpl->maMediaDesc );
+ OSL_ENSURE( mxImpl->mxInStream.is(), "FilterBase::setMediaDescriptor - missing input stream" );
+ break;
+ case FILTERDIRECTION_EXPORT:
+ mxImpl->mxOutStream = implGetOutputStream( mxImpl->maMediaDesc );
+ OSL_ENSURE( mxImpl->mxOutStream.is(), "FilterBase::setMediaDescriptor - missing output stream" );
+ break;
+ }
+
+ mxImpl->maFileUrl = mxImpl->maMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_URL(), OUString() );
+ mxImpl->mxStatusIndicator = mxImpl->maMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_STATUSINDICATOR(), Reference< XStatusIndicator >() );
+ mxImpl->mxInteractionHandler = mxImpl->maMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_INTERACTIONHANDLER(), Reference< XInteractionHandler >() );
+}
+
+
// ============================================================================
} // namespace core
diff --git a/oox/source/core/filterdetect.cxx b/oox/source/core/filterdetect.cxx
index b0496de26589..434adb9576dd 100644
--- a/oox/source/core/filterdetect.cxx
+++ b/oox/source/core/filterdetect.cxx
@@ -28,89 +28,52 @@
*
************************************************************************/
-#include <com/sun/star/document/XExtendedFilterDetection.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/embed/XHierarchicalStorageAccess.hpp>
-
-#include <com/sun/star/xml/sax/XFastDocumentHandler.hpp>
-#include <com/sun/star/xml/sax/XFastContextHandler.hpp>
+#include "oox/core/filterdetect.hxx"
+#include <com/sun/star/io/XStream.hpp>
#include <com/sun/star/xml/sax/XFastParser.hpp>
-
+#include <rtl/digest.h>
+#include <openssl/evp.h>
+#include <comphelper/docpasswordhelper.hxx>
#include <comphelper/mediadescriptor.hxx>
-#include <cppuhelper/implbase1.hxx>
-#include <cppuhelper/implbase2.hxx>
-
#include "oox/helper/attributelist.hxx"
+#include "oox/helper/binaryinputstream.hxx"
+#include "oox/helper/binaryoutputstream.hxx"
+#include "oox/helper/olestorage.hxx"
#include "oox/helper/zipstorage.hxx"
#include "oox/core/fasttokenhandler.hxx"
#include "oox/core/namespaces.hxx"
-#include "tokens.hxx"
-
-#include <vector>
using ::rtl::OUString;
-using ::rtl::OString;
+using ::com::sun::star::uno::Exception;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::RuntimeException;
+using ::com::sun::star::uno::Sequence;
+using ::com::sun::star::uno::UNO_QUERY;
+using ::com::sun::star::uno::UNO_QUERY_THROW;
+using ::com::sun::star::uno::UNO_SET_THROW;
+using ::com::sun::star::uno::XInterface;
+using ::com::sun::star::lang::XMultiServiceFactory;
+using ::com::sun::star::beans::NamedValue;
+using ::com::sun::star::beans::PropertyValue;
+using ::com::sun::star::io::XInputStream;
+using ::com::sun::star::io::XOutputStream;
+using ::com::sun::star::io::XStream;
+using ::com::sun::star::xml::sax::InputSource;
+using ::com::sun::star::xml::sax::SAXException;
+using ::com::sun::star::xml::sax::XFastAttributeList;
+using ::com::sun::star::xml::sax::XFastContextHandler;
+using ::com::sun::star::xml::sax::XFastParser;
+using ::com::sun::star::xml::sax::XLocator;
using ::comphelper::MediaDescriptor;
-using namespace ::com::sun::star::document;
-using namespace ::com::sun::star::lang;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::beans;
-using namespace ::com::sun::star::io;
-using namespace ::com::sun::star::embed;
-using namespace ::com::sun::star::xml::sax;
+using ::comphelper::SequenceAsHashMap;
namespace oox {
namespace core {
// ============================================================================
-/** Document handler specifically designed for detecting OOXML file formats.
-
- It takes a reference to the filter string object via its constructor, and
- puts the name of the detected filter to it if it successfully finds one.
- */
-class FilterDetectDocHandler : public ::cppu::WeakImplHelper1< XFastDocumentHandler >
-{
-public:
- explicit FilterDetectDocHandler( OUString& rFilter );
- virtual ~FilterDetectDocHandler();
-
- // XFastDocumentHandler
- virtual void SAL_CALL startDocument() throw (SAXException, RuntimeException);
- virtual void SAL_CALL endDocument() throw (SAXException, RuntimeException);
- virtual void SAL_CALL setDocumentLocator( const Reference< XLocator >& xLocator ) throw (SAXException, RuntimeException);
-
- // XFastContextHandler
- virtual void SAL_CALL startFastElement( sal_Int32 nElement, const Reference< XFastAttributeList >& Attribs ) throw (SAXException, RuntimeException);
- virtual void SAL_CALL startUnknownElement( const OUString& Namespace, const OUString& Name, const Reference< XFastAttributeList >& Attribs ) throw (SAXException, RuntimeException);
- virtual void SAL_CALL endFastElement( sal_Int32 Element ) throw (SAXException, RuntimeException);
- virtual void SAL_CALL endUnknownElement( const OUString& Namespace, const OUString& Name ) throw (SAXException, RuntimeException);
- virtual Reference< XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 Element, const Reference< XFastAttributeList >& Attribs ) throw (SAXException, RuntimeException);
- virtual Reference< XFastContextHandler > SAL_CALL createUnknownChildContext( const OUString& Namespace, const OUString& Name, const Reference< XFastAttributeList >& Attribs ) throw (SAXException, RuntimeException);
- virtual void SAL_CALL characters( const OUString& aChars ) throw (SAXException, RuntimeException);
- virtual void SAL_CALL ignorableWhitespace( const OUString& aWhitespaces ) throw (SAXException, RuntimeException);
- virtual void SAL_CALL processingInstruction( const OUString& aTarget, const OUString& aData ) throw (SAXException, RuntimeException);
-
-private:
- void parseRelationship( const AttributeList& rAttribs );
-
- OUString getFilterNameFromContentType( const OUString& rContentType ) const;
- void parseContentTypesDefault( const AttributeList& rAttribs );
- void parseContentTypesOverride( const AttributeList& rAttribs );
-
-private:
- typedef ::std::vector< sal_Int32 > ContextVector;
-
- OUString& mrFilter;
- ContextVector maContextStack;
- OUString maTargetPath;
-};
-
-// ============================================================================
-
-FilterDetectDocHandler::FilterDetectDocHandler( OUString& rFilter ) :
- mrFilter( rFilter )
+FilterDetectDocHandler::FilterDetectDocHandler( OUString& rFilterName ) :
+ mrFilterName( rFilterName )
{
maContextStack.reserve( 2 );
}
@@ -134,8 +97,6 @@ void SAL_CALL FilterDetectDocHandler::setDocumentLocator( const Reference<XLocat
{
}
-// ===========================================================================
-
void SAL_CALL FilterDetectDocHandler::startFastElement(
sal_Int32 nElement, const Reference< XFastAttributeList >& rAttribs )
throw (SAXException,RuntimeException)
@@ -213,8 +174,6 @@ void SAL_CALL FilterDetectDocHandler::processingInstruction(
{
}
-// ============================================================================
-
void FilterDetectDocHandler::parseRelationship( const AttributeList& rAttribs )
{
OUString aType = rAttribs.getString( XML_Type, OUString() );
@@ -224,6 +183,14 @@ void FilterDetectDocHandler::parseRelationship( const AttributeList& rAttribs )
OUString FilterDetectDocHandler::getFilterNameFromContentType( const OUString& rContentType ) const
{
+ if( rContentType.equalsAscii( "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" ) ||
+ rContentType.equalsAscii( "application/vnd.ms-word.document.macroEnabled.main+xml" ) )
+ return CREATE_OUSTRING( "writer_MS_Word_2007" );
+
+ if( rContentType.equalsAscii( "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml" ) ||
+ rContentType.equalsAscii( "application/vnd.ms-word.template.macroEnabledTemplate.main+xml" ) )
+ return CREATE_OUSTRING( "writer_MS_Word_2007_Template" );
+
if( rContentType.equalsAscii( "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" ) ||
rContentType.equalsAscii( "application/vnd.ms-excel.sheet.macroEnabled.main+xml" ) )
return CREATE_OUSTRING( "MS Excel 2007 XML" );
@@ -249,44 +216,24 @@ OUString FilterDetectDocHandler::getFilterNameFromContentType( const OUString& r
void FilterDetectDocHandler::parseContentTypesDefault( const AttributeList& rAttribs )
{
// only if no overridden part name found
- if( mrFilter.getLength() == 0 )
+ if( mrFilterName.getLength() == 0 )
{
// check if target path ends with extension
OUString aExtension = rAttribs.getString( XML_Extension, OUString() );
sal_Int32 nExtPos = maTargetPath.getLength() - aExtension.getLength();
if( (nExtPos > 0) && (maTargetPath[ nExtPos - 1 ] == '.') && maTargetPath.match( aExtension, nExtPos ) )
- mrFilter = getFilterNameFromContentType( rAttribs.getString( XML_ContentType, OUString() ) );
+ mrFilterName = getFilterNameFromContentType( rAttribs.getString( XML_ContentType, OUString() ) );
}
}
void FilterDetectDocHandler::parseContentTypesOverride( const AttributeList& rAttribs )
{
if( rAttribs.getString( XML_PartName, OUString() ).equals( maTargetPath ) )
- mrFilter = getFilterNameFromContentType( rAttribs.getString( XML_ContentType, OUString() ) );
+ mrFilterName = getFilterNameFromContentType( rAttribs.getString( XML_ContentType, OUString() ) );
}
// ============================================================================
-class FilterDetect : public ::cppu::WeakImplHelper2< XExtendedFilterDetection, XServiceInfo >
-{
-public:
- explicit FilterDetect( const Reference< XMultiServiceFactory >& xFactory );
- virtual ~FilterDetect();
-
- // XServiceInfo
- virtual OUString SAL_CALL getImplementationName() throw( RuntimeException );
- virtual sal_Bool SAL_CALL supportsService( const OUString& rServiceName ) throw( RuntimeException );
- virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw( RuntimeException );
-
- // XExtendedFilterDetect
- virtual OUString SAL_CALL detect( Sequence< PropertyValue >& lDescriptor ) throw( RuntimeException );
-
-private:
- Reference< XMultiServiceFactory > mxFactory;
-};
-
-// ----------------------------------------------------------------------------
-
/* Helper for XServiceInfo */
Sequence< OUString > FilterDetect_getSupportedServiceNames()
{
@@ -307,8 +254,10 @@ Reference< XInterface > SAL_CALL FilterDetect_createInstance( const Reference< X
return Reference< XInterface >( *new FilterDetect( xServiceManager ) );
}
-FilterDetect::FilterDetect( const Reference< XMultiServiceFactory >& xFactory ) :
- mxFactory( xFactory )
+// ----------------------------------------------------------------------------
+
+FilterDetect::FilterDetect( const Reference< XMultiServiceFactory >& rxFactory ) :
+ mxFactory( rxFactory )
{
OSL_ENSURE( mxFactory.is(), "FilterDetect::FilterDetect - no service factory" );
}
@@ -317,45 +266,319 @@ FilterDetect::~FilterDetect()
{
}
-// com.sun.star.document.XExtendedFilterDetect interface ----------------------
+/* =========================================================================== */
+/* Kudos to Caolan McNamara who provided the core decryption implementations. */
+/* =========================================================================== */
+
+namespace {
+
+const sal_uInt32 ENCRYPTINFO_CRYPTOAPI = 0x00000004;
+const sal_uInt32 ENCRYPTINFO_DOCPROPS = 0x00000008;
+const sal_uInt32 ENCRYPTINFO_EXTERNAL = 0x00000010;
+const sal_uInt32 ENCRYPTINFO_AES = 0x00000020;
+
+const sal_uInt32 ENCRYPT_ALGO_AES128 = 0x0000660E;
+const sal_uInt32 ENCRYPT_ALGO_AES192 = 0x0000660F;
+const sal_uInt32 ENCRYPT_ALGO_AES256 = 0x00006610;
+const sal_uInt32 ENCRYPT_ALGO_RC4 = 0x00006801;
+
+const sal_uInt32 ENCRYPT_HASH_SHA1 = 0x00008004;
+
+// ----------------------------------------------------------------------------
+
+bool lclIsZipPackage( const Reference< XMultiServiceFactory >& rxFactory, const Reference< XInputStream >& rxInStrm )
+{
+ ZipStorage aZipStorage( rxFactory, rxInStrm );
+ return aZipStorage.isStorage();
+}
+
+// ----------------------------------------------------------------------------
+
+struct PackageEncryptionInfo
+{
+ sal_uInt8 mpnSalt[ 16 ];
+ sal_uInt8 mpnEncrVerifier[ 16 ];
+ sal_uInt8 mpnEncrVerifierHash[ 32 ];
+ sal_uInt32 mnFlags;
+ sal_uInt32 mnAlgorithmId;
+ sal_uInt32 mnAlgorithmIdHash;
+ sal_uInt32 mnKeySize;
+ sal_uInt32 mnSaltSize;
+ sal_uInt32 mnVerifierHashSize;
+};
+
+bool lclReadEncryptionInfo( PackageEncryptionInfo& rEncrInfo, BinaryInputStream& rStrm )
+{
+ rStrm.skip( 4 );
+ rStrm >> rEncrInfo.mnFlags;
+ if( getFlag( rEncrInfo.mnFlags, ENCRYPTINFO_EXTERNAL ) )
+ return false;
+
+ sal_uInt32 nHeaderSize, nRepeatedFlags;
+ rStrm >> nHeaderSize >> nRepeatedFlags;
+ if( (nHeaderSize < 20) || (nRepeatedFlags != rEncrInfo.mnFlags) )
+ return false;
+
+ rStrm.skip( 4 );
+ rStrm >> rEncrInfo.mnAlgorithmId >> rEncrInfo.mnAlgorithmIdHash >> rEncrInfo.mnKeySize;
+ rStrm.skip( nHeaderSize - 20 );
+ rStrm >> rEncrInfo.mnSaltSize;
+ if( rEncrInfo.mnSaltSize != 16 )
+ return false;
+
+ rStrm.readMemory( rEncrInfo.mpnSalt, 16 );
+ rStrm.readMemory( rEncrInfo.mpnEncrVerifier, 16 );
+ rStrm >> rEncrInfo.mnVerifierHashSize;
+ rStrm.readMemory( rEncrInfo.mpnEncrVerifierHash, 32 );
+ return !rStrm.isEof();
+}
+
+// ----------------------------------------------------------------------------
+
+void lclDeriveKey( const sal_uInt8* pnHash, sal_uInt32 nHashLen, sal_uInt8* pnKeyDerived, sal_uInt32 nRequiredKeyLen )
+{
+ sal_uInt8 pnBuffer[ 64 ];
+ memset( pnBuffer, 0x36, sizeof( pnBuffer ) );
+ for( sal_uInt32 i = 0; i < nHashLen; ++i )
+ pnBuffer[ i ] ^= pnHash[ i ];
+
+ rtlDigest aDigest = rtl_digest_create( rtl_Digest_AlgorithmSHA1 );
+ rtlDigestError aError = rtl_digest_update( aDigest, pnBuffer, sizeof( pnBuffer ) );
+ sal_uInt8 pnX1[ RTL_DIGEST_LENGTH_SHA1 ];
+ aError = rtl_digest_get( aDigest, pnX1, RTL_DIGEST_LENGTH_SHA1 );
+ rtl_digest_destroy( aDigest );
+
+ memset( pnBuffer, 0x5C, sizeof( pnBuffer ) );
+ for( sal_uInt32 i = 0; i < nHashLen; ++i )
+ pnBuffer[ i ] ^= pnHash[ i ];
+
+ aDigest = rtl_digest_create( rtl_Digest_AlgorithmSHA1 );
+ aError = rtl_digest_update( aDigest, pnBuffer, sizeof( pnBuffer ) );
+ sal_uInt8 pnX2[ RTL_DIGEST_LENGTH_SHA1 ];
+ aError = rtl_digest_get( aDigest, pnX2, RTL_DIGEST_LENGTH_SHA1 );
+ rtl_digest_destroy( aDigest );
+
+ if( nRequiredKeyLen > RTL_DIGEST_LENGTH_SHA1 )
+ {
+ memcpy( pnKeyDerived + RTL_DIGEST_LENGTH_SHA1, pnX2, nRequiredKeyLen - RTL_DIGEST_LENGTH_SHA1 );
+ nRequiredKeyLen = RTL_DIGEST_LENGTH_SHA1;
+ }
+ memcpy( pnKeyDerived, pnX1, nRequiredKeyLen );
+}
+
+// ----------------------------------------------------------------------------
-OUString SAL_CALL FilterDetect::detect( Sequence< PropertyValue >& lDescriptor ) throw( RuntimeException )
+bool lclGenerateEncryptionKey( const PackageEncryptionInfo& rEncrInfo, const OUString& rPassword, sal_uInt8* pnKey, sal_uInt32 nRequiredKeyLen )
{
- OUString aFilter;
+ size_t nBufferSize = rEncrInfo.mnSaltSize + 2 * rPassword.getLength();
+ sal_uInt8* pnBuffer = new sal_uInt8[ nBufferSize ];
+ memcpy( pnBuffer, rEncrInfo.mpnSalt, rEncrInfo.mnSaltSize );
+
+ sal_uInt8* pnPasswordLoc = pnBuffer + rEncrInfo.mnSaltSize;
+ const sal_Unicode* pStr = rPassword.getStr();
+ for( sal_Int32 i = 0, nLen = rPassword.getLength(); i < nLen; ++i, ++pStr, pnPasswordLoc += 2 )
+ ByteOrderConverter::writeLittleEndian( pnPasswordLoc, static_cast< sal_uInt16 >( *pStr ) );
+
+ rtlDigest aDigest = rtl_digest_create( rtl_Digest_AlgorithmSHA1 );
+ rtlDigestError aError = rtl_digest_update( aDigest, pnBuffer, nBufferSize );
+ delete[] pnBuffer;
- if( mxFactory.is() ) try
+ size_t nHashSize = RTL_DIGEST_LENGTH_SHA1 + 4;
+ sal_uInt8* pnHash = new sal_uInt8[ nHashSize ];
+ aError = rtl_digest_get( aDigest, pnHash + 4, RTL_DIGEST_LENGTH_SHA1 );
+ rtl_digest_destroy( aDigest );
+
+ for( sal_uInt32 i = 0; i < 50000; ++i )
{
- Reference< XFastParser > xParser( mxFactory->createInstance(
- CREATE_OUSTRING( "com.sun.star.xml.sax.FastParser" ) ), UNO_QUERY_THROW );
-
- xParser->setFastDocumentHandler( new FilterDetectDocHandler( aFilter ) );
- xParser->setTokenHandler( new FastTokenHandler );
-
- xParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/package/2006/relationships" ), NMSP_PACKAGE_RELATIONSHIPS );
- xParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/officeDocument/2006/relationships" ), NMSP_RELATIONSHIPS );
- xParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/package/2006/content-types" ), NMSP_CONTENT_TYPES );
-
- MediaDescriptor aDescriptor( lDescriptor );
- aDescriptor.addInputStream();
- Reference< XInputStream > xInputStream( aDescriptor[ MediaDescriptor::PROP_INPUTSTREAM() ], UNO_QUERY_THROW );
- StorageRef xStorage( new ZipStorage( mxFactory, xInputStream ) );
-
- // Parse _rels/.rels to get the target path.
- InputSource aParserInput;
- aParserInput.sSystemId = CREATE_OUSTRING( "_rels/.rels" );
- aParserInput.aInputStream = xStorage->openInputStream( aParserInput.sSystemId );
- xParser->parseStream( aParserInput );
-
- // Parse [Content_Types].xml to determine the content type of the part at the target path.
- aParserInput.sSystemId = CREATE_OUSTRING( "[Content_Types].xml" );
- aParserInput.aInputStream = xStorage->openInputStream( aParserInput.sSystemId );
- xParser->parseStream( aParserInput );
+ ByteOrderConverter::writeLittleEndian( pnHash, i );
+ aDigest = rtl_digest_create( rtl_Digest_AlgorithmSHA1 );
+ aError = rtl_digest_update( aDigest, pnHash, nHashSize );
+ aError = rtl_digest_get( aDigest, pnHash + 4, RTL_DIGEST_LENGTH_SHA1 );
+ rtl_digest_destroy( aDigest );
}
- catch ( const Exception& )
+
+ memmove( pnHash, pnHash + 4, RTL_DIGEST_LENGTH_SHA1 );
+ memset( pnHash + RTL_DIGEST_LENGTH_SHA1, 0, 4 );
+ aDigest = rtl_digest_create( rtl_Digest_AlgorithmSHA1 );
+ aError = rtl_digest_update( aDigest, pnHash, nHashSize );
+ aError = rtl_digest_get( aDigest, pnHash, RTL_DIGEST_LENGTH_SHA1 );
+ rtl_digest_destroy( aDigest );
+
+ lclDeriveKey( pnHash, RTL_DIGEST_LENGTH_SHA1, pnKey, nRequiredKeyLen );
+ delete[] pnHash;
+
+ // check password
+ EVP_CIPHER_CTX aes_ctx;
+ EVP_CIPHER_CTX_init( &aes_ctx );
+ EVP_DecryptInit_ex( &aes_ctx, EVP_aes_128_ecb(), 0, pnKey, 0 );
+ EVP_CIPHER_CTX_set_padding( &aes_ctx, 0 );
+ int nOutLen = 0;
+ sal_uInt8 pnVerifier[ 16 ] = { 0 };
+ /*int*/ EVP_DecryptUpdate( &aes_ctx, pnVerifier, &nOutLen, rEncrInfo.mpnEncrVerifier, sizeof( rEncrInfo.mpnEncrVerifier ) );
+ EVP_CIPHER_CTX_cleanup( &aes_ctx );
+
+ EVP_CIPHER_CTX_init( &aes_ctx );
+ EVP_DecryptInit_ex( &aes_ctx, EVP_aes_128_ecb(), 0, pnKey, 0 );
+ EVP_CIPHER_CTX_set_padding( &aes_ctx, 0 );
+ sal_uInt8 pnVerifierHash[ 32 ] = { 0 };
+ /*int*/ EVP_DecryptUpdate( &aes_ctx, pnVerifierHash, &nOutLen, rEncrInfo.mpnEncrVerifierHash, sizeof( rEncrInfo.mpnEncrVerifierHash ) );
+ EVP_CIPHER_CTX_cleanup( &aes_ctx );
+
+ aDigest = rtl_digest_create( rtl_Digest_AlgorithmSHA1 );
+ aError = rtl_digest_update( aDigest, pnVerifier, sizeof( pnVerifier ) );
+ sal_uInt8 pnSha1Hash[ RTL_DIGEST_LENGTH_SHA1 ];
+ aError = rtl_digest_get( aDigest, pnSha1Hash, RTL_DIGEST_LENGTH_SHA1 );
+ rtl_digest_destroy( aDigest );
+
+ return memcmp( pnSha1Hash, pnVerifierHash, RTL_DIGEST_LENGTH_SHA1 ) == 0;
+}
+
+// the password verifier ------------------------------------------------------
+
+class PasswordVerifier : public ::comphelper::IDocPasswordVerifier
+{
+public:
+ explicit PasswordVerifier( const PackageEncryptionInfo& rEncryptInfo );
+
+ virtual ::comphelper::DocPasswordVerifierResult
+ verifyPassword( const OUString& rPassword );
+
+ inline const sal_uInt8* getKey() const { return &maKey.front(); }
+
+private:
+ const PackageEncryptionInfo& mrEncryptInfo;
+ ::std::vector< sal_uInt8 > maKey;
+};
+
+PasswordVerifier::PasswordVerifier( const PackageEncryptionInfo& rEncryptInfo ) :
+ mrEncryptInfo( rEncryptInfo ),
+ maKey( static_cast< size_t >( rEncryptInfo.mnKeySize / 8 ), 0 )
+{
+}
+
+::comphelper::DocPasswordVerifierResult PasswordVerifier::verifyPassword( const OUString& rPassword )
+{
+ // verifies the password and writes the related decryption key into maKey
+ return lclGenerateEncryptionKey( mrEncryptInfo, rPassword, &maKey.front(), maKey.size() ) ?
+ ::comphelper::DocPasswordVerifierResult_OK : ::comphelper::DocPasswordVerifierResult_WRONG_PASSWORD;
+}
+
+} // namespace
+
+// ----------------------------------------------------------------------------
+
+Reference< XInputStream > FilterDetect::extractUnencryptedPackage( MediaDescriptor& rMediaDesc ) const
+{
+ if( mxFactory.is() )
{
+ // try the plain input stream
+ Reference< XInputStream > xInStrm( rMediaDesc[ MediaDescriptor::PROP_INPUTSTREAM() ], UNO_QUERY );
+ if( !xInStrm.is() || lclIsZipPackage( mxFactory, xInStrm ) )
+ return xInStrm;
+
+ // check if a temporary file is passed in the 'ComponentData' property
+ Sequence< NamedValue > aCompData = rMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_COMPONENTDATA(), Sequence< NamedValue >() );
+ SequenceAsHashMap aCompDataMap( aCompData );
+ Reference< XStream > xDecrypted = aCompDataMap.getUnpackedValueOrDefault( CREATE_OUSTRING( "DecryptedPackage" ), Reference< XStream >() );
+ if( xDecrypted.is() )
+ {
+ Reference< XInputStream > xDecrInStrm = xDecrypted->getInputStream();
+ if( lclIsZipPackage( mxFactory, xDecrInStrm ) )
+ return xDecrInStrm;
+ }
+
+ // try to decrypt an encrypted OLE package
+ OleStorage aOleStorage( mxFactory, xInStrm, false );
+ if( aOleStorage.isStorage() ) try
+ {
+ // open the required input streams in the encrypted package
+ Reference< XInputStream > xEncryptionInfo( aOleStorage.openInputStream( CREATE_OUSTRING( "EncryptionInfo" ) ), UNO_SET_THROW );
+ Reference< XInputStream > xEncryptedPackage( aOleStorage.openInputStream( CREATE_OUSTRING( "EncryptedPackage" ) ), UNO_SET_THROW );
+
+ // read the encryption info stream
+ PackageEncryptionInfo aEncryptInfo;
+ BinaryXInputStream aInfoStrm( xEncryptionInfo, true );
+ bool bValidInfo = lclReadEncryptionInfo( aEncryptInfo, aInfoStrm );
+
+ // check flags and agorithm IDs, requiered are AES128 and SHA-1
+ bool bImplemented = bValidInfo &&
+ getFlag( aEncryptInfo.mnFlags, ENCRYPTINFO_CRYPTOAPI ) &&
+ getFlag( aEncryptInfo.mnFlags, ENCRYPTINFO_AES ) &&
+ // algorithm ID 0 defaults to AES128 too, if ENCRYPTINFO_AES flag is set
+ ((aEncryptInfo.mnAlgorithmId == 0) || (aEncryptInfo.mnAlgorithmId == ENCRYPT_ALGO_AES128)) &&
+ // hash algorithm ID 0 defaults to SHA-1 too
+ ((aEncryptInfo.mnAlgorithmIdHash == 0) || (aEncryptInfo.mnAlgorithmIdHash == ENCRYPT_HASH_SHA1)) &&
+ (aEncryptInfo.mnVerifierHashSize == 20);
+
+ if( bImplemented )
+ {
+ /* "VelvetSweatshop" is the built-in default encryption
+ password used by MS Excel for the "workbook protection"
+ feature with password. Try this first before prompting the
+ user for a password. */
+ ::std::vector< OUString > aDefaultPasswords;
+ aDefaultPasswords.push_back( CREATE_OUSTRING( "VelvetSweatshop" ) );
+
+ /* Use the comphelper password helper to request a password.
+ This helper returns either with the correct password
+ (according to the verifier), or with an empty string if
+ user has cancelled the password input dialog. */
+ PasswordVerifier aVerifier( aEncryptInfo );
+ OUString aPassword = ::comphelper::DocPasswordHelper::requestAndVerifyDocPassword(
+ aVerifier, rMediaDesc, ::comphelper::DocPasswordRequestType_MS, &aDefaultPasswords );
+
+ if( aPassword.getLength() == 0 )
+ {
+ rMediaDesc[ MediaDescriptor::PROP_ABORTED() ] <<= true;
+ }
+ else
+ {
+ // create temporary file for unencrypted package
+ Reference< XStream > xTempFile( mxFactory->createInstance( CREATE_OUSTRING( "com.sun.star.io.TempFile" ) ), UNO_QUERY_THROW );
+ Reference< XOutputStream > xDecryptedPackage( xTempFile->getOutputStream(), UNO_SET_THROW );
+ BinaryXOutputStream aDecryptedPackage( xDecryptedPackage, true );
+ BinaryXInputStream aEncryptedPackage( xEncryptedPackage, true );
+
+ EVP_CIPHER_CTX aes_ctx;
+ EVP_CIPHER_CTX_init( &aes_ctx );
+ EVP_DecryptInit_ex( &aes_ctx, EVP_aes_128_ecb(), 0, aVerifier.getKey(), 0 );
+ EVP_CIPHER_CTX_set_padding( &aes_ctx, 0 );
+
+ sal_uInt8 pnInBuffer[ 1024 ];
+ sal_uInt8 pnOutBuffer[ 1024 ];
+ sal_Int32 nInLen;
+ int nOutLen;
+ aEncryptedPackage.skip( 8 ); // decrypted size
+ while( (nInLen = aEncryptedPackage.readMemory( pnInBuffer, sizeof( pnInBuffer ) )) > 0 )
+ {
+ EVP_DecryptUpdate( &aes_ctx, pnOutBuffer, &nOutLen, pnInBuffer, nInLen );
+ aDecryptedPackage.writeMemory( pnOutBuffer, nOutLen );
+ }
+ EVP_DecryptFinal_ex( &aes_ctx, pnOutBuffer, &nOutLen );
+ aDecryptedPackage.writeMemory( pnOutBuffer, nOutLen );
+
+ EVP_CIPHER_CTX_cleanup( &aes_ctx );
+ xDecryptedPackage->flush();
+ aDecryptedPackage.seekToStart();
+
+ // store temp file in media descriptor to keep it alive
+ Sequence< NamedValue > aPropSeq( 1 );
+ aPropSeq[ 0 ].Name = CREATE_OUSTRING( "DecryptedPackage" );
+ aPropSeq[ 0 ].Value <<= xTempFile;
+ rMediaDesc[ MediaDescriptor::PROP_COMPONENTDATA() ] <<= aPropSeq;
+
+ Reference< XInputStream > xDecrInStrm = xTempFile->getInputStream();
+ if( lclIsZipPackage( mxFactory, xDecrInStrm ) )
+ return xDecrInStrm;
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ }
}
- return aFilter;
+ return Reference< XInputStream >();
}
// com.sun.star.lang.XServiceInfo interface -----------------------------------
@@ -378,6 +601,62 @@ Sequence< OUString > SAL_CALL FilterDetect::getSupportedServiceNames() throw( Ru
return FilterDetect_getSupportedServiceNames();
}
+// com.sun.star.document.XExtendedFilterDetection interface -------------------
+
+OUString SAL_CALL FilterDetect::detect( Sequence< PropertyValue >& rMediaDescSeq ) throw( RuntimeException )
+{
+ OUString aFilterName;
+ MediaDescriptor aMediaDesc( rMediaDescSeq );
+
+ /* Check that the user has not choosen to abort detection, e.g. by hitting
+ 'Cancel' in the password input dialog. This may happen because this
+ filter detection is used by different filters. */
+ bool bAborted = aMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_ABORTED(), false );
+ if( !bAborted && mxFactory.is() ) try
+ {
+ aMediaDesc.addInputStream();
+
+ /* Get the unencrypted input stream. This may include creation of a
+ temporary file that contains the decrypted package. This temporary
+ file will be stored in the 'ComponentData' property of the media
+ descriptor. */
+ Reference< XInputStream > xInStrm( extractUnencryptedPackage( aMediaDesc ), UNO_SET_THROW );
+
+ // try to detect the file type, must be a ZIP package
+ ZipStorage aZipStorage( mxFactory, xInStrm );
+ if( aZipStorage.isStorage() )
+ {
+ Reference< XFastParser > xParser( mxFactory->createInstance(
+ CREATE_OUSTRING( "com.sun.star.xml.sax.FastParser" ) ), UNO_QUERY_THROW );
+
+ xParser->setFastDocumentHandler( new FilterDetectDocHandler( aFilterName ) );
+ xParser->setTokenHandler( new FastTokenHandler );
+
+ xParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/package/2006/relationships" ), NMSP_PACKAGE_RELATIONSHIPS );
+ xParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/officeDocument/2006/relationships" ), NMSP_RELATIONSHIPS );
+ xParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/package/2006/content-types" ), NMSP_CONTENT_TYPES );
+
+ // Parse _rels/.rels to get the target path.
+ InputSource aParserInput;
+ aParserInput.sSystemId = CREATE_OUSTRING( "_rels/.rels" );
+ aParserInput.aInputStream = aZipStorage.openInputStream( aParserInput.sSystemId );
+ xParser->parseStream( aParserInput );
+
+ // Parse [Content_Types].xml to determine the content type of the part at the target path.
+ aParserInput.sSystemId = CREATE_OUSTRING( "[Content_Types].xml" );
+ aParserInput.aInputStream = aZipStorage.openInputStream( aParserInput.sSystemId );
+ xParser->parseStream( aParserInput );
+ }
+ }
+ catch( Exception& )
+ {
+ }
+
+ // write back changed media descriptor members
+ aMediaDesc >> rMediaDescSeq;
+ return aFilterName;
+}
+
// ============================================================================
} // namespace core
diff --git a/oox/source/core/makefile.mk b/oox/source/core/makefile.mk
index 3443bd35c7f8..84d12776eadd 100644
--- a/oox/source/core/makefile.mk
+++ b/oox/source/core/makefile.mk
@@ -42,6 +42,10 @@ ENABLE_EXCEPTIONS=TRUE
.INCLUDE : settings.mk
.INCLUDE: $(PRJ)$/util$/makefile.pmk
+.IF "$(SYSTEM_OPENSSL)" == "YES"
+CFLAGS+= $(OPENSSL_CFLAGS)
+.ENDIF
+
# --- Files --------------------------------------------------------
SLOFILES = \
@@ -50,6 +54,7 @@ SLOFILES = \
$(SLO)$/contexthandler.obj \
$(SLO)$/contexthandler2.obj \
$(SLO)$/facreg.obj \
+ $(SLO)$/fasttokenhandler.obj \
$(SLO)$/filterbase.obj \
$(SLO)$/filterdetect.obj \
$(SLO)$/fragmenthandler.obj \
diff --git a/oox/source/core/xmlfilterbase.cxx b/oox/source/core/xmlfilterbase.cxx
index 71a2ef874419..fade52d2a743 100644
--- a/oox/source/core/xmlfilterbase.cxx
+++ b/oox/source/core/xmlfilterbase.cxx
@@ -29,23 +29,31 @@
************************************************************************/
#include "oox/core/xmlfilterbase.hxx"
-#include <stdio.h>
+
+#include <cstdio>
+
+#include <rtl/strbuf.hxx>
#include <rtl/ustrbuf.hxx>
#include <com/sun/star/container/XNameContainer.hpp>
#include <com/sun/star/embed/XRelationshipAccess.hpp>
#include <com/sun/star/xml/sax/InputSource.hpp>
#include <com/sun/star/xml/sax/XFastParser.hpp>
+#include <com/sun/star/document/XDocumentProperties.hpp>
+#include <comphelper/mediadescriptor.hxx>
#include <sax/fshelper.hxx>
#include "properties.hxx"
+#include "tokens.hxx"
#include "oox/helper/containerhelper.hxx"
#include "oox/helper/propertyset.hxx"
#include "oox/helper/zipstorage.hxx"
#include "oox/core/fasttokenhandler.hxx"
+#include "oox/core/filterdetect.hxx"
#include "oox/core/fragmenthandler.hxx"
#include "oox/core/namespaces.hxx"
#include "oox/core/recordparser.hxx"
#include "oox/core/relationshandler.hxx"
+using ::rtl::OStringBuffer;
using ::rtl::OUString;
using ::rtl::OUStringBuffer;
using ::com::sun::star::beans::StringPair;
@@ -56,6 +64,7 @@ using ::com::sun::star::uno::RuntimeException;
using ::com::sun::star::uno::UNO_QUERY;
using ::com::sun::star::uno::UNO_QUERY_THROW;
using ::com::sun::star::uno::UNO_SET_THROW;
+using ::com::sun::star::lang::Locale;
using ::com::sun::star::lang::XMultiServiceFactory;
using ::com::sun::star::embed::XRelationshipAccess;
using ::com::sun::star::embed::XStorage;
@@ -68,6 +77,9 @@ using ::com::sun::star::xml::sax::XFastTokenHandler;
using ::com::sun::star::xml::sax::XFastDocumentHandler;
using ::com::sun::star::xml::sax::InputSource;
using ::com::sun::star::xml::sax::SAXException;
+using ::com::sun::star::document::XDocumentProperties;
+using ::com::sun::star::util::DateTime;
+using ::comphelper::MediaDescriptor;
using ::sax_fastparser::FastSerializerHelper;
using ::sax_fastparser::FSHelperPtr;
@@ -200,8 +212,17 @@ bool XmlFilterBase::importFragment( const ::rtl::Reference< FragmentHandler >& r
InputSource aSource;
aSource.aInputStream = xInStrm;
aSource.sSystemId = aFragmentPath;
- xParser->parseStream( aSource );
- return true;
+ // own try/catch block for showing parser failure assertion with fragment path
+ try
+ {
+ xParser->parseStream( aSource );
+ return true;
+ }
+ catch( Exception& )
+ {
+ OSL_ENSURE( false, OStringBuffer( "XmlFilterBase::importFragment - XML parser failed in fragment '" ).
+ append( OUStringToOString( aFragmentPath, RTL_TEXTENCODING_ASCII_US ) ).append( '\'' ).getStr() );
+ }
}
catch( Exception& )
{
@@ -289,16 +310,210 @@ OUString XmlFilterBase::addRelation( const Reference< XOutputStream > xOutputStr
return OUString();
}
-StorageRef XmlFilterBase::implCreateStorage(
- Reference< XInputStream >& rxInStream, Reference< XStream >& rxOutStream ) const
+static void
+writeElement( FSHelperPtr pDoc, sal_Int32 nXmlElement, const OUString& sValue )
+{
+ if( sValue.getLength() == 0 )
+ return;
+ pDoc->startElement( nXmlElement, FSEND );
+ pDoc->write( sValue );
+ pDoc->endElement( nXmlElement );
+}
+
+static void
+writeElement( FSHelperPtr pDoc, sal_Int32 nXmlElement, const sal_Int32 nValue )
+{
+ pDoc->startElement( nXmlElement, FSEND );
+ pDoc->write( OUString::valueOf( nValue ) );
+ pDoc->endElement( nXmlElement );
+}
+
+static void
+writeElement( FSHelperPtr pDoc, sal_Int32 nXmlElement, const DateTime& rTime )
+{
+ if( rTime.Year == 0 )
+ return;
+
+ if ( ( nXmlElement >> 16 ) != XML_dcterms )
+ pDoc->startElement( nXmlElement, FSEND );
+ else
+ pDoc->startElement( nXmlElement,
+ FSNS( XML_xsi, XML_type ), "dcterms:W3CDTF",
+ FSEND );
+
+ char pStr[200];
+ snprintf( pStr, sizeof( pStr ), "%d-%02d-%02dT%02d:%02d:%02d.%02dZ",
+ rTime.Year, rTime.Month, rTime.Day,
+ rTime.Hours, rTime.Minutes, rTime.Seconds,
+ rTime.HundredthSeconds );
+
+ pDoc->write( pStr );
+
+ pDoc->endElement( nXmlElement );
+}
+
+static void
+writeElement( FSHelperPtr pDoc, sal_Int32 nXmlElement, Sequence< rtl::OUString > aItems )
+{
+ if( aItems.getLength() == 0 )
+ return;
+
+ OUStringBuffer sRep;
+ sRep.append( aItems[ 0 ] );
+
+ for( sal_Int32 i = 1, end = aItems.getLength(); i < end; ++i )
+ {
+ sRep.appendAscii( " " ).append( aItems[ i ] );
+ }
+
+ writeElement( pDoc, nXmlElement, sRep.makeStringAndClear() );
+}
+
+static void
+writeElement( FSHelperPtr pDoc, sal_Int32 nXmlElement, const Locale& rLocale )
+{
+ // TODO: what to do with .Country and .Variant
+ writeElement( pDoc, nXmlElement, rLocale.Language );
+}
+
+static void
+writeCoreProperties( XmlFilterBase& rSelf, Reference< XDocumentProperties > xProperties )
{
- StorageRef xStorage;
- if( rxInStream.is() )
- xStorage.reset( new ZipStorage( getGlobalFactory(), rxInStream ) );
- else if( rxOutStream.is() )
- xStorage.reset( new ZipStorage( getGlobalFactory(), rxOutStream ) );
+ rSelf.addRelation(
+ CREATE_OUSTRING( "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" ),
+ CREATE_OUSTRING( "docProps/core.xml" ) );
+ FSHelperPtr pCoreProps = rSelf.openFragmentStreamWithSerializer(
+ CREATE_OUSTRING( "docProps/core.xml" ),
+ CREATE_OUSTRING( "application/vnd.openxmlformats-package.core-properties+xml" ) );
+ pCoreProps->startElementNS( XML_cp, XML_coreProperties,
+ FSNS( XML_xmlns, XML_cp ), "http://schemas.openxmlformats.org/package/2006/metadata/core-properties",
+ FSNS( XML_xmlns, XML_dc ), "http://purl.org/dc/elements/1.1/",
+ FSNS( XML_xmlns, XML_dcterms ), "http://purl.org/dc/terms/",
+ FSNS( XML_xmlns, XML_dcmitype ), "http://purl.org/dc/dcmitype/",
+ FSNS( XML_xmlns, XML_xsi ), "http://www.w3.org/2001/XMLSchema-instance",
+ FSEND );
+
+#if OOXTODO
+ writeElement( pCoreProps, FSNS( XML_cp, XML_category ), "category" );
+ writeElement( pCoreProps, FSNS( XML_cp, XML_contentStatus ), "status" );
+ writeElement( pCoreProps, FSNS( XML_cp, XML_contentType ), "contentType" );
+#endif /* def OOXTODO */
+ writeElement( pCoreProps, FSNS( XML_dcterms, XML_created ), xProperties->getCreationDate() );
+ writeElement( pCoreProps, FSNS( XML_dc, XML_creator ), xProperties->getAuthor() );
+ writeElement( pCoreProps, FSNS( XML_dc, XML_description ), xProperties->getDescription() );
+#if OOXTODO
+ writeElement( pCoreProps, FSNS( XML_dc, XML_identifier ), "ident" );
+#endif /* def OOXTODO */
+ writeElement( pCoreProps, FSNS( XML_cp, XML_keywords ), xProperties->getKeywords() );
+ writeElement( pCoreProps, FSNS( XML_dc, XML_language ), xProperties->getLanguage() );
+ writeElement( pCoreProps, FSNS( XML_cp, XML_lastModifiedBy ), xProperties->getModifiedBy() );
+ writeElement( pCoreProps, FSNS( XML_cp, XML_lastPrinted ), xProperties->getPrintDate() );
+ writeElement( pCoreProps, FSNS( XML_dcterms, XML_modified ), xProperties->getModificationDate() );
+ writeElement( pCoreProps, FSNS( XML_cp, XML_revision ), xProperties->getEditingCycles() );
+ writeElement( pCoreProps, FSNS( XML_dc, XML_subject ), xProperties->getSubject() );
+ writeElement( pCoreProps, FSNS( XML_dc, XML_title ), xProperties->getTitle() );
+#if OOXTODO
+ writeElement( pCoreProps, FSNS( XML_cp, XML_version ), "version" );
+#endif /* def OOXTODO */
+
+ pCoreProps->endElementNS( XML_cp, XML_coreProperties );
+}
+
+static void
+writeAppProperties( XmlFilterBase& rSelf, Reference< XDocumentProperties > xProperties )
+{
+ rSelf.addRelation(
+ CREATE_OUSTRING( "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" ),
+ CREATE_OUSTRING( "docProps/app.xml" ) );
+ FSHelperPtr pAppProps = rSelf.openFragmentStreamWithSerializer(
+ CREATE_OUSTRING( "docProps/app.xml" ),
+ CREATE_OUSTRING( "application/vnd.openxmlformats-officedocument.extended-properties+xml" ) );
+ pAppProps->startElement( XML_Properties,
+ XML_xmlns, "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties",
+ FSNS( XML_xmlns, XML_vt ), "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes",
+ FSEND );
+
+ writeElement( pAppProps, XML_Template, xProperties->getTemplateName() );
+#if OOXTODO
+ writeElement( pAppProps, XML_Manager, "manager" );
+ writeElement( pAppProps, XML_Company, "company" );
+ writeElement( pAppProps, XML_Pages, "pages" );
+ writeElement( pAppProps, XML_Words, "words" );
+ writeElement( pAppProps, XML_Characters, "characters" );
+ writeElement( pAppProps, XML_PresentationFormat, "presentation format" );
+ writeElement( pAppProps, XML_Lines, "lines" );
+ writeElement( pAppProps, XML_Paragraphs, "paragraphs" );
+ writeElement( pAppProps, XML_Slides, "slides" );
+ writeElement( pAppProps, XML_Notes, "notes" );
+#endif /* def OOXTODO */
+ writeElement( pAppProps, XML_TotalTime, xProperties->getEditingDuration() );
+#if OOXTODO
+ writeElement( pAppProps, XML_HiddenSlides, "hidden slides" );
+ writeElement( pAppProps, XML_MMClips, "mm clips" );
+ writeElement( pAppProps, XML_ScaleCrop, "scale crop" );
+ writeElement( pAppProps, XML_HeadingPairs, "heading pairs" );
+ writeElement( pAppProps, XML_TitlesOfParts, "titles of parts" );
+ writeElement( pAppProps, XML_LinksUpToDate, "links up-to-date" );
+ writeElement( pAppProps, XML_CharactersWithSpaces, "characters with spaces" );
+ writeElement( pAppProps, XML_SharedDoc, "shared doc" );
+ writeElement( pAppProps, XML_HyperlinkBase, "hyperlink base" );
+ writeElement( pAppProps, XML_HLinks, "hlinks" );
+ writeElement( pAppProps, XML_HyperlinksChanged, "hyperlinks changed" );
+ writeElement( pAppProps, XML_DigSig, "digital signature" );
+#endif /* def OOXTODO */
+ writeElement( pAppProps, XML_Application, xProperties->getGenerator() );
+#if OOXTODO
+ writeElement( pAppProps, XML_AppVersion, "app version" );
+ writeElement( pAppProps, XML_DocSecurity, "doc security" );
+#endif /* def OOXTODO */
+ pAppProps->endElement( XML_Properties );
+}
- return xStorage;
+XmlFilterBase& XmlFilterBase::exportDocumentProperties( Reference< XDocumentProperties > xProperties )
+{
+ if( xProperties.is() )
+ {
+ writeCoreProperties( *this, xProperties );
+ writeAppProperties( *this, xProperties );
+ Sequence< ::com::sun::star::beans::NamedValue > aStats = xProperties->getDocumentStatistics();
+ printf( "# Document Statistics:\n" );
+ for( sal_Int32 i = 0, end = aStats.getLength(); i < end; ++i )
+ {
+ ::com::sun::star::uno::Any aValue = aStats[ i ].Value;
+ ::rtl::OUString sValue;
+ bool bHaveString = aValue >>= sValue;
+ printf ("#\t%s=%s [%s]\n",
+ OUStringToOString( aStats[ i ].Name, RTL_TEXTENCODING_UTF8 ).getStr(),
+ bHaveString
+ ? OUStringToOString( sValue, RTL_TEXTENCODING_UTF8 ).getStr()
+ : "<unconvertable>",
+ OUStringToOString( aValue.getValueTypeName(), RTL_TEXTENCODING_UTF8 ).getStr());
+ }
+ }
+ return *this;
+}
+
+// protected ------------------------------------------------------------------
+
+Reference< XInputStream > XmlFilterBase::implGetInputStream( MediaDescriptor& rMediaDesc ) const
+{
+ /* Get the input stream directly from the media descriptor, or decrypt the
+ package again. The latter is needed e.g. when the document is reloaded.
+ All this is implemented in the detector service. */
+ FilterDetect aDetector( getGlobalFactory() );
+ return aDetector.extractUnencryptedPackage( rMediaDesc );
+}
+
+// private --------------------------------------------------------------------
+
+StorageRef XmlFilterBase::implCreateStorage( const Reference< XInputStream >& rxInStream ) const
+{
+ return StorageRef( new ZipStorage( getGlobalFactory(), rxInStream ) );
+}
+
+StorageRef XmlFilterBase::implCreateStorage( const Reference< XStream >& rxOutStream ) const
+{
+ return StorageRef( new ZipStorage( getGlobalFactory(), rxOutStream ) );
}
// ============================================================================
diff --git a/oox/source/drawingml/chart/objectformatter.cxx b/oox/source/drawingml/chart/objectformatter.cxx
index 6ddb72bd3040..46253e92dd68 100644
--- a/oox/source/drawingml/chart/objectformatter.cxx
+++ b/oox/source/drawingml/chart/objectformatter.cxx
@@ -892,7 +892,7 @@ void LineFormatter::convertFormatting( PropertySet& rPropSet, const ModelRef< Sh
aLineProps.assignUsed( *mxAutoLine );
if( rxShapeProp.is() )
aLineProps.assignUsed( rxShapeProp->getLineProperties() );
- aLineProps.pushToPropSet( rPropSet, mrLinePropIds, mrData.mrFilter, mrData.maModelObjHelper, getPhColor( nSeriesIdx ) );
+ aLineProps.pushToPropSet( rPropSet, mrData.mrFilter, mrData.maModelObjHelper, mrLinePropIds, getPhColor( nSeriesIdx ) );
}
// ============================================================================
@@ -920,7 +920,7 @@ void FillFormatter::convertFormatting( PropertySet& rPropSet, const ModelRef< Sh
aFillProps.assignUsed( rxShapeProp->getFillProperties() );
if( pPicOptions )
lclConvertPictureOptions( aFillProps, *pPicOptions );
- aFillProps.pushToPropSet( rPropSet, mrFillPropIds, mrData.mrFilter, mrData.maModelObjHelper, 0, getPhColor( nSeriesIdx ) );
+ aFillProps.pushToPropSet( rPropSet, mrData.mrFilter, mrData.maModelObjHelper, mrFillPropIds, 0, getPhColor( nSeriesIdx ) );
}
// ============================================================================
diff --git a/oox/source/drawingml/chart/typegroupconverter.cxx b/oox/source/drawingml/chart/typegroupconverter.cxx
index 20ef90834482..91b32d5d2200 100644
--- a/oox/source/drawingml/chart/typegroupconverter.cxx
+++ b/oox/source/drawingml/chart/typegroupconverter.cxx
@@ -70,34 +70,35 @@ namespace chart {
namespace {
// chart type service names
-const sal_Char SERVICE_CHART2_AREA[] = "com.sun.star.chart2.AreaChartType";
-const sal_Char SERVICE_CHART2_CANDLE[] = "com.sun.star.chart2.CandleStickChartType";
-const sal_Char SERVICE_CHART2_COLUMN[] = "com.sun.star.chart2.ColumnChartType";
-const sal_Char SERVICE_CHART2_LINE[] = "com.sun.star.chart2.LineChartType";
-const sal_Char SERVICE_CHART2_NET[] = "com.sun.star.chart2.NetChartType";
-const sal_Char SERVICE_CHART2_PIE[] = "com.sun.star.chart2.PieChartType";
-const sal_Char SERVICE_CHART2_SCATTER[] = "com.sun.star.chart2.ScatterChartType";
-const sal_Char SERVICE_CHART2_BUBBLE[] = "com.sun.star.chart2.BubbleChartType";
-const sal_Char SERVICE_CHART2_SURFACE[] = "com.sun.star.chart2.ColumnChartType"; // Todo
+const sal_Char SERVICE_CHART2_AREA[] = "com.sun.star.chart2.AreaChartType";
+const sal_Char SERVICE_CHART2_CANDLE[] = "com.sun.star.chart2.CandleStickChartType";
+const sal_Char SERVICE_CHART2_COLUMN[] = "com.sun.star.chart2.ColumnChartType";
+const sal_Char SERVICE_CHART2_LINE[] = "com.sun.star.chart2.LineChartType";
+const sal_Char SERVICE_CHART2_NET[] = "com.sun.star.chart2.NetChartType";
+const sal_Char SERVICE_CHART2_FILLEDNET[] = "com.sun.star.chart2.FilledNetChartType";
+const sal_Char SERVICE_CHART2_PIE[] = "com.sun.star.chart2.PieChartType";
+const sal_Char SERVICE_CHART2_SCATTER[] = "com.sun.star.chart2.ScatterChartType";
+const sal_Char SERVICE_CHART2_BUBBLE[] = "com.sun.star.chart2.BubbleChartType";
+const sal_Char SERVICE_CHART2_SURFACE[] = "com.sun.star.chart2.ColumnChartType"; // Todo
namespace csscd = ::com::sun::star::chart::DataLabelPlacement;
static const TypeGroupInfo spTypeInfos[] =
{
- // type-id type-category service varied-point-color default label pos comb2d supp3d polar area2d 1stvis xcateg swap stack revers betw picopt
- { TYPEID_BAR, TYPECATEGORY_BAR, SERVICE_CHART2_COLUMN, VARPOINTMODE_SINGLE, csscd::OUTSIDE, true, true, false, true, false, true, false, true, false, true, true },
- { TYPEID_HORBAR, TYPECATEGORY_BAR, SERVICE_CHART2_COLUMN, VARPOINTMODE_SINGLE, csscd::OUTSIDE, false, true, false, true, false, true, true, true, false, true, true },
- { TYPEID_LINE, TYPECATEGORY_LINE, SERVICE_CHART2_LINE, VARPOINTMODE_SINGLE, csscd::RIGHT, true, true, false, false, false, true, false, true, false, true, false },
- { TYPEID_AREA, TYPECATEGORY_LINE, SERVICE_CHART2_AREA, VARPOINTMODE_NONE, csscd::CENTER, true, true, false, true, false, true, false, true, true, false, false },
- { TYPEID_STOCK, TYPECATEGORY_LINE, SERVICE_CHART2_CANDLE, VARPOINTMODE_NONE, csscd::RIGHT, true, false, false, false, false, true, false, true, false, true, false },
- { TYPEID_RADARLINE, TYPECATEGORY_RADAR, SERVICE_CHART2_NET, VARPOINTMODE_SINGLE, csscd::TOP, false, false, true, false, false, true, false, false, false, false, false },
- { TYPEID_RADARAREA, TYPECATEGORY_RADAR, SERVICE_CHART2_NET, VARPOINTMODE_NONE, csscd::TOP, false, false, true, true, false, true, false, false, false, false, false },
- { TYPEID_PIE, TYPECATEGORY_PIE, SERVICE_CHART2_PIE, VARPOINTMODE_MULTI, csscd::AVOID_OVERLAP, false, true, true, true, true, true, false, false, false, false, false },
- { TYPEID_DOUGHNUT, TYPECATEGORY_PIE, SERVICE_CHART2_PIE, VARPOINTMODE_MULTI, csscd::AVOID_OVERLAP, false, true, true, true, false, true, false, false, false, false, false },
- { TYPEID_OFPIE, TYPECATEGORY_PIE, SERVICE_CHART2_PIE, VARPOINTMODE_MULTI, csscd::AVOID_OVERLAP, false, true, true, true, true, true, false, false, false, false, false },
- { TYPEID_SCATTER, TYPECATEGORY_SCATTER, SERVICE_CHART2_SCATTER, VARPOINTMODE_SINGLE, csscd::RIGHT, true, true, false, false, false, false, false, false, false, false, false },
- { TYPEID_BUBBLE, TYPECATEGORY_SCATTER, SERVICE_CHART2_BUBBLE, VARPOINTMODE_SINGLE, csscd::RIGHT, false, false, false, true, false, false, false, false, false, false, false },
- { TYPEID_SURFACE, TYPECATEGORY_SURFACE, SERVICE_CHART2_SURFACE, VARPOINTMODE_NONE, csscd::RIGHT, false, true, false, true, false, true, false, false, false, false, false }
+ // type-id type-category service varied-point-color default label pos comb2d supp3d polar area2d 1stvis xcateg swap stack revers betw picopt
+ { TYPEID_BAR, TYPECATEGORY_BAR, SERVICE_CHART2_COLUMN, VARPOINTMODE_SINGLE, csscd::OUTSIDE, true, true, false, true, false, true, false, true, false, true, true },
+ { TYPEID_HORBAR, TYPECATEGORY_BAR, SERVICE_CHART2_COLUMN, VARPOINTMODE_SINGLE, csscd::OUTSIDE, false, true, false, true, false, true, true, true, false, true, true },
+ { TYPEID_LINE, TYPECATEGORY_LINE, SERVICE_CHART2_LINE, VARPOINTMODE_SINGLE, csscd::RIGHT, true, true, false, false, false, true, false, true, false, true, false },
+ { TYPEID_AREA, TYPECATEGORY_LINE, SERVICE_CHART2_AREA, VARPOINTMODE_NONE, csscd::CENTER, true, true, false, true, false, true, false, true, true, false, false },
+ { TYPEID_STOCK, TYPECATEGORY_LINE, SERVICE_CHART2_CANDLE, VARPOINTMODE_NONE, csscd::RIGHT, true, false, false, false, false, true, false, true, false, true, false },
+ { TYPEID_RADARLINE, TYPECATEGORY_RADAR, SERVICE_CHART2_NET, VARPOINTMODE_SINGLE, csscd::TOP, false, false, true, false, false, true, false, false, false, false, false },
+ { TYPEID_RADARAREA, TYPECATEGORY_RADAR, SERVICE_CHART2_FILLEDNET, VARPOINTMODE_NONE, csscd::TOP, false, false, true, true, false, true, false, false, true, false, false },
+ { TYPEID_PIE, TYPECATEGORY_PIE, SERVICE_CHART2_PIE, VARPOINTMODE_MULTI, csscd::AVOID_OVERLAP, false, true, true, true, true, true, false, false, false, false, false },
+ { TYPEID_DOUGHNUT, TYPECATEGORY_PIE, SERVICE_CHART2_PIE, VARPOINTMODE_MULTI, csscd::AVOID_OVERLAP, false, true, true, true, false, true, false, false, false, false, false },
+ { TYPEID_OFPIE, TYPECATEGORY_PIE, SERVICE_CHART2_PIE, VARPOINTMODE_MULTI, csscd::AVOID_OVERLAP, false, true, true, true, true, true, false, false, false, false, false },
+ { TYPEID_SCATTER, TYPECATEGORY_SCATTER, SERVICE_CHART2_SCATTER, VARPOINTMODE_SINGLE, csscd::RIGHT, true, true, false, false, false, false, false, false, false, false, false },
+ { TYPEID_BUBBLE, TYPECATEGORY_SCATTER, SERVICE_CHART2_BUBBLE, VARPOINTMODE_SINGLE, csscd::RIGHT, false, false, false, true, false, false, false, false, false, false, false },
+ { TYPEID_SURFACE, TYPECATEGORY_SURFACE, SERVICE_CHART2_SURFACE, VARPOINTMODE_NONE, csscd::RIGHT, false, true, false, true, false, true, false, false, false, false, false }
};
static const TypeGroupInfo saUnknownTypeInfo =
@@ -485,7 +486,7 @@ void TypeGroupConverter::convertMarker( PropertySet& rPropSet, sal_Int32 nOoxSym
void TypeGroupConverter::convertLineSmooth( PropertySet& rPropSet, bool bOoxSmooth ) const
{
- if( !isSeriesFrameFormat() )
+ if( !isSeriesFrameFormat() && (maTypeInfo.meTypeCategory != TYPECATEGORY_RADAR) )
{
namespace cssc = ::com::sun::star::chart2;
cssc::CurveStyle eCurveStyle = bOoxSmooth ? cssc::CurveStyle_CUBIC_SPLINES : cssc::CurveStyle_LINES;
diff --git a/oox/source/drawingml/clrschemecontext.cxx b/oox/source/drawingml/clrschemecontext.cxx
index 6eedb908c00e..a8fa5d737c63 100644
--- a/oox/source/drawingml/clrschemecontext.cxx
+++ b/oox/source/drawingml/clrschemecontext.cxx
@@ -30,6 +30,7 @@
#include "oox/drawingml/clrschemecontext.hxx"
#include "oox/core/namespaces.hxx"
+#include "oox/core/xmlfilterbase.hxx"
#include "tokens.hxx"
using namespace ::oox::core;
diff --git a/oox/source/drawingml/color.cxx b/oox/source/drawingml/color.cxx
index c269379b5adc..009be55424f3 100644
--- a/oox/source/drawingml/color.cxx
+++ b/oox/source/drawingml/color.cxx
@@ -29,11 +29,15 @@
************************************************************************/
#include "oox/drawingml/color.hxx"
-#include "oox/core/namespaces.hxx"
-#include "oox/core/xmlfilterbase.hxx"
-#include "tokens.hxx"
#include <algorithm>
#include <math.h>
+#include "tokens.hxx"
+#include "oox/helper/containerhelper.hxx"
+#include "oox/core/namespaces.hxx"
+#include "oox/core/filterbase.hxx"
+#include "oox/drawingml/drawingmltypes.hxx"
+
+using ::rtl::OUString;
namespace oox {
namespace drawingml {
@@ -42,164 +46,127 @@ namespace drawingml {
namespace {
-const sal_Int32 PER_PERCENT = 1000;
-const sal_Int32 MAX_PERCENT = 100 * PER_PERCENT;
+/** Global storage for predefined color values used in OOXML file formats. */
+struct PresetColorsPool
+{
+ typedef ::std::vector< sal_Int32 > ColorVector;
-const sal_Int32 PER_DEGREE = 60000;
-const sal_Int32 MAX_DEGREE = 360 * PER_DEGREE;
+ ColorVector maDmlColors; /// Predefined colors in DrawingML, indexed by XML token.
+ ColorVector maVmlColors; /// Predefined colors in VML, indexed by XML token.
-const double DEC_GAMMA = 2.3;
-const double INC_GAMMA = 1.0 / DEC_GAMMA;
+ explicit PresetColorsPool();
+};
-sal_Int32 lclGetPresetColor( sal_Int32 nToken )
+// ----------------------------------------------------------------------------
+
+PresetColorsPool::PresetColorsPool() :
+ maDmlColors( static_cast< size_t >( XML_TOKEN_COUNT ), API_RGB_TRANSPARENT ),
+ maVmlColors( static_cast< size_t >( XML_TOKEN_COUNT ), API_RGB_TRANSPARENT )
{
- switch( nToken )
+ // predefined colors in DrawingML (map XML token identifiers to RGB values)
+ static const sal_Int32 spnDmlColors[] =
{
- case XML_aliceBlue: return 0xF0F8FF;
- case XML_antiqueWhite: return 0xFAEBD7;
- case XML_aqua: return 0x00FFFF;
- case XML_aquamarine: return 0x7FFFD4;
- case XML_azure: return 0xF0FFFF;
- case XML_beige: return 0xF5F5DC;
- case XML_bisque: return 0xFFE4C4;
- case XML_black: return 0x000000;
- case XML_blanchedAlmond: return 0xFFEBCD;
- case XML_blue: return 0x0000FF;
- case XML_blueViolet: return 0x8A2BE2;
- case XML_brown: return 0xA52A2A;
- case XML_burlyWood: return 0xDEB887;
- case XML_cadetBlue: return 0x5F9EA0;
- case XML_chartreuse: return 0x7FFF00;
- case XML_chocolate: return 0xD2691E;
- case XML_coral: return 0xFF7F50;
- case XML_cornflowerBlue: return 0x6495ED;
- case XML_cornsilk: return 0xFFF8DC;
- case XML_crimson: return 0xDC143C;
- case XML_cyan: return 0x00FFFF;
- case XML_deepPink: return 0xFF1493;
- case XML_deepSkyBlue: return 0x00BFFF;
- case XML_dimGray: return 0x696969;
- case XML_dkBlue: return 0x00008B;
- case XML_dkCyan: return 0x008B8B;
- case XML_dkGoldenrod: return 0xB8860B;
- case XML_dkGray: return 0xA9A9A9;
- case XML_dkGreen: return 0x006400;
- case XML_dkKhaki: return 0xBDB76B;
- case XML_dkMagenta: return 0x8B008B;
- case XML_dkOliveGreen: return 0x556B2F;
- case XML_dkOrange: return 0xFF8C00;
- case XML_dkOrchid: return 0x9932CC;
- case XML_dkRed: return 0x8B0000;
- case XML_dkSalmon: return 0xE9967A;
- case XML_dkSeaGreen: return 0x8FBC8B;
- case XML_dkSlateBlue: return 0x483D8B;
- case XML_dkSlateGray: return 0x2F4F4F;
- case XML_dkTurquoise: return 0x00CED1;
- case XML_dkViolet: return 0x9400D3;
- case XML_dodgerBlue: return 0x1E90FF;
- case XML_firebrick: return 0xB22222;
- case XML_floralWhite: return 0xFFFAF0;
- case XML_forestGreen: return 0x228B22;
- case XML_fuchsia: return 0xFF00FF;
- case XML_gainsboro: return 0xDCDCDC;
- case XML_ghostWhite: return 0xF8F8FF;
- case XML_gold: return 0xFFD700;
- case XML_goldenrod: return 0xDAA520;
- case XML_gray: return 0x808080;
- case XML_green: return 0x008000;
- case XML_greenYellow: return 0xADFF2F;
- case XML_honeydew: return 0xF0FFF0;
- case XML_hotPink: return 0xFF69B4;
- case XML_indianRed: return 0xCD5C5C;
- case XML_indigo: return 0x4B0082;
- case XML_ivory: return 0xFFFFF0;
- case XML_khaki: return 0xF0E68C;
- case XML_lavender: return 0xE6E6FA;
- case XML_lavenderBlush: return 0xFFF0F5;
- case XML_lawnGreen: return 0x7CFC00;
- case XML_lemonChiffon: return 0xFFFACD;
- case XML_lime: return 0x00FF00;
- case XML_limeGreen: return 0x32CD32;
- case XML_linen: return 0xFAF0E6;
- case XML_ltBlue: return 0xADD8E6;
- case XML_ltCoral: return 0xF08080;
- case XML_ltCyan: return 0xE0FFFF;
- case XML_ltGoldenrodYellow: return 0xFAFA78;
- case XML_ltGray: return 0xD3D3D3;
- case XML_ltGreen: return 0x90EE90;
- case XML_ltPink: return 0xFFB6C1;
- case XML_ltSalmon: return 0xFFA07A;
- case XML_ltSeaGreen: return 0x20B2AA;
- case XML_ltSkyBlue: return 0x87CEFA;
- case XML_ltSlateGray: return 0x778899;
- case XML_ltSteelBlue: return 0xB0C4DE;
- case XML_ltYellow: return 0xFFFFE0;
- case XML_magenta: return 0xFF00FF;
- case XML_maroon: return 0x800000;
- case XML_medAquamarine: return 0x66CDAA;
- case XML_medBlue: return 0x0000CD;
- case XML_medOrchid: return 0xBA55D3;
- case XML_medPurple: return 0x9370DB;
- case XML_medSeaGreen: return 0x3CB371;
- case XML_medSlateBlue: return 0x7B68EE;
- case XML_medSpringGreen: return 0x00FA9A;
- case XML_medTurquoise: return 0x48D1CC;
- case XML_medVioletRed: return 0xC71585;
- case XML_midnightBlue: return 0x191970;
- case XML_mintCream: return 0xF5FFFA;
- case XML_mistyRose: return 0xFFE4E1;
- case XML_moccasin: return 0xFFE4B5;
- case XML_navajoWhite: return 0xFFDEAD;
- case XML_navy: return 0x000080;
- case XML_oldLace: return 0xFDF5E6;
- case XML_olive: return 0x808000;
- case XML_oliveDrab: return 0x6B8E23;
- case XML_orange: return 0xFFA500;
- case XML_orangeRed: return 0xFF4500;
- case XML_orchid: return 0xDA70D6;
- case XML_paleGoldenrod: return 0xEEE8AA;
- case XML_paleGreen: return 0x98FB98;
- case XML_paleTurquoise: return 0xAFEEEE;
- case XML_paleVioletRed: return 0xDB7093;
- case XML_papayaWhip: return 0xFFEFD5;
- case XML_peachPuff: return 0xFFDAB9;
- case XML_peru: return 0xCD853F;
- case XML_pink: return 0xFFC0CB;
- case XML_plum: return 0xDDA0DD;
- case XML_powderBlue: return 0xB0E0E6;
- case XML_purple: return 0x800080;
- case XML_red: return 0xFF0000;
- case XML_rosyBrown: return 0xBC8F8F;
- case XML_royalBlue: return 0x4169E1;
- case XML_saddleBrown: return 0x8B4513;
- case XML_salmon: return 0xFA8072;
- case XML_sandyBrown: return 0xF4A460;
- case XML_seaGreen: return 0x2E8B57;
- case XML_seaShell: return 0xFFF5EE;
- case XML_sienna: return 0xA0522D;
- case XML_silver: return 0xC0C0C0;
- case XML_skyBlue: return 0x87CEEB;
- case XML_slateBlue: return 0x6A5ACD;
- case XML_slateGray: return 0x708090;
- case XML_snow: return 0xFFFAFA;
- case XML_springGreen: return 0x00FF7F;
- case XML_steelBlue: return 0x4682B4;
- case XML_tan: return 0xD2B48C;
- case XML_teal: return 0x008080;
- case XML_thistle: return 0xD8BFD8;
- case XML_tomato: return 0xFF6347;
- case XML_turquoise: return 0x40E0D0;
- case XML_violet: return 0xEE82EE;
- case XML_wheat: return 0xF5DEB3;
- case XML_white: return 0xFFFFFF;
- case XML_whiteSmoke: return 0xF5F5F5;
- case XML_yellow: return 0xFFFF00;
- case XML_yellowGreen: return 0x9ACD32;
- }
- OSL_ENSURE( false, "lclGetPresetColor - invalid preset color token" );
- return API_RGB_BLACK;
+ XML_aliceBlue, 0xF0F8FF, XML_antiqueWhite, 0xFAEBD7,
+ XML_aqua, 0x00FFFF, XML_aquamarine, 0x7FFFD4,
+ XML_azure, 0xF0FFFF, XML_beige, 0xF5F5DC,
+ XML_bisque, 0xFFE4C4, XML_black, 0x000000,
+ XML_blanchedAlmond, 0xFFEBCD, XML_blue, 0x0000FF,
+ XML_blueViolet, 0x8A2BE2, XML_brown, 0xA52A2A,
+ XML_burlyWood, 0xDEB887, XML_cadetBlue, 0x5F9EA0,
+ XML_chartreuse, 0x7FFF00, XML_chocolate, 0xD2691E,
+ XML_coral, 0xFF7F50, XML_cornflowerBlue, 0x6495ED,
+ XML_cornsilk, 0xFFF8DC, XML_crimson, 0xDC143C,
+ XML_cyan, 0x00FFFF, XML_deepPink, 0xFF1493,
+ XML_deepSkyBlue, 0x00BFFF, XML_dimGray, 0x696969,
+ XML_dkBlue, 0x00008B, XML_dkCyan, 0x008B8B,
+ XML_dkGoldenrod, 0xB8860B, XML_dkGray, 0xA9A9A9,
+ XML_dkGreen, 0x006400, XML_dkKhaki, 0xBDB76B,
+ XML_dkMagenta, 0x8B008B, XML_dkOliveGreen, 0x556B2F,
+ XML_dkOrange, 0xFF8C00, XML_dkOrchid, 0x9932CC,
+ XML_dkRed, 0x8B0000, XML_dkSalmon, 0xE9967A,
+ XML_dkSeaGreen, 0x8FBC8B, XML_dkSlateBlue, 0x483D8B,
+ XML_dkSlateGray, 0x2F4F4F, XML_dkTurquoise, 0x00CED1,
+ XML_dkViolet, 0x9400D3, XML_dodgerBlue, 0x1E90FF,
+ XML_firebrick, 0xB22222, XML_floralWhite, 0xFFFAF0,
+ XML_forestGreen, 0x228B22, XML_fuchsia, 0xFF00FF,
+ XML_gainsboro, 0xDCDCDC, XML_ghostWhite, 0xF8F8FF,
+ XML_gold, 0xFFD700, XML_goldenrod, 0xDAA520,
+ XML_gray, 0x808080, XML_green, 0x008000,
+ XML_greenYellow, 0xADFF2F, XML_honeydew, 0xF0FFF0,
+ XML_hotPink, 0xFF69B4, XML_indianRed, 0xCD5C5C,
+ XML_indigo, 0x4B0082, XML_ivory, 0xFFFFF0,
+ XML_khaki, 0xF0E68C, XML_lavender, 0xE6E6FA,
+ XML_lavenderBlush, 0xFFF0F5, XML_lawnGreen, 0x7CFC00,
+ XML_lemonChiffon, 0xFFFACD, XML_lime, 0x00FF00,
+ XML_limeGreen, 0x32CD32, XML_linen, 0xFAF0E6,
+ XML_ltBlue, 0xADD8E6, XML_ltCoral, 0xF08080,
+ XML_ltCyan, 0xE0FFFF, XML_ltGoldenrodYellow, 0xFAFA78,
+ XML_ltGray, 0xD3D3D3, XML_ltGreen, 0x90EE90,
+ XML_ltPink, 0xFFB6C1, XML_ltSalmon, 0xFFA07A,
+ XML_ltSeaGreen, 0x20B2AA, XML_ltSkyBlue, 0x87CEFA,
+ XML_ltSlateGray, 0x778899, XML_ltSteelBlue, 0xB0C4DE,
+ XML_ltYellow, 0xFFFFE0, XML_magenta, 0xFF00FF,
+ XML_maroon, 0x800000, XML_medAquamarine, 0x66CDAA,
+ XML_medBlue, 0x0000CD, XML_medOrchid, 0xBA55D3,
+ XML_medPurple, 0x9370DB, XML_medSeaGreen, 0x3CB371,
+ XML_medSlateBlue, 0x7B68EE, XML_medSpringGreen, 0x00FA9A,
+ XML_medTurquoise, 0x48D1CC, XML_medVioletRed, 0xC71585,
+ XML_midnightBlue, 0x191970, XML_mintCream, 0xF5FFFA,
+ XML_mistyRose, 0xFFE4E1, XML_moccasin, 0xFFE4B5,
+ XML_navajoWhite, 0xFFDEAD, XML_navy, 0x000080,
+ XML_oldLace, 0xFDF5E6, XML_olive, 0x808000,
+ XML_oliveDrab, 0x6B8E23, XML_orange, 0xFFA500,
+ XML_orangeRed, 0xFF4500, XML_orchid, 0xDA70D6,
+ XML_paleGoldenrod, 0xEEE8AA, XML_paleGreen, 0x98FB98,
+ XML_paleTurquoise, 0xAFEEEE, XML_paleVioletRed, 0xDB7093,
+ XML_papayaWhip, 0xFFEFD5, XML_peachPuff, 0xFFDAB9,
+ XML_peru, 0xCD853F, XML_pink, 0xFFC0CB,
+ XML_plum, 0xDDA0DD, XML_powderBlue, 0xB0E0E6,
+ XML_purple, 0x800080, XML_red, 0xFF0000,
+ XML_rosyBrown, 0xBC8F8F, XML_royalBlue, 0x4169E1,
+ XML_saddleBrown, 0x8B4513, XML_salmon, 0xFA8072,
+ XML_sandyBrown, 0xF4A460, XML_seaGreen, 0x2E8B57,
+ XML_seaShell, 0xFFF5EE, XML_sienna, 0xA0522D,
+ XML_silver, 0xC0C0C0, XML_skyBlue, 0x87CEEB,
+ XML_slateBlue, 0x6A5ACD, XML_slateGray, 0x708090,
+ XML_snow, 0xFFFAFA, XML_springGreen, 0x00FF7F,
+ XML_steelBlue, 0x4682B4, XML_tan, 0xD2B48C,
+ XML_teal, 0x008080, XML_thistle, 0xD8BFD8,
+ XML_tomato, 0xFF6347, XML_turquoise, 0x40E0D0,
+ XML_violet, 0xEE82EE, XML_wheat, 0xF5DEB3,
+ XML_white, 0xFFFFFF, XML_whiteSmoke, 0xF5F5F5,
+ XML_yellow, 0xFFFF00, XML_yellowGreen, 0x9ACD32
+ };
+ for( const sal_Int32* pnEntry = spnDmlColors; pnEntry < STATIC_ARRAY_END( spnDmlColors ); pnEntry += 2 )
+ maDmlColors[ static_cast< size_t >( pnEntry[ 0 ] ) ] = pnEntry[ 1 ];
+
+ // predefined colors in VML (map XML token identifiers to RGB values)
+ static const sal_Int32 spnVmlColors[] =
+ {
+ XML_aqua, 0x00FFFF, XML_black, 0x000000,
+ XML_blue, 0x0000FF, XML_fuchsia, 0xFF00FF,
+ XML_gray, 0x808080, XML_green, 0x008000,
+ XML_lime, 0x00FF00, XML_maroon, 0x800000,
+ XML_navy, 0x000080, XML_olive, 0x808000,
+ XML_purple, 0x800080, XML_red, 0xFF0000,
+ XML_silver, 0xC0C0C0, XML_teal, 0x008080,
+ XML_white, 0xFFFFFF, XML_yellow, 0xFFFF00
+ };
+ for( const sal_Int32* pnEntry = spnVmlColors; pnEntry < STATIC_ARRAY_END( spnVmlColors ); pnEntry += 2 )
+ maVmlColors[ static_cast< size_t >( pnEntry[ 0 ] ) ] = pnEntry[ 1 ];
}
+// ----------------------------------------------------------------------------
+
+struct StaticPresetColorsPool : public ::rtl::Static< PresetColorsPool, StaticPresetColorsPool > {};
+
+// ----------------------------------------------------------------------------
+
+const double DEC_GAMMA = 2.3;
+const double INC_GAMMA = 1.0 / DEC_GAMMA;
+
+// ----------------------------------------------------------------------------
+
inline void lclRgbToRgbComponents( sal_Int32& ornR, sal_Int32& ornG, sal_Int32& ornB, sal_Int32 nRgb )
{
ornR = (nRgb >> 16) & 0xFF;
@@ -248,7 +215,7 @@ void lclOffValue( sal_Int32& ornValue, sal_Int32 nOff, sal_Int32 nMax = MAX_PERC
} // namespace
-// ----------------------------------------------------------------------------
+// ============================================================================
Color::Color() :
meMode( COLOR_UNUSED ),
@@ -263,6 +230,24 @@ Color::~Color()
{
}
+/*static*/ sal_Int32 Color::getDmlPresetColor( sal_Int32 nToken, sal_Int32 nDefaultRgb )
+{
+ /* Do not pass nDefaultRgb to ContainerHelper::getVectorElement(), to be
+ able to catch the existing vector entries without corresponding XML
+ token identifier. */
+ sal_Int32 nRgbValue = ContainerHelper::getVectorElement( StaticPresetColorsPool::get().maDmlColors, nToken, API_RGB_TRANSPARENT );
+ return (nRgbValue >= 0) ? nRgbValue : nDefaultRgb;
+}
+
+/*static*/ sal_Int32 Color::getVmlPresetColor( sal_Int32 nToken, sal_Int32 nDefaultRgb )
+{
+ /* Do not pass nDefaultRgb to ContainerHelper::getVectorElement(), to be
+ able to catch the existing vector entries without corresponding XML
+ token identifier. */
+ sal_Int32 nRgbValue = ContainerHelper::getVectorElement( StaticPresetColorsPool::get().maVmlColors, nToken, API_RGB_TRANSPARENT );
+ return (nRgbValue >= 0) ? nRgbValue : nDefaultRgb;
+}
+
void Color::setUnused()
{
meMode = COLOR_UNUSED;
@@ -299,7 +284,10 @@ void Color::setHslClr( sal_Int32 nHue, sal_Int32 nSat, sal_Int32 nLum )
void Color::setPrstClr( sal_Int32 nToken )
{
- setSrgbClr( lclGetPresetColor( nToken ) );
+ sal_Int32 nRgbValue = getDmlPresetColor( nToken, API_RGB_TRANSPARENT );
+ OSL_ENSURE( nRgbValue >= 0, "Color::setPrstClr - invalid preset color token" );
+ if( nRgbValue >= 0 )
+ setSrgbClr( nRgbValue );
}
void Color::setSchemeClr( sal_Int32 nToken )
@@ -309,6 +297,13 @@ void Color::setSchemeClr( sal_Int32 nToken )
mnC1 = nToken;
}
+void Color::setPaletteClr( sal_Int32 nPaletteIdx )
+{
+ OSL_ENSURE( nPaletteIdx >= 0, "Color::setPaletteClr - invalid palette index" );
+ meMode = COLOR_PALETTE;
+ mnC1 = nPaletteIdx;
+}
+
void Color::setSysClr( sal_Int32 nToken, sal_Int32 nLastRgb )
{
OSL_ENSURE( (-1 <= nLastRgb) && (nLastRgb <= 0xFFFFFF), "Color::setSysClr - invalid RGB value" );
@@ -347,12 +342,18 @@ void Color::addExcelTintTransformation( double fTint )
maTransforms.push_back( Transformation( NMSP_XLS | XML_tint, nValue ) );
}
+void Color::clearTransformations()
+{
+ maTransforms.clear();
+ clearTransparence();
+}
+
void Color::clearTransparence()
{
mnAlpha = MAX_PERCENT;
}
-sal_Int32 Color::getColor( const ::oox::core::XmlFilterBase& rFilter, sal_Int32 nPhClr ) const
+sal_Int32 Color::getColor( const ::oox::core::FilterBase& rFilter, sal_Int32 nPhClr ) const
{
/* Special handling for theme style list placeholder colors (state
COLOR_PH), Color::getColor() may be called with different placeholder
@@ -364,151 +365,154 @@ sal_Int32 Color::getColor( const ::oox::core::XmlFilterBase& rFilter, sal_Int32
switch( meMode )
{
- case COLOR_UNUSED: return -1;
- case COLOR_FINAL: return mnC1;
+ case COLOR_UNUSED: mnC1 = API_RGB_TRANSPARENT; break;
case COLOR_RGB: break; // nothing to do
case COLOR_CRGB: break; // nothing to do
case COLOR_HSL: break; // nothing to do
- case COLOR_SCHEME:
- meMode = COLOR_RGB;
- lclRgbToRgbComponents( mnC1, mnC2, mnC3, rFilter.getSchemeClr( mnC1 ) );
- break;
- case COLOR_PH:
- meMode = COLOR_RGB;
- lclRgbToRgbComponents( mnC1, mnC2, mnC3, nPhClr );
- bIsPh = true;
- break;
- case COLOR_SYSTEM:
- meMode = COLOR_RGB;
- lclRgbToRgbComponents( mnC1, mnC2, mnC3, rFilter.getSystemColor( mnC1, mnC2 ) );
- break;
+ case COLOR_SCHEME: setResolvedRgb( rFilter.getSchemeColor( mnC1 ) ); break;
+ case COLOR_PALETTE: setResolvedRgb( rFilter.getPaletteColor( mnC1 ) ); break;
+ case COLOR_SYSTEM: setResolvedRgb( rFilter.getSystemColor( mnC1, mnC2 ) ); break;
+ case COLOR_PH: setResolvedRgb( nPhClr ); bIsPh = true; break;
+
+ case COLOR_FINAL: return mnC1;
}
- for( TransformVec::const_iterator aIt = maTransforms.begin(), aEnd = maTransforms.end(); aIt != aEnd; ++aIt )
+ // if color is UNUSED or turns to UNUSED in setResolvedRgb, do not perform transformations
+ if( meMode != COLOR_UNUSED )
{
- switch( aIt->mnToken )
+ for( TransformVec::const_iterator aIt = maTransforms.begin(), aEnd = maTransforms.end(); aIt != aEnd; ++aIt )
{
- case XML_red: toCrgb(); lclSetValue( mnC1, aIt->mnValue ); break;
- case XML_redMod: toCrgb(); lclModValue( mnC1, aIt->mnValue ); break;
- case XML_redOff: toCrgb(); lclOffValue( mnC1, aIt->mnValue ); break;
- case XML_green: toCrgb(); lclSetValue( mnC2, aIt->mnValue ); break;
- case XML_greenMod: toCrgb(); lclModValue( mnC2, aIt->mnValue ); break;
- case XML_greenOff: toCrgb(); lclOffValue( mnC2, aIt->mnValue ); break;
- case XML_blue: toCrgb(); lclSetValue( mnC3, aIt->mnValue ); break;
- case XML_blueMod: toCrgb(); lclModValue( mnC3, aIt->mnValue ); break;
- case XML_blueOff: toCrgb(); lclOffValue( mnC3, aIt->mnValue ); break;
-
- case XML_hue: toHsl(); lclSetValue( mnC1, aIt->mnValue, MAX_DEGREE ); break;
- case XML_hueMod: toHsl(); lclModValue( mnC1, aIt->mnValue, MAX_DEGREE ); break;
- case XML_hueOff: toHsl(); lclOffValue( mnC1, aIt->mnValue, MAX_DEGREE ); break;
- case XML_sat: toHsl(); lclSetValue( mnC2, aIt->mnValue ); break;
- case XML_satMod: toHsl(); lclModValue( mnC2, aIt->mnValue ); break;
- case XML_satOff: toHsl(); lclOffValue( mnC2, aIt->mnValue ); break;
-
- case XML_lum:
- toHsl();
- lclSetValue( mnC3, aIt->mnValue );
- // if color changes to black or white, it will stay gray if luminance changes again
- if( (mnC3 == 0) || (mnC3 == MAX_PERCENT) ) mnC2 = 0;
- break;
- case XML_lumMod:
- toHsl();
- lclModValue( mnC3, aIt->mnValue );
- // if color changes to black or white, it will stay gray if luminance changes again
- if( (mnC3 == 0) || (mnC3 == MAX_PERCENT) ) mnC2 = 0;
- break;
- case XML_lumOff:
- toHsl();
- lclOffValue( mnC3, aIt->mnValue );
- // if color changes to black or white, it will stay gray if luminance changes again
- if( (mnC3 == 0) || (mnC3 == MAX_PERCENT) ) mnC2 = 0;
- break;
-
- case XML_shade:
- // shade: 0% = black, 100% = original color
- toCrgb();
- OSL_ENSURE( (0 <= aIt->mnValue) && (aIt->mnValue <= MAX_PERCENT), "Color::getColor - invalid shade value" );
- if( (0 <= aIt->mnValue) && (aIt->mnValue <= MAX_PERCENT) )
- {
- double fFactor = static_cast< double >( aIt->mnValue ) / MAX_PERCENT;
- mnC1 = static_cast< sal_Int32 >( mnC1 * fFactor );
- mnC2 = static_cast< sal_Int32 >( mnC2 * fFactor );
- mnC3 = static_cast< sal_Int32 >( mnC3 * fFactor );
- }
- break;
- case XML_tint:
- // tint: 0% = white, 100% = original color
- toCrgb();
- OSL_ENSURE( (0 <= aIt->mnValue) && (aIt->mnValue <= MAX_PERCENT), "Color::getColor - invalid tint value" );
- if( (0 <= aIt->mnValue) && (aIt->mnValue <= MAX_PERCENT) )
- {
- double fFactor = static_cast< double >( aIt->mnValue ) / MAX_PERCENT;
- mnC1 = static_cast< sal_Int32 >( MAX_PERCENT - (MAX_PERCENT - mnC1) * fFactor );
- mnC2 = static_cast< sal_Int32 >( MAX_PERCENT - (MAX_PERCENT - mnC2) * fFactor );
- mnC3 = static_cast< sal_Int32 >( MAX_PERCENT - (MAX_PERCENT - mnC3) * fFactor );
- }
- break;
- case XLS_TOKEN( tint ):
- // Excel tint: move luminance relative to current value
- toHsl();
- OSL_ENSURE( (-MAX_PERCENT <= aIt->mnValue) && (aIt->mnValue <= MAX_PERCENT), "Color::getColor - invalid tint value" );
- if( (-MAX_PERCENT <= aIt->mnValue) && (aIt->mnValue < 0) )
- {
- // negative: luminance towards 0% (black)
- lclModValue( mnC3, aIt->mnValue + MAX_PERCENT );
- }
- else if( (0 < aIt->mnValue) && (aIt->mnValue <= MAX_PERCENT) )
- {
- // positive: luminance towards 100% (white)
- mnC3 = MAX_PERCENT - mnC3;
- lclModValue( mnC3, MAX_PERCENT - aIt->mnValue );
+ switch( aIt->mnToken )
+ {
+ case XML_red: toCrgb(); lclSetValue( mnC1, aIt->mnValue ); break;
+ case XML_redMod: toCrgb(); lclModValue( mnC1, aIt->mnValue ); break;
+ case XML_redOff: toCrgb(); lclOffValue( mnC1, aIt->mnValue ); break;
+ case XML_green: toCrgb(); lclSetValue( mnC2, aIt->mnValue ); break;
+ case XML_greenMod: toCrgb(); lclModValue( mnC2, aIt->mnValue ); break;
+ case XML_greenOff: toCrgb(); lclOffValue( mnC2, aIt->mnValue ); break;
+ case XML_blue: toCrgb(); lclSetValue( mnC3, aIt->mnValue ); break;
+ case XML_blueMod: toCrgb(); lclModValue( mnC3, aIt->mnValue ); break;
+ case XML_blueOff: toCrgb(); lclOffValue( mnC3, aIt->mnValue ); break;
+
+ case XML_hue: toHsl(); lclSetValue( mnC1, aIt->mnValue, MAX_DEGREE ); break;
+ case XML_hueMod: toHsl(); lclModValue( mnC1, aIt->mnValue, MAX_DEGREE ); break;
+ case XML_hueOff: toHsl(); lclOffValue( mnC1, aIt->mnValue, MAX_DEGREE ); break;
+ case XML_sat: toHsl(); lclSetValue( mnC2, aIt->mnValue ); break;
+ case XML_satMod: toHsl(); lclModValue( mnC2, aIt->mnValue ); break;
+ case XML_satOff: toHsl(); lclOffValue( mnC2, aIt->mnValue ); break;
+
+ case XML_lum:
+ toHsl();
+ lclSetValue( mnC3, aIt->mnValue );
+ // if color changes to black or white, it will stay gray if luminance changes again
+ if( (mnC3 == 0) || (mnC3 == MAX_PERCENT) ) mnC2 = 0;
+ break;
+ case XML_lumMod:
+ toHsl();
+ lclModValue( mnC3, aIt->mnValue );
+ // if color changes to black or white, it will stay gray if luminance changes again
+ if( (mnC3 == 0) || (mnC3 == MAX_PERCENT) ) mnC2 = 0;
+ break;
+ case XML_lumOff:
+ toHsl();
+ lclOffValue( mnC3, aIt->mnValue );
+ // if color changes to black or white, it will stay gray if luminance changes again
+ if( (mnC3 == 0) || (mnC3 == MAX_PERCENT) ) mnC2 = 0;
+ break;
+
+ case XML_shade:
+ // shade: 0% = black, 100% = original color
+ toCrgb();
+ OSL_ENSURE( (0 <= aIt->mnValue) && (aIt->mnValue <= MAX_PERCENT), "Color::getColor - invalid shade value" );
+ if( (0 <= aIt->mnValue) && (aIt->mnValue <= MAX_PERCENT) )
+ {
+ double fFactor = static_cast< double >( aIt->mnValue ) / MAX_PERCENT;
+ mnC1 = static_cast< sal_Int32 >( mnC1 * fFactor );
+ mnC2 = static_cast< sal_Int32 >( mnC2 * fFactor );
+ mnC3 = static_cast< sal_Int32 >( mnC3 * fFactor );
+ }
+ break;
+ case XML_tint:
+ // tint: 0% = white, 100% = original color
+ toCrgb();
+ OSL_ENSURE( (0 <= aIt->mnValue) && (aIt->mnValue <= MAX_PERCENT), "Color::getColor - invalid tint value" );
+ if( (0 <= aIt->mnValue) && (aIt->mnValue <= MAX_PERCENT) )
+ {
+ double fFactor = static_cast< double >( aIt->mnValue ) / MAX_PERCENT;
+ mnC1 = static_cast< sal_Int32 >( MAX_PERCENT - (MAX_PERCENT - mnC1) * fFactor );
+ mnC2 = static_cast< sal_Int32 >( MAX_PERCENT - (MAX_PERCENT - mnC2) * fFactor );
+ mnC3 = static_cast< sal_Int32 >( MAX_PERCENT - (MAX_PERCENT - mnC3) * fFactor );
+ }
+ break;
+ case XLS_TOKEN( tint ):
+ // Excel tint: move luminance relative to current value
+ toHsl();
+ OSL_ENSURE( (-MAX_PERCENT <= aIt->mnValue) && (aIt->mnValue <= MAX_PERCENT), "Color::getColor - invalid tint value" );
+ if( (-MAX_PERCENT <= aIt->mnValue) && (aIt->mnValue < 0) )
+ {
+ // negative: luminance towards 0% (black)
+ lclModValue( mnC3, aIt->mnValue + MAX_PERCENT );
+ }
+ else if( (0 < aIt->mnValue) && (aIt->mnValue <= MAX_PERCENT) )
+ {
+ // positive: luminance towards 100% (white)
+ mnC3 = MAX_PERCENT - mnC3;
+ lclModValue( mnC3, MAX_PERCENT - aIt->mnValue );
+ mnC3 = MAX_PERCENT - mnC3;
+ }
+ break;
+
+ case XML_gray:
+ // change color to gray, weighted RGB: 22% red, 72% green, 6% blue
+ toRgb();
+ mnC1 = mnC2 = mnC3 = (mnC1 * 22 + mnC2 * 72 + mnC3 * 6) / 100;
+ break;
+
+ case XML_comp:
+ // comp: rotate hue by 180 degrees, do not change lum/sat
+ toHsl();
+ (mnC1 += 180 * PER_DEGREE) %= MAX_DEGREE;
+ break;
+ case XML_inv:
+ // invert percentual RGB values
+ toCrgb();
+ mnC1 = MAX_PERCENT - mnC1;
+ mnC2 = MAX_PERCENT - mnC2;
mnC3 = MAX_PERCENT - mnC3;
- }
- break;
-
- case XML_gray:
- // change color to gray, weighted RGB: 22% red, 72% green, 6% blue
- toRgb();
- mnC1 = mnC2 = mnC3 = (mnC1 * 22 + mnC2 * 72 + mnC3 * 6) / 100;
- break;
-
- case XML_comp:
- // comp: rotate hue by 180 degrees, do not change lum/sat
- toHsl();
- (mnC1 += 180 * PER_DEGREE) %= MAX_DEGREE;
- break;
- case XML_inv:
- // invert percentual RGB values
- toCrgb();
- mnC1 = MAX_PERCENT - mnC1;
- mnC2 = MAX_PERCENT - mnC2;
- mnC3 = MAX_PERCENT - mnC3;
- break;
-
- case XML_gamma:
- // increase gamma of color
- toCrgb();
- mnC1 = lclGamma( mnC1, INC_GAMMA );
- mnC2 = lclGamma( mnC2, INC_GAMMA );
- mnC3 = lclGamma( mnC3, INC_GAMMA );
- break;
- case XML_invGamma:
- // decrease gamma of color
- toCrgb();
- mnC1 = lclGamma( mnC1, DEC_GAMMA );
- mnC2 = lclGamma( mnC2, DEC_GAMMA );
- mnC3 = lclGamma( mnC3, DEC_GAMMA );
- break;
+ break;
+
+ case XML_gamma:
+ // increase gamma of color
+ toCrgb();
+ mnC1 = lclGamma( mnC1, INC_GAMMA );
+ mnC2 = lclGamma( mnC2, INC_GAMMA );
+ mnC3 = lclGamma( mnC3, INC_GAMMA );
+ break;
+ case XML_invGamma:
+ // decrease gamma of color
+ toCrgb();
+ mnC1 = lclGamma( mnC1, DEC_GAMMA );
+ mnC2 = lclGamma( mnC2, DEC_GAMMA );
+ mnC3 = lclGamma( mnC3, DEC_GAMMA );
+ break;
+ }
}
+
+ // store resulting RGB value in mnC1
+ toRgb();
+ mnC1 = lclRgbComponentsToRgb( mnC1, mnC2, mnC3 );
+ }
+ else // if( meMode != COLOR_UNUSED )
+ {
+ mnC1 = API_RGB_TRANSPARENT;
}
- toRgb();
meMode = bIsPh ? COLOR_PH : COLOR_FINAL;
if( meMode == COLOR_FINAL )
maTransforms.clear();
- return mnC1 = lclRgbComponentsToRgb( mnC1, mnC2, mnC3 );
+ return mnC1;
}
bool Color::hasTransparence() const
@@ -523,6 +527,12 @@ sal_Int16 Color::getTransparence() const
// private --------------------------------------------------------------------
+void Color::setResolvedRgb( sal_Int32 nRgb ) const
+{
+ meMode = (nRgb < 0) ? COLOR_UNUSED : COLOR_RGB;
+ lclRgbToRgbComponents( mnC1, mnC2, mnC3, nRgb );
+}
+
void Color::toRgb() const
{
switch( meMode )
diff --git a/oox/source/drawingml/customshapeproperties.cxx b/oox/source/drawingml/customshapeproperties.cxx
index 5a1756e6d110..fdede72a7e8e 100644
--- a/oox/source/drawingml/customshapeproperties.cxx
+++ b/oox/source/drawingml/customshapeproperties.cxx
@@ -63,7 +63,7 @@ void CustomShapeProperties::apply( const CustomShapePropertiesPtr& /* rSourceCus
// not sure if this needs to be implemented
}
-void CustomShapeProperties::pushToPropSet( const ::oox::core::XmlFilterBase& /* rFilterBase */,
+void CustomShapeProperties::pushToPropSet( const ::oox::core::FilterBase& /* rFilterBase */,
const Reference < XPropertySet >& xPropSet, const Reference < XShape > & xShape ) const
{
if ( maShapePresetType.getLength() )
diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx
index 46fe6ae5292c..f6a72c3aafce 100644
--- a/oox/source/drawingml/fillproperties.cxx
+++ b/oox/source/drawingml/fillproperties.cxx
@@ -44,7 +44,8 @@
#include "oox/helper/modelobjecthelper.hxx"
#include "oox/helper/propertymap.hxx"
#include "oox/helper/propertyset.hxx"
-#include "oox/core/xmlfilterbase.hxx"
+#include "oox/core/filterbase.hxx"
+#include "oox/drawingml/drawingmltypes.hxx"
using namespace ::com::sun::star;
using namespace ::com::sun::star::drawing;
@@ -55,7 +56,8 @@ using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::Exception;
using ::com::sun::star::uno::UNO_QUERY;
using ::com::sun::star::uno::UNO_QUERY_THROW;
-using ::oox::core::XmlFilterBase;
+using ::com::sun::star::geometry::IntegerRectangle2D;
+using ::oox::core::FilterBase;
namespace oox {
namespace drawingml {
@@ -106,7 +108,7 @@ RectanglePoint lclGetRectanglePoint( sal_Int32 nToken )
return RectanglePoint_LEFT_TOP;
}
-const awt::Size lclGetOriginalSize( const XmlFilterBase& rFilter, const Reference< XGraphic >& rxGraphic )
+const awt::Size lclGetOriginalSize( const FilterBase& rFilter, const Reference< XGraphic >& rxGraphic )
{
awt::Size aSize100thMM( 0, 0 );
try
@@ -222,8 +224,8 @@ Color FillProperties::getBestSolidColor() const
return aSolidColor;
}
-void FillProperties::pushToPropMap( PropertyMap& rPropMap, const FillPropertyIds& rPropIds,
- const XmlFilterBase& rFilter, ModelObjectHelper& rModelObjHelper,
+void FillProperties::pushToPropMap( PropertyMap& rPropMap, const FilterBase& rFilter,
+ ModelObjectHelper& rModelObjHelper, const FillPropertyIds& rPropIds,
sal_Int32 nShapeRotation, sal_Int32 nPhClr ) const
{
if( moFillType.has() )
@@ -254,7 +256,8 @@ void FillProperties::pushToPropMap( PropertyMap& rPropMap, const FillPropertyIds
aGradient.StartIntensity = 100;
aGradient.EndIntensity = 100;
- if( maGradientProps.maGradientStops.size() > 1 )
+ size_t nColorCount = maGradientProps.maGradientStops.size();
+ if( nColorCount > 1 )
{
aGradient.StartColor = maGradientProps.maGradientStops.begin()->second.getColor( rFilter, nPhClr );
aGradient.EndColor = maGradientProps.maGradientStops.rbegin()->second.getColor( rFilter, nPhClr );
@@ -264,19 +267,36 @@ void FillProperties::pushToPropMap( PropertyMap& rPropMap, const FillPropertyIds
if ( !maGradientProps.moRotateWithShape.get( false ) )
nShapeRotation = 0;
+ sal_Int32 nDmlAngle = 0;
if( maGradientProps.moGradientPath.has() )
{
aGradient.Style = (maGradientProps.moGradientPath.get() == XML_circle) ? awt::GradientStyle_ELLIPTICAL : awt::GradientStyle_RECT;
- aGradient.Angle = static_cast< sal_Int16 >( (900 - (nShapeRotation / 6000)) % 3600 );
- aGradient.XOffset = maGradientProps.moFillToRect.has() ? getLimitedValue< sal_Int16, sal_Int32 >( maGradientProps.moFillToRect.get().X1 / 1000, 30, 70 ) : 50;
- aGradient.YOffset = maGradientProps.moFillToRect.has() ? getLimitedValue< sal_Int16, sal_Int32 >( maGradientProps.moFillToRect.get().Y1 / 1000, 30, 70 ) : 50;
+ // position of gradient center (limited to [30%;70%], otherwise gradient is too hidden)
+ IntegerRectangle2D aFillToRect = maGradientProps.moFillToRect.get( IntegerRectangle2D( 0, 0, MAX_PERCENT, MAX_PERCENT ) );
+ sal_Int32 nCenterX = (MAX_PERCENT + aFillToRect.X1 - aFillToRect.X2) / 2;
+ aGradient.XOffset = getLimitedValue< sal_Int16, sal_Int32 >( nCenterX / PER_PERCENT, 30, 70 );
+ sal_Int32 nCenterY = (MAX_PERCENT + aFillToRect.Y1 - aFillToRect.Y2) / 2;
+ aGradient.YOffset = getLimitedValue< sal_Int16, sal_Int32 >( nCenterY / PER_PERCENT, 30, 70 );
::std::swap( aGradient.StartColor, aGradient.EndColor );
+ nDmlAngle = nShapeRotation;
}
else
{
- aGradient.Style = awt::GradientStyle_LINEAR;
- aGradient.Angle = static_cast< sal_Int16 >( (4500 - ((maGradientProps.moShadeAngle.get( 0 ) - nShapeRotation) / 6000)) % 3600 );
+ /* Try to detect a VML axial gradient. This type of
+ gradient is simulated by a 3-point linear gradient
+ with equal start and end color. */
+ bool bAxial = (nColorCount == 3) && (aGradient.StartColor == aGradient.EndColor);
+ aGradient.Style = bAxial ? awt::GradientStyle_AXIAL : awt::GradientStyle_LINEAR;
+ if( bAxial )
+ {
+ GradientFillProperties::GradientStopMap::const_iterator aIt = maGradientProps.maGradientStops.begin();
+ // API StartColor is inner color in axial gradient
+ aGradient.StartColor = (++aIt)->second.getColor( rFilter, nPhClr );
+ }
+ nDmlAngle = maGradientProps.moShadeAngle.get( 0 ) - nShapeRotation;
}
+ // convert DrawingML angle (in 1/60000 degrees) to API angle (in 1/10 degrees)
+ aGradient.Angle = static_cast< sal_Int16 >( (4500 - (nDmlAngle / (PER_DEGREE / 10))) % 3600 );
// push gradient or named gradient to property map
if( rPropIds.mbNamedFillGradient )
@@ -340,10 +360,10 @@ void FillProperties::pushToPropMap( PropertyMap& rPropMap, const FillPropertyIds
if( (aOriginalSize.Width > 0) && (aOriginalSize.Height > 0) )
{
// size of one bitmap tile (given as 1/1000 percent of bitmap size), convert to 1/100 mm
- double fScaleX = maBlipProps.moTileScaleX.get( 100000 ) / 100000.0;
+ double fScaleX = maBlipProps.moTileScaleX.get( MAX_PERCENT ) / static_cast< double >( MAX_PERCENT );
sal_Int32 nFillBmpSizeX = getLimitedValue< sal_Int32, double >( aOriginalSize.Width * fScaleX, 1, SAL_MAX_INT32 );
rPropMap.setProperty( rPropIds[ FillBitmapSizeXId ], nFillBmpSizeX );
- double fScaleY = maBlipProps.moTileScaleY.get( 100000 ) / 100000.0;
+ double fScaleY = maBlipProps.moTileScaleY.get( MAX_PERCENT ) / static_cast< double >( MAX_PERCENT );
sal_Int32 nFillBmpSizeY = getLimitedValue< sal_Int32, double >( aOriginalSize.Height * fScaleY, 1, SAL_MAX_INT32 );
rPropMap.setProperty( rPropIds[ FillBitmapSizeYId ], nFillBmpSizeY );
@@ -383,12 +403,12 @@ void FillProperties::pushToPropMap( PropertyMap& rPropMap, const FillPropertyIds
}
}
-void FillProperties::pushToPropSet( PropertySet& rPropSet, const FillPropertyIds& rPropIds,
- const XmlFilterBase& rFilter, ModelObjectHelper& rModelObjHelper,
+void FillProperties::pushToPropSet( PropertySet& rPropSet, const FilterBase& rFilter,
+ ModelObjectHelper& rModelObjHelper, const FillPropertyIds& rPropIds,
sal_Int32 nShapeRotation, sal_Int32 nPhClr ) const
{
PropertyMap aPropMap;
- pushToPropMap( aPropMap, rPropIds, rFilter, rModelObjHelper, nShapeRotation, nPhClr );
+ pushToPropMap( aPropMap, rFilter, rModelObjHelper, rPropIds, nShapeRotation, nPhClr );
rPropSet.setProperties( aPropMap );
}
@@ -399,7 +419,7 @@ void GraphicProperties::assignUsed( const GraphicProperties& rSourceProps )
maBlipProps.assignUsed( rSourceProps.maBlipProps );
}
-void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const XmlFilterBase& rFilter, sal_Int32 nPhClr ) const
+void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const FilterBase& rFilter, sal_Int32 nPhClr ) const
{
if( maBlipProps.mxGraphic.is() )
{
@@ -436,15 +456,15 @@ void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const XmlFilterBas
rPropMap[ PROP_GraphicColorMode ] <<= eColorMode;
// brightness and contrast
- sal_Int16 nBrightness = getLimitedValue< sal_Int16, sal_Int32 >( maBlipProps.moBrightness.get( 0 ) / 1000, -100, 100 );
+ sal_Int16 nBrightness = getLimitedValue< sal_Int16, sal_Int32 >( maBlipProps.moBrightness.get( 0 ) / PER_PERCENT, -100, 100 );
if( nBrightness != 0 )
rPropMap[ PROP_AdjustLuminance ] <<= nBrightness;
- sal_Int16 nContrast = getLimitedValue< sal_Int16, sal_Int32 >( maBlipProps.moContrast.get( 0 ) / 1000, -100, 100 );
+ sal_Int16 nContrast = getLimitedValue< sal_Int16, sal_Int32 >( maBlipProps.moContrast.get( 0 ) / PER_PERCENT, -100, 100 );
if( nContrast != 0 )
rPropMap[ PROP_AdjustContrast ] <<= nContrast;
}
-void GraphicProperties::pushToPropSet( PropertySet& rPropSet, const XmlFilterBase& rFilter, sal_Int32 nPhClr ) const
+void GraphicProperties::pushToPropSet( PropertySet& rPropSet, const FilterBase& rFilter, sal_Int32 nPhClr ) const
{
PropertyMap aPropMap;
pushToPropMap( aPropMap, rFilter, nPhClr );
diff --git a/oox/source/drawingml/fillpropertiesgroupcontext.cxx b/oox/source/drawingml/fillpropertiesgroupcontext.cxx
index 1e27dcd60bb7..dfe395ec8f34 100644
--- a/oox/source/drawingml/fillpropertiesgroupcontext.cxx
+++ b/oox/source/drawingml/fillpropertiesgroupcontext.cxx
@@ -271,15 +271,14 @@ Reference< XFastContextHandler > FillPropertiesContext::createFastChildContext(
ContextHandler& rParent, sal_Int32 nElement,
const Reference< XFastAttributeList >& rxAttribs, FillProperties& rFillProps )
{
- rFillProps.moFillType = getToken( nElement );
switch( nElement )
{
- case A_TOKEN( noFill ): return 0;
- case A_TOKEN( solidFill ): return new SolidFillContext( rParent, rxAttribs, rFillProps );
- case A_TOKEN( gradFill ): return new GradientFillContext( rParent, rxAttribs, rFillProps.maGradientProps );
- case A_TOKEN( pattFill ): return new PatternFillContext( rParent, rxAttribs, rFillProps.maPatternProps );
- case A_TOKEN( blipFill ): return new BlipFillContext( rParent, rxAttribs, rFillProps.maBlipProps );
- case A_TOKEN( grpFill ): return 0; // TODO
+ case A_TOKEN( noFill ): { rFillProps.moFillType = getToken( nElement ); return 0; };
+ case A_TOKEN( solidFill ): { rFillProps.moFillType = getToken( nElement ); return new SolidFillContext( rParent, rxAttribs, rFillProps ); };
+ case A_TOKEN( gradFill ): { rFillProps.moFillType = getToken( nElement ); return new GradientFillContext( rParent, rxAttribs, rFillProps.maGradientProps ); };
+ case A_TOKEN( pattFill ): { rFillProps.moFillType = getToken( nElement ); return new PatternFillContext( rParent, rxAttribs, rFillProps.maPatternProps ); };
+ case A_TOKEN( blipFill ): { rFillProps.moFillType = getToken( nElement ); return new BlipFillContext( rParent, rxAttribs, rFillProps.maBlipProps ); };
+ case A_TOKEN( grpFill ): { rFillProps.moFillType = getToken( nElement ); return 0; }; // TODO
}
return 0;
}
diff --git a/oox/source/drawingml/lineproperties.cxx b/oox/source/drawingml/lineproperties.cxx
index 7f31bc05cb7e..6cee420c167d 100644
--- a/oox/source/drawingml/lineproperties.cxx
+++ b/oox/source/drawingml/lineproperties.cxx
@@ -43,8 +43,8 @@
#include "oox/helper/modelobjecthelper.hxx"
#include "oox/helper/propertymap.hxx"
#include "oox/helper/propertyset.hxx"
+#include "oox/core/filterbase.hxx"
#include "oox/core/namespaces.hxx"
-#include "oox/core/xmlfilterbase.hxx"
#include "oox/drawingml/drawingmltypes.hxx"
using namespace ::com::sun::star::drawing;
@@ -55,7 +55,7 @@ using ::com::sun::star::uno::Any;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::awt::Point;
using ::com::sun::star::container::XNameContainer;
-using ::oox::core::XmlFilterBase;
+using ::oox::core::FilterBase;
namespace oox {
namespace drawingml {
@@ -82,6 +82,85 @@ static const sal_Int32 spnDefaultLineIds[ LineId_END ] =
// ----------------------------------------------------------------------------
+void lclSetDashData( LineDash& orLineDash, sal_Int16 nDots, sal_Int32 nDotLen,
+ sal_Int16 nDashes, sal_Int32 nDashLen, sal_Int32 nDistance )
+{
+ orLineDash.Dots = nDots;
+ orLineDash.DotLen = nDotLen;
+ orLineDash.Dashes = nDashes;
+ orLineDash.DashLen = nDashLen;
+ orLineDash.Distance = nDistance;
+}
+
+/** Converts the specified preset dash to API dash.
+
+ Line length and dot length are set relative to line width and have to be
+ multiplied by the actual line width after this function.
+ */
+void lclConvertPresetDash( LineDash& orLineDash, sal_Int32 nPresetDash )
+{
+ switch( nPresetDash )
+ {
+ case XML_dot: lclSetDashData( orLineDash, 1, 1, 0, 0, 3 ); break;
+ case XML_dash: lclSetDashData( orLineDash, 0, 0, 1, 4, 3 ); break;
+ case XML_dashDot: lclSetDashData( orLineDash, 1, 1, 1, 4, 3 ); break;
+
+ case XML_lgDash: lclSetDashData( orLineDash, 0, 0, 1, 8, 3 ); break;
+ case XML_lgDashDot: lclSetDashData( orLineDash, 1, 1, 1, 8, 3 ); break;
+ case XML_lgDashDotDot: lclSetDashData( orLineDash, 2, 1, 1, 8, 3 ); break;
+
+ case XML_sysDot: lclSetDashData( orLineDash, 1, 1, 0, 0, 1 ); break;
+ case XML_sysDash: lclSetDashData( orLineDash, 0, 0, 1, 3, 1 ); break;
+ case XML_sysDashDot: lclSetDashData( orLineDash, 1, 1, 1, 3, 1 ); break;
+ case XML_sysDashDotDot: lclSetDashData( orLineDash, 2, 1, 1, 3, 1 ); break;
+
+ default:
+ OSL_ENSURE( false, "lclConvertPresetDash - unsupported preset dash" );
+ lclSetDashData( orLineDash, 0, 0, 1, 4, 3 );
+ }
+}
+
+/** Converts the passed custom dash to API dash.
+
+ Line length and dot length are set relative to line width and have to be
+ multiplied by the actual line width after this function.
+ */
+void lclConvertCustomDash( LineDash& orLineDash, const LineProperties::DashStopVector& rCustomDash )
+{
+ if( rCustomDash.empty() )
+ {
+ OSL_ENSURE( false, "lclConvertCustomDash - unexpected empty custom dash" );
+ lclSetDashData( orLineDash, 0, 0, 1, 4, 3 );
+ return;
+ }
+
+ // count dashes and dots (stops equal or less than 2 are assumed to be dots)
+ sal_Int16 nDots = 0;
+ sal_Int32 nDotLen = 0;
+ sal_Int16 nDashes = 0;
+ sal_Int32 nDashLen = 0;
+ sal_Int32 nDistance = 0;
+ for( LineProperties::DashStopVector::const_iterator aIt = rCustomDash.begin(), aEnd = rCustomDash.end(); aIt != aEnd; ++aIt )
+ {
+ if( aIt->first <= 2 )
+ {
+ ++nDots;
+ nDotLen += aIt->first;
+ }
+ else
+ {
+ ++nDashes;
+ nDashLen += aIt->first;
+ }
+ nDistance += aIt->second;
+ }
+ orLineDash.DotLen = (nDots > 0) ? ::std::max< sal_Int32 >( nDotLen / nDots, 1 ) : 0;
+ orLineDash.Dots = nDots;
+ orLineDash.DashLen = (nDashes > 0) ? ::std::max< sal_Int32 >( nDashLen / nDashes, 1 ) : 0;
+ orLineDash.Dashes = nDashes;
+ orLineDash.Distance = ::std::max< sal_Int32 >( nDistance / rCustomDash.size(), 1 );
+}
+
DashStyle lclGetDashStyle( sal_Int32 nToken )
{
switch( nToken )
@@ -122,7 +201,7 @@ sal_Int32 lclGetArrowSize( sal_Int32 nToken )
// ----------------------------------------------------------------------------
void lclPushMarkerProperties( PropertyMap& rPropMap, const LineArrowProperties& rArrowProps,
- const LinePropertyIds& rPropIds, ModelObjectHelper& rModelObjHelper, sal_Int32 nLineWidth, bool bLineEnd )
+ ModelObjectHelper& rModelObjHelper, const LinePropertyIds& rPropIds, sal_Int32 nLineWidth, bool bLineEnd )
{
PolyPolygonBezierCoords aMarker;
OUString aMarkerName;
@@ -310,14 +389,17 @@ void LineProperties::assignUsed( const LineProperties& rSourceProps )
maStartArrow.assignUsed( rSourceProps.maStartArrow );
maEndArrow.assignUsed( rSourceProps.maEndArrow );
maLineFill.assignUsed( rSourceProps.maLineFill );
+ if( !rSourceProps.maCustomDash.empty() )
+ maCustomDash = rSourceProps.maCustomDash;
moLineWidth.assignIfUsed( rSourceProps.moLineWidth );
moPresetDash.assignIfUsed( rSourceProps.moPresetDash );
+ moLineCompound.assignIfUsed( rSourceProps.moLineCompound );
moLineCap.assignIfUsed( rSourceProps.moLineCap );
moLineJoint.assignIfUsed( rSourceProps.moLineJoint );
}
-void LineProperties::pushToPropMap( PropertyMap& rPropMap, const LinePropertyIds& rPropIds,
- const XmlFilterBase& rFilter, ModelObjectHelper& rModelObjHelper, sal_Int32 nPhClr ) const
+void LineProperties::pushToPropMap( PropertyMap& rPropMap, const FilterBase& rFilter,
+ ModelObjectHelper& rModelObjHelper, const LinePropertyIds& rPropIds, sal_Int32 nPhClr ) const
{
// line fill type must exist, otherwise ignore other properties
if( maLineFill.moFillType.has() )
@@ -326,51 +408,22 @@ void LineProperties::pushToPropMap( PropertyMap& rPropMap, const LinePropertyIds
LineStyle eLineStyle = (maLineFill.moFillType.get() == XML_noFill) ? LineStyle_NONE : LineStyle_SOLID;
// create line dash from preset dash token (not for invisible line)
- if( (eLineStyle != LineStyle_NONE) && moPresetDash.differsFrom( XML_solid ) )
+ if( (eLineStyle != LineStyle_NONE) && (moPresetDash.differsFrom( XML_solid ) || (!moPresetDash && !maCustomDash.empty())) )
{
LineDash aLineDash;
-
- sal_Int32 nLineWidth = GetCoordinate( moLineWidth.get( 103500 ) );
aLineDash.Style = lclGetDashStyle( moLineCap.get( XML_rnd ) );
- aLineDash.Dots = 1;
- aLineDash.DotLen = nLineWidth;
- aLineDash.Dashes = 0;
- aLineDash.DashLen = 8 * nLineWidth;
- aLineDash.Distance = 3 * nLineWidth;
- switch( moPresetDash.get() )
- {
- default:
- case XML_dash:
- case XML_sysDash:
- aLineDash.DashLen = 4 * nLineWidth;
- // passthrough intended
- case XML_lgDash:
- aLineDash.Dots = 0;
- aLineDash.Dashes = 1;
- break;
-
- case XML_dashDot:
- case XML_sysDashDot:
- aLineDash.DashLen = 4 * nLineWidth;
- // passthrough intended
- case XML_lgDashDot:
- aLineDash.Dashes = 1;
- break;
-
- case XML_sysDashDotDot:
- aLineDash.DashLen = 4 * nLineWidth;
- // passthrough intended
- case XML_lgDashDotDot:
- aLineDash.Dots = 2;
- aLineDash.Dashes = 1;
- break;
+ // convert preset dash or custom dash
+ if( moPresetDash.has() )
+ lclConvertPresetDash( aLineDash, moPresetDash.get() );
+ else
+ lclConvertCustomDash( aLineDash, maCustomDash );
- case XML_dot:
- case XML_sysDot:
- aLineDash.Distance = aLineDash.DotLen;
- break;
- }
+ // convert relative dash/dot length to absolute length
+ sal_Int32 nLineWidth = GetCoordinate( moLineWidth.get( 103500 ) );
+ aLineDash.DotLen *= nLineWidth;
+ aLineDash.DashLen *= nLineWidth;
+ aLineDash.Distance *= nLineWidth;
if( rPropIds.mbNamedLineDash )
{
@@ -409,16 +462,16 @@ void LineProperties::pushToPropMap( PropertyMap& rPropMap, const LinePropertyIds
}
// line markers
- lclPushMarkerProperties( rPropMap, maStartArrow, rPropIds, rModelObjHelper, moLineWidth.get( 0 ), false );
- lclPushMarkerProperties( rPropMap, maEndArrow, rPropIds, rModelObjHelper, moLineWidth.get( 0 ), true );
+ lclPushMarkerProperties( rPropMap, maStartArrow, rModelObjHelper, rPropIds, moLineWidth.get( 0 ), false );
+ lclPushMarkerProperties( rPropMap, maEndArrow, rModelObjHelper, rPropIds, moLineWidth.get( 0 ), true );
}
}
-void LineProperties::pushToPropSet( PropertySet& rPropSet, const LinePropertyIds& rPropIds,
- const XmlFilterBase& rFilter, ModelObjectHelper& rModelObjHelper, sal_Int32 nPhClr ) const
+void LineProperties::pushToPropSet( PropertySet& rPropSet, const FilterBase& rFilter,
+ ModelObjectHelper& rModelObjHelper, const LinePropertyIds& rPropIds, sal_Int32 nPhClr ) const
{
PropertyMap aPropMap;
- pushToPropMap( aPropMap, rPropIds, rFilter, rModelObjHelper, nPhClr );
+ pushToPropMap( aPropMap, rFilter, rModelObjHelper, rPropIds, nPhClr );
rPropSet.setProperties( aPropMap );
}
diff --git a/oox/source/drawingml/linepropertiescontext.cxx b/oox/source/drawingml/linepropertiescontext.cxx
index b98f30738ec0..e6c6f76d5585 100644
--- a/oox/source/drawingml/linepropertiescontext.cxx
+++ b/oox/source/drawingml/linepropertiescontext.cxx
@@ -53,6 +53,7 @@ LinePropertiesContext::LinePropertiesContext( ContextHandler& rParent, const Ref
{
AttributeList aAttribs( xAttribs );
mrLineProperties.moLineWidth = aAttribs.getInteger( XML_w );
+ mrLineProperties.moLineCompound = aAttribs.getToken( XML_cmpd );
mrLineProperties.moLineCap = aAttribs.getToken( XML_cap );
}
@@ -79,6 +80,11 @@ Reference< XFastContextHandler > LinePropertiesContext::createFastChildContext(
mrLineProperties.moPresetDash = aAttribs.getToken( XML_val );
break;
case A_TOKEN( custDash ): // CT_DashStopList
+ xRet = this;
+ break;
+ case A_TOKEN( ds ):
+ mrLineProperties.maCustomDash.push_back( LineProperties::DashStop(
+ aAttribs.getInteger( XML_d, 0 ), aAttribs.getInteger( XML_sp, 0 ) ) );
break;
// LineJoinPropertiesGroup
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index f7cfed3270eb..ae9faaa9c4d6 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -423,11 +423,11 @@ Reference< XShape > Shape::createAndInsert(
// applying properties
PropertySet aPropSet( xSet );
if ( aServiceName == OUString::createFromAscii( "com.sun.star.drawing.GraphicObjectShape" ) )
- mpGraphicPropertiesPtr->pushToPropSet( aPropSet, rFilterBase, -1 );
+ mpGraphicPropertiesPtr->pushToPropSet( aPropSet, rFilterBase );
if ( mpTablePropertiesPtr.get() && ( aServiceName == OUString::createFromAscii( "com.sun.star.drawing.TableShape" ) ) )
mpTablePropertiesPtr->pushToPropSet( rFilterBase, xSet, mpMasterTextListStyle );
- aFillProperties.pushToPropSet( aPropSet, FillProperties::DEFAULT_IDS, rFilterBase, rFilterBase.getModelObjectHelper(), mnRotation, nFillPhClr );
- aLineProperties.pushToPropSet( aPropSet, LineProperties::DEFAULT_IDS, rFilterBase, rFilterBase.getModelObjectHelper(), nLinePhClr );
+ aFillProperties.pushToPropSet( aPropSet, rFilterBase, rFilterBase.getModelObjectHelper(), FillProperties::DEFAULT_IDS, mnRotation, nFillPhClr );
+ aLineProperties.pushToPropSet( aPropSet, rFilterBase, rFilterBase.getModelObjectHelper(), LineProperties::DEFAULT_IDS, nLinePhClr );
// applying autogrowheight property before setting shape size, because
// the shape size might be changed if currently autogrowheight is true
diff --git a/oox/source/drawingml/table/tablecell.cxx b/oox/source/drawingml/table/tablecell.cxx
index 58aaf9081385..1f0bdad34100 100644
--- a/oox/source/drawingml/table/tablecell.cxx
+++ b/oox/source/drawingml/table/tablecell.cxx
@@ -84,8 +84,8 @@ void applyLineAttributes( const ::oox::core::XmlFilterBase& rFilterBase,
{
Color aColor = rLineProperties.maLineFill.getBestSolidColor();
aBorderLine.Color = aColor.getColor( rFilterBase );
- aBorderLine.OuterLineWidth = static_cast< sal_Int16 >( GetCoordinate( rLineProperties.moLineWidth.get( 0 ) ) );
- aBorderLine.InnerLineWidth = 0;
+ aBorderLine.OuterLineWidth = static_cast< sal_Int16 >( GetCoordinate( rLineProperties.moLineWidth.get( 0 ) ) / 4 );
+ aBorderLine.InnerLineWidth = static_cast< sal_Int16 >( GetCoordinate( rLineProperties.moLineWidth.get( 0 ) ) / 4 );
aBorderLine.LineDistance = 0;
}
@@ -363,8 +363,7 @@ void TableCell::pushToXCell( const ::oox::core::XmlFilterBase& rFilterBase, ::oo
aFillProperties.assignUsed( maFillProperties );
PropertySet aPropSet( xPropSet );
// TODO: phClr?
- aFillProperties.pushToPropSet( aPropSet, FillProperties::DEFAULT_IDS,
- rFilterBase, rFilterBase.getModelObjectHelper(), 0, -1 );
+ aFillProperties.pushToPropSet( aPropSet, rFilterBase, rFilterBase.getModelObjectHelper() );
}
} } }
diff --git a/oox/source/drawingml/textcharacterproperties.cxx b/oox/source/drawingml/textcharacterproperties.cxx
index a5ef7558701f..41855170d26b 100644
--- a/oox/source/drawingml/textcharacterproperties.cxx
+++ b/oox/source/drawingml/textcharacterproperties.cxx
@@ -34,6 +34,7 @@
#include <com/sun/star/awt/FontWeight.hpp>
#include "oox/helper/helper.hxx"
#include "oox/helper/propertyset.hxx"
+#include "oox/core/xmlfilterbase.hxx"
#include "oox/drawingml/drawingmltypes.hxx"
#include "properties.hxx"
#include "tokens.hxx"
diff --git a/oox/source/drawingml/textparagraphproperties.cxx b/oox/source/drawingml/textparagraphproperties.cxx
index c8197e3d78a3..35fe17716250 100644
--- a/oox/source/drawingml/textparagraphproperties.cxx
+++ b/oox/source/drawingml/textparagraphproperties.cxx
@@ -41,6 +41,7 @@
#include "oox/helper/helper.hxx"
#include "oox/helper/propertyset.hxx"
#include "oox/core/namespaces.hxx"
+#include "oox/core/xmlfilterbase.hxx"
#include "oox/drawingml/drawingmltypes.hxx"
#include "properties.hxx"
#include "tokens.hxx"
diff --git a/oox/source/dump/biffdumper.cxx b/oox/source/dump/biffdumper.cxx
index 95b7da811a74..2e42d2dc8ca8 100644
--- a/oox/source/dump/biffdumper.cxx
+++ b/oox/source/dump/biffdumper.cxx
@@ -50,6 +50,7 @@ using ::com::sun::star::uno::Reference;
using ::com::sun::star::util::DateTime;
using ::com::sun::star::lang::XMultiServiceFactory;
using ::com::sun::star::io::XInputStream;
+using ::comphelper::MediaDescriptor;
using ::oox::core::FilterBase;
using namespace ::oox::xls;
@@ -326,14 +327,6 @@ bool BiffObjectBase::implStartRecord( BinaryInputStream&, sal_Int64& ornRecPos,
ornRecPos = mxBiffStrm->tellBase() - 4;
ornRecId = mxBiffStrm->getRecId();
- // record specific settings
- switch( mxBiffStrm->getRecId() )
- {
- case BIFF_ID_CHEND:
- out().decIndent();
- break;
- }
-
// special CONTINUE handling
mxBiffStrm->resetRecord( mbMergeContRec );
if( mbMergeContRec ) switch( mxBiffStrm->getRecId() )
@@ -350,6 +343,21 @@ bool BiffObjectBase::implStartRecord( BinaryInputStream&, sal_Int64& ornRecPos,
break;
}
+ // record specific settings
+ switch( mxBiffStrm->getRecId() )
+ {
+ case BIFF2_ID_BOF:
+ case BIFF3_ID_BOF:
+ case BIFF4_ID_BOF:
+ case BIFF5_ID_BOF:
+ case BIFF_ID_INTERFACEHDR:
+ mxBiffStrm->enableDecoder( false );
+ break;
+ case BIFF_ID_CHEND:
+ out().decIndent();
+ break;
+ }
+
ornRecSize = mxBiffStrm->getLength();
return bValid;
}
@@ -677,12 +685,12 @@ sal_uInt16 BiffObjectBase::dumpRepeatedRecId()
void BiffObjectBase::dumpFrHeader( bool bWithFlags, bool bWithRange )
{
- dumpHex< sal_uInt16 >( "rec-id", getRecNames() );
- sal_Int16 nFlags = bWithFlags ? dumpHex< sal_uInt16 >( "flags", "FR-FLAGS" ) : 0x0001;
+ dumpHex< sal_uInt16 >( "fr-rec-id", getRecNames() );
+ sal_Int16 nFlags = bWithFlags ? dumpHex< sal_uInt16 >( "fr-flags", "FR-FLAGS" ) : 0x0001;
if( bWithRange )
{
if( getFlag< sal_uInt16 >( nFlags, 0x0001 ) )
- dumpRange( "range" );
+ dumpRange( "fr-range" );
else
dumpUnused( 8 );
}
@@ -1329,6 +1337,7 @@ bool FormulaObject::dumpAttrToken()
dumpDec< sal_uInt16, sal_uInt8 >( !bBiff2, "skip-err" );
}
break;
+ case 0: // in array formulas and defined names, the skip-bit may be 0
case BIFF_TOK_ATTR_SKIP:
dumpDec< sal_uInt16, sal_uInt8 >( !bBiff2, "skip" );
break;
@@ -1855,6 +1864,18 @@ void WorkbookStreamObject::implDumpRecordBody()
if( eBiff >= BIFF8 ) dumpHex< sal_uInt16 >( "flags", "CHPIE-FLAGS" );
break;
+ case BIFF_ID_CHPIVOTFLAGS:
+ dumpRepeatedRecId();
+ dumpUnused( 2 );
+ dumpHex< sal_uInt16 >( "flags", "CHPIVOTFLAGS-FLAGS" );
+ break;
+
+ case BIFF8_ID_CHPIVOTREF:
+ dumpRepeatedRecId();
+ dumpUnused( 4 );
+ dumpUniString( "ref", BIFF_STR_8BITLENGTH );
+ break;
+
case BIFF_ID_CHPLOTGROWTH:
dumpFix< sal_Int32 >( "horizontal-growth" );
dumpFix< sal_Int32 >( "vertical-growth" );
@@ -2183,6 +2204,52 @@ void WorkbookStreamObject::implDumpRecordBody()
}
break;
+ case BIFF_ID_FILEPASS:
+ {
+ rStrm.enableDecoder( false );
+ if( eBiff == BIFF8 )
+ {
+ switch( dumpDec< sal_uInt16 >( "type", "FILEPASS-TYPE" ) )
+ {
+ case 0:
+ dumpHex< sal_uInt16 >( "key" );
+ dumpHex< sal_uInt16 >( "verifier" );
+ break;
+ case 1:
+ {
+ sal_uInt16 nMajor = dumpDec< sal_uInt16 >( "major-version", "FILEPASS-MAJOR" );
+ dumpDec< sal_uInt16 >( "minor-version" );
+ switch( nMajor )
+ {
+ case 1:
+ dumpArray( "salt", 16 );
+ dumpArray( "verifier", 16 );
+ dumpArray( "verifier-hash", 16 );
+ break;
+ }
+ }
+ break;
+ }
+ }
+ else
+ {
+ dumpHex< sal_uInt16 >( "key" );
+ dumpHex< sal_uInt16 >( "verifier" );
+ }
+ rStrm.seekToStart();
+ BiffDecoderRef xDecoder = BiffCodecHelper::implReadFilePass( rStrm, eBiff );
+ if( xDecoder.get() )
+ cfg().requestPassword( *xDecoder );
+ setBinaryOnlyMode( !xDecoder || !xDecoder->isValid() );
+ }
+ break;
+
+ case BIFF_ID_FILESHARING:
+ dumpBool< sal_uInt16 >( "recommend-read-only" );
+ dumpHex< sal_uInt16 >( "password-hash" );
+ dumpString( "password-creator", BIFF_STR_8BITLENGTH, BIFF_STR_SMARTFLAGS );
+ break;
+
case BIFF2_ID_FONT:
case BIFF3_ID_FONT:
dumpFontRec();
@@ -2602,9 +2669,14 @@ void WorkbookStreamObject::implDumpRecordBody()
break;
case BIFF_ID_SHEET:
- if( eBiff >= BIFF5 ) dumpHex< sal_uInt32 >( "sheet-stream-pos", "CONV-DEC" );
- if( eBiff >= BIFF5 ) dumpDec< sal_uInt8 >( "sheet-state", "SHEET-STATE" );
- if( eBiff >= BIFF5 ) dumpDec< sal_uInt8 >( "sheet-type", "SHEET-TYPE" );
+ if( eBiff >= BIFF5 )
+ {
+ rStrm.enableDecoder( false );
+ dumpHex< sal_uInt32 >( "sheet-stream-pos", "CONV-DEC" );
+ rStrm.enableDecoder( true );
+ dumpDec< sal_uInt8 >( "sheet-state", "SHEET-STATE" );
+ dumpDec< sal_uInt8 >( "sheet-type", "SHEET-TYPE" );
+ }
dumpString( "sheet-name", BIFF_STR_8BITLENGTH, BIFF_STR_8BITLENGTH );
break;
@@ -2638,14 +2710,23 @@ void WorkbookStreamObject::implDumpRecordBody()
sal_uInt16 nFlags = dumpHex< sal_uInt16 >( "flags", "STYLE-FLAGS" );
if( getFlag( nFlags, BIFF_STYLE_BUILTIN ) )
{
- dumpDec< sal_uInt8 >( "builtin-idx", "STYLE-BUILTIN" );
- dumpDec< sal_uInt8 >( "outline-level" );
+ dumpDec< sal_Int8 >( "builtin-idx", "STYLE-BUILTIN" );
+ dumpDec< sal_Int8 >( "outline-level" );
}
else
dumpString( "style-name", BIFF_STR_8BITLENGTH );
}
break;
+ case BIFF_ID_STYLEEXT:
+ dumpFrHeader( true, true );
+ dumpHex< sal_uInt8 >( "flags", "STYLEEXT-FLAGS" );
+ dumpDec< sal_uInt8 >( "category", "STYLEEXT-CATEGORY" );
+ dumpDec< sal_Int8 >( "builtin-idx", "STYLEEXT-BUILTIN" );
+ dumpDec< sal_Int8 >( "outline-level" );
+ dumpUnicodeArray( "style-name", rStrm.readuInt16() );
+ break;
+
case BIFF_ID_SXEXT:
if( eBiff == BIFF8 )
{
@@ -2717,6 +2798,10 @@ void WorkbookStreamObject::implDumpRecordBody()
dumpColorABGR( "grid-color" );
break;
+ case BIFF_ID_WRITEACCESS:
+ dumpString( "user-name", BIFF_STR_8BITLENGTH );
+ break;
+
case BIFF_ID_XCT:
dumpDec< sal_uInt16 >( "crn-count" );
if( eBiff == BIFF8 ) dumpDec< sal_Int16 >( "sheet-idx" );
@@ -2795,7 +2880,7 @@ OUString WorkbookStreamObject::dumpPivotString( const String& rName, sal_uInt16
if( nStrLen != BIFF_PT_NOSTRING )
{
aString = (getBiff() == BIFF8) ?
- getBiffStream().readUniString( nStrLen ) :
+ getBiffStream().readUniStringBody( nStrLen ) :
getBiffStream().readCharArrayUC( nStrLen, getBiffData().getTextEncoding() );
writeStringItem( rName, aString );
}
@@ -3682,7 +3767,8 @@ Dumper::Dumper( const Reference< XMultiServiceFactory >& rxFactory, const Refere
if( rxFactory.is() && rxInStrm.is() )
{
StorageRef xStrg( new OleStorage( rxFactory, rxInStrm, true ) );
- ConfigRef xCfg( new Config( DUMP_BIFF_CONFIG_ENVVAR, rxFactory, xStrg, rSysFileName ) );
+ MediaDescriptor aMediaDesc;
+ ConfigRef xCfg( new Config( DUMP_BIFF_CONFIG_ENVVAR, rxFactory, xStrg, rSysFileName, aMediaDesc ) );
DumperBase::construct( xCfg );
}
}
diff --git a/oox/source/dump/biffdumper.ini b/oox/source/dump/biffdumper.ini
index 510e950ff652..83dfd0d71b68 100644
--- a/oox/source/dump/biffdumper.ini
+++ b/oox/source/dump/biffdumper.ini
@@ -207,6 +207,7 @@ combilist=NLRADDFLAGS
end
flagslist=ATTRTYPES
+ 0x00=skip
0x01=volatile
0x02=if
0x04=choose
@@ -307,8 +308,8 @@ multilist=RECORD-NAMES-BIFF5
0x0098=,,,FILTERMODE,,AUTOFILTERINFO,AUTOFILTER,
0x00A8=,,,,,,SCENARIOS,SCENARIO
0x00B0=PTDEFINITION,PTFIELD,PTFITEM,,PTROWCOLFIELDS,PTROWCOLITEMS,PTPAGEFIELDS,
- 0x00B8=DOCROUTE,RECIPNAME,,,SHAREDFMLA,MULTRK,MULTBLANK,
- 0x00C0=,MMS,ADDMENU,DELMENU,,PTDATAFIELD,PCDEFINITION,PCDFIELD
+ 0x00B8=DOCROUTE,RECIPNAME,,,SHAREDFMLA,MULTRK,MULTBLANK,TOOLBARHDR
+ 0x00C0=TOOLBAREND,MMS,ADDMENU,DELMENU,,PTDATAFIELD,PCDEFINITION,PCDFIELD
0x00C8=PCITEM_INDEXLIST,PCITEM_DOUBLE,PCITEM_BOOL,PCITEM_ERROR,PCITEM_INTEGER,PCITEM_STRING,PCITEM_DATE,PCITEM_MISSING
0x00D0=SXTBL,SXTBRGITEM,SXTBPG,OBPROJ,,PIVOTCACHE,RSTRING,DBCELL
0x00D8=PCDFRANGEPR,PCDFDISCRETEPR,BOOKBOOL,REVERT,SXEXT|PARAMQRY,SCENPROTECT,OLESIZE,UDDESC
@@ -341,11 +342,13 @@ multilist=RECORD-NAMES-BIFF8
0x01A8=,USERBVIEW,USERSVIEWBEGIN,USERSVIEWEND,,QSI,EXTERNALBOOK,PROT4REV
0x01B0=CFHEADER,CFRULE,DATAVALIDATIONS,,,DCONBINAME,TXO,REFRESHALL
0x01B8=HYPERLINK,NLRDELNAME,CODENAME,PCDFSQLTYPE,PROT4REVPASS,,DATAVALIDATION,
+ 0x01C0=XL9FILE,,,,,,,
0x0800=SCREENTIP,,,WEBQRYSETTINGS,WEBQRYTABLES,,,
0x0850=CHFRINFO,CHFRWRAPPER,CHFRBLOCKBEGIN,CHFRBLOCKEND,,,,CHFRUNITPROPS
- 0x0858=CHPIVOTREF,,,,,,,
+ 0x0858=CHPIVOTREF,CHPIVOTFLAGS,,,,,,
0x0860=,,SHEETLAYOUT,,,,,SHEETPROTECTION
0x0868=,,,CHFRLABELPROPS,,,,
+ 0x0890=,,STYLEEXT,,,,,
# chart records
0x1058=,,,,,,,CH3DDATAFORMAT
0x1060=CHFONTBASE,CHPIEEXT,CHLABELRANGE2,CHDATATABLE,CHPLOTGROWTH,CHSERINDEX,CHESCHERFORMAT,CHPIEEXTSETT
@@ -815,6 +818,12 @@ flagslist=CHPIE-FLAGS
0x0002=connectors
end
+# CHPIVOTFLAGS ---------------------------------------------------------------
+
+flagslist=CHPIVOTFLAGS-FLAGS
+ 0x0001=hide-field-captions
+end
+
# CHRADAR, CHRADARAREA -------------------------------------------------------
flagslist=CHRADAR-FLAGS
@@ -1094,6 +1103,11 @@ constlist=EXTERNSHEET-IDX-BIFF8
-2=special
end
+# FILEPASS -------------------------------------------------------------------
+
+shortlist=FILEPASS-TYPE,0,xor,rc4
+shortlist=FILEPASS-MAJOR,1,rc4,crypto-api-2003,crypto-api-2007
+
# FONT -----------------------------------------------------------------------
flagslist=FONT-FLAGS
@@ -1649,7 +1663,26 @@ combilist=STYLE-FLAGS
0x8000=builtin
end
-shortlist=STYLE-BUILTIN,0,normal,rowlevel,collevel,comma,currency,percent,comma-0,currency-0,hyperlink,followed-hyperlink
+shortlist=STYLE-BUILTIN,-1,user-defined,normal,rowlevel,collevel,comma,currency,percent,comma-0,currency-0,hyperlink,followed-hyperlink
+
+# STYLEEXT -------------------------------------------------------------------
+
+flagslist=STYLEEXT-FLAGS
+ 0x01=builtin
+ 0x02=hidden
+ 0x04=custom
+end
+
+shortlist=STYLEEXT-CATEGORY,0,custom,good-bad-neutral,data-model,title-heading,themed,number-format
+
+multilist=STYLEEXT-BUILTIN
+ include=STYLE-BUILTIN
+ 10=note,warning-text,,,,title,heading-1,heading-2,heading-3,heading-4
+ 20=input,output,calculation,check-cell,linked-cell,total,good,bad,neutral,accent1
+ 30=20%-accent1,40%-accent1,60%-accent1,accent2,20%-accent2,40%-accent2,60%-accent2,accent3,20%-accent3,40%-accent3
+ 40=60%-accent3,accent4,20%-accent4,40%-accent4,60%-accent4,accent5,20%-accent5,40%-accent5,60%-accent5,accent6
+ 50=20%-accent6,40%-accent6,60%-accent6,explanatory-text
+end
# SXEXT ----------------------------------------------------------------------
diff --git a/oox/source/dump/dumperbase.cxx b/oox/source/dump/dumperbase.cxx
index fb9179d9fe54..8b8cd7e7392d 100644
--- a/oox/source/dump/dumperbase.cxx
+++ b/oox/source/dump/dumperbase.cxx
@@ -39,6 +39,7 @@
#include <com/sun/star/io/XTextOutputStream.hpp>
#include <rtl/math.hxx>
#include <osl/file.hxx>
+#include <comphelper/docpasswordhelper.hxx>
#include "oox/helper/binaryoutputstream.hxx"
#include "oox/core/filterbase.hxx"
#include "oox/xls/biffhelper.hxx"
@@ -51,8 +52,8 @@ using ::rtl::OStringToOUString;
using ::rtl::OUString;
using ::rtl::OUStringBuffer;
using ::rtl::OUStringToOString;
-using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::Exception;
+using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::UNO_QUERY_THROW;
using ::com::sun::star::util::DateTime;
using ::com::sun::star::lang::XMultiServiceFactory;
@@ -60,9 +61,10 @@ using ::com::sun::star::ucb::XSimpleFileAccess;
using ::com::sun::star::io::XActiveDataSink;
using ::com::sun::star::io::XActiveDataSource;
using ::com::sun::star::io::XInputStream;
-using ::com::sun::star::io::XTextInputStream;
using ::com::sun::star::io::XOutputStream;
+using ::com::sun::star::io::XTextInputStream;
using ::com::sun::star::io::XTextOutputStream;
+using ::comphelper::MediaDescriptor;
using ::oox::core::FilterBase;
namespace oox {
@@ -1528,11 +1530,14 @@ NameListRef NameListWrapper::getNameList( const Config& rCfg ) const
// ============================================================================
SharedConfigData::SharedConfigData( const OUString& rFileName,
- const Reference< XMultiServiceFactory >& rxFactory, const StorageRef& rxRootStrg, const OUString& rSysFileName ) :
+ const Reference< XMultiServiceFactory >& rxFactory, const StorageRef& rxRootStrg,
+ const OUString& rSysFileName, MediaDescriptor& rMediaDesc ) :
mxFactory( rxFactory ),
mxRootStrg( rxRootStrg ),
maSysFileName( rSysFileName ),
- mbLoaded( false )
+ mrMediaDesc( rMediaDesc ),
+ mbLoaded( false ),
+ mbPwCancelled( false )
{
OUString aFileUrl = InputOutputHelper::convertFileNameToUrl( rFileName );
if( aFileUrl.getLength() > 0 )
@@ -1578,6 +1583,20 @@ NameListRef SharedConfigData::getNameList( const OUString& rListName ) const
return xList;
}
+OUString SharedConfigData::requestPassword( ::comphelper::IDocPasswordVerifier& rVerifier )
+{
+ OUString aPassword;
+ if( !mbPwCancelled )
+ {
+ ::std::vector< OUString > aDefaultPasswords;
+ aDefaultPasswords.push_back( CREATE_OUSTRING( "VelvetSweatshop" ) );
+ aPassword = ::comphelper::DocPasswordHelper::requestAndVerifyDocPassword(
+ rVerifier, mrMediaDesc, ::comphelper::DocPasswordRequestType_MS, &aDefaultPasswords );
+ mbPwCancelled = aPassword.getLength() == 0;
+ }
+ return aPassword;
+}
+
bool SharedConfigData::implIsValid() const
{
return mbLoaded && mxFactory.is() && mxRootStrg.get() && (maSysFileName.getLength() > 0);
@@ -1677,9 +1696,9 @@ Config::Config( const sal_Char* pcEnvVar, const FilterBase& rFilter )
construct( pcEnvVar, rFilter );
}
-Config::Config( const sal_Char* pcEnvVar, const Reference< XMultiServiceFactory >& rxFactory, const StorageRef& rxRootStrg, const OUString& rSysFileName )
+Config::Config( const sal_Char* pcEnvVar, const Reference< XMultiServiceFactory >& rxFactory, const StorageRef& rxRootStrg, const OUString& rSysFileName, MediaDescriptor& rMediaDesc )
{
- construct( pcEnvVar, rxFactory, rxRootStrg, rSysFileName );
+ construct( pcEnvVar, rxFactory, rxRootStrg, rSysFileName, rMediaDesc );
}
Config::~Config()
@@ -1694,14 +1713,14 @@ void Config::construct( const Config& rParent )
void Config::construct( const sal_Char* pcEnvVar, const FilterBase& rFilter )
{
if( rFilter.getFileUrl().getLength() > 0 )
- construct( pcEnvVar, rFilter.getGlobalFactory(), rFilter.getStorage(), rFilter.getFileUrl() );
+ construct( pcEnvVar, rFilter.getGlobalFactory(), rFilter.getStorage(), rFilter.getFileUrl(), rFilter.getMediaDescriptor() );
}
-void Config::construct( const sal_Char* pcEnvVar, const Reference< XMultiServiceFactory >& rxFactory, const StorageRef& rxRootStrg, const OUString& rSysFileName )
+void Config::construct( const sal_Char* pcEnvVar, const Reference< XMultiServiceFactory >& rxFactory, const StorageRef& rxRootStrg, const OUString& rSysFileName, MediaDescriptor& rMediaDesc )
{
if( pcEnvVar && rxRootStrg.get() && (rSysFileName.getLength() > 0) )
if( const sal_Char* pcFileName = ::getenv( pcEnvVar ) )
- mxCfgData.reset( new SharedConfigData( OUString::createFromAscii( pcFileName ), rxFactory, rxRootStrg, rSysFileName ) );
+ mxCfgData.reset( new SharedConfigData( OUString::createFromAscii( pcFileName ), rxFactory, rxRootStrg, rSysFileName, rMediaDesc ) );
}
void Config::setStringOption( const String& rKey, const String& rData )
@@ -1746,6 +1765,16 @@ NameListRef Config::getNameList( const String& rListName ) const
return implGetNameList( rListName );
}
+OUString Config::requestPassword( ::comphelper::IDocPasswordVerifier& rVerifier )
+{
+ return mxCfgData->requestPassword( rVerifier );
+}
+
+bool Config::isPasswordCancelled() const
+{
+ return mxCfgData->isPasswordCancelled();
+}
+
bool Config::implIsValid() const
{
return isValid( mxCfgData );
@@ -3112,7 +3141,7 @@ void RecordObjectBase::implDump()
sal_Int64 nRecPos = in().tell();
// record body
- if( cfg().hasName( xRecNames, mnRecId ) )
+ if( !mbBinaryOnly && cfg().hasName( xRecNames, mnRecId ) )
{
ItemFormatMap::const_iterator aIt = aSimpleRecs.find( mnRecId );
if( aIt != aSimpleRecs.end() )
@@ -3143,6 +3172,7 @@ void RecordObjectBase::constructRecObjBase( const BinaryInputStreamRef& rxBaseSt
maRecNames = rRecNames;
maSimpleRecs = rSimpleRecs;
mnRecPos = mnRecId = mnRecSize = 0;
+ mbBinaryOnly = false;
if( InputObjectBase::implIsValid() )
mbShowRecPos = cfg().getBoolOption( "show-record-position", true );
}
@@ -3228,6 +3258,11 @@ bool DumperBase::isImportEnabled() const
return !isValid() || cfg().isImportEnabled();
}
+bool DumperBase::isImportCancelled() const
+{
+ return isValid() && cfg().isPasswordCancelled();
+}
+
void DumperBase::construct( const ConfigRef& rxConfig )
{
if( isValid( rxConfig ) && rxConfig->isDumperEnabled() )
diff --git a/oox/source/dump/pptxdumper.cxx b/oox/source/dump/pptxdumper.cxx
index d1694000f03b..0e04cb821d4a 100644
--- a/oox/source/dump/pptxdumper.cxx
+++ b/oox/source/dump/pptxdumper.cxx
@@ -41,6 +41,7 @@ using ::rtl::OUString;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::lang::XMultiServiceFactory;
using ::com::sun::star::io::XInputStream;
+using ::comphelper::MediaDescriptor;
using ::oox::core::FilterBase;
namespace oox {
@@ -127,7 +128,8 @@ Dumper::Dumper( const Reference< XMultiServiceFactory >& rxFactory, const Refere
if( rxFactory.is() && rxInStrm.is() )
{
StorageRef xStrg( new ZipStorage( rxFactory, rxInStrm ) );
- ConfigRef xCfg( new Config( DUMP_PPTX_CONFIG_ENVVAR, rxFactory, xStrg, rSysFileName ) );
+ MediaDescriptor aMediaDesc;
+ ConfigRef xCfg( new Config( DUMP_PPTX_CONFIG_ENVVAR, rxFactory, xStrg, rSysFileName, aMediaDesc ) );
DumperBase::construct( xCfg );
}
}
diff --git a/oox/source/dump/xlsbdumper.cxx b/oox/source/dump/xlsbdumper.cxx
index 819aff6bed92..3db91fd7383d 100644
--- a/oox/source/dump/xlsbdumper.cxx
+++ b/oox/source/dump/xlsbdumper.cxx
@@ -48,6 +48,7 @@ using ::com::sun::star::uno::Reference;
using ::com::sun::star::util::DateTime;
using ::com::sun::star::lang::XMultiServiceFactory;
using ::com::sun::star::io::XInputStream;
+using ::comphelper::MediaDescriptor;
using ::oox::core::FilterBase;
using namespace ::oox::xls;
@@ -1492,6 +1493,12 @@ void RecordStreamObject::implDumpRecordBody()
dumpString( "#sheet-name" );
break;
+ case OOBIN_ID_FILESHARING:
+ dumpBool< sal_uInt16 >( "recommend-read-only" );
+ dumpHex< sal_uInt16 >( "password-hash" );
+ dumpString( "password-creator" );
+ break;
+
case OOBIN_ID_FILL:
dumpDec< sal_Int32 >( "fill-pattern", "FILLPATTERNS" );
dumpColor( "fg-color" );
@@ -2267,7 +2274,8 @@ Dumper::Dumper( const Reference< XMultiServiceFactory >& rxFactory, const Refere
if( rxFactory.is() && rxInStrm.is() )
{
StorageRef xStrg( new ZipStorage( rxFactory, rxInStrm ) );
- ConfigRef xCfg( new Config( DUMP_XLSB_CONFIG_ENVVAR, rxFactory, xStrg, rSysFileName ) );
+ MediaDescriptor aMediaDesc;
+ ConfigRef xCfg( new Config( DUMP_XLSB_CONFIG_ENVVAR, rxFactory, xStrg, rSysFileName, aMediaDesc ) );
DumperBase::construct( xCfg );
}
}
diff --git a/oox/source/dump/xlsbdumper.ini b/oox/source/dump/xlsbdumper.ini
index be6efd2c6af3..34c464c69509 100644
--- a/oox/source/dump/xlsbdumper.ini
+++ b/oox/source/dump/xlsbdumper.ini
@@ -208,7 +208,7 @@ multilist=RECORD-NAMES
0x01C8=,,,AUTOSORTSCOPE,AUTOSORTSCOPE_END,CONDFORMATTING,CONDFORMATTING_END,CFRULE
0x01D0=CFRULE_END,ICONSET,ICONSET_END,DATABAR,DATABAR_END,COLORSCALE,COLORSCALE_END,CFVO
0x01D8=,COLORS,COLORS_END,RGBCOLOR,PAGEMARGINS,PRINTOPTIONS,PAGESETUP,HEADERFOOTER
- 0x01E0=HEADERFOOTER_END,,,,,SHEETFORMATPR,,
+ 0x01E0=HEADERFOOTER_END,PTCHARTFORMAT,PTCHARTFORMAT_END,PTCHARTFORMATS,PTCHARTFORMATS_END,SHEETFORMATPR,,
0x01E8=,,,,,,HYPERLINK,
0x01F0=,,,,SCENARIOS,SCENARIOS_END,SCENARIO,SCENARIO_END
0x01F8=INPUTCELLS,DXFS,DXFS_END,DXF,TABLESTYLES,TABLESTYLES_END,,
@@ -249,6 +249,7 @@ constlist=SIMPLE-RECORDS
0x0159=int32,dec,count
0x017E=int32,dec,item-index
0x01DD=uint16,hex,flags,PRINTOPTIONS-FLAGS
+ 0x01E3=int32,dec,count
0x01F9=int32,dec,count
0x0204=int32,dec,type,VOLTYPE-TYPE
0x020D=uint8,dec,error-code,ERRORCODES
diff --git a/oox/source/export/README b/oox/source/export/README
new file mode 100644
index 000000000000..56195b97706d
--- /dev/null
+++ b/oox/source/export/README
@@ -0,0 +1,2 @@
+presetTextWarpDefinitions.xml and presetShapeDefinitions.xml come from the
+OOXML documentation (TC45).
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
new file mode 100644
index 000000000000..f681477076bf
--- /dev/null
+++ b/oox/source/export/drawingml.cxx
@@ -0,0 +1,1404 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile$
+ * $Revision$
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "tokens.hxx"
+#include "oox/core/xmlfilterbase.hxx"
+#include "oox/export/drawingml.hxx"
+#include "oox/export/utils.hxx"
+
+#include <cstdio>
+#include <com/sun/star/awt/CharSet.hpp>
+#include <com/sun/star/awt/FontDescriptor.hpp>
+#include <com/sun/star/awt/FontSlant.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
+#include <com/sun/star/awt/FontUnderline.hpp>
+#include <com/sun/star/awt/Gradient.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/beans/XPropertyState.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/drawing/BitmapMode.hpp>
+#include <com/sun/star/drawing/EnhancedCustomShapeAdjustmentValue.hpp>
+#include <com/sun/star/drawing/LineDash.hpp>
+#include <com/sun/star/drawing/LineJoint.hpp>
+#include <com/sun/star/drawing/LineStyle.hpp>
+#include <com/sun/star/drawing/TextHorizontalAdjust.hpp>
+#include <com/sun/star/drawing/TextVerticalAdjust.hpp>
+#include <com/sun/star/i18n/ScriptType.hpp>
+#include <com/sun/star/io/XOutputStream.hpp>
+#include <com/sun/star/style/ParagraphAdjust.hpp>
+#include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/text/XTextContent.hpp>
+#include <com/sun/star/text/XTextField.hpp>
+#include <com/sun/star/text/XTextRange.hpp>
+#include <tools/stream.hxx>
+#include <tools/string.hxx>
+#include <vcl/cvtgrf.hxx>
+#include <vcl/fontcvt.hxx>
+#include <vcl/graph.hxx>
+#include <goodies/grfmgr.hxx>
+#include <rtl/strbuf.hxx>
+#include <sfx2/app.hxx>
+#include <svtools/languageoptions.hxx>
+#include <svx/escherex.hxx>
+#include <svx/svxenum.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::i18n;
+using ::com::sun::star::beans::PropertyState;
+using ::com::sun::star::beans::PropertyValue;
+using ::com::sun::star::beans::XPropertySet;
+using ::com::sun::star::beans::XPropertyState;
+using ::com::sun::star::container::XEnumeration;
+using ::com::sun::star::container::XEnumerationAccess;
+using ::com::sun::star::container::XIndexAccess;
+using ::com::sun::star::io::XOutputStream;
+using ::com::sun::star::text::XText;
+using ::com::sun::star::text::XTextContent;
+using ::com::sun::star::text::XTextField;
+using ::com::sun::star::text::XTextRange;
+using ::rtl::OString;
+using ::rtl::OStringBuffer;
+using ::rtl::OUString;
+using ::rtl::OUStringBuffer;
+using ::sax_fastparser::FSHelperPtr;
+
+DBG(extern void dump_pset(Reference< XPropertySet > rXPropSet));
+
+namespace oox {
+namespace drawingml {
+
+#define GETA(propName) \
+ GetProperty( rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( #propName ) ) )
+
+#define GETAD(propName) \
+ ( GetPropertyAndState( rXPropSet, rXPropState, String( RTL_CONSTASCII_USTRINGPARAM( #propName ) ), eState ) && eState == beans::PropertyState_DIRECT_VALUE )
+
+#define GET(variable, propName) \
+ if ( GETA(propName) ) \
+ mAny >>= variable;
+
+// not thread safe
+int DrawingML::mnImageCounter = 1;
+
+void DrawingML::ResetCounters()
+{
+ mnImageCounter = 1;
+}
+
+bool DrawingML::GetProperty( Reference< XPropertySet > rXPropSet, String aName )
+{
+ bool bRetValue = false;
+
+ try {
+ mAny = rXPropSet->getPropertyValue( aName );
+ if ( mAny.hasValue() )
+ bRetValue = true;
+ } catch( Exception& ) { /* printf ("exception when trying to get value of property: %s\n", ST(aName)); */ }
+
+ return bRetValue;
+}
+
+bool DrawingML::GetPropertyAndState( Reference< XPropertySet > rXPropSet, Reference< XPropertyState > rXPropState, String aName, PropertyState& eState )
+{
+ bool bRetValue = false;
+
+ try {
+ mAny = rXPropSet->getPropertyValue( aName );
+ if ( mAny.hasValue() ) {
+ bRetValue = true;
+ eState = rXPropState->getPropertyState( aName );
+ }
+ } catch( Exception& ) { /* printf ("exception when trying to get value of property: %s\n", ST(aName)); */ }
+
+ return bRetValue;
+}
+
+void DrawingML::WriteColor( sal_uInt32 nColor )
+{
+ OString sColor = OString::valueOf( ( sal_Int64 ) nColor, 16 );
+ if( sColor.getLength() < 6 ) {
+ OStringBuffer sBuf( "0" );
+ int remains = 5 - sColor.getLength();
+
+ while( remains > 0 ) {
+ sBuf.append( "0" );
+ remains--;
+ }
+
+ sBuf.append( sColor );
+
+ sColor = sBuf.getStr();
+ }
+ mpFS->singleElementNS( XML_a, XML_srgbClr, XML_val, sColor.getStr(), FSEND );
+}
+
+void DrawingML::WriteSolidFill( sal_uInt32 nColor )
+{
+ mpFS->startElementNS( XML_a, XML_solidFill, FSEND );
+ WriteColor( nColor );
+ mpFS->endElementNS( XML_a, XML_solidFill );
+}
+
+void DrawingML::WriteSolidFill( Reference< XPropertySet > rXPropSet )
+{
+ if ( GetProperty( rXPropSet, S( "FillColor" ) ) )
+ WriteSolidFill( *((sal_uInt32*) mAny.getValue()) & 0xffffff );
+}
+
+void DrawingML::WriteGradientStop( sal_uInt16 nStop, sal_uInt32 nColor )
+{
+ mpFS->startElementNS( XML_a, XML_gs,
+ XML_pos, I32S( nStop * 1000 ),
+ FSEND );
+ WriteColor( nColor );
+ mpFS->endElementNS( XML_a, XML_gs );
+}
+
+sal_uInt32 DrawingML::ColorWithIntensity( sal_uInt32 nColor, sal_uInt32 nIntensity )
+{
+ return ( ( ( nColor & 0xff ) * nIntensity ) / 100 )
+ | ( ( ( ( ( nColor & 0xff00 ) >> 8 ) * nIntensity ) / 100 ) << 8 )
+ | ( ( ( ( ( nColor & 0xff0000 ) >> 8 ) * nIntensity ) / 100 ) << 8 );
+}
+
+void DrawingML::WriteGradientFill( Reference< XPropertySet > rXPropSet )
+{
+ awt::Gradient aGradient;
+ if( GETA( FillGradient ) ) {
+ aGradient = *static_cast< const awt::Gradient* >( mAny.getValue() );
+
+ mpFS->startElementNS( XML_a, XML_gradFill, FSEND );
+
+ switch( aGradient.Style ) {
+ default:
+ case GradientStyle_LINEAR:
+ mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
+ WriteGradientStop( 0, ColorWithIntensity( aGradient.StartColor, aGradient.StartIntensity ) );
+ WriteGradientStop( 100, ColorWithIntensity( aGradient.EndColor, aGradient.EndIntensity ) );
+ mpFS->endElementNS( XML_a, XML_gsLst );
+ mpFS->singleElementNS( XML_a, XML_lin,
+ XML_ang, I32S( ( ( ( 3600 - aGradient.Angle + 900 ) * 6000 ) % 21600000 ) ),
+ FSEND );
+ break;
+
+ case GradientStyle_AXIAL:
+ mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
+ WriteGradientStop( 0, ColorWithIntensity( aGradient.EndColor, aGradient.EndIntensity ) );
+ WriteGradientStop( 50, ColorWithIntensity( aGradient.StartColor, aGradient.StartIntensity ) );
+ WriteGradientStop( 100, ColorWithIntensity( aGradient.EndColor, aGradient.EndIntensity ) );
+ mpFS->endElementNS( XML_a, XML_gsLst );
+ mpFS->singleElementNS( XML_a, XML_lin,
+ XML_ang, I32S( ( ( ( 3600 - aGradient.Angle + 900 ) * 6000 ) % 21600000 ) ),
+ FSEND );
+ break;
+
+ /* I don't see how to apply transformation to gradients, so
+ * elliptical will end as radial and square as
+ * rectangular. also position offsets are not applied */
+ case GradientStyle_RADIAL:
+ case GradientStyle_ELLIPTICAL:
+ case GradientStyle_RECT:
+ case GradientStyle_SQUARE:
+ mpFS->startElementNS( XML_a, XML_gsLst, FSEND );
+ WriteGradientStop( 0, ColorWithIntensity( aGradient.EndColor, aGradient.EndIntensity ) );
+ WriteGradientStop( 100, ColorWithIntensity( aGradient.StartColor, aGradient.StartIntensity ) );
+ mpFS->endElementNS( XML_a, XML_gsLst );
+ mpFS->singleElementNS( XML_a, XML_path,
+ XML_path, ( aGradient.Style == awt::GradientStyle_RADIAL || aGradient.Style == awt::GradientStyle_ELLIPTICAL ) ? "circle" : "rect",
+ FSEND );
+ break;
+ }
+
+ mpFS->endElementNS( XML_a, XML_gradFill );
+ }
+
+}
+
+void DrawingML::WriteLineArrow( Reference< XPropertySet > rXPropSet, sal_Bool bLineStart )
+{
+ ESCHER_LineEnd eLineEnd;
+ sal_Int32 nArrowLength;
+ sal_Int32 nArrowWidth;
+
+ if ( EscherPropertyContainer::GetLineArrow( bLineStart, rXPropSet, eLineEnd, nArrowLength, nArrowWidth ) ) {
+ const char* len;
+ const char* type;
+ const char* width;
+
+ switch( nArrowLength ) {
+ case ESCHER_LineShortArrow:
+ len = "sm";
+ break;
+ default:
+ case ESCHER_LineMediumLenArrow:
+ len = "med";
+ break;
+ case ESCHER_LineLongArrow:
+ len = "lg";
+ break;
+ }
+
+ switch( eLineEnd ) {
+ default:
+ case ESCHER_LineNoEnd:
+ type = "none";
+ break;
+ case ESCHER_LineArrowEnd:
+ type = "triangle";
+ break;
+ case ESCHER_LineArrowStealthEnd:
+ type = "stealth";
+ break;
+ case ESCHER_LineArrowDiamondEnd:
+ type = "diamond";
+ break;
+ case ESCHER_LineArrowOvalEnd:
+ type = "oval";
+ break;
+ case ESCHER_LineArrowOpenEnd:
+ type = "arrow";
+ break;
+ }
+
+ switch( nArrowWidth ) {
+ case ESCHER_LineNarrowArrow:
+ width = "sm";
+ break;
+ default:
+ case ESCHER_LineMediumWidthArrow:
+ width = "med";
+ break;
+ case ESCHER_LineWideArrow:
+ width = "lg";
+ break;
+ }
+
+ mpFS->singleElementNS( XML_a, bLineStart ? XML_headEnd : XML_tailEnd,
+ XML_len, len,
+ XML_type, type,
+ XML_w, width,
+ FSEND );
+ }
+}
+
+void DrawingML::WriteOutline( Reference< XPropertySet > rXPropSet )
+{
+ drawing::LineStyle aLineStyle( drawing::LineStyle_NONE );
+
+ GET( aLineStyle, LineStyle );
+
+ if( aLineStyle == drawing::LineStyle_NONE )
+ return;
+
+ sal_uInt32 nLineWidth = 0;
+ sal_uInt32 nColor = 0;
+ sal_Bool bColorSet = FALSE;
+ const char* cap = NULL;
+ drawing::LineDash aLineDash;
+ sal_Bool bDashSet = FALSE;
+
+ GET( nLineWidth, LineWidth );
+
+ switch( aLineStyle ) {
+ case drawing::LineStyle_DASH:
+ if( GETA( LineDash ) ) {
+ aLineDash = *(drawing::LineDash*) mAny.getValue();
+ bDashSet = TRUE;
+ if( aLineDash.Style == DashStyle_ROUND || aLineDash.Style == DashStyle_ROUNDRELATIVE )
+ cap = "rnd";
+
+ DBG(printf("dash dots: %d dashes: %d dotlen: %d dashlen: %d distance: %d\n",
+ int( aLineDash.Dots ), int( aLineDash.Dashes ), int( aLineDash.DotLen ), int( aLineDash.DashLen ), int( aLineDash.Distance )));
+ }
+ /* fallthru intended */
+ case drawing::LineStyle_SOLID:
+ default:
+ if ( GETA( LineColor ) ) {
+ nColor = *((sal_uInt32*) mAny.getValue()) & 0xffffff;
+ bColorSet = TRUE;
+ }
+ break;
+ }
+
+ mpFS->startElementNS( XML_a, XML_ln,
+ XML_cap, cap,
+ XML_w, nLineWidth > 1 ? I64S( MM100toEMU( nLineWidth ) ) : NULL,
+ FSEND );
+ if( bColorSet )
+ WriteSolidFill( nColor );
+
+ if( bDashSet ) {
+ mpFS->startElementNS( XML_a, XML_custDash, FSEND );
+ int i;
+ for( i = 0; i < aLineDash.Dots; i ++ )
+ mpFS->singleElementNS( XML_a, XML_ds,
+ XML_d, aLineDash.DotLen ? I64S( aLineDash.DotLen*1000 ) : "100000",
+ XML_sp, I64S( aLineDash.Distance*1000 ),
+ FSEND );
+ for( i = 0; i < aLineDash.Dashes; i ++ )
+ mpFS->singleElementNS( XML_a, XML_ds,
+ XML_d, aLineDash.DashLen ? I64S( aLineDash.DashLen*1000 ) : "100000",
+ XML_sp, I64S( aLineDash.Distance*1000 ),
+ FSEND );
+ mpFS->endElementNS( XML_a, XML_custDash );
+ }
+
+ if( nLineWidth > 1 && GETA( LineJoint ) ) {
+ LineJoint eLineJoint;
+
+ mAny >>= eLineJoint;
+ switch( eLineJoint ) {
+ case LineJoint_NONE:
+ case LineJoint_MIDDLE:
+ case LineJoint_BEVEL:
+ mpFS->singleElementNS( XML_a, XML_bevel, FSEND );
+ break;
+ default:
+ case LineJoint_MITER:
+ mpFS->singleElementNS( XML_a, XML_miter, FSEND );
+ break;
+ case LineJoint_ROUND:
+ mpFS->singleElementNS( XML_a, XML_round, FSEND );
+ break;
+ }
+ }
+
+ WriteLineArrow( rXPropSet, sal_True );
+ WriteLineArrow( rXPropSet, sal_False );
+
+ mpFS->endElementNS( XML_a, XML_ln );
+}
+
+OUString DrawingML::WriteImage( const OUString& rURL )
+{
+ ByteString aURLBS( UniString( rURL ), RTL_TEXTENCODING_UTF8 );
+
+ const char aURLBegin[] = "vnd.sun.star.GraphicObject:";
+ int index = aURLBS.Search( aURLBegin );
+
+ if ( index != STRING_NOTFOUND ) {
+ DBG(printf ("begin: %ld %s\n", long( sizeof( aURLBegin ) ), USS( rURL ) + sizeof( aURLBegin ) - 1 ));
+ aURLBS.Erase( 0, sizeof( aURLBegin ) - 1 );
+ Graphic aGraphic = GraphicObject( aURLBS ).GetTransformedGraphic ();
+
+ return WriteImage( aGraphic );
+ } else {
+ // add link to relations
+ }
+
+ return OUString();
+}
+
+OUString DrawingML::WriteImage( const Graphic& rGraphic )
+{
+ GfxLink aLink = rGraphic.GetLink ();
+ OUString sMediaType;
+ const char* sExtension = NULL;
+ OUString sRelId;
+
+ SvMemoryStream aStream;
+ const void* aData = aLink.GetData();
+ sal_Size nDataSize = aLink.GetDataSize();
+
+ switch ( aLink.GetType() ) {
+ case GFX_LINK_TYPE_NATIVE_GIF:
+ sMediaType = US( "image/gif" );
+ sExtension = ".gif";
+ break;
+ case GFX_LINK_TYPE_NATIVE_JPG:
+ sMediaType = US( "image/jpeg" );
+ sExtension = ".jpeg";
+ break;
+ case GFX_LINK_TYPE_NATIVE_PNG:
+ sMediaType = US( "image/png" );
+ sExtension = ".png";
+ break;
+ case GFX_LINK_TYPE_NATIVE_TIF:
+ sMediaType = US( "image/tiff" );
+ sExtension = ".tiff";
+ break;
+ case GFX_LINK_TYPE_NATIVE_WMF:
+ sMediaType = US( "image/x-wmf" );
+ sExtension = ".wmf";
+ break;
+ case GFX_LINK_TYPE_NATIVE_MET:
+ sMediaType = US( "image/x-met" );
+ sExtension = ".met";
+ break;
+ case GFX_LINK_TYPE_NATIVE_PCT:
+ sMediaType = US( "image/x-pict" );
+ sExtension = ".pct";
+ break;
+ default: {
+ GraphicType aType = rGraphic.GetType();
+ if ( aType == GRAPHIC_BITMAP ) {
+ GraphicConverter::Export( aStream, rGraphic, CVT_PNG );
+ sMediaType = US( "image/png" );
+ sExtension = ".png";
+ } else if ( aType == GRAPHIC_GDIMETAFILE ) {
+ GraphicConverter::Export( aStream, rGraphic, CVT_EMF );
+ sMediaType = US( "image/x-emf" );
+ sExtension = ".emf";
+ } else {
+ OSL_TRACE( "unhandled graphic type" );
+ break;
+ }
+
+ aData = aStream.GetData();
+ nDataSize = aStream.GetSize();
+ break;
+ }
+ }
+
+ const char *pComponent = NULL;
+ switch ( meDocumentType )
+ {
+ case DOCUMENT_DOCX: pComponent = "word"; break;
+ case DOCUMENT_PPTX: pComponent = "ppt"; break;
+ case DOCUMENT_XLSX: pComponent = "xl"; break;
+ }
+
+ Reference< XOutputStream > xOutStream = mpFB->openOutputStream( OUStringBuffer()
+ .appendAscii( pComponent )
+ .appendAscii( "/media/image" )
+ .append( (sal_Int32) mnImageCounter )
+ .appendAscii( sExtension )
+ .makeStringAndClear(),
+ sMediaType );
+ xOutStream->writeBytes( Sequence< sal_Int8 >( (const sal_Int8*) aData, nDataSize ) );
+ xOutStream->closeOutput();
+
+ const char *pImagePrefix = NULL;
+ switch ( meDocumentType )
+ {
+ case DOCUMENT_DOCX:
+ pImagePrefix = "media/image";
+ break;
+ case DOCUMENT_PPTX:
+ case DOCUMENT_XLSX:
+ pImagePrefix = "../media/image";
+ break;
+ }
+
+ sRelId = mpFB->addRelation( mpFS->getOutputStream(),
+ US( "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" ),
+ OUStringBuffer()
+ .appendAscii( pImagePrefix )
+ .append( (sal_Int32) mnImageCounter ++ )
+ .appendAscii( sExtension )
+ .makeStringAndClear() );
+
+ return sRelId;
+}
+
+OUString DrawingML::WriteBlip( OUString& rURL )
+{
+ OUString sRelId = WriteImage( rURL );
+
+ mpFS->singleElementNS( XML_a, XML_blip,
+ FSNS( XML_r, XML_embed), OUStringToOString( sRelId, RTL_TEXTENCODING_UTF8 ).getStr(),
+ FSEND );
+
+ return sRelId;
+}
+
+void DrawingML::WriteBlipMode( Reference< XPropertySet > rXPropSet )
+{
+ BitmapMode eBitmapMode( BitmapMode_NO_REPEAT );
+ if (GetProperty( rXPropSet, S( "FillBitmapMode" ) ) )
+ mAny >>= eBitmapMode;
+
+ DBG(printf("fill bitmap mode: %d\n", eBitmapMode));
+
+ switch (eBitmapMode) {
+ case BitmapMode_REPEAT:
+ mpFS->singleElementNS( XML_a, XML_tile, FSEND );
+ break;
+ default:
+ ;
+ }
+}
+
+void DrawingML::WriteBlipFill( Reference< XPropertySet > rXPropSet, String sURLPropName )
+{
+ WriteBlipFill( rXPropSet, sURLPropName, XML_a );
+}
+
+void DrawingML::WriteBlipFill( Reference< XPropertySet > rXPropSet, String sURLPropName, sal_Int32 nXmlNamespace )
+{
+ if ( GetProperty( rXPropSet, sURLPropName ) ) {
+ OUString aURL;
+ mAny >>= aURL;
+
+ DBG(printf ("URL: %s\n", OUStringToOString( aURL, RTL_TEXTENCODING_UTF8 ).getStr() ));
+
+ if( !aURL.getLength() )
+ return;
+
+ mpFS->startElementNS( nXmlNamespace , XML_blipFill, FSEND );
+
+ WriteBlip( aURL );
+
+ if( sURLPropName == S( "FillBitmapURL" ) )
+ WriteBlipMode( rXPropSet );
+ else if( GetProperty( rXPropSet, S( "FillBitmapStretch" ) ) ) {
+ bool bStretch = false;
+ mAny >>= bStretch;
+
+ if( bStretch )
+ WriteStretch();
+ }
+
+ mpFS->endElementNS( nXmlNamespace, XML_blipFill );
+ }
+}
+
+void DrawingML::WriteStretch()
+{
+ mpFS->startElementNS( XML_a, XML_stretch, FSEND );
+ mpFS->singleElementNS( XML_a, XML_fillRect, FSEND );
+ mpFS->endElementNS( XML_a, XML_stretch );
+}
+
+void DrawingML::WriteTransformation( const Rectangle& rRect,
+ sal_Bool bFlipH, sal_Bool bFlipV, sal_Int32 nRotation )
+{
+ mpFS->startElementNS( XML_a, XML_xfrm,
+ XML_flipH, bFlipH ? "1" : NULL,
+ XML_flipV, bFlipV ? "1" : NULL,
+ XML_rot, nRotation ? I32S( nRotation ) : NULL,
+ FSEND );
+
+ mpFS->singleElementNS( XML_a, XML_off, XML_x, IS( MM100toEMU( rRect.Left() ) ), XML_y, IS( MM100toEMU( rRect.Top() ) ), FSEND );
+ mpFS->singleElementNS( XML_a, XML_ext, XML_cx, IS( MM100toEMU( rRect.GetWidth() ) ), XML_cy, IS( MM100toEMU( rRect.GetHeight() ) ), FSEND );
+
+ mpFS->endElementNS( XML_a, XML_xfrm );
+}
+
+void DrawingML::WriteShapeTransformation( Reference< XShape > rXShape, sal_Bool bFlipH, sal_Bool bFlipV, sal_Int32 nRotation )
+{
+ DBG(printf( "write shape transformation\n" ));
+
+ awt::Point aPos = rXShape->getPosition();
+ awt::Size aSize = rXShape->getSize();
+
+ WriteTransformation( Rectangle( Point( aPos.X, aPos.Y ), Size( aSize.Width, aSize.Height ) ), bFlipH, bFlipV, nRotation );
+}
+
+void DrawingML::WriteRunProperties( Reference< XTextRange > rRun )
+{
+ Reference< XPropertySet > rXPropSet( rRun, UNO_QUERY );
+ Reference< XPropertyState > rXPropState( rRun, UNO_QUERY );
+ OUString usLanguage;
+ PropertyState eState;
+ sal_Int16 nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( Application::GetSettings().GetLanguage() );
+ sal_Bool bComplex = ( nScriptType == ScriptType::COMPLEX );
+ const char* bold = NULL;
+ const char* italic = NULL;
+ const char* underline = NULL;
+ sal_Int32 nSize = 1800;
+
+ if( GETAD( CharHeight ) )
+ nSize = (sal_Int32) (100*(*((float*) mAny.getValue())));
+
+ if ( ( bComplex && GETAD( CharWeightComplex ) ) || GETAD( CharWeight ) )
+ if ( *((float*) mAny.getValue()) >= awt::FontWeight::SEMIBOLD )
+ bold = "1";
+
+ if ( ( bComplex && GETAD( CharPostureComplex ) ) || GETAD( CharPosture ) )
+ switch ( *((awt::FontSlant*) mAny.getValue()) )
+ {
+ case awt::FontSlant_OBLIQUE :
+ case awt::FontSlant_ITALIC :
+ italic = "1";
+ break;
+ default:
+ break;
+ }
+
+ if ( GETAD( CharUnderline ) )
+ switch ( *((sal_Int16*) mAny.getValue()) )
+ {
+ case awt::FontUnderline::SINGLE :
+ underline = "sng";
+ break;
+ case awt::FontUnderline::DOUBLE :
+ underline = "dbl";
+ break;
+ case awt::FontUnderline::DOTTED :
+ underline = "dotted";
+ break;
+ case awt::FontUnderline::DASH :
+ underline = "dash";
+ break;
+ case awt::FontUnderline::LONGDASH :
+ underline = "dashLong";
+ break;
+ case awt::FontUnderline::DASHDOT :
+ underline = "dotDash";
+ break;
+ case awt::FontUnderline::DASHDOTDOT :
+ underline = "dotDotDash";
+ break;
+ case awt::FontUnderline::WAVE :
+ underline = "wavy";
+ break;
+ case awt::FontUnderline::DOUBLEWAVE :
+ underline = "wavyDbl";
+ break;
+ case awt::FontUnderline::BOLD :
+ underline = "heavy";
+ break;
+ case awt::FontUnderline::BOLDDOTTED :
+ underline = "dottedHeavy";
+ break;
+ case awt::FontUnderline::BOLDDASH :
+ underline = "dashHeavy";
+ break;
+ case awt::FontUnderline::BOLDLONGDASH :
+ underline = "dashLongHeavy";
+ break;
+ case awt::FontUnderline::BOLDDASHDOT :
+ underline = "dotDashHeavy";
+ break;
+ case awt::FontUnderline::BOLDDASHDOTDOT :
+ underline = "dotDotDashHeavy";
+ break;
+ case awt::FontUnderline::BOLDWAVE :
+ underline = "wavyHeavy";
+ break;
+ }
+
+ if( GETA( CharLocale ) ) {
+ com::sun::star::lang::Locale eLocale;
+ mAny >>= eLocale;
+
+ OUStringBuffer usLanguageBuffer = eLocale.Language;
+ if( eLocale.Country.getLength() ) {
+ usLanguageBuffer.appendAscii( "-" );
+ usLanguageBuffer.append( eLocale.Country );
+ }
+
+ if( usLanguageBuffer.getLength() )
+ usLanguage = usLanguageBuffer.makeStringAndClear();
+ }
+
+ mpFS->startElementNS( XML_a, XML_rPr,
+ XML_b, bold,
+ XML_i, italic,
+ XML_lang, usLanguage.getLength() ? USS( usLanguage ) : NULL,
+ XML_sz, nSize == 1800 ? NULL : IS( nSize ),
+ XML_u, underline,
+ FSEND );
+
+ // mso doesn't like text color to be placed after typeface
+ if( GETAD( CharColor ) ) {
+ sal_uInt32 color = *((sal_uInt32*) mAny.getValue());
+ DBG(printf("run color: %x auto: %x\n", static_cast<unsigned int>( color ), static_cast<unsigned int>( COL_AUTO )));
+
+ if( color == COL_AUTO ) { // nCharColor depends to the background color
+ sal_Bool bIsDark = sal_False;
+ GET( bIsDark, IsBackgroundDark );
+ color = bIsDark ? 0xffffff : 0x000000;
+ }
+ color &= 0xffffff;
+
+ // TODO: special handle embossed/engraved
+
+ WriteSolidFill( color );
+ }
+
+ if( GETAD( CharFontName ) ) {
+ const char* typeface = NULL;
+ const char* pitch = NULL;
+ const char* charset = NULL;
+ OUString usTypeface, usPitch, usCharset;
+
+ mAny >>= usTypeface;
+ String aSubstName( GetSubsFontName( usTypeface, SUBSFONT_ONLYONE | SUBSFONT_MS ) );
+ if( aSubstName.Len() )
+ typeface = ST( aSubstName );
+ else
+ typeface = USS( usTypeface );
+
+
+
+ mpFS->singleElementNS( XML_a, XML_latin,
+ XML_typeface, typeface,
+ XML_pitchFamily, pitch,
+ XML_charset, charset,
+ FSEND );
+ }
+
+ if( ( bComplex && GETAD( CharFontNameComplex ) ) || ( !bComplex && GETAD( CharFontNameAsian ) ) ) {
+ const char* typeface = NULL;
+ const char* pitch = NULL;
+ const char* charset = NULL;
+ OUString usTypeface, usPitch, usCharset;
+
+ mAny >>= usTypeface;
+ String aSubstName( GetSubsFontName( usTypeface, SUBSFONT_ONLYONE | SUBSFONT_MS ) );
+ if( aSubstName.Len() )
+ typeface = ST( aSubstName );
+ else
+ typeface = USS( usTypeface );
+
+ mpFS->singleElementNS( XML_a, bComplex ? XML_cs : XML_ea,
+ XML_typeface, typeface,
+ XML_pitchFamily, pitch,
+ XML_charset, charset,
+ FSEND );
+ }
+
+ mpFS->endElementNS( XML_a, XML_rPr );
+}
+
+const char* DrawingML::GetFieldType( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > rRun )
+{
+ const char* sType = NULL;
+ Reference< XPropertySet > rXPropSet( rRun, UNO_QUERY );
+ String aFieldType;
+
+ if( GETA( TextPortionType ) ) {
+ aFieldType = String( *(::rtl::OUString*)mAny.getValue() );
+ DBG(printf ("field type: %s\n", ST(aFieldType) ));
+ }
+
+ if( aFieldType == S( "TextField" ) ) {
+ Reference< XTextField > rXTextField;
+ GET( rXTextField, TextField );
+ if( rXTextField.is() ) {
+ rXPropSet.set( rXTextField, UNO_QUERY );
+ if( rXPropSet.is() ) {
+ String aFieldKind( rXTextField->getPresentation( TRUE ) );
+ DBG(printf ("field kind: %s\n", ST(aFieldKind) ));
+ if( aFieldKind == S( "Page" ) ) {
+ return "slidenum";
+ }
+ }
+ }
+ }
+
+ return sType;
+}
+
+void DrawingML::GetUUID( OStringBuffer& rBuffer )
+{
+ Sequence< sal_uInt8 > aSeq( 16 );
+ static char cDigits[17] = "0123456789ABCDEF";
+ rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
+ int i;
+
+ rBuffer.append( '{' );
+ for( i = 0; i < 4; i++ ) {
+ rBuffer.append( cDigits[ aSeq[i] >> 4 ] );
+ rBuffer.append( cDigits[ aSeq[i] && 0xf ] );
+ }
+ rBuffer.append( '-' );
+ for( ; i < 6; i++ ) {
+ rBuffer.append( cDigits[ aSeq[i] >> 4 ] );
+ rBuffer.append( cDigits[ aSeq[i] && 0xf ] );
+ }
+ rBuffer.append( '-' );
+ for( ; i < 8; i++ ) {
+ rBuffer.append( cDigits[ aSeq[i] >> 4 ] );
+ rBuffer.append( cDigits[ aSeq[i] && 0xf ] );
+ }
+ rBuffer.append( '-' );
+ for( ; i < 10; i++ ) {
+ rBuffer.append( cDigits[ aSeq[i] >> 4 ] );
+ rBuffer.append( cDigits[ aSeq[i] && 0xf ] );
+ }
+ rBuffer.append( '-' );
+ for( ; i < 16; i++ ) {
+ rBuffer.append( cDigits[ aSeq[i] >> 4 ] );
+ rBuffer.append( cDigits[ aSeq[i] && 0xf ] );
+ }
+ rBuffer.append( '}' );
+}
+
+void DrawingML::WriteRun( Reference< XTextRange > rRun )
+{
+ const char* sFieldType;
+ bool bIsField = false;
+ OUString sText = rRun->getString();
+
+ if( sText.getLength() < 1)
+ return;
+
+ if( ( sFieldType = GetFieldType( rRun ) ) ) {
+ OStringBuffer sUUID(39);
+
+ GetUUID( sUUID );
+ mpFS->startElementNS( XML_a, XML_fld,
+ XML_id, sUUID.getStr(),
+ XML_type, sFieldType,
+ FSEND );
+ bIsField = true;
+ } else
+ mpFS->startElementNS( XML_a, XML_r, FSEND );
+
+ WriteRunProperties( rRun );
+
+ mpFS->startElementNS( XML_a, XML_t, FSEND );
+ mpFS->writeEscaped( sText );
+ mpFS->endElementNS( XML_a, XML_t );
+
+ if( bIsField )
+ mpFS->endElementNS( XML_a, XML_fld );
+ else
+ mpFS->endElementNS( XML_a, XML_r );
+}
+
+#define AUTONUM(x) \
+ if( bPBoth ) \
+ pAutoNumType = #x "ParenBoth"; \
+ else if( bPBehind ) \
+ pAutoNumType = #x "ParenR"; \
+ else if( bSDot ) \
+ pAutoNumType = #x "Period";
+
+
+inline static const char* GetAutoNumType( sal_Int16 nNumberingType, bool bSDot, bool bPBehind, bool bPBoth )
+{
+ const char* pAutoNumType = NULL;
+
+ switch( (SvxExtNumType)nNumberingType )
+ {
+ case SVX_NUM_CHARS_UPPER_LETTER_N :
+ case SVX_NUM_CHARS_UPPER_LETTER :
+ AUTONUM( alphaUc );
+ break;
+ case SVX_NUM_CHARS_LOWER_LETTER_N :
+ case SVX_NUM_CHARS_LOWER_LETTER :
+ AUTONUM( alphaLc );
+ break;
+ case SVX_NUM_ROMAN_UPPER :
+ AUTONUM( romanUc );
+ break;
+ case SVX_NUM_ROMAN_LOWER :
+ AUTONUM( romanLc );
+ break;
+ case SVX_NUM_ARABIC :
+ AUTONUM( arabic )
+ else
+ pAutoNumType = "arabicPlain";
+ break;
+ default:
+ break;
+ }
+
+ return pAutoNumType;
+}
+
+void DrawingML::WriteParagraphNumbering( Reference< XPropertySet > rXPropSet, sal_Int16 nLevel )
+{
+ if( nLevel >= 0 && GETA( NumberingRules ) )
+ {
+ Reference< XIndexAccess > rXIndexAccess;
+
+ if ( ( mAny >>= rXIndexAccess ) && nLevel < rXIndexAccess->getCount() )
+ {
+ DBG(printf ("numbering rules\n"));
+
+ Sequence< PropertyValue > aPropertySequence;
+ rXIndexAccess->getByIndex( nLevel ) >>= aPropertySequence;
+
+
+ const PropertyValue* pPropValue = aPropertySequence.getArray();
+
+ sal_Int32 nPropertyCount = aPropertySequence.getLength();
+
+ if ( nPropertyCount ) {
+
+ sal_Int16 nNumberingType = -1;
+ bool bSDot = false;
+ bool bPBehind = false;
+ bool bPBoth = false;
+ sal_Unicode aBulletChar = 0x2022; // a bullet
+ awt::FontDescriptor aFontDesc;
+ bool bHasFontDesc = false;
+ OUString aGraphicURL;
+ sal_Int16 nBulletRelSize = 0;
+
+ for ( sal_Int32 i = 0; i < nPropertyCount; i++ ) {
+ const void* pValue = pPropValue[ i ].Value.getValue();
+ if ( pValue ) {
+ OUString aPropName( pPropValue[ i ].Name );
+ DBG(printf ("pro name: %s\n", OUStringToOString( aPropName, RTL_TEXTENCODING_UTF8 ).getStr()));
+ if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "NumberingType" ) ) )
+ nNumberingType = *( (sal_Int16*)pValue );
+ else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Prefix" ) ) ) {
+ if( *(OUString*)pValue == US( ")" ) )
+ bPBoth = true;
+ } else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Suffix" ) ) ) {
+ if( *(OUString*)pValue == US( "." ) )
+ bSDot = true;
+ else if( *(OUString*)pValue == US( ")" ) )
+ bPBehind = true;
+ } else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BulletChar" ) ) )
+ {
+ aBulletChar = String ( *( (String*)pValue ) ).GetChar( 0 );
+ //printf ("bullet char: %d\n", aBulletChar.getStr());
+ }
+ else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BulletFont" ) ) )
+ {
+ aFontDesc = *( (awt::FontDescriptor*)pValue );
+ bHasFontDesc = true;
+
+ // Our numbullet dialog has set the wrong textencoding for our "StarSymbol" font,
+ // instead of a Unicode encoding the encoding RTL_TEXTENCODING_SYMBOL was used.
+ // Because there might exist a lot of damaged documemts I added this two lines
+ // which fixes the bullet problem for the export.
+ if ( aFontDesc.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "StarSymbol" ) ) )
+ aFontDesc.CharSet = RTL_TEXTENCODING_MS_1252;
+
+ } else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BulletRelSize" ) ) ) {
+ nBulletRelSize = *( (sal_Int16*)pValue );
+ } else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "GraphicURL" ) ) ) {
+ aGraphicURL = ( *(OUString*)pValue );
+ DBG(printf ("graphic url: %s\n", OUStringToOString( aGraphicURL, RTL_TEXTENCODING_UTF8 ).getStr()));
+ } else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "GraphicSize" ) ) )
+ {
+ if ( pPropValue[ i ].Value.getValueType() == ::getCppuType( (awt::Size*)0) )
+ {
+ // don't cast awt::Size to Size as on 64-bits they are not the same.
+ ::com::sun::star::awt::Size aSize;
+ pPropValue[ i ].Value >>= aSize;
+ //aBuGraSize.nA = aSize.Width;
+ //aBuGraSize.nB = aSize.Height;
+ DBG(printf("graphic size: %dx%d\n", int( aSize.Width ), int( aSize.Height )));
+ }
+ }
+ }
+ }
+
+ const char* pAutoNumType = GetAutoNumType( nNumberingType, bSDot, bPBehind, bPBoth );
+
+ if( nLevel >= 0 ) {
+ if( aGraphicURL.getLength() > 0 ) {
+ OUString sRelId = WriteImage( aGraphicURL );
+
+ mpFS->startElementNS( XML_a, XML_buBlip, FSEND );
+ mpFS->singleElementNS( XML_a, XML_blip, FSNS( XML_r, XML_embed ), USS( sRelId ), FSEND );
+ mpFS->endElementNS( XML_a, XML_buBlip );
+ } else {
+ if( nBulletRelSize && nBulletRelSize != 100 )
+ mpFS->singleElementNS( XML_a, XML_buSzPct,
+ XML_val, IS( 1000*( (sal_Int32)nBulletRelSize ) ), FSEND );
+ if( bHasFontDesc )
+ mpFS->singleElementNS( XML_a, XML_buFont,
+ XML_typeface, OUStringToOString( aFontDesc.Name, RTL_TEXTENCODING_UTF8 ).getStr(),
+ XML_charset, (aFontDesc.CharSet == awt::CharSet::SYMBOL) ? "2" : NULL,
+ FSEND );
+
+ if( pAutoNumType )
+ mpFS->singleElementNS( XML_a, XML_buAutoNum, XML_type, pAutoNumType, FSEND );
+ else {
+ aBulletChar = SubstituteBullet( aBulletChar, aFontDesc );
+ mpFS->singleElementNS( XML_a, XML_buChar, XML_char, USS( OUString( aBulletChar ) ), FSEND );
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+const char* DrawingML::GetAlignment( sal_Int32 nAlignment )
+{
+ const char* sAlignment = NULL;
+
+ switch( nAlignment ) {
+ case style::ParagraphAdjust_CENTER:
+ sAlignment = "ctr";
+ break;
+ case style::ParagraphAdjust_RIGHT:
+ sAlignment = "r";
+ break;
+ case style::ParagraphAdjust_BLOCK:
+ sAlignment = "just";
+ break;
+ default:
+ ;
+ }
+
+ return sAlignment;
+}
+
+void DrawingML::WriteParagraphProperties( Reference< XTextContent > rParagraph )
+{
+ Reference< XPropertySet > rXPropSet( rParagraph, UNO_QUERY );
+ Reference< XPropertyState > rXPropState( rParagraph, UNO_QUERY );
+
+ if( !rXPropSet.is() || !rXPropState.is() )
+ return;
+
+ sal_Int16 nLevel = -1;
+ GET( nLevel, NumberingLevel );
+
+ sal_Int32 nLeftMargin = 0;
+ // fix coordinates
+ //GET( nLeftMargin, ParaLeftMargin );
+
+ sal_Int16 nAlignment( style::ParagraphAdjust_LEFT );
+ GET( nAlignment, ParaAdjust );
+
+ if( nLevel != -1
+ || nLeftMargin > 0
+ || nAlignment != style::ParagraphAdjust_LEFT ) {
+ mpFS->startElementNS( XML_a, XML_pPr,
+ XML_lvl, nLevel > 0 ? I32S( nLevel ) : NULL,
+ XML_marL, nLeftMargin > 0 ? IS( nLeftMargin ) : NULL,
+ XML_algn, GetAlignment( nAlignment ),
+ FSEND );
+
+ WriteParagraphNumbering( rXPropSet, nLevel );
+
+ mpFS->endElementNS( XML_a, XML_pPr );
+ }
+}
+
+void DrawingML::WriteParagraph( Reference< XTextContent > rParagraph )
+{
+ Reference< XEnumerationAccess > access( rParagraph, UNO_QUERY );
+ if( !access.is() )
+ return;
+
+ Reference< XEnumeration > enumeration( access->createEnumeration() );
+ if( !enumeration.is() )
+ return;
+
+ mpFS->startElementNS( XML_a, XML_p, FSEND );
+
+ sal_Bool bPropertiesWritten = FALSE;
+ while( enumeration->hasMoreElements() ) {
+ Reference< XTextRange > run;
+ Any any ( enumeration->nextElement() );
+
+ if (any >>= run) {
+ if( !bPropertiesWritten && run->getString().getLength() ) {
+ WriteParagraphProperties( rParagraph );
+ bPropertiesWritten = TRUE;
+ }
+ WriteRun( run );
+ }
+ }
+ mpFS->singleElementNS( XML_a, XML_endParaRPr, FSEND );
+
+ mpFS->endElementNS( XML_a, XML_p );
+}
+
+void DrawingML::WriteText( Reference< XShape > rXShape )
+{
+ Reference< XText > xXText( rXShape, UNO_QUERY );
+ Reference< XPropertySet > rXPropSet( rXShape, UNO_QUERY );
+
+ if( !xXText.is() )
+ return;
+
+#define DEFLRINS 254
+#define DEFTBINS 127
+ sal_Int32 nLeft, nRight, nTop, nBottom;
+ nLeft = nRight = DEFLRINS;
+ nTop = nBottom = DEFTBINS;
+
+ // top inset looks a bit different compared to ppt export
+ // check if something related doesn't work as expected
+ GET( nLeft, TextLeftDistance );
+ GET( nRight, TextRightDistance );
+ GET( nTop, TextUpperDistance );
+ GET( nBottom, TextLowerDistance );
+
+ TextVerticalAdjust eVerticalAlignment( TextVerticalAdjust_TOP );
+ const char* sVerticalAlignment = NULL;
+ GET( eVerticalAlignment, TextVerticalAdjust );
+ switch( eVerticalAlignment ) {
+ case TextVerticalAdjust_BOTTOM:
+ sVerticalAlignment = "b";
+ break;
+ case TextVerticalAdjust_CENTER:
+ sVerticalAlignment = "ctr";
+ break;
+ case TextVerticalAdjust_TOP:
+ default:
+ ;
+ }
+
+ TextHorizontalAdjust eHorizontalAlignment( TextHorizontalAdjust_CENTER );
+ bool bHorizontalCenter = false;
+ GET( eHorizontalAlignment, TextHorizontalAdjust );
+ if( eHorizontalAlignment == TextHorizontalAdjust_CENTER )
+ bHorizontalCenter = true;
+
+ sal_Bool bHasWrap = FALSE;
+ sal_Bool bWrap = FALSE;
+ if( GETA( TextWordWrap ) ) {
+ mAny >>= bWrap;
+ bHasWrap = TRUE;
+ //DBG(printf("wrap: %d\n", bWrap));
+ }
+
+ mpFS->singleElementNS( XML_a, XML_bodyPr,
+ XML_wrap, bHasWrap && !bWrap ? "none" : NULL,
+ XML_lIns, (nLeft != DEFLRINS) ? IS( MM100toEMU( nLeft ) ) : NULL,
+ XML_rIns, (nRight != DEFLRINS) ? IS( MM100toEMU( nRight ) ) : NULL,
+ XML_tIns, (nTop != DEFTBINS) ? IS( MM100toEMU( nTop ) ) : NULL,
+ XML_bIns, (nBottom != DEFTBINS) ? IS( MM100toEMU( nBottom ) ) : NULL,
+ XML_anchor, sVerticalAlignment,
+ XML_anchorCtr, bHorizontalCenter ? "1" : NULL,
+ FSEND );
+
+ Reference< XEnumerationAccess > access( xXText, UNO_QUERY );
+ if( !access.is() )
+ return;
+
+ Reference< XEnumeration > enumeration( access->createEnumeration() );
+ if( !enumeration.is() )
+ return;
+
+ while( enumeration->hasMoreElements() ) {
+ Reference< XTextContent > paragraph;
+ Any any ( enumeration->nextElement() );
+
+ if( any >>= paragraph)
+ WriteParagraph( paragraph );
+ }
+
+}
+
+void DrawingML::WritePresetShape( const char* pShape )
+{
+ mpFS->startElementNS( XML_a, XML_prstGeom,
+ XML_prst, pShape,
+ FSEND );
+ mpFS->singleElementNS( XML_a, XML_avLst, FSEND );
+ mpFS->endElementNS( XML_a, XML_prstGeom );
+}
+
+void DrawingML::WritePresetShape( const char* pShape, MSO_SPT eShapeType, sal_Bool bPredefinedHandlesUsed, sal_Int32 nAdjustmentsWhichNeedsToBeConverted, const PropertyValue& rProp )
+{
+ mpFS->startElementNS( XML_a, XML_prstGeom,
+ XML_prst, pShape,
+ FSEND );
+ mpFS->startElementNS( XML_a, XML_avLst, FSEND );
+
+ Sequence< drawing::EnhancedCustomShapeAdjustmentValue > aAdjustmentSeq;
+ if ( rProp.Value >>= aAdjustmentSeq ) {
+ DBG(printf("adj seq len: %d\n", int( aAdjustmentSeq.getLength() )));
+ if ( bPredefinedHandlesUsed )
+ EscherPropertyContainer::LookForPolarHandles( eShapeType, nAdjustmentsWhichNeedsToBeConverted );
+
+ sal_Int32 nValue, nLength = aAdjustmentSeq.getLength();
+ for( sal_Int32 i=0; i < nLength; i++ )
+ if( EscherPropertyContainer::GetAdjustmentValue( aAdjustmentSeq[ i ], i, nAdjustmentsWhichNeedsToBeConverted, nValue ) )
+ mpFS->singleElementNS( XML_a, XML_gd,
+ XML_name, nLength > 1 ? ( OString( "adj" ) + OString::valueOf( i + 1 ) ).getStr() : "adj",
+ XML_fmla, (OString("val ") + OString::valueOf( nValue )).getStr(),
+ FSEND );
+ }
+
+ mpFS->endElementNS( XML_a, XML_avLst );
+ mpFS->endElementNS( XML_a, XML_prstGeom );
+}
+
+void DrawingML::WritePolyPolygon( const PolyPolygon& rPolyPolygon )
+{
+ if( rPolyPolygon.Count() < 1 )
+ return;
+
+ mpFS->startElementNS( XML_a, XML_custGeom, FSEND );
+ mpFS->singleElementNS( XML_a, XML_avLst, FSEND );
+ mpFS->singleElementNS( XML_a, XML_gdLst, FSEND );
+ mpFS->singleElementNS( XML_a, XML_ahLst, FSEND );
+ mpFS->singleElementNS( XML_a, XML_rect,
+ XML_l, "0",
+ XML_t, "0",
+ XML_r, "r",
+ XML_b, "b",
+ FSEND );
+
+ mpFS->startElementNS( XML_a, XML_pathLst, FSEND );
+
+ for( USHORT i = 0; i < rPolyPolygon.Count(); i ++ ) {
+
+ const Polygon& rPoly = rPolyPolygon[ i ];
+ Rectangle aRect( rPoly.GetBoundRect() );
+ sal_Bool bBezier = FALSE;
+
+ mpFS->startElementNS( XML_a, XML_path,
+ XML_w, I64S( aRect.GetWidth() ),
+ XML_h, I64S( aRect.GetHeight() ),
+ FSEND );
+
+ if( rPoly.GetSize() > 0 )
+ {
+ mpFS->startElementNS( XML_a, XML_moveTo, FSEND );
+
+ mpFS->singleElementNS( XML_a, XML_pt,
+ XML_x, I64S( rPoly[ 0 ].X() - aRect.Left() ),
+ XML_y, I64S( rPoly[ 0 ].Y() - aRect.Top() ),
+ FSEND );
+
+ mpFS->endElementNS( XML_a, XML_moveTo );
+ }
+
+ for( USHORT j = 1; j < rPoly.GetSize(); j ++ )
+ {
+ enum PolyFlags flags = rPoly.GetFlags(j);
+ if( flags == POLY_CONTROL && !bBezier )
+ {
+ mpFS->startElementNS( XML_a, XML_cubicBezTo, FSEND );
+ bBezier = TRUE;
+ }
+ else if( flags == POLY_NORMAL && !bBezier )
+ mpFS->startElementNS( XML_a, XML_lnTo, FSEND );
+
+ mpFS->singleElementNS( XML_a, XML_pt,
+ XML_x, I64S( rPoly[j].X() - aRect.Left() ),
+ XML_y, I64S( rPoly[j].Y() - aRect.Top() ),
+ FSEND );
+
+ if( ( flags == POLY_NORMAL || flags == POLY_SYMMTR ) && bBezier )
+ {
+ mpFS->endElementNS( XML_a, XML_cubicBezTo );
+ bBezier = FALSE;
+ }
+ else if( flags == POLY_NORMAL && !bBezier )
+ mpFS->endElementNS( XML_a, XML_lnTo );
+ else if( bBezier && ( j % 3 ) == 0 )
+ {
+ // //a:cubicBezTo can only contain 3 //a:pt elements, so we
+ // need to break things up...
+ mpFS->endElementNS( XML_a, XML_cubicBezTo );
+ mpFS->startElementNS( XML_a, XML_cubicBezTo, FSEND );
+ }
+// switch( rPoly.GetFlags(j) ) {
+// case POLY_NORMAL:
+// DBG(printf("normal\n"));
+// break;
+// case POLY_SMOOTH:
+// DBG(printf("smooth\n"));
+// break;
+// case POLY_CONTROL:
+// DBG(printf("control\n"));
+// break;
+// case POLY_SYMMTR:
+// DBG(printf("symmtr\n"));
+// break;
+// }
+// DBG(printf("point %ld %ld\n", rPoly[j].X() - aRect.Left(), rPoly[j].Y() - aRect.Top()));
+ }
+
+ mpFS->endElementNS( XML_a, XML_path );
+ }
+
+ mpFS->endElementNS( XML_a, XML_pathLst );
+
+ mpFS->endElementNS( XML_a, XML_custGeom );
+}
+
+void DrawingML::WriteConnectorConnections( EscherConnectorListEntry& rConnectorEntry, sal_Int32 nStartID, sal_Int32 nEndID )
+{
+ mpFS->singleElementNS( XML_a, XML_stCxn,
+ XML_id, I32S( nStartID ),
+ XML_idx, I64S( rConnectorEntry.GetConnectorRule( TRUE ) ),
+ FSEND );
+ mpFS->singleElementNS( XML_a, XML_endCxn,
+ XML_id, I32S( nEndID ),
+ XML_idx, I64S( rConnectorEntry.GetConnectorRule( FALSE ) ),
+ FSEND );
+}
+
+// from sw/source/filter/ww8/wrtw8num.cxx for default bullets to export to MS intact
+static void lcl_SubstituteBullet(String& rNumStr, rtl_TextEncoding& rChrSet, String& rFontName)
+{
+ StarSymbolToMSMultiFont *pConvert = 0;
+ FontFamily eFamily = FAMILY_DECORATIVE;
+
+ if (!pConvert)
+ {
+ pConvert = CreateStarSymbolToMSMultiFont();
+ }
+ sal_Unicode cChar = rNumStr.GetChar(0);
+ String sFont = pConvert->ConvertChar(cChar);
+ if (sFont.Len())
+ {
+ rNumStr = static_cast< sal_Unicode >(cChar | 0xF000);
+ rFontName = sFont;
+ rChrSet = RTL_TEXTENCODING_SYMBOL;
+ }
+ else if ( (rNumStr.GetChar(0) < 0xE000 || rNumStr.GetChar(0) > 0xF8FF) )
+ {
+ /*
+ Ok we can't fit into a known windows unicode font, but
+ we are not in the private area, so we are a
+ standardized symbol, so turn off the symbol bit and
+ let words own font substitution kick in
+ */
+ rChrSet = RTL_TEXTENCODING_UNICODE;
+ eFamily = FAMILY_SWISS;
+ rFontName = ::GetFontToken(rFontName, 0);
+ }
+ else
+ {
+ /*
+ Well we don't have an available substition, and we're
+ in our private area, so give up and show a standard
+ bullet symbol
+ */
+ rFontName.AssignAscii(RTL_CONSTASCII_STRINGPARAM("Wingdings"));
+ rNumStr = static_cast< sal_Unicode >(0x6C);
+ }
+ delete pConvert;
+}
+
+sal_Unicode DrawingML::SubstituteBullet( sal_Unicode cBulletId, ::com::sun::star::awt::FontDescriptor& rFontDesc )
+{
+ String sNumStr = cBulletId;
+
+ if ( rFontDesc.Name.equalsIgnoreAsciiCaseAscii("starsymbol") ||
+ rFontDesc.Name.equalsIgnoreAsciiCaseAscii("opensymbol") ) {
+ String sFontName = rFontDesc.Name;
+ rtl_TextEncoding aCharSet = rFontDesc.CharSet;
+
+ lcl_SubstituteBullet( sNumStr, aCharSet, sFontName );
+
+ rFontDesc.Name = sFontName;
+ rFontDesc.CharSet = aCharSet;
+ }
+
+ return sNumStr.GetChar( 0 );
+}
+
+}
+}
diff --git a/oox/source/export/makefile.mk b/oox/source/export/makefile.mk
new file mode 100644
index 000000000000..08fa7a09dff8
--- /dev/null
+++ b/oox/source/export/makefile.mk
@@ -0,0 +1,27 @@
+PRJ=..$/..
+
+PRJNAME=oox
+TARGET=export
+AUTOSEG=true
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+.INCLUDE: $(PRJ)$/util$/makefile.pmk
+
+# --- Files --------------------------------------------------------
+
+SLOFILES = \
+ $(SLO)$/drawingml.obj \
+ $(SLO)$/shapes.obj \
+ $(SLO)$/vmlexport.obj \
+ $(SLO)$/vmlexport-shape-types.obj
+
+# --- Targets -------------------------------------------------------
+
+.INCLUDE : target.mk
+
+$(MISC)$/vmlexport-shape-types.cxx : preset-definitions-to-shape-types.pl presetShapeDefinitions.xml presetTextWarpDefinitions.xml
+ $(PERL) $< > $@.in_progress 2> $(MISC)$/vmlexport-shape-types.log && mv $@.in_progress $@
diff --git a/oox/source/export/preset-definitions-to-shape-types.pl b/oox/source/export/preset-definitions-to-shape-types.pl
new file mode 100644
index 000000000000..a05bff74ab90
--- /dev/null
+++ b/oox/source/export/preset-definitions-to-shape-types.pl
@@ -0,0 +1,1242 @@
+#! /usr/bin/perl -w
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org 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 Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+use warnings;
+
+sub usage() {
+ print STDERR <<EOF;
+Usage: preset-definitions-to-shape-types.pl <shapes> <text>
+
+Converts presetShapeDefinitions.xml and presetTextWarpDefinitions.xml to a
+.cxx that contains VML with the definitions of the shapes. The result is
+written to stdout.
+
+<shapes> presetShapeDefinitions.xml (including the path to it)
+<text> presetTextWarpDefinitions.xml (including the path to it)
+EOF
+ exit 1;
+}
+
+sub show_call_stack
+{
+ my ( $path, $line, $subr );
+ my $max_depth = 30;
+ my $i = 1;
+ print STDERR "--- Begin stack trace ---\n";
+ while ( (my @call_details = (caller($i++))) && ($i<$max_depth) ) {
+ print STDERR "$call_details[1] line $call_details[2] in function $call_details[3]\n";
+ }
+ print STDERR "--- End stack trace ---\n";
+}
+
+$src_shapes = shift;
+$src_text = shift;
+
+usage() if ( !defined( $src_shapes ) || !defined( $src_text ) ||
+ $src_shapes eq "-h" || $src_shapes eq "--help" ||
+ !-f $src_shapes || !-f $src_text );
+
+# Global variables
+@levels = ();
+$shape_name = "";
+$state = "";
+$path = "";
+$adjust = "";
+$max_adj_no = 0;
+@formulas = ();
+%variables = ();
+$ignore_this_shape = 0;
+$handles = "";
+$textboxrect = "";
+$last_pos_x = "";
+$last_pos_y = "";
+$no_stroke = 0;
+$no_fill = 0;
+$path_w = 1;
+$path_h = 1;
+@quadratic_bezier = ();
+
+%result_shapes = ();
+
+%shapes_ids = (
+ 0 => 'notPrimitive',
+ 1 => 'rectangle',
+ 2 => 'roundRectangle',
+ 3 => 'ellipse',
+ 4 => 'diamond',
+ 5 => 'triangle',
+ 6 => 'rtTriangle',
+ 7 => 'parallelogram',
+ 8 => 'trapezoid',
+ 9 => 'hexagon',
+ 10 => 'octagon',
+ 11 => 'plus',
+ 12 => 'star5',
+ 13 => 'rightArrow',
+ 14 => 'thickArrow', # should not be used
+ 15 => 'homePlate',
+ 16 => 'cube',
+ 17 => 'wedgeRoundRectCallout', # balloon
+ 18 => 'star16', # seal
+ 19 => 'arc',
+ 20 => 'line',
+ 21 => 'plaque',
+ 22 => 'can',
+ 23 => 'donut',
+ 24 => 'textPlain', # textSimple - FIXME MS Office 2007 converts these to textboxes with unstyled text, so is it actually correct to map it to a real style?
+ 25 => 'textStop', # textOctagon FIXME see 24
+ 26 => 'textTriangle', # textHexagon FIXMME see 24
+ 27 => 'textCanDown', # textCurve FIXMME see 24
+ 28 => 'textWave1', # textWave FIXMME see 24
+ 29 => 'textArchUpPour', # textRing FIXMME see 24
+ 30 => 'textCanDown', # textOnCurve FIXMME see 24
+ 31 => 'textArchUp', # textOnRing FIXMME see 24
+ 32 => 'straightConnector1',
+ 33 => 'bentConnector2',
+ 34 => 'bentConnector3',
+ 35 => 'bentConnector4',
+ 36 => 'bentConnector5',
+ 37 => 'curvedConnector2',
+ 38 => 'curvedConnector3',
+ 39 => 'curvedConnector4',
+ 40 => 'curvedConnector5',
+ 41 => 'callout1',
+ 42 => 'callout2',
+ 43 => 'callout3',
+ 44 => 'accentCallout1',
+ 45 => 'accentCallout2',
+ 46 => 'accentCallout3',
+ 47 => 'borderCallout1',
+ 48 => 'borderCallout2',
+ 49 => 'borderCallout3',
+ 50 => 'accentBorderCallout1',
+ 51 => 'accentBorderCallout2',
+ 52 => 'accentBorderCallout3',
+ 53 => 'ribbon',
+ 54 => 'ribbon2',
+ 55 => 'chevron',
+ 56 => 'pentagon',
+ 57 => 'noSmoking',
+ 58 => 'star8', # seal8
+ 59 => 'star16', # seal16
+ 60 => 'star32', # seal32
+ 61 => 'wedgeRectCallout',
+ 62 => 'wedgeRoundRectCallout', # wedgeRRectCallout
+ 63 => 'wedgeEllipseCallout',
+ 64 => 'wave',
+ 65 => 'foldedCorner',
+ 66 => 'leftArrow',
+ 67 => 'downArrow',
+ 68 => 'upArrow',
+ 69 => 'leftRightArrow',
+ 70 => 'upDownArrow',
+ 71 => 'irregularSeal1',
+ 72 => 'irregularSeal2',
+ 73 => 'lightningBolt',
+ 74 => 'heart',
+ 75 => 'frame', # pictureFrame
+ 76 => 'quadArrow',
+ 77 => 'leftArrowCallout',
+ 78 => 'rightArrowCallout',
+ 79 => 'upArrowCallout',
+ 80 => 'downArrowCallout',
+ 81 => 'leftRightArrowCallout',
+ 82 => 'upDownArrowCallout',
+ 83 => 'quadArrowCallout',
+ 84 => 'bevel',
+ 85 => 'leftBracket',
+ 86 => 'rightBracket',
+ 87 => 'leftBrace',
+ 88 => 'rightBrace',
+ 89 => 'leftUpArrow',
+ 90 => 'bentUpArrow',
+ 91 => 'bentArrow',
+ 92 => 'star24', # seal24
+ 93 => 'stripedRightArrow',
+ 94 => 'notchedRightArrow',
+ 95 => 'blockArc',
+ 96 => 'smileyFace',
+ 97 => 'verticalScroll',
+ 98 => 'horizontalScroll',
+ 99 => 'circularArrow',
+ 100 => 'notchedCircularArrow', # should not be used
+ 101 => 'uturnArrow',
+ 102 => 'curvedRightArrow',
+ 103 => 'curvedLeftArrow',
+ 104 => 'curvedUpArrow',
+ 105 => 'curvedDownArrow',
+ 106 => 'cloudCallout',
+ 107 => 'ellipseRibbon',
+ 108 => 'ellipseRibbon2',
+ 109 => 'flowChartProcess',
+ 110 => 'flowChartDecision',
+ 111 => 'flowChartInputOutput',
+ 112 => 'flowChartPredefinedProcess',
+ 113 => 'flowChartInternalStorage',
+ 114 => 'flowChartDocument',
+ 115 => 'flowChartMultidocument',
+ 116 => 'flowChartTerminator',
+ 117 => 'flowChartPreparation',
+ 118 => 'flowChartManualInput',
+ 119 => 'flowChartManualOperation',
+ 120 => 'flowChartConnector',
+ 121 => 'flowChartPunchedCard',
+ 122 => 'flowChartPunchedTape',
+ 123 => 'flowChartSummingJunction',
+ 124 => 'flowChartOr',
+ 125 => 'flowChartCollate',
+ 126 => 'flowChartSort',
+ 127 => 'flowChartExtract',
+ 128 => 'flowChartMerge',
+ 129 => 'flowChartOfflineStorage',
+ 130 => 'flowChartOnlineStorage',
+ 131 => 'flowChartMagneticTape',
+ 132 => 'flowChartMagneticDisk',
+ 133 => 'flowChartMagneticDrum',
+ 134 => 'flowChartDisplay',
+ 135 => 'flowChartDelay',
+ 136 => 'textPlain', # textPlainText
+ 137 => 'textStop',
+ 138 => 'textTriangle',
+ 139 => 'textTriangleInverted',
+ 140 => 'textChevron',
+ 141 => 'textChevronInverted',
+ 142 => 'textRingInside',
+ 143 => 'textRingOutside',
+ 144 => 'textArchUp', # textArchUpCurve
+ 145 => 'textArchDown', # textArchDownCurve
+ 146 => 'textCircle', # textCircleCurve
+ 147 => 'textButton', # textButtonCurve
+ 148 => 'textArchUpPour',
+ 149 => 'textArchDownPour',
+ 150 => 'textCirclePour',
+ 151 => 'textButtonPour',
+ 152 => 'textCurveUp',
+ 153 => 'textCurveDown',
+ 154 => 'textCascadeUp',
+ 155 => 'textCascadeDown',
+ 156 => 'textWave1',
+ 157 => 'textWave2',
+ 158 => 'textWave3',
+ 159 => 'textWave4',
+ 160 => 'textInflate',
+ 161 => 'textDeflate',
+ 162 => 'textInflateBottom',
+ 163 => 'textDeflateBottom',
+ 164 => 'textInflateTop',
+ 165 => 'textDeflateTop',
+ 166 => 'textDeflateInflate',
+ 167 => 'textDeflateInflateDeflate',
+ 168 => 'textFadeRight',
+ 169 => 'textFadeLeft',
+ 170 => 'textFadeUp',
+ 171 => 'textFadeDown',
+ 172 => 'textSlantUp',
+ 173 => 'textSlantDown',
+ 174 => 'textCanUp',
+ 175 => 'textCanDown',
+ 176 => 'flowChartAlternateProcess',
+ 177 => 'flowChartOffpageConnector',
+ 178 => 'callout1', # callout90
+ 179 => 'accentCallout1', # accentCallout90
+ 180 => 'borderCallout1', # borderCallout90
+ 181 => 'accentBorderCallout1', # accentBorderCallout90
+ 182 => 'leftRightUpArrow',
+ 183 => 'sun',
+ 184 => 'moon',
+ 185 => 'bracketPair',
+ 186 => 'bracePair',
+ 187 => 'star4', # seal4
+ 188 => 'doubleWave',
+ 189 => 'actionButtonBlank',
+ 190 => 'actionButtonHome',
+ 191 => 'actionButtonHelp',
+ 192 => 'actionButtonInformation',
+ 193 => 'actionButtonForwardNext',
+ 194 => 'actionButtonBackPrevious',
+ 195 => 'actionButtonEnd',
+ 196 => 'actionButtonBeginning',
+ 197 => 'actionButtonReturn',
+ 198 => 'actionButtonDocument',
+ 199 => 'actionButtonSound',
+ 200 => 'actionButtonMovie',
+ 201 => 'hostControl', # should not be used
+ 202 => 'textBox'
+);
+# An error occured, we have to ignore this shape
+sub error( $ )
+{
+ my ( $msg ) = @_;
+
+ $ignore_this_shape = 1;
+ print STDERR "ERROR (in $shape_name ): $msg\n";
+}
+
+# Check that we are in the correct level
+sub is_level( $$ )
+{
+ my ( $level, $value ) = @_;
+
+ if ( $level > 0 ) {
+ error( "Error in is_level(), \$level should be <= 0." );
+ }
+ return ( $#levels + $level > 0 ) && ( $levels[$#levels + $level] eq $value );
+}
+
+# Setup the %variables map with predefined values
+sub setup_variables()
+{
+ %variables = (
+ 'l' => 0,
+ 't' => 0,
+ 'r' => 21600,
+ 'b' => 21600,
+
+ 'w' => 21600,
+ 'h' => 21600,
+ 'ss' => 21600,
+ 'ls' => 21600,
+
+ 'ssd2' => 10800, # 1/2
+ 'ssd4' => 5400, # 1/4
+ 'ssd6' => 3600, # 1/6
+ 'ssd8' => 2700, # 1/8
+ 'ssd16' => 1350, # 1/16
+ 'ssd32' => 675, # 1/32
+
+ 'hc' => 10800, # horizontal center
+ 'vc' => 10800, # vertical center
+
+ 'wd2' => 10800, # 1/2
+ 'wd3' => 7200, # 1/3
+ 'wd4' => 5400, # 1/4
+ 'wd5' => 4320, # 1/5
+ 'wd6' => 3600, # 1/6
+ 'wd8' => 2700, # 1/8
+ 'wd10' => 2160, # 1/10
+ 'wd12' => 1800, # 1/12
+ 'wd32' => 675, # 1/32
+
+ 'hd2' => 10800, # 1/2
+ 'hd3' => 7200, # 1/3
+ 'hd4' => 5400, # 1/4
+ 'hd5' => 4320, # 1/5
+ 'hd6' => 3600, # 1/6
+ 'hd8' => 2700, # 1/8
+ 'hd10' => 2160, # 1/10
+ 'hd12' => 1800, # 1/12
+ 'hd32' => 675, # 1/32
+
+ '25000' => 5400,
+ '12500' => 2700,
+
+ 'cd4' => 90, # 1/4 of a circle
+ 'cd2' => 180, # 1/2 of a circle
+ '3cd4' => 270, # 3/4 of a circle
+
+ 'cd8' => 45, # 1/8 of a circle
+ '3cd8' => 135, # 3/8 of a circle
+ '5cd8' => 225, # 5/8 of a circle
+ '7cd8' => 315, # 7/8 of a circle
+
+ '-5400000' => -90,
+ '-10800000'=> -180,
+ '-16200000'=> -270,
+ '-21600000'=> -360,
+ '-21599999'=> -360,
+
+ '5400000' => 90,
+ '10800000' => 180,
+ '16200000' => 270,
+ '21600000' => 360,
+ '21599999' => 360
+#
+# '21600000' => 360, # angle conversions
+# '27000000' => 450,
+# '32400000' => 540,
+# '37800000' => 630
+ );
+}
+
+# Convert the (predefiend) value to a number
+sub value( $ )
+{
+ my ( $val ) = @_;
+
+ my $result = $variables{$val};
+ return $result if ( defined( $result ) );
+
+ return $val if ( $val =~ /^[0-9-]+$/ );
+
+ error( "Unknown variable '$val'." );
+
+ show_call_stack();
+ return $val;
+}
+
+# Convert the DrawingML formula to a VML one
+%command_variables = (
+ 'w' => 'width',
+ 'h' => 'height',
+ 'r' => 'width',
+ 'b' => 'height'
+);
+
+# The same as value(), but some of the hardcoded values can have a name
+sub command_value( $ )
+{
+ my ( $value ) = @_;
+
+ return "" if ( $value eq "" );
+
+ return $value if ( $value =~ /^@/ );
+
+ my $command_val = $command_variables{$value};
+ if ( defined( $command_val ) ) {
+ return $command_val;
+ }
+
+ return value( $value );
+}
+
+# Insert the new formula to the list of formulas
+# Creates the name if it's empty...
+sub insert_formula( $$ )
+{
+ my ( $name, $fmla ) = @_;
+
+ my $i = 0;
+ foreach $f ( @formulas ) {
+ if ( $f eq $fmla ) {
+ if ( $name ne "" ) {
+ $variables{$name} = "@" . $i;
+ }
+ return "@" . $i;
+ }
+ ++$i;
+ }
+
+ if ( $name eq "" ) {
+ $name = "@" . ( $#formulas + 1 );
+ }
+
+ $variables{$name} = "@" . ( $#formulas + 1 );
+ push @formulas, $fmla;
+
+ if ( $#formulas > 127 ) {
+ error( "Reached the maximum amount of formulas, have to ignore the shape '$shape_name'" );
+ }
+
+ return $variables{$name};
+}
+
+# The same as insert_formula(), but converts the params
+sub insert_formula_params( $$$$$ )
+{
+ my ( $name, $command, $p1, $p2, $p3 ) = @_;
+
+ my $result = $command;
+ if ( $p1 ne "" ) {
+ $result .= " " . command_value( $p1 );
+ if ( $p2 ne "" ) {
+ $result .= " " . command_value( $p2 );
+ if ( $p3 ne "" ) {
+ $result .= " " . command_value( $p3 );
+ }
+ }
+ }
+
+ return insert_formula( $name, $result );
+}
+
+# Convert the formula from DrawingML to VML
+sub convert_formula( $$ )
+{
+ my ( $name, $fmla ) = @_;
+
+ if ( $fmla =~ /^([^ ]+)/ ) {
+ my $command = $1;
+
+ # parse the parameters
+ ( my $values = $fmla ) =~ s/^([^ ]+) *//;
+ my $p1 = "", $p2 = "", $p3 = "";
+ if ( $values =~ /^([^ ]+)/ ) {
+ $p1 = $1;
+ $values =~ s/^([^ ]+) *//;
+ if ( $values =~ /^([^ ]+)/ ) {
+ $p2 = $1;
+ $values =~ s/^([^ ]+) *//;
+ if ( $values =~ /^([^ ]+)/ ) {
+ $p3 = $1;
+ }
+ }
+ }
+
+ # now convert the formula
+ if ( $command eq "+-" ) {
+ if ( $p1 eq "100000" ) {
+ $p1 = value( 'w' );
+ }
+ insert_formula_params( $name, "sum", $p1, $p2, $p3 );
+ return;
+ }
+ elsif ( $command eq "*/" ) {
+ if ( ( $p2 =~ /^(w|h|ss|hd2|wd2|vc)$/ ) && defined( $variables{$p1} ) ) {
+ # switch it ;-) - presetTextWarpDefinitions.xml has it in other order
+ my $tmp = $p1;
+ $p1 = $p2;
+ $p2 = $tmp;
+ }
+
+ if ( ( $p1 =~ /^(w|h|ss|hd2|wd2|vc)$/ ) && defined( $variables{$p2} ) ) {
+ my $val3 = $p3;
+ if ( $val3 =~ /^[0-9-]+$/ ) {
+ $val3 *= ( value( 'w' ) / value( $p1 ) );
+
+ # Oh yes, I'm too lazy to implement the full GCD here ;-)
+ if ( ( $val3 % 100000 ) == 0 ) {
+ $p1 = 1;
+ $p3 = sprintf( "%.0f", ( $val3 / 100000 ) );
+ }
+ elsif ( $val3 < 100000 ) {
+ $p3 = 1;
+ while ( ( ( $p3 * 100000 ) % $val3 ) != 0 ) {
+ ++$p3
+ }
+ $p1 = ( $p3 * 100000 ) / $val3;
+ }
+ else {
+ error( "Need to count the greatest common divisor." );
+ }
+ }
+ }
+ elsif ( $p3 eq "100000" && $p2 =~ /^[0-9-]+$/ ) {
+ # prevent overflows in some shapes
+ $p2 = sprintf( "%.0f", ( $p2 / 10 ) );
+ $p3 /= 10;
+ }
+ elsif ( $p3 eq "32768" && $p2 =~ /^[0-9-]+$/ ) {
+ # prevent overflows in some shapes
+ $p2 = sprintf( "%.0f", ( $p2 / 8 ) );
+ $p3 /= 8;
+ }
+ elsif ( $p3 eq "50000" ) {
+ $p3 = 10800;
+ }
+ elsif ( $name =~ /^maxAdj/ ) {
+ my $val = value( $p1 );
+ if ( $val =~ /^[0-9-]+$/ ) {
+ $p1 = sprintf( "%.0f", ( value( 'w' ) * $val / 100000 ) );
+ }
+ }
+
+ if ( ( value( $p1 ) eq value( $p3 ) ) || ( value( $p2 ) eq value( $p3 ) ) ) {
+ my $val = value( ( value( $p1 ) eq value( $p3 ) )? $p2: $p1 );
+ if ( $val =~ /^@([0-9]+)$/ ) {
+ insert_formula( $name, $formulas[$1] );
+ }
+ else {
+ insert_formula( $name, "val $val" );
+ }
+ }
+ else {
+ insert_formula_params( $name, "prod", $p1, $p2, $p3 );
+ }
+ return;
+ }
+ elsif ( $command eq "+/" ) {
+ # we have to split this into 2 formulas - 'sum' and 'prod'
+ my $constructed = insert_formula_params( "", "sum", $p1, $p2, "0" );
+ insert_formula_params( $name, "prod", 1, $constructed, $p3); # references the 'sum' formula
+ return;
+ }
+ elsif ( $command eq "?:" ) {
+ insert_formula_params( $name, "if", $p1, $p2, $p3 );
+ return;
+ }
+ elsif ( $command eq "sin" || $command eq "cos" ) {
+ if ( $p2 =~ /^[0-9-]+$/ && ( ( $p2 % 60000 ) == 0 ) ) {
+ $p2 /= 60000;
+ }
+ else {
+ $p2 = insert_formula_params( "", "prod", "1", $p2, "60000" );
+ }
+ # we have to use 'sumangle' even for the case when $p2 is const
+ # and theoretically could be written as such; but Word does not
+ # accept it :-(
+ my $conv = insert_formula_params( "", "sumangle", "0", $p2, "0" );
+
+ $p2 = $conv;
+
+ insert_formula_params( $name, $command, $p1, $p2, "" );
+ return;
+ }
+ elsif ( $command eq "abs" ) {
+ insert_formula_params( $name, $command, $p1, "", "" );
+ return;
+ }
+ elsif ( $command eq "max" || $command eq "min" ) {
+ insert_formula_params( $name, $command, $p1, $p2, "" );
+ return;
+ }
+ elsif ( $command eq "at2" ) {
+ insert_formula_params( $name, "atan2", $p1, $p2, "" );
+ return;
+ }
+ elsif ( $command eq "cat2" ) {
+ insert_formula_params( $name, "cosatan2", $p1, $p2, $p3 );
+ return;
+ }
+ elsif ( $command eq "sat2" ) {
+ insert_formula_params( $name, "sinatan2", $p1, $p2, $p3 );
+ return;
+ }
+ elsif ( $command eq "sqrt" ) {
+ insert_formula_params( $name, "sqrt", $p1, "", "" );
+ return;
+ }
+ elsif ( $command eq "mod" ) {
+ insert_formula_params( $name, "mod", $p1, $p2, $p3 );
+ return;
+ }
+ elsif ( $command eq "val" ) {
+ insert_formula_params( $name, "val", value( $p1 ), "", "" );
+ return;
+ }
+ else {
+ error( "Unknown formula '$name', '$fmla'." );
+ }
+ }
+ else {
+ error( "Cannot convert formula's command '$name', '$fmla'." );
+ }
+}
+
+# There's no exact equivalent of 'arcTo' in VML, we have to do some special casing...
+%convert_arcTo = (
+ '0' => {
+ '90' => {
+ 'path' => 'qy',
+ 'op' => [ 'sum 0 __last_x__ __wR__', 'sum __hR__ __last_y__ 0' ],
+ },
+ '-90' => {
+ 'path' => 'qy',
+ 'op' => [ 'sum 0 __last_x__ __wR__', 'sum 0 __last_y__ __hR__' ],
+ },
+ },
+ '90' => {
+ '90' => {
+ 'path' => 'qx',
+ 'op' => [ 'sum 0 __last_x__ __wR__', 'sum 0 __last_y__ __hR__' ],
+ },
+ '-90' => {
+ 'path' => 'qx',
+ 'op' => [ 'sum __wR__ __last_x__ 0', 'sum 0 __last_y__ __hR__' ],
+ },
+ },
+ '180' => {
+ '90' => {
+ 'path' => 'qy',
+ 'op' => [ 'sum __wR__ __last_x__ 0', 'sum 0 __last_y__ __hR__' ],
+ },
+ '-90' => {
+ 'path' => 'qy',
+ 'op' => [ 'sum __wR__ __last_x__ 0', 'sum __hR__ __last_y__ 0' ],
+ },
+ },
+ '270' => {
+ '90' => {
+ 'path' => 'qx',
+ 'op' => [ 'sum __wR__ __last_x__ 0', 'sum __hR__ __last_y__ 0' ],
+ },
+ '-90' => {
+ 'path' => 'qx',
+ 'op' => [ 'sum 0 __last_x__ __wR__', 'sum __hR__ __last_y__ 0' ],
+ },
+ },
+);
+
+# Elliptic quadrant
+# FIXME optimize so that we compute the const values when possible
+sub elliptic_quadrant( $$$$ )
+{
+ my ( $wR, $hR, $stAng, $swAng ) = @_;
+
+ if ( defined( $convert_arcTo{$stAng} ) && defined( $convert_arcTo{$stAng}{$swAng} ) ) {
+ my $conv_path = $convert_arcTo{$stAng}{$swAng}{'path'};
+ my $conv_op_ref = $convert_arcTo{$stAng}{$swAng}{'op'};
+
+ $path .= "$conv_path";
+
+ my $pos_x = $last_pos_x;
+ my $pos_y = $last_pos_y;
+ for ( my $i = 0; $i <= $#{$conv_op_ref}; ++$i ) {
+ my $op = $conv_op_ref->[$i];
+
+ $op =~ s/__last_x__/$last_pos_x/g;
+ $op =~ s/__last_y__/$last_pos_y/g;
+ $op =~ s/__wR__/$wR/g;
+ $op =~ s/__hR__/$hR/g;
+
+ my $fmla = insert_formula( "", $op );
+
+ $path .= $fmla;
+
+ # so far it's sufficient just to rotate the positions
+ # FIXME if not ;-)
+ $pos_x = $pos_y;
+ $pos_y = $fmla;
+ }
+ $last_pos_x = $pos_x;
+ $last_pos_y = $pos_y;
+ }
+ else {
+ error( "Unhandled elliptic_quadrant(), input is ($wR, $hR, $stAng, $swAng)." );
+ }
+}
+
+# Convert the quadratic bezier to cubic (exact)
+# No idea why, but the 'qb' did not work for me :-(
+sub quadratic_to_cubic_bezier( $ )
+{
+ my ( $axis ) = @_;
+
+ my $a0 = $quadratic_bezier[0]->{$axis};
+ my $a1 = $quadratic_bezier[1]->{$axis};
+ my $a2 = $quadratic_bezier[2]->{$axis};
+
+ my $b0 = $a0;
+
+ # $b1 = $a0 + 2/3 * ( $a1 - $a0 ), but in VML
+ # FIXME optimize for constants - compute directly
+ my $b1_1 = insert_formula_params( "", "sum", "0", $a1, $a0 );
+ my $b1_2 = insert_formula_params( "", "prod", "2", $b1_1, "3" );
+ my $b1 = insert_formula_params( "", "sum", $a0, $b1_2, "0" );
+
+ # $b2 = $b1 + 1/3 * ( $a2 - $a0 );
+ # FIXME optimize for constants - compute directly
+ my $b2_1 = insert_formula_params( "", "sum", "0", $a2, $a0 );
+ my $b2_2 = insert_formula_params( "", "prod", "1", $b2_1, "3" );
+ my $b2 = insert_formula_params( "", "sum", $b1, $b2_2, "0" );
+
+ my $b3 = $a2;
+
+ return ( $b0, $b1, $b2, $b3 );
+}
+
+# Extend $path by one more point
+sub add_point_to_path( $$ )
+{
+ my ( $x, $y ) = @_;
+
+ if ( $path =~ /[0-9]$/ && $x =~ /^[0-9-]/ ) {
+ $path .= ",";
+ }
+ $path .= $x;
+
+ if ( $path =~ /[0-9]$/ && $y =~ /^[0-9-]/ ) {
+ $path .= ",";
+ }
+ $path .= $y;
+}
+
+# Start of an element
+sub start_element( $% )
+{
+ my ( $element, %attr ) = @_;
+
+ push @levels, $element;
+
+ #print "element: $element\n";
+
+ if ( is_level( -1, "presetShapeDefinitons" ) || is_level( -1, "presetTextWarpDefinitions" ) ) {
+ $shape_name = $element;
+
+ $state = "";
+ $ignore_this_shape = 0;
+ $path = "";
+ $adjust = "";
+ $max_adj_no = 0;
+ @formulas = ();
+ $handles = "";
+ $textboxrect = "";
+ $last_pos_x = "";
+ $last_pos_y = "";
+ $no_stroke = 0;
+ $no_fill = 0;
+ @quadratic_bezier = ();
+
+ setup_variables();
+
+ if ( $shape_name eq "sun" ) {
+ # hack for this shape
+ $variables{'100000'} = "21600";
+ $variables{'50000'} = "10800";
+ $variables{'25000'} = "5400";
+ $variables{'12500'} = "2700";
+ $variables{'3662'} = "791";
+ }
+
+ my $found = 0;
+ foreach my $name ( values( %shapes_ids ) ) {
+ if ( $name eq $shape_name ) {
+ $found = 1;
+ last;
+ }
+ }
+ if ( !$found ) {
+ error( "Unknown shape '$shape_name'." );
+ }
+ }
+ elsif ( $element eq "pathLst" ) {
+ $state = "path";
+ }
+ elsif ( $element eq "avLst" ) {
+ $state = "adjust";
+ }
+ elsif ( $element eq "gdLst" ) {
+ $state = "formulas";
+ }
+ elsif ( $element eq "ahLst" ) {
+ $state = "handles";
+ }
+ elsif ( $element eq "rect" ) {
+ $textboxrect = value( $attr{'l'} ) . "," . value( $attr{'t'} ) . "," .
+ value( $attr{'r'} ) . "," . value( $attr{'b'} );
+ }
+ elsif ( $state eq "path" ) {
+ if ( $element eq "path" ) {
+ $no_stroke = ( defined( $attr{'stroke'} ) && $attr{'stroke'} eq 'false' );
+ $no_fill = ( defined( $attr{'fill'} ) && $attr{'fill'} eq 'none' );
+ $path_w = $attr{'w'};
+ $path_h = $attr{'h'};
+ }
+ elsif ( $element eq "moveTo" ) {
+ $path .= "m";
+ }
+ elsif ( $element eq "lnTo" ) {
+ $path .= "l";
+ }
+ elsif ( $element eq "cubicBezTo" ) {
+ $path .= "c";
+ }
+ elsif ( $element eq "quadBezTo" ) {
+ my %points = ( 'x' => $last_pos_x, 'y' => $last_pos_y );
+ @quadratic_bezier = ( \%points );
+ }
+ elsif ( $element eq "close" ) {
+ $path .= "x";
+ }
+ elsif ( $element eq "pt" ) {
+ # rememeber the last position for the arcTo
+ $last_pos_x = value( $attr{'x'} );
+ $last_pos_y = value( $attr{'y'} );
+
+ $last_pos_x *= ( value( 'w' ) / $path_w ) if ( defined( $path_w ) );
+ $last_pos_y *= ( value( 'h' ) / $path_h ) if ( defined( $path_h ) );
+
+ if ( $#quadratic_bezier >= 0 ) {
+ my %points = ( 'x' => $last_pos_x, 'y' => $last_pos_y );
+ push( @quadratic_bezier, \%points );
+ }
+ else {
+ add_point_to_path( $last_pos_x, $last_pos_y );
+ }
+ }
+ elsif ( ( $element eq "arcTo" ) && ( $last_pos_x ne "" ) && ( $last_pos_y ne "" ) ) {
+ # there's no exact equivalent of arcTo in VML, so we have to
+ # compute here a bit...
+ my $stAng = value( $attr{'stAng'} );
+ my $swAng = value( $attr{'swAng'} );
+ my $wR = value( $attr{'wR'} );
+ my $hR = value( $attr{'hR'} );
+
+ $wR *= ( value( 'w' ) / $path_w ) if ( defined( $path_w ) );
+ $hR *= ( value( 'h' ) / $path_h ) if ( defined( $path_h ) );
+
+ if ( ( $stAng =~ /^[0-9-]+$/ ) && ( $swAng =~ /^[0-9-]+$/ ) ) {
+ if ( ( ( $stAng % 90 ) == 0 ) && ( ( $swAng % 90 ) == 0 ) && ( $swAng != 0 ) ) {
+ my $end = $stAng + $swAng;
+ my $step = ( $swAng > 0 )? 90: -90;
+
+ for ( my $cur = $stAng; $cur != $end; $cur += $step ) {
+ elliptic_quadrant( $wR, $hR, ( $cur % 360 ), $step );
+ }
+ }
+ else {
+ error( "Unsupported numeric 'arcTo' ($attr{'wR'}, $attr{'hR'}, $stAng, $swAng)." );
+ }
+ }
+ else {
+ error( "Unsupported 'arcTo' conversion ($attr{'wR'}, $attr{'hR'}, $stAng, $swAng)." );
+ }
+ }
+ else {
+ error( "Unhandled path element '$element'." );
+ }
+ }
+ elsif ( $state eq "adjust" ) {
+ if ( $element eq "gd" ) {
+ my $adj_no = $attr{'name'};
+ my $is_const = 0;
+
+ $adj_no =~ s/^adj//;
+ if ( $adj_no eq "" ) {
+ $max_adj_no = 0;
+ }
+ elsif ( !( $adj_no =~ /^[0-9]*$/ ) ) {
+ ++$max_adj_no;
+ $is_const = 1;
+ }
+ elsif ( $adj_no != $max_adj_no + 1 ) {
+ error( "Wrong order of adj values." );
+ ++$max_adj_no;
+ }
+ else {
+ $max_adj_no = $adj_no;
+ }
+
+ if ( $attr{'fmla'} =~ /^val ([0-9-]*)$/ ) {
+ my $val = sprintf( "%.0f", ( 21600 * $1 ) / 100000 );
+ if ( $is_const ) {
+ $variables{$adj_no} = $val;
+ }
+ elsif ( $adjust eq "" ) {
+ $adjust = $val;
+ }
+ else {
+ $adjust = "$val,$adjust";
+ }
+ }
+ else {
+ error( "Wrong fmla '$attr{'fmla'}'." );
+ }
+ }
+ else {
+ error( "Unhandled adjust element '$element'." );
+ }
+ }
+ elsif ( $state eq "formulas" ) {
+ if ( $element eq "gd" ) {
+ if ( $attr{'fmla'} =~ /^\*\/ (h|w|ss) adj([0-9]+) 100000$/ ) {
+ insert_formula( $attr{'name'}, "val #" . ( $max_adj_no - $2 ) );
+ }
+ elsif ( $attr{'fmla'} =~ /^pin [^ ]+ ([^ ]+) / ) {
+ print STDERR "TODO Map 'pin' to VML as xrange for handles.\n";
+ my $pin_val = $1;
+ if ( $pin_val eq "adj" ) {
+ insert_formula( $attr{'name'}, "val #0" );
+ }
+ elsif ( $pin_val =~ /^adj([0-9]+)/ ) {
+ insert_formula( $attr{'name'}, "val #" . ( $max_adj_no - $1 ) );
+ }
+ else {
+ insert_formula( $attr{'name'}, "val " . value( $pin_val ) );
+ }
+ }
+ elsif ( $attr{'fmla'} =~ /adj/ ) {
+ error( "Non-standard usage of adj in '$attr{'fmla'}'." );
+ }
+ else {
+ convert_formula( $attr{'name'}, $attr{'fmla'} );
+ }
+ }
+ }
+ elsif ( $state eq "handles" ) {
+ if ( $element eq "pos" ) {
+ $handles .= "<v:h position=\"" . value( $attr{'x'} ) . "," . value( $attr{'y'} ) . "\"/>\n";
+ }
+ }
+}
+
+# End of an element
+sub end_element( $ )
+{
+ my ( $element ) = @_;
+
+ pop @levels;
+
+ if ( $element eq $shape_name ) {
+ if ( !$ignore_this_shape ) {
+ # we have all the info, generate the shape now
+ $state = "";
+
+ # shape path
+ my $out = "<v:shapetype id=\"shapetype___ID__\" coordsize=\"21600,21600\" o:spt=\"__ID__\" ";
+ if ( $adjust ne "" ) {
+ $out .= "adj=\"$adjust\" ";
+ }
+
+ # optimize it [yes, we need this twice ;-)]
+ $path =~ s/([^0-9-@])0([^0-9-@])/$1$2/g;
+ $path =~ s/([^0-9-@])0([^0-9-@])/$1$2/g;
+
+ $out .= "path=\"$path\">\n";
+
+ # stroke
+ $out .= "<v:stroke joinstyle=\"miter\"/>\n";
+
+ # formulas
+ if ( $#formulas >= 0 )
+ {
+ $out .= "<v:formulas>\n";
+ foreach $fmla ( @formulas ) {
+ $out .= "<v:f eqn=\"$fmla\"/>\n"
+ }
+ $out .= "</v:formulas>\n";
+ }
+
+ # path
+ if ( $textboxrect ne "" ) { # TODO connectlocs, connectangles
+ $out .= "<v:path gradientshapeok=\"t\" o:connecttype=\"rect\" textboxrect=\"$textboxrect\"/>\n";
+ }
+
+ # handles
+ if ( $handles ne "" ) {
+ $out .= "<v:handles>\n$handles</v:handles>\n";
+ }
+
+ $out .="</v:shapetype>";
+
+ # hooray! :-)
+ $result_shapes{$shape_name} = $out;
+ }
+ else {
+ print STDERR "Shape '$shape_name' ignored; see the above error(s) for the reason.\n";
+ }
+ $shape_name = "";
+ }
+ elsif ( $state eq "path" ) {
+ if ( $element eq "path" ) {
+ $path .= "ns" if ( $no_stroke );
+ $path .= "nf" if ( $no_fill );
+ $path .= "e";
+ }
+ elsif ( $element eq "quadBezTo" ) {
+ # we have to convert the quadratic bezier to cubic
+ if ( $#quadratic_bezier == 2 ) {
+ my @points_x = quadratic_to_cubic_bezier( 'x' );
+ my @points_y = quadratic_to_cubic_bezier( 'y' );
+
+ $path .= "c";
+ # ignore the starting point
+ for ( my $i = 1; $i < 4; ++$i ) {
+ add_point_to_path( $points_x[$i], $points_y[$i] );
+ }
+ }
+ else {
+ error( "Wrong number of points of the quadratic bezier." );
+ }
+ @quadratic_bezier = ();
+ }
+ }
+ elsif ( $element eq "avLst" ) {
+ $state = "";
+ }
+ elsif ( $element eq "gdLst" ) {
+ $state = "";
+ }
+ elsif ( $element eq "ahLst" ) {
+ $state = "";
+ }
+}
+
+# Text inside an element
+sub characters( $ )
+{
+ #my ( $text ) = @_;
+}
+
+#################### A trivial XML parser ####################
+
+# Parse the attributes
+sub parse_start_element( $ )
+{
+ # split the string containing both the elements and attributes
+ my ( $element_tmp ) = @_;
+
+ $element_tmp =~ s/\s*$//;
+ $element_tmp =~ s/^\s*//;
+
+ ( my $element = $element_tmp ) =~ s/\s.*$//;
+ if ( $element_tmp =~ /\s/ ) {
+ $element_tmp =~ s/^[^\s]*\s//;
+ }
+ else {
+ $element_tmp = "";
+ }
+
+ # we have the element, now the attributes
+ my %attr;
+ my $is_key = 1;
+ my $key = "";
+ foreach my $tmp ( split( /"/, $element_tmp ) ) {
+ if ( $is_key ) {
+ $key = $tmp;
+ $key =~ s/^\s*//;
+ $key =~ s/\s*=\s*$//;
+ }
+ else {
+ $attr{$key} = $tmp;
+ }
+ $is_key = !$is_key;
+ }
+
+ if ( $element ne "" ) {
+ start_element( $element, %attr );
+ }
+}
+
+# Parse the file
+sub parse( $ )
+{
+ my ( $file ) = @_;
+
+ my $in_comment = 0;
+ my $line = "";
+ while (<$file>) {
+ # ignore comments
+ s/<\?[^>]*\?>//g;
+ s/<!--[^>]*-->//g;
+ if ( /<!--/ ) {
+ $in_comment = 1;
+ s/<!--.*//;
+ }
+ elsif ( /-->/ && $in_comment ) {
+ $in_comment = 0;
+ s/.*-->//;
+ }
+ elsif ( $in_comment ) {
+ next;
+ }
+ # ignore empty lines
+ chomp;
+ s/^\s*//;
+ s/\s*$//;
+ next if ( $_ eq "" );
+
+ # take care of lines where element continues
+ if ( $line ne "" ) {
+ $line .= " " . $_;
+ }
+ else {
+ $line = $_;
+ }
+ next if ( !/>$/ );
+
+ # the actual parsing
+ my @starts = split( /</, $line );
+ $line = "";
+ foreach $start ( @starts ) {
+ next if ( $start eq "" );
+
+ @ends = split( />/, $start );
+ my $element = $ends[0];
+ my $data = $ends[1];
+
+ # start or end element
+ if ( $element =~ /^\/(.*)/ ) {
+ end_element( $1 );
+ }
+ elsif ( $element =~ /^(.*)\/$/ ) {
+ parse_start_element( $1 );
+ ( my $end = $1 ) =~ s/\s.*$//;
+ end_element( $end );
+ }
+ else {
+ parse_start_element( $element );
+ }
+
+ # the data
+ characters( $data ) if ( defined( $data ) && $data ne "" );
+ }
+ }
+}
+
+# Do the real work
+open( IN, "<$src_shapes" ) || die "Cannot open $src_shapes.";
+parse( IN );
+close( IN );
+
+open( IN, "<$src_text" ) || die "Cannot open $src_text.";
+parse( IN );
+close( IN );
+
+if ( !defined( $result_shapes{'textBox'} ) ) {
+ $result_shapes{'textBox'} =
+ "<v:shapetype id=\"shapetype___ID__\" coordsize=\"21600,21600\" " .
+ "o:spt=\"__ID__\" path=\"m,l,21600l21600,21600l21600,xe\">\n" .
+ "<v:stroke joinstyle=\"miter\"/>\n" .
+ "<v:path gradientshapeok=\"t\" o:connecttype=\"rect\"/>\n" .
+ "</v:shapetype>";
+}
+
+# Generate the code
+print <<EOF;
+// Shape types generated from
+// '$src_shapes'
+// and
+// '$src_text'
+// which are part of the OOXML documentation
+
+#include <svx/escherex.hxx>
+
+const char* pShapeTypes[ ESCHER_ShpInst_COUNT ] =
+{
+EOF
+
+for ( $i = 0; $i < 203; ++$i ) {
+ if ( $i < 4 ) {
+ print " /* $i - $shapes_ids{$i} - handled separately */\n NULL,\n";
+ }
+ else {
+ print " /* $i - $shapes_ids{$i} */\n";
+ my $out = $result_shapes{$shapes_ids{$i}};
+ if ( defined( $out ) ) {
+ # set the id
+ $out =~ s/__ID__/$i/g;
+
+ # escape the '"'s
+ $out =~ s/"/\\"/g;
+
+ # output as string
+ $out =~ s/^/ "/;
+ $out =~ s/\n/"\n "/g;
+ $out =~ s/$/"/;
+
+ print "$out,\n";
+ }
+ else {
+ print " NULL,\n";
+ }
+ }
+}
+
+print <<EOF;
+};
+EOF
diff --git a/oox/source/export/presetShapeDefinitions.xml b/oox/source/export/presetShapeDefinitions.xml
new file mode 100644
index 000000000000..f5fead717fe0
--- /dev/null
+++ b/oox/source/export/presetShapeDefinitions.xml
@@ -0,0 +1,19915 @@
+<?xml version="1.0" encoding="utf-8"?>
+<presetShapeDefinitons>
+ <accentBorderCallout1>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="adj1" fmla="val 18750" />
+
+ <gd name="adj2" fmla="val -8333" />
+
+ <gd name="adj3" fmla="val 112500" />
+
+ <gd name="adj4" fmla="val -38333" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h adj1 100000" />
+ <gd name="x1" fmla="*/ w adj2 100000" />
+ <gd name="y2" fmla="*/ h adj3 100000" />
+ <gd name="x2" fmla="*/ w adj4 100000" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="t" />
+ </moveTo>
+ <close />
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </accentBorderCallout1>
+ <accentBorderCallout2>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="adj1" fmla="val 18750" />
+
+ <gd name="adj2" fmla="val -8333" />
+
+ <gd name="adj3" fmla="val 18750" />
+
+ <gd name="adj4" fmla="val -16667" />
+
+ <gd name="adj5" fmla="val 112500" />
+
+ <gd name="adj6" fmla="val -46667" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h adj1 100000" />
+ <gd name="x1" fmla="*/ w adj2 100000" />
+ <gd name="y2" fmla="*/ h adj3 100000" />
+ <gd name="x2" fmla="*/ w adj4 100000" />
+ <gd name="y3" fmla="*/ h adj5 100000" />
+ <gd name="x3" fmla="*/ w adj6 100000" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">
+ <pos x="x3" y="y3" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="t" />
+ </moveTo>
+ <close />
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </accentBorderCallout2>
+ <accentBorderCallout3>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="adj1" fmla="val 18750" />
+
+ <gd name="adj2" fmla="val -8333" />
+
+ <gd name="adj3" fmla="val 18750" />
+
+ <gd name="adj4" fmla="val -16667" />
+
+ <gd name="adj5" fmla="val 100000" />
+
+ <gd name="adj6" fmla="val -16667" />
+
+ <gd name="adj7" fmla="val 112963" />
+
+ <gd name="adj8" fmla="val -8333" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h adj1 100000" />
+ <gd name="x1" fmla="*/ w adj2 100000" />
+ <gd name="y2" fmla="*/ h adj3 100000" />
+ <gd name="x2" fmla="*/ w adj4 100000" />
+ <gd name="y3" fmla="*/ h adj5 100000" />
+ <gd name="x3" fmla="*/ w adj6 100000" />
+ <gd name="y4" fmla="*/ h adj7 100000" />
+ <gd name="x4" fmla="*/ w adj8 100000" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">
+ <pos x="x3" y="y3" />
+ </ahXY>
+ <ahXY gdRefX="adj8" minX="-2147483647" maxX="2147483647" gdRefY="adj7" minY="-2147483647" maxY="2147483647">
+ <pos x="x4" y="y4" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="t" />
+ </moveTo>
+ <close />
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y4" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </accentBorderCallout3>
+ <accentCallout1>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="adj1" fmla="val 18750" />
+
+ <gd name="adj2" fmla="val -8333" />
+
+ <gd name="adj3" fmla="val 112500" />
+
+ <gd name="adj4" fmla="val -38333" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h adj1 100000" />
+ <gd name="x1" fmla="*/ w adj2 100000" />
+ <gd name="y2" fmla="*/ h adj3 100000" />
+ <gd name="x2" fmla="*/ w adj4 100000" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="t" />
+ </moveTo>
+ <close />
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </accentCallout1>
+ <accentCallout2>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="adj1" fmla="val 18750" />
+
+ <gd name="adj2" fmla="val -8333" />
+
+ <gd name="adj3" fmla="val 18750" />
+
+ <gd name="adj4" fmla="val -16667" />
+
+ <gd name="adj5" fmla="val 112500" />
+
+ <gd name="adj6" fmla="val -46667" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h adj1 100000" />
+ <gd name="x1" fmla="*/ w adj2 100000" />
+ <gd name="y2" fmla="*/ h adj3 100000" />
+ <gd name="x2" fmla="*/ w adj4 100000" />
+ <gd name="y3" fmla="*/ h adj5 100000" />
+ <gd name="x3" fmla="*/ w adj6 100000" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">
+ <pos x="x3" y="y3" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="t" />
+ </moveTo>
+ <close />
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </accentCallout2>
+ <accentCallout3>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="adj1" fmla="val 18750" />
+
+ <gd name="adj2" fmla="val -8333" />
+
+ <gd name="adj3" fmla="val 18750" />
+
+ <gd name="adj4" fmla="val -16667" />
+
+ <gd name="adj5" fmla="val 100000" />
+
+ <gd name="adj6" fmla="val -16667" />
+
+ <gd name="adj7" fmla="val 112963" />
+
+ <gd name="adj8" fmla="val -8333" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h adj1 100000" />
+ <gd name="x1" fmla="*/ w adj2 100000" />
+ <gd name="y2" fmla="*/ h adj3 100000" />
+ <gd name="x2" fmla="*/ w adj4 100000" />
+ <gd name="y3" fmla="*/ h adj5 100000" />
+ <gd name="x3" fmla="*/ w adj6 100000" />
+ <gd name="y4" fmla="*/ h adj7 100000" />
+ <gd name="x4" fmla="*/ w adj8 100000" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">
+ <pos x="x3" y="y3" />
+ </ahXY>
+ <ahXY gdRefX="adj8" minX="-2147483647" maxX="2147483647" gdRefY="adj7" minY="-2147483647" maxY="2147483647">
+ <pos x="x4" y="y4" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="t" />
+ </moveTo>
+ <close />
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y4" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </accentCallout3>
+ <actionButtonBackPrevious>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dx2" fmla="*/ ss 3 8" />
+ <gd name="g9" fmla="+- vc 0 dx2" />
+ <gd name="g10" fmla="+- vc dx2 0" />
+ <gd name="g11" fmla="+- hc 0 dx2" />
+ <gd name="g12" fmla="+- hc dx2 0" />
+ </gdLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g11" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="g12" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g10" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darken" extrusionOk="false">
+ <moveTo>
+ <pt x="g11" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="g12" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g10" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="g11" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="g12" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g10" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </actionButtonBackPrevious>
+ <actionButtonBeginning>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dx2" fmla="*/ ss 3 8" />
+ <gd name="g9" fmla="+- vc 0 dx2" />
+ <gd name="g10" fmla="+- vc dx2 0" />
+ <gd name="g11" fmla="+- hc 0 dx2" />
+ <gd name="g12" fmla="+- hc dx2 0" />
+ <gd name="g13" fmla="*/ ss 3 4" />
+ <gd name="g14" fmla="*/ g13 1 8" />
+ <gd name="g15" fmla="*/ g13 1 4" />
+ <gd name="g16" fmla="+- g11 g14 0" />
+ <gd name="g17" fmla="+- g11 g15 0" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g17" y="vc" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g12" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g10" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g16" y="g9" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g11" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g16" y="g10" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darken" extrusionOk="false">
+ <moveTo>
+ <pt x="g17" y="vc" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g12" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g10" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g16" y="g9" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g11" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g16" y="g10" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="g17" y="vc" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g12" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g10" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g16" y="g9" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g16" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g9" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </actionButtonBeginning>
+ <actionButtonBlank>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </actionButtonBlank>
+ <actionButtonDocument>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dx2" fmla="*/ ss 3 8" />
+ <gd name="g9" fmla="+- vc 0 dx2" />
+ <gd name="g10" fmla="+- vc dx2 0" />
+ <gd name="dx1" fmla="*/ ss 9 32" />
+ <gd name="g11" fmla="+- hc 0 dx1" />
+ <gd name="g12" fmla="+- hc dx1 0" />
+ <gd name="g13" fmla="*/ ss 3 16" />
+ <gd name="g14" fmla="+- g12 0 g13" />
+ <gd name="g15" fmla="+- g9 g13 0" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g11" y="g9" />
+ </moveTo>
+ <lnTo>
+ <pt x="g14" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g15" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g10" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darkenLess" extrusionOk="false">
+
+ <moveTo>
+ <pt x="g11" y="g9" />
+ </moveTo>
+ <lnTo>
+ <pt x="g14" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g14" y="g15" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g15" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g10" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darken" extrusionOk="false">
+ <moveTo>
+ <pt x="g14" y="g9" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g14" y="g15" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g15" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="g11" y="g9" />
+ </moveTo>
+ <lnTo>
+ <pt x="g14" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g15" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g10" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g12" y="g15" />
+ </moveTo>
+ <lnTo>
+ <pt x="g14" y="g15" />
+ </lnTo>
+ <lnTo>
+ <pt x="g14" y="g9" />
+ </lnTo>
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </actionButtonDocument>
+ <actionButtonEnd>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dx2" fmla="*/ ss 3 8" />
+ <gd name="g9" fmla="+- vc 0 dx2" />
+ <gd name="g10" fmla="+- vc dx2 0" />
+ <gd name="g11" fmla="+- hc 0 dx2" />
+ <gd name="g12" fmla="+- hc dx2 0" />
+ <gd name="g13" fmla="*/ ss 3 4" />
+ <gd name="g14" fmla="*/ g13 3 4" />
+ <gd name="g15" fmla="*/ g13 7 8" />
+ <gd name="g16" fmla="+- g11 g14 0" />
+ <gd name="g17" fmla="+- g11 g15 0" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g16" y="vc" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g11" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g10" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g17" y="g9" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g12" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g17" y="g10" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darken" extrusionOk="false">
+ <moveTo>
+ <pt x="g16" y="vc" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g11" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g10" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g17" y="g9" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g12" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g17" y="g10" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="g16" y="vc" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g11" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g9" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g17" y="g9" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g12" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g17" y="g10" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </actionButtonEnd>
+ <actionButtonForwardNext>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dx2" fmla="*/ ss 3 8" />
+ <gd name="g9" fmla="+- vc 0 dx2" />
+ <gd name="g10" fmla="+- vc dx2 0" />
+ <gd name="g11" fmla="+- hc 0 dx2" />
+ <gd name="g12" fmla="+- hc dx2 0" />
+ </gdLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g12" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="g11" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g10" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darken" extrusionOk="false">
+ <moveTo>
+ <pt x="g12" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="g11" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g10" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="g12" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="g11" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g9" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </actionButtonForwardNext>
+ <actionButtonHelp>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dx2" fmla="*/ ss 3 8" />
+ <gd name="g9" fmla="+- vc 0 dx2" />
+ <gd name="g11" fmla="+- hc 0 dx2" />
+ <gd name="g13" fmla="*/ ss 3 4" />
+ <gd name="g14" fmla="*/ g13 1 7" />
+ <gd name="g15" fmla="*/ g13 3 14" />
+ <gd name="g16" fmla="*/ g13 2 7" />
+ <gd name="g19" fmla="*/ g13 3 7" />
+ <gd name="g20" fmla="*/ g13 4 7" />
+ <gd name="g21" fmla="*/ g13 17 28" />
+ <gd name="g23" fmla="*/ g13 21 28" />
+ <gd name="g24" fmla="*/ g13 11 14" />
+ <gd name="g27" fmla="+- g9 g16 0" />
+ <gd name="g29" fmla="+- g9 g21 0" />
+ <gd name="g30" fmla="+- g9 g23 0" />
+ <gd name="g31" fmla="+- g9 g24 0" />
+ <gd name="g33" fmla="+- g11 g15 0" />
+ <gd name="g36" fmla="+- g11 g19 0" />
+ <gd name="g37" fmla="+- g11 g20 0" />
+ <gd name="g41" fmla="*/ g13 1 14" />
+ <gd name="g42" fmla="*/ g13 3 28" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g33" y="g27" />
+ </moveTo>
+
+ <arcTo wR="g16" hR="g16" stAng="cd2" swAng="cd2" />
+ <arcTo wR="g14" hR="g15" stAng="0" swAng="cd4" />
+ <arcTo wR="g41" hR="g42" stAng="3cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="g37" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g36" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g36" y="g29" />
+ </lnTo>
+ <arcTo wR="g14" hR="g15" stAng="cd2" swAng="cd4" />
+ <arcTo wR="g41" hR="g42" stAng="cd4" swAng="-5400000" />
+ <arcTo wR="g14" hR="g14" stAng="0" swAng="-10800000" />
+ <close />
+ <moveTo>
+ <pt x="hc" y="g31" />
+ </moveTo>
+
+ <arcTo wR="g42" hR="g42" stAng="3cd4" swAng="21600000" />
+ <close />
+ </path>
+ <path stroke="false" fill="darken" extrusionOk="false">
+ <moveTo>
+ <pt x="g33" y="g27" />
+ </moveTo>
+
+ <arcTo wR="g16" hR="g16" stAng="cd2" swAng="cd2" />
+ <arcTo wR="g14" hR="g15" stAng="0" swAng="cd4" />
+ <arcTo wR="g41" hR="g42" stAng="3cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="g37" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g36" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g36" y="g29" />
+ </lnTo>
+ <arcTo wR="g14" hR="g15" stAng="cd2" swAng="cd4" />
+ <arcTo wR="g41" hR="g42" stAng="cd4" swAng="-5400000" />
+ <arcTo wR="g14" hR="g14" stAng="0" swAng="-10800000" />
+ <close />
+ <moveTo>
+ <pt x="hc" y="g31" />
+ </moveTo>
+
+ <arcTo wR="g42" hR="g42" stAng="3cd4" swAng="21600000" />
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="g33" y="g27" />
+ </moveTo>
+
+ <arcTo wR="g16" hR="g16" stAng="cd2" swAng="cd2" />
+ <arcTo wR="g14" hR="g15" stAng="0" swAng="cd4" />
+ <arcTo wR="g41" hR="g42" stAng="3cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="g37" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g36" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g36" y="g29" />
+ </lnTo>
+ <arcTo wR="g14" hR="g15" stAng="cd2" swAng="cd4" />
+ <arcTo wR="g41" hR="g42" stAng="cd4" swAng="-5400000" />
+ <arcTo wR="g14" hR="g14" stAng="0" swAng="-10800000" />
+ <close />
+ <moveTo>
+ <pt x="hc" y="g31" />
+ </moveTo>
+
+ <arcTo wR="g42" hR="g42" stAng="3cd4" swAng="21600000" />
+ <close />
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </actionButtonHelp>
+ <actionButtonHome>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dx2" fmla="*/ ss 3 8" />
+ <gd name="g9" fmla="+- vc 0 dx2" />
+ <gd name="g10" fmla="+- vc dx2 0" />
+ <gd name="g11" fmla="+- hc 0 dx2" />
+ <gd name="g12" fmla="+- hc dx2 0" />
+ <gd name="g13" fmla="*/ ss 3 4" />
+ <gd name="g14" fmla="*/ g13 1 16" />
+ <gd name="g15" fmla="*/ g13 1 8" />
+ <gd name="g16" fmla="*/ g13 3 16" />
+ <gd name="g17" fmla="*/ g13 5 16" />
+ <gd name="g18" fmla="*/ g13 7 16" />
+ <gd name="g19" fmla="*/ g13 9 16" />
+ <gd name="g20" fmla="*/ g13 11 16" />
+ <gd name="g21" fmla="*/ g13 3 4" />
+ <gd name="g22" fmla="*/ g13 13 16" />
+ <gd name="g23" fmla="*/ g13 7 8" />
+ <gd name="g24" fmla="+- g9 g14 0" />
+ <gd name="g25" fmla="+- g9 g16 0" />
+ <gd name="g26" fmla="+- g9 g17 0" />
+ <gd name="g27" fmla="+- g9 g21 0" />
+ <gd name="g28" fmla="+- g11 g15 0" />
+ <gd name="g29" fmla="+- g11 g18 0" />
+ <gd name="g30" fmla="+- g11 g19 0" />
+ <gd name="g31" fmla="+- g11 g20 0" />
+ <gd name="g32" fmla="+- g11 g22 0" />
+ <gd name="g33" fmla="+- g11 g23 0" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="hc" y="g9" />
+ </moveTo>
+ <lnTo>
+ <pt x="g11" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="g28" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="g28" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g33" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g33" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g26" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g24" />
+ </lnTo>
+ <lnTo>
+ <pt x="g31" y="g24" />
+ </lnTo>
+ <lnTo>
+ <pt x="g31" y="g25" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darkenLess" extrusionOk="false">
+
+ <moveTo>
+ <pt x="g32" y="g26" />
+ </moveTo>
+ <lnTo>
+ <pt x="g32" y="g24" />
+ </lnTo>
+ <lnTo>
+ <pt x="g31" y="g24" />
+ </lnTo>
+ <lnTo>
+ <pt x="g31" y="g25" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g28" y="vc" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g28" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g29" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g29" y="g27" />
+ </lnTo>
+ <lnTo>
+ <pt x="g30" y="g27" />
+ </lnTo>
+ <lnTo>
+ <pt x="g30" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g33" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g33" y="vc" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darken" extrusionOk="false">
+ <moveTo>
+ <pt x="hc" y="g9" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g11" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="vc" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g29" y="g27" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g30" y="g27" />
+ </lnTo>
+ <lnTo>
+ <pt x="g30" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g29" y="g10" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="hc" y="g9" />
+ </moveTo>
+ <lnTo>
+ <pt x="g31" y="g25" />
+ </lnTo>
+ <lnTo>
+ <pt x="g31" y="g24" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g24" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g26" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="g33" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="g33" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g28" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g28" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="vc" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g31" y="g25" />
+ </moveTo>
+ <lnTo>
+ <pt x="g32" y="g26" />
+ </lnTo>
+
+ <moveTo>
+ <pt x="g33" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="g28" y="vc" />
+ </lnTo>
+
+ <moveTo>
+ <pt x="g29" y="g10" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g29" y="g27" />
+ </lnTo>
+ <lnTo>
+ <pt x="g30" y="g27" />
+ </lnTo>
+ <lnTo>
+ <pt x="g30" y="g10" />
+ </lnTo>
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </actionButtonHome>
+ <actionButtonInformation>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dx2" fmla="*/ ss 3 8" />
+ <gd name="g9" fmla="+- vc 0 dx2" />
+ <gd name="g11" fmla="+- hc 0 dx2" />
+ <gd name="g13" fmla="*/ ss 3 4" />
+ <gd name="g14" fmla="*/ g13 1 32" />
+ <gd name="g17" fmla="*/ g13 5 16" />
+ <gd name="g18" fmla="*/ g13 3 8" />
+ <gd name="g19" fmla="*/ g13 13 32" />
+ <gd name="g20" fmla="*/ g13 19 32" />
+ <gd name="g22" fmla="*/ g13 11 16" />
+ <gd name="g23" fmla="*/ g13 13 16" />
+ <gd name="g24" fmla="*/ g13 7 8" />
+ <gd name="g25" fmla="+- g9 g14 0" />
+ <gd name="g28" fmla="+- g9 g17 0" />
+ <gd name="g29" fmla="+- g9 g18 0" />
+ <gd name="g30" fmla="+- g9 g23 0" />
+ <gd name="g31" fmla="+- g9 g24 0" />
+ <gd name="g32" fmla="+- g11 g17 0" />
+ <gd name="g34" fmla="+- g11 g19 0" />
+ <gd name="g35" fmla="+- g11 g20 0" />
+ <gd name="g37" fmla="+- g11 g22 0" />
+ <gd name="g38" fmla="*/ g13 3 32" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="hc" y="g9" />
+ </moveTo>
+
+ <arcTo wR="dx2" hR="dx2" stAng="3cd4" swAng="21600000" />
+ <close />
+ </path>
+ <path stroke="false" fill="darken" extrusionOk="false">
+ <moveTo>
+ <pt x="hc" y="g9" />
+ </moveTo>
+
+ <arcTo wR="dx2" hR="dx2" stAng="3cd4" swAng="21600000" />
+ <close />
+ <moveTo>
+ <pt x="hc" y="g25" />
+ </moveTo>
+
+ <arcTo wR="g38" hR="g38" stAng="3cd4" swAng="21600000" />
+ <moveTo>
+ <pt x="g32" y="g28" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g32" y="g29" />
+ </lnTo>
+ <lnTo>
+ <pt x="g34" y="g29" />
+ </lnTo>
+ <lnTo>
+ <pt x="g34" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g31" />
+ </lnTo>
+ <lnTo>
+ <pt x="g37" y="g31" />
+ </lnTo>
+ <lnTo>
+ <pt x="g37" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g28" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="lighten" extrusionOk="false">
+ <moveTo>
+ <pt x="hc" y="g25" />
+ </moveTo>
+
+ <arcTo wR="g38" hR="g38" stAng="3cd4" swAng="21600000" />
+ <moveTo>
+ <pt x="g32" y="g28" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g35" y="g28" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g37" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g37" y="g31" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g31" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g34" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g34" y="g29" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g29" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="hc" y="g9" />
+ </moveTo>
+
+ <arcTo wR="dx2" hR="dx2" stAng="3cd4" swAng="21600000" />
+ <close />
+ <moveTo>
+ <pt x="hc" y="g25" />
+ </moveTo>
+
+ <arcTo wR="g38" hR="g38" stAng="3cd4" swAng="21600000" />
+ <moveTo>
+ <pt x="g32" y="g28" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g35" y="g28" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g37" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g37" y="g31" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g31" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g34" y="g30" />
+ </lnTo>
+ <lnTo>
+ <pt x="g34" y="g29" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g29" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </actionButtonInformation>
+ <actionButtonMovie>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dx2" fmla="*/ ss 3 8" />
+ <gd name="g9" fmla="+- vc 0 dx2" />
+ <gd name="g10" fmla="+- vc dx2 0" />
+ <gd name="g11" fmla="+- hc 0 dx2" />
+ <gd name="g12" fmla="+- hc dx2 0" />
+ <gd name="g13" fmla="*/ ss 3 4" />
+ <gd name="g14" fmla="*/ g13 1455 21600" />
+ <gd name="g15" fmla="*/ g13 1905 21600" />
+ <gd name="g16" fmla="*/ g13 2325 21600" />
+ <gd name="g17" fmla="*/ g13 16155 21600" />
+ <gd name="g18" fmla="*/ g13 17010 21600" />
+ <gd name="g19" fmla="*/ g13 19335 21600" />
+ <gd name="g20" fmla="*/ g13 19725 21600" />
+ <gd name="g21" fmla="*/ g13 20595 21600" />
+ <gd name="g22" fmla="*/ g13 5280 21600" />
+ <gd name="g23" fmla="*/ g13 5730 21600" />
+ <gd name="g24" fmla="*/ g13 6630 21600" />
+ <gd name="g25" fmla="*/ g13 7492 21600" />
+ <gd name="g26" fmla="*/ g13 9067 21600" />
+ <gd name="g27" fmla="*/ g13 9555 21600" />
+ <gd name="g28" fmla="*/ g13 13342 21600" />
+ <gd name="g29" fmla="*/ g13 14580 21600" />
+ <gd name="g30" fmla="*/ g13 15592 21600" />
+ <gd name="g31" fmla="+- g11 g14 0" />
+ <gd name="g32" fmla="+- g11 g15 0" />
+ <gd name="g33" fmla="+- g11 g16 0" />
+ <gd name="g34" fmla="+- g11 g17 0" />
+ <gd name="g35" fmla="+- g11 g18 0" />
+ <gd name="g36" fmla="+- g11 g19 0" />
+ <gd name="g37" fmla="+- g11 g20 0" />
+ <gd name="g38" fmla="+- g11 g21 0" />
+ <gd name="g39" fmla="+- g9 g22 0" />
+ <gd name="g40" fmla="+- g9 g23 0" />
+ <gd name="g41" fmla="+- g9 g24 0" />
+ <gd name="g42" fmla="+- g9 g25 0" />
+ <gd name="g43" fmla="+- g9 g26 0" />
+ <gd name="g44" fmla="+- g9 g27 0" />
+ <gd name="g45" fmla="+- g9 g28 0" />
+ <gd name="g46" fmla="+- g9 g29 0" />
+ <gd name="g47" fmla="+- g9 g30 0" />
+ <gd name="g48" fmla="+- g9 g31 0" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g11" y="g39" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g11" y="g44" />
+ </lnTo>
+ <lnTo>
+ <pt x="g31" y="g44" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g43" />
+ </lnTo>
+ <lnTo>
+ <pt x="g33" y="g43" />
+ </lnTo>
+ <lnTo>
+ <pt x="g33" y="g47" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g47" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g45" />
+ </lnTo>
+ <lnTo>
+ <pt x="g36" y="g45" />
+ </lnTo>
+ <lnTo>
+ <pt x="g38" y="g46" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g46" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g41" />
+ </lnTo>
+ <lnTo>
+ <pt x="g38" y="g41" />
+ </lnTo>
+ <lnTo>
+ <pt x="g37" y="g42" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g42" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g41" />
+ </lnTo>
+ <lnTo>
+ <pt x="g34" y="g40" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g40" />
+ </lnTo>
+ <lnTo>
+ <pt x="g31" y="g39" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darken" extrusionOk="false">
+ <moveTo>
+ <pt x="g11" y="g39" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g11" y="g44" />
+ </lnTo>
+ <lnTo>
+ <pt x="g31" y="g44" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g43" />
+ </lnTo>
+ <lnTo>
+ <pt x="g33" y="g43" />
+ </lnTo>
+ <lnTo>
+ <pt x="g33" y="g47" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g47" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g45" />
+ </lnTo>
+ <lnTo>
+ <pt x="g36" y="g45" />
+ </lnTo>
+ <lnTo>
+ <pt x="g38" y="g46" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g46" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g41" />
+ </lnTo>
+ <lnTo>
+ <pt x="g38" y="g41" />
+ </lnTo>
+ <lnTo>
+ <pt x="g37" y="g42" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g42" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g41" />
+ </lnTo>
+ <lnTo>
+ <pt x="g34" y="g40" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g40" />
+ </lnTo>
+ <lnTo>
+ <pt x="g31" y="g39" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="g11" y="g39" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g31" y="g39" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g40" />
+ </lnTo>
+ <lnTo>
+ <pt x="g34" y="g40" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g41" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g42" />
+ </lnTo>
+ <lnTo>
+ <pt x="g37" y="g42" />
+ </lnTo>
+ <lnTo>
+ <pt x="g38" y="g41" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g41" />
+ </lnTo>
+ <lnTo>
+ <pt x="g12" y="g46" />
+ </lnTo>
+ <lnTo>
+ <pt x="g38" y="g46" />
+ </lnTo>
+ <lnTo>
+ <pt x="g36" y="g45" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g45" />
+ </lnTo>
+ <lnTo>
+ <pt x="g35" y="g47" />
+ </lnTo>
+ <lnTo>
+ <pt x="g33" y="g47" />
+ </lnTo>
+ <lnTo>
+ <pt x="g33" y="g43" />
+ </lnTo>
+ <lnTo>
+ <pt x="g32" y="g43" />
+ </lnTo>
+ <lnTo>
+ <pt x="g31" y="g44" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g44" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </actionButtonMovie>
+ <actionButtonReturn>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dx2" fmla="*/ ss 3 8" />
+ <gd name="g9" fmla="+- vc 0 dx2" />
+ <gd name="g10" fmla="+- vc dx2 0" />
+ <gd name="g11" fmla="+- hc 0 dx2" />
+ <gd name="g12" fmla="+- hc dx2 0" />
+ <gd name="g13" fmla="*/ ss 3 4" />
+ <gd name="g14" fmla="*/ g13 7 8" />
+ <gd name="g15" fmla="*/ g13 3 4" />
+ <gd name="g16" fmla="*/ g13 5 8" />
+ <gd name="g17" fmla="*/ g13 3 8" />
+ <gd name="g18" fmla="*/ g13 1 4" />
+ <gd name="g19" fmla="+- g9 g15 0" />
+ <gd name="g20" fmla="+- g9 g16 0" />
+ <gd name="g21" fmla="+- g9 g18 0" />
+ <gd name="g22" fmla="+- g11 g14 0" />
+ <gd name="g23" fmla="+- g11 g15 0" />
+ <gd name="g24" fmla="+- g11 g16 0" />
+ <gd name="g25" fmla="+- g11 g17 0" />
+ <gd name="g26" fmla="+- g11 g18 0" />
+ <gd name="g27" fmla="*/ g13 1 8" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g12" y="g21" />
+ </moveTo>
+ <lnTo>
+ <pt x="g23" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="g24" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="g24" y="g20" />
+ </lnTo>
+ <arcTo wR="g27" hR="g27" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="g25" y="g19" />
+ </lnTo>
+ <arcTo wR="g27" hR="g27" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="g26" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g20" />
+ </lnTo>
+ <arcTo wR="g17" hR="g17" stAng="cd2" swAng="-5400000" />
+ <lnTo>
+ <pt x="hc" y="g10" />
+ </lnTo>
+ <arcTo wR="g17" hR="g17" stAng="cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="g22" y="g21" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darken" extrusionOk="false">
+ <moveTo>
+ <pt x="g12" y="g21" />
+ </moveTo>
+ <lnTo>
+ <pt x="g23" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="g24" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="g24" y="g20" />
+ </lnTo>
+ <arcTo wR="g27" hR="g27" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="g25" y="g19" />
+ </lnTo>
+ <arcTo wR="g27" hR="g27" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="g26" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g20" />
+ </lnTo>
+ <arcTo wR="g17" hR="g17" stAng="cd2" swAng="-5400000" />
+ <lnTo>
+ <pt x="hc" y="g10" />
+ </lnTo>
+ <arcTo wR="g17" hR="g17" stAng="cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="g22" y="g21" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="g12" y="g21" />
+ </moveTo>
+ <lnTo>
+ <pt x="g22" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="g22" y="g20" />
+ </lnTo>
+ <arcTo wR="g17" hR="g17" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="g25" y="g10" />
+ </lnTo>
+ <arcTo wR="g17" hR="g17" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="g11" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="g26" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="g26" y="g20" />
+ </lnTo>
+ <arcTo wR="g27" hR="g27" stAng="cd2" swAng="-5400000" />
+ <lnTo>
+ <pt x="hc" y="g19" />
+ </lnTo>
+ <arcTo wR="g27" hR="g27" stAng="cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="g24" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="g23" y="g9" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </actionButtonReturn>
+ <actionButtonSound>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dx2" fmla="*/ ss 3 8" />
+ <gd name="g9" fmla="+- vc 0 dx2" />
+ <gd name="g10" fmla="+- vc dx2 0" />
+ <gd name="g11" fmla="+- hc 0 dx2" />
+ <gd name="g12" fmla="+- hc dx2 0" />
+ <gd name="g13" fmla="*/ ss 3 4" />
+ <gd name="g14" fmla="*/ g13 1 8" />
+ <gd name="g15" fmla="*/ g13 5 16" />
+ <gd name="g16" fmla="*/ g13 5 8" />
+ <gd name="g17" fmla="*/ g13 11 16" />
+ <gd name="g18" fmla="*/ g13 3 4" />
+ <gd name="g19" fmla="*/ g13 7 8" />
+ <gd name="g20" fmla="+- g9 g14 0" />
+ <gd name="g21" fmla="+- g9 g15 0" />
+ <gd name="g22" fmla="+- g9 g17 0" />
+ <gd name="g23" fmla="+- g9 g19 0" />
+ <gd name="g24" fmla="+- g11 g15 0" />
+ <gd name="g25" fmla="+- g11 g16 0" />
+ <gd name="g26" fmla="+- g11 g18 0" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g11" y="g21" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g11" y="g22" />
+ </lnTo>
+ <lnTo>
+ <pt x="g24" y="g22" />
+ </lnTo>
+ <lnTo>
+ <pt x="g25" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g25" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g24" y="g21" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darken" extrusionOk="false">
+ <moveTo>
+ <pt x="g11" y="g21" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g11" y="g22" />
+ </lnTo>
+ <lnTo>
+ <pt x="g24" y="g22" />
+ </lnTo>
+ <lnTo>
+ <pt x="g25" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g25" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g24" y="g21" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="g11" y="g21" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="g24" y="g21" />
+ </lnTo>
+ <lnTo>
+ <pt x="g25" y="g9" />
+ </lnTo>
+ <lnTo>
+ <pt x="g25" y="g10" />
+ </lnTo>
+ <lnTo>
+ <pt x="g24" y="g22" />
+ </lnTo>
+ <lnTo>
+ <pt x="g11" y="g22" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="g26" y="g21" />
+ </moveTo>
+ <lnTo>
+ <pt x="g12" y="g20" />
+ </lnTo>
+ <moveTo>
+ <pt x="g26" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="g12" y="vc" />
+ </lnTo>
+ <moveTo>
+ <pt x="g26" y="g22" />
+ </moveTo>
+ <lnTo>
+ <pt x="g12" y="g23" />
+ </lnTo>
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </actionButtonSound>
+ <arc>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 16200000" />
+ <gd name="adj2" fmla="val 0" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="stAng" fmla="pin 0 adj1 21599999" />
+ <gd name="enAng" fmla="pin 0 adj2 21599999" />
+ <gd name="sw11" fmla="+- enAng 0 stAng" />
+ <gd name="sw12" fmla="+- sw11 21600000 0" />
+ <gd name="swAng" fmla="?: sw11 sw11 sw12" />
+ <gd name="wt1" fmla="sin wd2 stAng" />
+ <gd name="ht1" fmla="cos hd2 stAng" />
+ <gd name="dx1" fmla="cat2 wd2 ht1 wt1" />
+ <gd name="dy1" fmla="sat2 hd2 ht1 wt1" />
+ <gd name="wt2" fmla="sin wd2 enAng" />
+ <gd name="ht2" fmla="cos hd2 enAng" />
+ <gd name="dx2" fmla="cat2 wd2 ht2 wt2" />
+ <gd name="dy2" fmla="sat2 hd2 ht2 wt2" />
+ <gd name="x1" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- vc dy1 0" />
+ <gd name="x2" fmla="+- hc dx2 0" />
+ <gd name="y2" fmla="+- vc dy2 0" />
+ <gd name="sw0" fmla="+- 21600000 0 stAng" />
+ <gd name="da1" fmla="+- swAng 0 sw0" />
+ <gd name="g1" fmla="max x1 x2" />
+ <gd name="ir" fmla="?: da1 r g1" />
+ <gd name="sw1" fmla="+- cd4 0 stAng" />
+ <gd name="sw2" fmla="+- 27000000 0 stAng" />
+ <gd name="sw3" fmla="?: sw1 sw1 sw2" />
+ <gd name="da2" fmla="+- swAng 0 sw3" />
+ <gd name="g5" fmla="max y1 y2" />
+ <gd name="ib" fmla="?: da2 b g5" />
+ <gd name="sw4" fmla="+- cd2 0 stAng" />
+ <gd name="sw5" fmla="+- 32400000 0 stAng" />
+ <gd name="sw6" fmla="?: sw4 sw4 sw5" />
+ <gd name="da3" fmla="+- swAng 0 sw6" />
+ <gd name="g9" fmla="min x1 x2" />
+ <gd name="il" fmla="?: da3 l g9" />
+ <gd name="sw7" fmla="+- 3cd4 0 stAng" />
+ <gd name="sw8" fmla="+- 37800000 0 stAng" />
+ <gd name="sw9" fmla="?: sw7 sw7 sw8" />
+ <gd name="da4" fmla="+- swAng 0 sw9" />
+ <gd name="g13" fmla="min y1 y2" />
+ <gd name="it" fmla="?: da4 t g13" />
+ <gd name="cang1" fmla="+- stAng 0 cd4" />
+ <gd name="cang2" fmla="+- enAng cd4 0" />
+ <gd name="cang3" fmla="+/ cang1 cang2 2" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefAng="adj1" minAng="0" maxAng="21599999">
+ <pos x="x1" y="y1" />
+ </ahPolar>
+ <ahPolar gdRefAng="adj2" minAng="0" maxAng="21599999">
+ <pos x="x2" y="y2" />
+ </ahPolar>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cang1">
+ <pos x="x1" y="y1" />
+ </cxn>
+ <cxn ang="cang3">
+ <pos x="hc" y="vc" />
+ </cxn>
+ <cxn ang="cang2">
+ <pos x="x2" y="y2" />
+ </cxn>
+ </cxnLst>
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="stAng" swAng="swAng" />
+ <lnTo>
+ <pt x="hc" y="vc" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="stAng" swAng="swAng" />
+ </path>
+ </pathLst>
+ </arc>
+ <bentArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 25000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ <gd name="adj4" fmla="val 43750" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a2" fmla="pin 0 adj2 50000" />
+ <gd name="maxAdj1" fmla="*/ a2 2 1" />
+
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="a3" fmla="pin 0 adj3 50000" />
+ <gd name="th" fmla="*/ ss a1 100000" />
+
+ <gd name="aw2" fmla="*/ ss a2 100000" />
+
+ <gd name="th2" fmla="*/ th 1 2" />
+ <gd name="dh2" fmla="+- aw2 0 th2" />
+
+ <gd name="ah" fmla="*/ ss a3 100000" />
+
+ <gd name="bw" fmla="+- r 0 ah" />
+
+ <gd name="bh" fmla="+- b 0 dh2" />
+
+ <gd name="bs" fmla="min bw bh" />
+
+ <gd name="maxAdj4" fmla="*/ 100000 bs ss" />
+ <gd name="a4" fmla="pin 0 adj4 maxAdj4" />
+
+ <gd name="bd" fmla="*/ ss a4 100000" />
+
+
+ <gd name="bd3" fmla="+- bd 0 th" />
+ <gd name="bd2" fmla="max bd3 0" />
+ <gd name="x3" fmla="+- th bd2 0" />
+ <gd name="x4" fmla="+- r 0 ah" />
+
+
+ <gd name="y3" fmla="+- dh2 th 0" />
+ <gd name="y4" fmla="+- y3 dh2 0" />
+ <gd name="y5" fmla="+- dh2 bd 0" />
+ <gd name="y6" fmla="+- y3 bd2 0" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">
+ <pos x="th" y="b" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="0" maxY="50000">
+ <pos x="r" y="y4" />
+ </ahXY>
+ <ahXY gdRefX="adj3" minX="0" maxX="50000">
+ <pos x="x4" y="t" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="0" maxX="maxAdj4">
+ <pos x="bd" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x4" y="t" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x4" y="y4" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="th2" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="aw2" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="l" y="y5" />
+ </lnTo>
+ <arcTo wR="bd" hR="bd" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="x4" y="dh2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="aw2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <arcTo wR="bd2" hR="bd2" stAng="3cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="th" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </bentArrow>
+ <bentConnector2>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ </path>
+ </pathLst>
+ </bentConnector2>
+ <bentConnector3>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x1" fmla="*/ w adj1 100000" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647">
+ <pos x="x1" y="vc" />
+ </ahXY>
+ </ahLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ </path>
+ </pathLst>
+ </bentConnector3>
+ <bentConnector4>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+ <gd name="adj2" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x1" fmla="*/ w adj1 100000" />
+ <gd name="x2" fmla="+/ x1 r 2" />
+ <gd name="y2" fmla="*/ h adj2 100000" />
+ <gd name="y1" fmla="+/ t y2 2" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ </ahLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ </path>
+ </pathLst>
+ </bentConnector4>
+ <bentConnector5>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ <gd name="adj3" fmla="val 50000" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x1" fmla="*/ w adj1 100000" />
+
+ <gd name="x3" fmla="*/ w adj3 100000" />
+
+ <gd name="x2" fmla="+/ x1 x3 2" />
+
+ <gd name="y2" fmla="*/ h adj2 100000" />
+
+ <gd name="y1" fmla="+/ t y2 2" />
+
+ <gd name="y3" fmla="+/ b y2 2" />
+
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ <ahXY gdRefX="adj3" minX="-2147483647" maxX="2147483647">
+ <pos x="x3" y="y3" />
+ </ahXY>
+ </ahLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </bentConnector5>
+ <bentUpArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 25000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 50000" />
+ <gd name="a2" fmla="pin 0 adj2 50000" />
+ <gd name="a3" fmla="pin 0 adj3 50000" />
+ <gd name="y1" fmla="*/ ss a3 100000" />
+ <gd name="dx1" fmla="*/ ss a2 50000" />
+
+ <gd name="x1" fmla="+- r 0 dx1" />
+ <gd name="dx3" fmla="*/ ss a2 100000" />
+
+ <gd name="x3" fmla="+- r 0 dx3" />
+ <gd name="dx2" fmla="*/ ss a1 200000" />
+
+ <gd name="x2" fmla="+- x3 0 dx2" />
+ <gd name="x4" fmla="+- x3 dx2 0" />
+ <gd name="dy2" fmla="*/ ss a1 100000" />
+
+ <gd name="y2" fmla="+- b 0 dy2" />
+ <gd name="x0" fmla="*/ x4 1 2" />
+ <gd name="y3" fmla="+/ y2 b 2" />
+ <gd name="y15" fmla="+/ y1 b 2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="50000">
+ <pos x="l" y="y2" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="50000">
+ <pos x="x1" y="t" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="0" maxY="50000">
+ <pos x="x2" y="y1" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x3" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y1" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x0" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x4" y="y15" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="y2" r="x4" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </bentUpArrow>
+ <bevel>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 12500" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="x1" fmla="*/ ss a 100000" />
+
+
+
+ <gd name="x2" fmla="+- r 0 x1" />
+
+ <gd name="y2" fmla="+- b 0 x1" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="50000">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x2" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="x1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x1" t="x1" r="x2" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="x1" y="x1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="lightenLess" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="x1" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darkenLess" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="lighten" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darken" extrusionOk="false">
+
+ <moveTo>
+ <pt x="r" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="x1" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="x1" y="x1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="x1" />
+ </lnTo>
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <moveTo>
+ <pt x="r" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="x1" />
+ </lnTo>
+ <moveTo>
+ <pt x="r" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </bevel>
+ <blockArc>
+
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 10800000" />
+
+ <gd name="adj2" fmla="val 0" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="stAng" fmla="pin 0 adj1 21599999" />
+ <gd name="istAng" fmla="pin 0 adj2 21599999" />
+ <gd name="a3" fmla="pin 0 adj3 50000" />
+ <gd name="sw11" fmla="+- istAng 0 stAng" />
+
+ <gd name="sw12" fmla="+- sw11 21600000 0" />
+
+ <gd name="swAng" fmla="?: sw11 sw11 sw12" />
+
+ <gd name="iswAng" fmla="+- 0 0 swAng" />
+
+
+ <gd name="wt1" fmla="sin wd2 stAng" />
+ <gd name="ht1" fmla="cos hd2 stAng" />
+ <gd name="wt3" fmla="sin wd2 istAng" />
+ <gd name="ht3" fmla="cos hd2 istAng" />
+ <gd name="dx1" fmla="cat2 wd2 ht1 wt1" />
+ <gd name="dy1" fmla="sat2 hd2 ht1 wt1" />
+ <gd name="dx3" fmla="cat2 wd2 ht3 wt3" />
+ <gd name="dy3" fmla="sat2 hd2 ht3 wt3" />
+ <gd name="x1" fmla="+- hc dx1 0" />
+
+ <gd name="y1" fmla="+- vc dy1 0" />
+
+ <gd name="x3" fmla="+- hc dx3 0" />
+
+ <gd name="y3" fmla="+- vc dy3 0" />
+
+
+ <gd name="dr" fmla="*/ ss a3 100000" />
+ <gd name="iwd2" fmla="+- wd2 0 dr" />
+ <gd name="ihd2" fmla="+- hd2 0 dr" />
+ <gd name="wt2" fmla="sin iwd2 istAng" />
+ <gd name="ht2" fmla="cos ihd2 istAng" />
+ <gd name="wt4" fmla="sin iwd2 stAng" />
+ <gd name="ht4" fmla="cos ihd2 stAng" />
+ <gd name="dx2" fmla="cat2 iwd2 ht2 wt2" />
+ <gd name="dy2" fmla="sat2 ihd2 ht2 wt2" />
+ <gd name="dx4" fmla="cat2 iwd2 ht4 wt4" />
+ <gd name="dy4" fmla="sat2 ihd2 ht4 wt4" />
+ <gd name="x2" fmla="+- hc dx2 0" />
+
+ <gd name="y2" fmla="+- vc dy2 0" />
+
+ <gd name="x4" fmla="+- hc dx4 0" />
+
+ <gd name="y4" fmla="+- vc dy4 0" />
+
+
+ <gd name="sw0" fmla="+- 21600000 0 stAng" />
+ <gd name="da1" fmla="+- swAng 0 sw0" />
+ <gd name="g1" fmla="max x1 x2" />
+ <gd name="g2" fmla="max x3 x4" />
+ <gd name="g3" fmla="max g1 g2" />
+ <gd name="ir" fmla="?: da1 r g3" />
+
+ <gd name="sw1" fmla="+- cd4 0 stAng" />
+ <gd name="sw2" fmla="+- 27000000 0 stAng" />
+ <gd name="sw3" fmla="?: sw1 sw1 sw2" />
+ <gd name="da2" fmla="+- swAng 0 sw3" />
+ <gd name="g5" fmla="max y1 y2" />
+ <gd name="g6" fmla="max y3 y4" />
+ <gd name="g7" fmla="max g5 g6" />
+ <gd name="ib" fmla="?: da2 b g7" />
+
+ <gd name="sw4" fmla="+- cd2 0 stAng" />
+ <gd name="sw5" fmla="+- 32400000 0 stAng" />
+ <gd name="sw6" fmla="?: sw4 sw4 sw5" />
+ <gd name="da3" fmla="+- swAng 0 sw6" />
+ <gd name="g9" fmla="min x1 x2" />
+ <gd name="g10" fmla="min x3 x4" />
+ <gd name="g11" fmla="min g9 g10" />
+ <gd name="il" fmla="?: da3 l g11" />
+
+ <gd name="sw7" fmla="+- 3cd4 0 stAng" />
+ <gd name="sw8" fmla="+- 37800000 0 stAng" />
+ <gd name="sw9" fmla="?: sw7 sw7 sw8" />
+ <gd name="da4" fmla="+- swAng 0 sw9" />
+ <gd name="g13" fmla="min y1 y2" />
+ <gd name="g14" fmla="min y3 y4" />
+ <gd name="g15" fmla="min g13 g14" />
+ <gd name="it" fmla="?: da4 t g15" />
+
+ <gd name="x5" fmla="+/ x1 x4 2" />
+
+ <gd name="y5" fmla="+/ y1 y4 2" />
+
+ <gd name="x6" fmla="+/ x3 x2 2" />
+
+ <gd name="y6" fmla="+/ y3 y2 2" />
+
+ <gd name="cang1" fmla="+- stAng 0 cd4" />
+ <gd name="cang2" fmla="+- istAng cd4 0" />
+ <gd name="cang3" fmla="+/ cang1 cang2 2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefAng="adj1" minAng="0" maxAng="21599999">
+ <pos x="x1" y="y1" />
+ </ahPolar>
+ <ahPolar gdRefR="adj3" minR="0" maxR="50000" gdRefAng="adj2" minAng="0" maxAng="21599999">
+ <pos x="x2" y="y2" />
+ </ahPolar>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cang1">
+ <pos x="x5" y="y5" />
+ </cxn>
+ <cxn ang="cang2">
+ <pos x="x6" y="y6" />
+ </cxn>
+ <cxn ang="cang3">
+ <pos x="hc" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="stAng" swAng="swAng" />
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <arcTo wR="iwd2" hR="ihd2" stAng="istAng" swAng="iswAng" />
+ <close />
+ </path>
+ </pathLst>
+
+ </blockArc>
+ <borderCallout1>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="adj1" fmla="val 18750" />
+
+ <gd name="adj2" fmla="val -8333" />
+
+ <gd name="adj3" fmla="val 112500" />
+
+ <gd name="adj4" fmla="val -38333" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h adj1 100000" />
+ <gd name="x1" fmla="*/ w adj2 100000" />
+ <gd name="y2" fmla="*/ h adj3 100000" />
+ <gd name="x2" fmla="*/ w adj4 100000" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </borderCallout1>
+ <borderCallout2>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="adj1" fmla="val 18750" />
+
+ <gd name="adj2" fmla="val -8333" />
+
+ <gd name="adj3" fmla="val 18750" />
+
+ <gd name="adj4" fmla="val -16667" />
+
+ <gd name="adj5" fmla="val 112500" />
+
+ <gd name="adj6" fmla="val -46667" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h adj1 100000" />
+ <gd name="x1" fmla="*/ w adj2 100000" />
+ <gd name="y2" fmla="*/ h adj3 100000" />
+ <gd name="x2" fmla="*/ w adj4 100000" />
+ <gd name="y3" fmla="*/ h adj5 100000" />
+ <gd name="x3" fmla="*/ w adj6 100000" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">
+ <pos x="x3" y="y3" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </borderCallout2>
+ <borderCallout3>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="adj1" fmla="val 18750" />
+
+ <gd name="adj2" fmla="val -8333" />
+
+ <gd name="adj3" fmla="val 18750" />
+
+ <gd name="adj4" fmla="val -16667" />
+
+ <gd name="adj5" fmla="val 100000" />
+
+ <gd name="adj6" fmla="val -16667" />
+
+ <gd name="adj7" fmla="val 112963" />
+
+ <gd name="adj8" fmla="val -8333" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h adj1 100000" />
+ <gd name="x1" fmla="*/ w adj2 100000" />
+ <gd name="y2" fmla="*/ h adj3 100000" />
+ <gd name="x2" fmla="*/ w adj4 100000" />
+ <gd name="y3" fmla="*/ h adj5 100000" />
+ <gd name="x3" fmla="*/ w adj6 100000" />
+ <gd name="y4" fmla="*/ h adj7 100000" />
+ <gd name="x4" fmla="*/ w adj8 100000" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">
+ <pos x="x3" y="y3" />
+ </ahXY>
+ <ahXY gdRefX="adj8" minX="-2147483647" maxX="2147483647" gdRefY="adj7" minY="-2147483647" maxY="2147483647">
+ <pos x="x4" y="y4" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y4" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </borderCallout3>
+ <bracePair>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 8333" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 25000" />
+ <gd name="x1" fmla="*/ ss a 100000" />
+ <gd name="x2" fmla="*/ ss a 50000" />
+ <gd name="x3" fmla="+- r 0 x2" />
+ <gd name="x4" fmla="+- r 0 x1" />
+
+ <gd name="y2" fmla="+- vc 0 x1" />
+ <gd name="y3" fmla="+- vc x1 0" />
+ <gd name="y4" fmla="+- b 0 x1" />
+ <gd name="it" fmla="*/ x1 29289 100000" />
+
+ <gd name="il" fmla="+- x1 it 0" />
+ <gd name="ir" fmla="+- r 0 il" />
+ <gd name="ib" fmla="+- b 0 it" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="25000">
+ <pos x="l" y="x1" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="x2" y="b" />
+ </moveTo>
+ <arcTo wR="x1" hR="x1" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="0" swAng="-5400000" />
+ <arcTo wR="x1" hR="x1" stAng="cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="x1" y="x1" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="x3" y="t" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="x4" y="y2" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="cd2" swAng="-5400000" />
+ <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="x4" y="y4" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="0" swAng="cd4" />
+ <close />
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="x2" y="b" />
+ </moveTo>
+ <arcTo wR="x1" hR="x1" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="0" swAng="-5400000" />
+ <arcTo wR="x1" hR="x1" stAng="cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="x1" y="x1" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />
+ <moveTo>
+ <pt x="x3" y="t" />
+ </moveTo>
+ <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="x4" y="y2" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="cd2" swAng="-5400000" />
+ <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="x4" y="y4" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="0" swAng="cd4" />
+ </path>
+ </pathLst>
+
+ </bracePair>
+ <bracketPair>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 16667" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="x1" fmla="*/ ss a 100000" />
+ <gd name="x2" fmla="+- r 0 x1" />
+
+ <gd name="y2" fmla="+- b 0 x1" />
+ <gd name="il" fmla="*/ x1 29289 100000" />
+
+
+ <gd name="ir" fmla="+- r 0 il" />
+ <gd name="ib" fmla="+- b 0 il" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="50000">
+ <pos x="l" y="x1" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="x1" />
+ </moveTo>
+ <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="cd4" swAng="cd4" />
+ <close />
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="x1" y="b" />
+ </moveTo>
+ <arcTo wR="x1" hR="x1" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="l" y="x1" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />
+ <moveTo>
+ <pt x="x2" y="t" />
+ </moveTo>
+ <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="0" swAng="cd4" />
+ </path>
+ </pathLst>
+
+ </bracketPair>
+ <callout1>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="adj1" fmla="val 18750" />
+
+ <gd name="adj2" fmla="val -8333" />
+
+ <gd name="adj3" fmla="val 112500" />
+
+ <gd name="adj4" fmla="val -38333" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h adj1 100000" />
+ <gd name="x1" fmla="*/ w adj2 100000" />
+ <gd name="y2" fmla="*/ h adj3 100000" />
+ <gd name="x2" fmla="*/ w adj4 100000" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </callout1>
+ <callout2>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="adj1" fmla="val 18750" />
+
+ <gd name="adj2" fmla="val -8333" />
+
+ <gd name="adj3" fmla="val 18750" />
+
+ <gd name="adj4" fmla="val -16667" />
+
+ <gd name="adj5" fmla="val 112500" />
+
+ <gd name="adj6" fmla="val -46667" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h adj1 100000" />
+ <gd name="x1" fmla="*/ w adj2 100000" />
+ <gd name="y2" fmla="*/ h adj3 100000" />
+ <gd name="x2" fmla="*/ w adj4 100000" />
+ <gd name="y3" fmla="*/ h adj5 100000" />
+ <gd name="x3" fmla="*/ w adj6 100000" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">
+ <pos x="x3" y="y3" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </callout2>
+ <callout3>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="adj1" fmla="val 18750" />
+
+ <gd name="adj2" fmla="val -8333" />
+
+ <gd name="adj3" fmla="val 18750" />
+
+ <gd name="adj4" fmla="val -16667" />
+
+ <gd name="adj5" fmla="val 100000" />
+
+ <gd name="adj6" fmla="val -16667" />
+
+ <gd name="adj7" fmla="val 112963" />
+
+ <gd name="adj8" fmla="val -8333" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h adj1 100000" />
+ <gd name="x1" fmla="*/ w adj2 100000" />
+ <gd name="y2" fmla="*/ h adj3 100000" />
+ <gd name="x2" fmla="*/ w adj4 100000" />
+ <gd name="y3" fmla="*/ h adj5 100000" />
+ <gd name="x3" fmla="*/ w adj6 100000" />
+ <gd name="y4" fmla="*/ h adj7 100000" />
+ <gd name="x4" fmla="*/ w adj8 100000" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">
+ <pos x="x1" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">
+ <pos x="x2" y="y2" />
+ </ahXY>
+ <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">
+ <pos x="x3" y="y3" />
+ </ahXY>
+ <ahXY gdRefX="adj8" minX="-2147483647" maxX="2147483647" gdRefY="adj7" minY="-2147483647" maxY="2147483647">
+ <pos x="x4" y="y4" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y4" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </callout3>
+ <can>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 25000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj" fmla="*/ 50000 h ss" />
+ <gd name="a" fmla="pin 0 adj maxAdj" />
+ <gd name="y1" fmla="*/ ss a 200000" />
+ <gd name="y2" fmla="+- y1 y1 0" />
+ <gd name="y3" fmla="+- b 0 y1" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="maxAdj">
+ <pos x="hc" y="y2" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="y2" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="y2" r="r" b="y3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="y1" />
+ </moveTo>
+ <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="-10800000" />
+ <lnTo>
+ <pt x="r" y="y3" />
+ </lnTo>
+ <arcTo wR="wd2" hR="y1" stAng="0" swAng="cd2" />
+ <close />
+ </path>
+ <path stroke="false" fill="lighten" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="y1" />
+ </moveTo>
+ <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="cd2" />
+ <arcTo wR="wd2" hR="y1" stAng="0" swAng="cd2" />
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+
+ <moveTo>
+ <pt x="r" y="y1" />
+ </moveTo>
+ <arcTo wR="wd2" hR="y1" stAng="0" swAng="cd2" />
+ <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="cd2" />
+ <lnTo>
+ <pt x="r" y="y3" />
+ </lnTo>
+ <arcTo wR="wd2" hR="y1" stAng="0" swAng="cd2" />
+ <lnTo>
+ <pt x="l" y="y1" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </can>
+ <chartPlus>
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="10" h="10" fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="5" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="5" y="10" />
+ </lnTo>
+ <moveTo>
+ <pt x="0" y="5" />
+ </moveTo>
+ <lnTo>
+ <pt x="10" y="5" />
+ </lnTo>
+ </path>
+ <path w="10" h="10" stroke="false">
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="0" y="10" />
+ </lnTo>
+ <lnTo>
+ <pt x="10" y="10" />
+ </lnTo>
+ <lnTo>
+ <pt x="10" y="0" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </chartPlus>
+ <chartStar>
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="10" h="10" fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="10" y="10" />
+ </lnTo>
+ <moveTo>
+ <pt x="0" y="10" />
+ </moveTo>
+ <lnTo>
+ <pt x="10" y="0" />
+ </lnTo>
+ <moveTo>
+ <pt x="5" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="5" y="10" />
+ </lnTo>
+ </path>
+ <path w="10" h="10" stroke="false">
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="0" y="10" />
+ </lnTo>
+ <lnTo>
+ <pt x="10" y="10" />
+ </lnTo>
+ <lnTo>
+ <pt x="10" y="0" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </chartStar>
+ <chartX>
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="10" h="10" fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="10" y="10" />
+ </lnTo>
+ <moveTo>
+ <pt x="0" y="10" />
+ </moveTo>
+ <lnTo>
+ <pt x="10" y="0" />
+ </lnTo>
+ </path>
+ <path w="10" h="10" stroke="false">
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="0" y="10" />
+ </lnTo>
+ <lnTo>
+ <pt x="10" y="10" />
+ </lnTo>
+ <lnTo>
+ <pt x="10" y="0" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </chartX>
+ <chevron>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj" fmla="*/ 100000 w ss" />
+ <gd name="a" fmla="pin 0 adj maxAdj" />
+ <gd name="x1" fmla="*/ ss a 100000" />
+ <gd name="x2" fmla="+- r 0 x1" />
+ <gd name="x3" fmla="*/ x2 1 2" />
+ <gd name="dx" fmla="+- x2 0 x1" />
+ <gd name="il" fmla="?: dx x1 l" />
+ <gd name="ir" fmla="?: dx x2 r" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="maxAdj">
+ <pos x="x2" y="t" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x3" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+ <rect l="il" t="t" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="vc" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </chevron>
+ <chord>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 2700000" />
+
+ <gd name="adj2" fmla="val 16200000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="stAng" fmla="pin 0 adj1 21599999" />
+ <gd name="enAng" fmla="pin 0 adj2 21599999" />
+ <gd name="sw1" fmla="+- enAng 0 stAng" />
+
+ <gd name="sw2" fmla="+- sw1 21600000 0" />
+
+ <gd name="swAng" fmla="?: sw1 sw1 sw2" />
+
+ <gd name="wt1" fmla="sin wd2 stAng" />
+ <gd name="ht1" fmla="cos hd2 stAng" />
+ <gd name="dx1" fmla="cat2 wd2 ht1 wt1" />
+ <gd name="dy1" fmla="sat2 hd2 ht1 wt1" />
+ <gd name="wt2" fmla="sin wd2 enAng" />
+ <gd name="ht2" fmla="cos hd2 enAng" />
+ <gd name="dx2" fmla="cat2 wd2 ht2 wt2" />
+ <gd name="dy2" fmla="sat2 hd2 ht2 wt2" />
+ <gd name="x1" fmla="+- hc dx1 0" />
+
+ <gd name="y1" fmla="+- vc dy1 0" />
+
+ <gd name="x2" fmla="+- hc dx2 0" />
+
+ <gd name="y2" fmla="+- vc dy2 0" />
+
+ <gd name="x3" fmla="+/ x1 x2 2" />
+ <gd name="y3" fmla="+/ y1 y2 2" />
+ <gd name="midAng0" fmla="*/ swAng 1 2" />
+ <gd name="midAng" fmla="+- stAng midAng0 cd2" />
+ <gd name="idx" fmla="cos wd2 2700000" />
+ <gd name="idy" fmla="sin hd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefAng="adj1" minAng="0" maxAng="21599999">
+ <pos x="x1" y="y1" />
+ </ahPolar>
+ <ahPolar gdRefAng="adj2" minAng="0" maxAng="21599999">
+ <pos x="x2" y="y2" />
+ </ahPolar>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="stAng">
+ <pos x="x1" y="y1" />
+ </cxn>
+ <cxn ang="enAng">
+ <pos x="x2" y="y2" />
+ </cxn>
+ <cxn ang="midAng">
+ <pos x="x3" y="y3" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="stAng" swAng="swAng" />
+ <close />
+ </path>
+ </pathLst>
+
+ </chord>
+ <circularArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 12500" />
+
+ <gd name="adj2" fmla="val 1142319" />
+
+ <gd name="adj3" fmla="val 20457681" />
+
+ <gd name="adj4" fmla="val 10800000" />
+
+ <gd name="adj5" fmla="val 12500" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a5" fmla="pin 0 adj5 25000" />
+
+ <gd name="maxAdj1" fmla="*/ a5 2 1" />
+
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="enAng" fmla="pin 1 adj3 21599999" />
+ <gd name="stAng" fmla="pin 0 adj4 21599999" />
+
+ <gd name="th" fmla="*/ ss a1 100000" />
+
+ <gd name="thh" fmla="*/ ss a5 100000" />
+
+ <gd name="th2" fmla="*/ th 1 2" />
+
+
+ <gd name="rw1" fmla="+- wd2 th2 thh" />
+
+ <gd name="rh1" fmla="+- hd2 th2 thh" />
+
+ <gd name="rw2" fmla="+- rw1 0 th" />
+
+ <gd name="rh2" fmla="+- rh1 0 th" />
+
+ <gd name="rw3" fmla="+- rw2 th2 0" />
+
+ <gd name="rh3" fmla="+- rh2 th2 0" />
+
+
+ <gd name="wtH" fmla="sin rw3 enAng" />
+ <gd name="htH" fmla="cos rh3 enAng" />
+ <gd name="dxH" fmla="cat2 rw3 htH wtH" />
+ <gd name="dyH" fmla="sat2 rh3 htH wtH" />
+ <gd name="xH" fmla="+- hc dxH 0" />
+
+ <gd name="yH" fmla="+- vc dyH 0" />
+
+
+ <gd name="rI" fmla="min rw2 rh2" />
+
+ <gd name="u1" fmla="*/ dxH dxH 1" />
+ <gd name="u2" fmla="*/ dyH dyH 1" />
+ <gd name="u3" fmla="*/ rI rI 1" />
+ <gd name="u4" fmla="+- u1 0 u3" />
+ <gd name="u5" fmla="+- u2 0 u3" />
+ <gd name="u6" fmla="*/ u4 u5 u1" />
+ <gd name="u7" fmla="*/ u6 1 u2" />
+ <gd name="u8" fmla="+- 1 0 u7" />
+ <gd name="u9" fmla="sqrt u8" />
+ <gd name="u10" fmla="*/ u4 1 dxH" />
+ <gd name="u11" fmla="*/ u10 1 dyH" />
+ <gd name="u12" fmla="+/ 1 u9 u11" />
+ <gd name="u13" fmla="at2 1 u12" />
+ <gd name="u14" fmla="+- u13 21600000 0" />
+ <gd name="u15" fmla="?: u13 u13 u14" />
+ <gd name="u16" fmla="+- u15 0 enAng" />
+
+ <gd name="u17" fmla="+- u16 21600000 0" />
+ <gd name="u18" fmla="?: u16 u16 u17" />
+ <gd name="u19" fmla="+- u18 0 cd2" />
+ <gd name="u20" fmla="+- u18 0 21600000" />
+ <gd name="u21" fmla="?: u19 u20 u18" />
+ <gd name="maxAng" fmla="abs u21" />
+ <gd name="aAng" fmla="pin 0 adj2 maxAng" />
+
+ <gd name="ptAng" fmla="+- enAng aAng 0" />
+
+
+ <gd name="wtA" fmla="sin rw3 ptAng" />
+ <gd name="htA" fmla="cos rh3 ptAng" />
+ <gd name="dxA" fmla="cat2 rw3 htA wtA" />
+ <gd name="dyA" fmla="sat2 rh3 htA wtA" />
+ <gd name="xA" fmla="+- hc dxA 0" />
+
+ <gd name="yA" fmla="+- vc dyA 0" />
+
+
+ <gd name="wtE" fmla="sin rw1 stAng" />
+ <gd name="htE" fmla="cos rh1 stAng" />
+ <gd name="dxE" fmla="cat2 rw1 htE wtE" />
+ <gd name="dyE" fmla="sat2 rh1 htE wtE" />
+ <gd name="xE" fmla="+- hc dxE 0" />
+
+ <gd name="yE" fmla="+- vc dyE 0" />
+
+
+ <gd name="dxG" fmla="cos thh ptAng" />
+ <gd name="dyG" fmla="sin thh ptAng" />
+ <gd name="xG" fmla="+- xH dxG 0" />
+
+ <gd name="yG" fmla="+- yH dyG 0" />
+
+
+ <gd name="dxB" fmla="cos thh ptAng" />
+ <gd name="dyB" fmla="sin thh ptAng" />
+ <gd name="xB" fmla="+- xH 0 dxB 0" />
+
+ <gd name="yB" fmla="+- yH 0 dyB 0" />
+
+
+ <gd name="sx1" fmla="+- xB 0 hc" />
+
+ <gd name="sy1" fmla="+- yB 0 vc" />
+
+ <gd name="sx2" fmla="+- xG 0 hc" />
+
+ <gd name="sy2" fmla="+- yG 0 vc" />
+
+
+ <gd name="rO" fmla="min rw1 rh1" />
+
+ <gd name="x1O" fmla="*/ sx1 rO rw1" />
+
+ <gd name="y1O" fmla="*/ sy1 rO rh1" />
+
+ <gd name="x2O" fmla="*/ sx2 rO rw1" />
+
+ <gd name="y2O" fmla="*/ sy2 rO rh1" />
+
+
+ <gd name="dxO" fmla="+- x2O 0 x1O" />
+ <gd name="dyO" fmla="+- y2O 0 y1O" />
+ <gd name="dO" fmla="mod dxO dyO 0" />
+
+ <gd name="q1" fmla="*/ x1O y2O 1" />
+ <gd name="q2" fmla="*/ x2O y1O 1" />
+ <gd name="DO" fmla="+- q1 0 q2" />
+
+
+ <gd name="q3" fmla="*/ rO rO 1" />
+
+ <gd name="q4" fmla="*/ dO dO 1" />
+
+ <gd name="q5" fmla="*/ q3 q4 1" />
+
+ <gd name="q6" fmla="*/ DO DO 1" />
+
+ <gd name="q7" fmla="+- q5 0 q6" />
+
+ <gd name="q8" fmla="max q7 0" />
+
+ <gd name="sdelO" fmla="sqrt q8" />
+
+ <gd name="ndyO" fmla="*/ dyO -1 1" />
+ <gd name="sdyO" fmla="?: ndyO -1 1" />
+
+ <gd name="q9" fmla="*/ sdyO dxO 1" />
+
+ <gd name="q10" fmla="*/ q9 sdelO 1" />
+
+ <gd name="q11" fmla="*/ DO dyO 1" />
+
+ <gd name="dxF1" fmla="+/ q11 q10 q4" />
+
+ <gd name="q12" fmla="+- q11 0 q10" />
+ <gd name="dxF2" fmla="*/ q12 1 q4" />
+
+
+ <gd name="adyO" fmla="abs dyO" />
+ <gd name="q13" fmla="*/ adyO sdelO 1" />
+
+ <gd name="q14" fmla="*/ DO dxO -1" />
+
+ <gd name="dyF1" fmla="+/ q14 q13 q4" />
+
+ <gd name="q15" fmla="+- q14 0 q13" />
+ <gd name="dyF2" fmla="*/ q15 1 q4" />
+
+
+
+ <gd name="q16" fmla="+- x2O 0 dxF1" />
+ <gd name="q17" fmla="+- x2O 0 dxF2" />
+ <gd name="q18" fmla="+- y2O 0 dyF1" />
+ <gd name="q19" fmla="+- y2O 0 dyF2" />
+ <gd name="q20" fmla="mod q16 q18 0" />
+
+ <gd name="q21" fmla="mod q17 q19 0" />
+
+ <gd name="q22" fmla="+- q21 0 q20" />
+ <gd name="dxF" fmla="?: q22 dxF1 dxF2" />
+
+ <gd name="dyF" fmla="?: q22 dyF1 dyF2" />
+
+ <gd name="sdxF" fmla="*/ dxF rw1 rO" />
+
+ <gd name="sdyF" fmla="*/ dyF rh1 rO" />
+
+ <gd name="xF" fmla="+- hc sdxF 0" />
+
+ <gd name="yF" fmla="+- vc sdyF 0" />
+
+
+
+
+ <gd name="x1I" fmla="*/ sx1 rI rw2" />
+
+ <gd name="y1I" fmla="*/ sy1 rI rh2" />
+
+ <gd name="x2I" fmla="*/ sx2 rI rw2" />
+
+ <gd name="y2I" fmla="*/ sy2 rI rh2" />
+
+
+ <gd name="dxI" fmla="+- x2I 0 x1I" />
+ <gd name="dyI" fmla="+- y2I 0 y1I" />
+ <gd name="dI" fmla="mod dxI dyI 0" />
+ <gd name="v1" fmla="*/ x1I y2I 1" />
+ <gd name="v2" fmla="*/ x2I y1I 1" />
+ <gd name="DI" fmla="+- v1 0 v2" />
+
+ <gd name="v3" fmla="*/ rI rI 1" />
+ <gd name="v4" fmla="*/ dI dI 1" />
+ <gd name="v5" fmla="*/ v3 v4 1" />
+ <gd name="v6" fmla="*/ DI DI 1" />
+ <gd name="v7" fmla="+- v5 0 v6" />
+ <gd name="v8" fmla="max v7 0" />
+ <gd name="sdelI" fmla="sqrt v8" />
+ <gd name="v9" fmla="*/ sdyO dxI 1" />
+ <gd name="v10" fmla="*/ v9 sdelI 1" />
+ <gd name="v11" fmla="*/ DI dyI 1" />
+ <gd name="dxC1" fmla="+/ v11 v10 v4" />
+ <gd name="v12" fmla="+- v11 0 v10" />
+ <gd name="dxC2" fmla="*/ v12 1 v4" />
+
+ <gd name="adyI" fmla="abs dyI" />
+ <gd name="v13" fmla="*/ adyI sdelI 1" />
+ <gd name="v14" fmla="*/ DI dxI -1" />
+ <gd name="dyC1" fmla="+/ v14 v13 v4" />
+ <gd name="v15" fmla="+- v14 0 v13" />
+ <gd name="dyC2" fmla="*/ v15 1 v4" />
+
+ <gd name="v16" fmla="+- x1I 0 dxC1" />
+ <gd name="v17" fmla="+- x1I 0 dxC2" />
+ <gd name="v18" fmla="+- y1I 0 dyC1" />
+ <gd name="v19" fmla="+- y1I 0 dyC2" />
+ <gd name="v20" fmla="mod v16 v18 0" />
+ <gd name="v21" fmla="mod v17 v19 0" />
+ <gd name="v22" fmla="+- v21 0 v20" />
+ <gd name="dxC" fmla="?: v22 dxC1 dxC2" />
+ <gd name="dyC" fmla="?: v22 dyC1 dyC2" />
+ <gd name="sdxC" fmla="*/ dxC rw2 rI" />
+ <gd name="sdyC" fmla="*/ dyC rh2 rI" />
+ <gd name="xC" fmla="+- hc sdxC 0" />
+
+ <gd name="yC" fmla="+- vc sdyC 0" />
+
+
+ <gd name="ist0" fmla="at2 sdxC sdyC" />
+ <gd name="ist1" fmla="+- ist0 21600000 0" />
+ <gd name="istAng" fmla="?: ist0 ist0 ist1" />
+ <gd name="isw1" fmla="+- stAng 0 istAng" />
+ <gd name="isw2" fmla="+- isw1 0 21600000" />
+ <gd name="iswAng" fmla="?: isw1 isw2 isw1" />
+
+
+ <gd name="p1" fmla="+- xF 0 xC" />
+ <gd name="p2" fmla="+- yF 0 yC" />
+ <gd name="p3" fmla="mod p1 p2 0" />
+ <gd name="p4" fmla="*/ p3 1 2" />
+ <gd name="p5" fmla="+- p4 0 thh" />
+ <gd name="xGp" fmla="?: p5 xF xG" />
+ <gd name="yGp" fmla="?: p5 yF yG" />
+ <gd name="xBp" fmla="?: p5 xC xB" />
+ <gd name="yBp" fmla="?: p5 yC yB" />
+
+ <gd name="en0" fmla="at2 sdxF sdyF" />
+ <gd name="en1" fmla="+- en0 21600000 0" />
+ <gd name="en2" fmla="?: en0 en0 en1" />
+ <gd name="sw0" fmla="+- en2 0 stAng" />
+ <gd name="sw1" fmla="+- sw0 21600000 0" />
+ <gd name="swAng" fmla="?: sw0 sw0 sw1" />
+
+ <gd name="wtI" fmla="sin rw3 stAng" />
+ <gd name="htI" fmla="cos rh3 stAng" />
+ <gd name="dxI" fmla="cat2 rw3 htI wtI" />
+ <gd name="dyI" fmla="sat2 rh3 htI wtI" />
+ <gd name="xI" fmla="+- hc dxI 0" />
+
+ <gd name="yI" fmla="+- vc dyI 0" />
+
+
+ <gd name="aI" fmla="+- stAng 0 cd4" />
+ <gd name="aA" fmla="+- ptAng cd4 0" />
+ <gd name="aB" fmla="+- ptAng cd2 0" />
+
+ <gd name="idx" fmla="cos rw1 2700000" />
+ <gd name="idy" fmla="sin rh1 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefAng="adj2" minAng="0" maxAng="maxAng">
+ <pos x="xA" y="yA" />
+ </ahPolar>
+ <ahPolar gdRefAng="adj4" minAng="0" maxAng="21599999">
+ <pos x="xE" y="yE" />
+ </ahPolar>
+ <ahPolar gdRefR="adj1" minR="0" maxR="maxAdj1" gdRefAng="adj3" minAng="0" maxAng="21599999">
+ <pos x="xF" y="yF" />
+ </ahPolar>
+ <ahPolar gdRefR="adj5" minR="0" maxR="25000">
+ <pos x="xB" y="yB" />
+ </ahPolar>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="aI">
+ <pos x="xI" y="yI" />
+ </cxn>
+ <cxn ang="ptAng">
+ <pos x="xGp" y="yGp" />
+ </cxn>
+ <cxn ang="aA">
+ <pos x="xA" y="yA" />
+ </cxn>
+ <cxn ang="aB">
+ <pos x="xBp" y="yBp" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="xE" y="yE" />
+ </moveTo>
+ <arcTo wR="rw1" hR="rh1" stAng="stAng" swAng="swAng" />
+ <lnTo>
+ <pt x="xGp" y="yGp" />
+ </lnTo>
+ <lnTo>
+ <pt x="xA" y="yA" />
+ </lnTo>
+ <lnTo>
+ <pt x="xBp" y="yBp" />
+ </lnTo>
+ <lnTo>
+ <pt x="xC" y="yC" />
+ </lnTo>
+ <arcTo wR="rw2" hR="rh2" stAng="istAng" swAng="iswAng" />
+ <close />
+ </path>
+ </pathLst>
+
+ </circularArrow>
+ <cloud>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="il" fmla="*/ w 2977 21600" />
+ <gd name="it" fmla="*/ h 3262 21600" />
+ <gd name="ir" fmla="*/ w 17087 21600" />
+ <gd name="ib" fmla="*/ h 17337 21600" />
+ <gd name="g27" fmla="*/ w 67 21600" />
+ <gd name="g28" fmla="*/ h 21577 21600" />
+ <gd name="g29" fmla="*/ w 21582 21600" />
+ <gd name="g30" fmla="*/ h 1235 21600" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="g29" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="g28" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="g27" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="g30" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="43200" h="43200">
+ <moveTo>
+ <pt x="3900" y="14370" />
+ </moveTo>
+ <arcTo wR="6753" hR="9190" stAng="-11429249" swAng="7426832" />
+ <arcTo wR="5333" hR="7267" stAng="-8646143" swAng="5396714" />
+ <arcTo wR="4365" hR="5945" stAng="-8748475" swAng="5983381" />
+ <arcTo wR="4857" hR="6595" stAng="-7859164" swAng="7034504" />
+ <arcTo wR="5333" hR="7273" stAng="-4722533" swAng="6541615" />
+ <arcTo wR="6775" hR="9220" stAng="-2776035" swAng="7816140" />
+ <arcTo wR="5785" hR="7867" stAng="37501" swAng="6842000" />
+ <arcTo wR="6752" hR="9215" stAng="1347096" swAng="6910353" />
+ <arcTo wR="7720" hR="10543" stAng="3974558" swAng="4542661" />
+ <arcTo wR="4360" hR="5918" stAng="-16496525" swAng="8804134" />
+ <arcTo wR="4345" hR="5945" stAng="-14809710" swAng="9151131" />
+ <close />
+ </path>
+ <path w="43200" h="43200" fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="4693" y="26177" />
+ </moveTo>
+ <arcTo wR="4345" hR="5945" stAng="5204520" swAng="1585770" />
+ <moveTo>
+ <pt x="6928" y="34899" />
+ </moveTo>
+ <arcTo wR="4360" hR="5918" stAng="4416628" swAng="686848" />
+ <moveTo>
+ <pt x="16478" y="39090" />
+ </moveTo>
+ <arcTo wR="6752" hR="9215" stAng="8257449" swAng="844866" />
+ <moveTo>
+ <pt x="28827" y="34751" />
+ </moveTo>
+ <arcTo wR="6752" hR="9215" stAng="387196" swAng="959901" />
+ <moveTo>
+ <pt x="34129" y="22954" />
+ </moveTo>
+ <arcTo wR="5785" hR="7867" stAng="-4217541" swAng="4255042" />
+ <moveTo>
+ <pt x="41798" y="15354" />
+ </moveTo>
+ <arcTo wR="5333" hR="7273" stAng="1819082" swAng="1665090" />
+ <moveTo>
+ <pt x="38324" y="5426" />
+ </moveTo>
+ <arcTo wR="4857" hR="6595" stAng="-824660" swAng="891534" />
+ <moveTo>
+ <pt x="29078" y="3952" />
+ </moveTo>
+ <arcTo wR="4857" hR="6595" stAng="-8950887" swAng="1091722" />
+ <moveTo>
+ <pt x="22141" y="4720" />
+ </moveTo>
+ <arcTo wR="4365" hR="5945" stAng="-9809656" swAng="1061181" />
+ <moveTo>
+ <pt x="14000" y="5192" />
+ </moveTo>
+ <arcTo wR="6753" hR="9190" stAng="-4002417" swAng="739161" />
+ <moveTo>
+ <pt x="4127" y="15789" />
+ </moveTo>
+ <arcTo wR="6753" hR="9190" stAng="9459261" swAng="711490" />
+ </path>
+ </pathLst>
+
+ </cloud>
+ <cloudCallout>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val -20833" />
+
+ <gd name="adj2" fmla="val 62500" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dxPos" fmla="*/ w adj1 100000" />
+ <gd name="dyPos" fmla="*/ h adj2 100000" />
+ <gd name="xPos" fmla="+- hc dxPos 0" />
+ <gd name="yPos" fmla="+- vc dyPos 0" />
+ <gd name="ht" fmla="cat2 hd2 dxPos dyPos" />
+ <gd name="wt" fmla="sat2 wd2 dxPos dyPos" />
+ <gd name="g2" fmla="cat2 wd2 ht wt" />
+ <gd name="g3" fmla="sat2 hd2 ht wt" />
+ <gd name="g4" fmla="+- hc g2 0" />
+
+ <gd name="g5" fmla="+- vc g3 0" />
+
+ <gd name="g6" fmla="+- g4 0 xPos" />
+
+ <gd name="g7" fmla="+- g5 0 yPos" />
+
+ <gd name="g8" fmla="mod g6 g7 0" />
+
+ <gd name="g9" fmla="*/ ss 6600 21600" />
+
+ <gd name="g10" fmla="+- g8 0 g9" />
+
+ <gd name="g11" fmla="*/ g10 1 3" />
+
+ <gd name="g12" fmla="*/ ss 1800 21600" />
+
+ <gd name="g13" fmla="+- g11 g12 0" />
+
+ <gd name="g14" fmla="*/ g13 g6 g8" />
+
+ <gd name="g15" fmla="*/ g13 g7 g8" />
+
+ <gd name="g16" fmla="+- g14 xPos 0" />
+
+ <gd name="g17" fmla="+- g15 yPos 0" />
+
+ <gd name="g18" fmla="*/ ss 4800 21600" />
+
+ <gd name="g19" fmla="*/ g11 2 1" />
+
+ <gd name="g20" fmla="+- g18 g19 0" />
+
+ <gd name="g21" fmla="*/ g20 g6 g8" />
+ <gd name="g22" fmla="*/ g20 g7 g8" />
+ <gd name="g23" fmla="+- g21 xPos 0" />
+ <gd name="g24" fmla="+- g22 yPos 0" />
+ <gd name="g25" fmla="*/ ss 1200 21600" />
+ <gd name="g26" fmla="*/ ss 600 21600" />
+
+ <gd name="x23" fmla="+- xPos g26 0" />
+ <gd name="x24" fmla="+- g16 g25 0" />
+ <gd name="x25" fmla="+- g23 g12 0" />
+ <gd name="il" fmla="*/ w 2977 21600" />
+ <gd name="it" fmla="*/ h 3262 21600" />
+ <gd name="ir" fmla="*/ w 17087 21600" />
+ <gd name="ib" fmla="*/ h 17337 21600" />
+
+ <gd name="g27" fmla="*/ w 67 21600" />
+ <gd name="g28" fmla="*/ h 21577 21600" />
+ <gd name="g29" fmla="*/ w 21582 21600" />
+ <gd name="g30" fmla="*/ h 1235 21600" />
+ <gd name="pang" fmla="at2 dxPos dyPos" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647" gdRefY="adj2" minY="-2147483647" maxY="2147483647">
+ <pos x="xPos" y="yPos" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd2">
+ <pos x="g27" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="g28" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="g29" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="g30" />
+ </cxn>
+ <cxn ang="pang">
+ <pos x="xPos" y="yPos" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="43200" h="43200">
+ <moveTo>
+ <pt x="3900" y="14370" />
+ </moveTo>
+ <arcTo wR="6753" hR="9190" stAng="-11429249" swAng="7426832" />
+ <arcTo wR="5333" hR="7267" stAng="-8646143" swAng="5396714" />
+ <arcTo wR="4365" hR="5945" stAng="-8748475" swAng="5983381" />
+ <arcTo wR="4857" hR="6595" stAng="-7859164" swAng="7034504" />
+ <arcTo wR="5333" hR="7273" stAng="-4722533" swAng="6541615" />
+ <arcTo wR="6775" hR="9220" stAng="-2776035" swAng="7816140" />
+ <arcTo wR="5785" hR="7867" stAng="37501" swAng="6842000" />
+ <arcTo wR="6752" hR="9215" stAng="1347096" swAng="6910353" />
+ <arcTo wR="7720" hR="10543" stAng="3974558" swAng="4542661" />
+ <arcTo wR="4360" hR="5918" stAng="-16496525" swAng="8804134" />
+ <arcTo wR="4345" hR="5945" stAng="-14809710" swAng="9151131" />
+ <close />
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x23" y="yPos" />
+ </moveTo>
+ <arcTo wR="g26" hR="g26" stAng="0" swAng="21600000" />
+ <close />
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x24" y="g17" />
+ </moveTo>
+ <arcTo wR="g25" hR="g25" stAng="0" swAng="21600000" />
+ <close />
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x25" y="g24" />
+ </moveTo>
+ <arcTo wR="g12" hR="g12" stAng="0" swAng="21600000" />
+ <close />
+ </path>
+ <path w="43200" h="43200" fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="4693" y="26177" />
+ </moveTo>
+ <arcTo wR="4345" hR="5945" stAng="5204520" swAng="1585770" />
+ <moveTo>
+ <pt x="6928" y="34899" />
+ </moveTo>
+ <arcTo wR="4360" hR="5918" stAng="4416628" swAng="686848" />
+ <moveTo>
+ <pt x="16478" y="39090" />
+ </moveTo>
+ <arcTo wR="6752" hR="9215" stAng="8257449" swAng="844866" />
+ <moveTo>
+ <pt x="28827" y="34751" />
+ </moveTo>
+ <arcTo wR="6752" hR="9215" stAng="387196" swAng="959901" />
+ <moveTo>
+ <pt x="34129" y="22954" />
+ </moveTo>
+ <arcTo wR="5785" hR="7867" stAng="-4217541" swAng="4255042" />
+ <moveTo>
+ <pt x="41798" y="15354" />
+ </moveTo>
+ <arcTo wR="5333" hR="7273" stAng="1819082" swAng="1665090" />
+ <moveTo>
+ <pt x="38324" y="5426" />
+ </moveTo>
+ <arcTo wR="4857" hR="6595" stAng="-824660" swAng="891534" />
+ <moveTo>
+ <pt x="29078" y="3952" />
+ </moveTo>
+ <arcTo wR="4857" hR="6595" stAng="-8950887" swAng="1091722" />
+ <moveTo>
+ <pt x="22141" y="4720" />
+ </moveTo>
+ <arcTo wR="4365" hR="5945" stAng="-9809656" swAng="1061181" />
+ <moveTo>
+ <pt x="14000" y="5192" />
+ </moveTo>
+ <arcTo wR="6753" hR="9190" stAng="-4002417" swAng="739161" />
+ <moveTo>
+ <pt x="4127" y="15789" />
+ </moveTo>
+ <arcTo wR="6753" hR="9190" stAng="9459261" swAng="711490" />
+ </path>
+ </pathLst>
+
+ </cloudCallout>
+ <corner>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj1" fmla="*/ 100000 h ss" />
+ <gd name="maxAdj2" fmla="*/ 100000 w ss" />
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="x1" fmla="*/ ss a2 100000" />
+ <gd name="dy1" fmla="*/ ss a1 100000" />
+ <gd name="y1" fmla="+- b 0 dy1" />
+ <gd name="cx1" fmla="*/ x1 1 2" />
+ <gd name="cy1" fmla="+/ y1 b 2" />
+ <gd name="d" fmla="+- w 0 h" />
+ <gd name="it" fmla="?: d y1 t" />
+ <gd name="ir" fmla="?: d r x1" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">
+ <pos x="l" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="cy1" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="cx1" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="it" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </corner>
+ <cornerTabs>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="md" fmla="mod w h 0" />
+ <gd name="dx" fmla="*/ 1 md 20" />
+
+ <gd name="y1" fmla="+- 0 b dx" />
+
+ <gd name="x1" fmla="+- 0 r dx" />
+
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd2">
+ <pos x="l" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="dx" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y1" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="b" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="dx" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x1" y="t" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="dx" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x1" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="t" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="dx" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y1" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="b" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="dx" t="dx" r="x1" b="y1" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="dx" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="dx" />
+ </lnTo>
+ <close />
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="dx" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x1" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="dx" />
+ </lnTo>
+ <close />
+ </path>
+ <path>
+ <moveTo>
+ <pt x="r" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </cornerTabs>
+ <cube>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 25000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 100000" />
+ <gd name="y1" fmla="*/ ss a 100000" />
+ <gd name="y4" fmla="+- b 0 y1" />
+ <gd name="y2" fmla="*/ y4 1 2" />
+ <gd name="y3" fmla="+/ y1 b 2" />
+ <gd name="x4" fmla="+- r 0 y1" />
+ <gd name="x2" fmla="*/ x4 1 2" />
+ <gd name="x3" fmla="+/ y1 r 2" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="100000">
+ <pos x="l" y="y1" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x3" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x2" y="y1" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x2" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x4" y="y3" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y2" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="y1" r="x4" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darkenLess" extrusionOk="false">
+ <moveTo>
+ <pt x="x4" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="lightenLess" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="y1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="y1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="l" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <moveTo>
+ <pt x="x4" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x4" y="b" />
+ </lnTo>
+ </path>
+ </pathLst>
+ </cube>
+ <curvedConnector2>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <cubicBezTo>
+ <pt x="wd2" y="t" />
+ <pt x="r" y="hd2" />
+ <pt x="r" y="b" />
+ </cubicBezTo>
+ </path>
+ </pathLst>
+ </curvedConnector2>
+ <curvedConnector3>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x2" fmla="*/ w adj1 100000" />
+ <gd name="x1" fmla="+/ l x2 2" />
+ <gd name="x3" fmla="+/ r x2 2" />
+ <gd name="y3" fmla="*/ h 3 4" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647">
+ <pos x="x2" y="vc" />
+ </ahXY>
+ </ahLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x1" y="t" />
+ <pt x="x2" y="hd4" />
+ <pt x="x2" y="vc" />
+ </cubicBezTo>
+ <cubicBezTo>
+ <pt x="x2" y="y3" />
+ <pt x="x3" y="b" />
+ <pt x="r" y="b" />
+ </cubicBezTo>
+ </path>
+ </pathLst>
+ </curvedConnector3>
+ <curvedConnector4>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+ <gd name="adj2" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x2" fmla="*/ w adj1 100000" />
+ <gd name="x1" fmla="+/ l x2 2" />
+ <gd name="x3" fmla="+/ r x2 2" />
+ <gd name="x4" fmla="+/ x2 x3 2" />
+ <gd name="x5" fmla="+/ x3 r 2" />
+ <gd name="y4" fmla="*/ h adj2 100000" />
+ <gd name="y1" fmla="+/ t y4 2" />
+ <gd name="y2" fmla="+/ t y1 2" />
+ <gd name="y3" fmla="+/ y1 y4 2" />
+ <gd name="y5" fmla="+/ b y4 2" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647">
+ <pos x="x2" y="y1" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="-2147483647" maxY="2147483647">
+ <pos x="x3" y="y4" />
+ </ahXY>
+ </ahLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x1" y="t" />
+ <pt x="x2" y="y2" />
+ <pt x="x2" y="y1" />
+ </cubicBezTo>
+ <cubicBezTo>
+ <pt x="x2" y="y3" />
+ <pt x="x4" y="y4" />
+ <pt x="x3" y="y4" />
+ </cubicBezTo>
+ <cubicBezTo>
+ <pt x="x5" y="y4" />
+ <pt x="r" y="y5" />
+ <pt x="r" y="b" />
+ </cubicBezTo>
+ </path>
+ </pathLst>
+ </curvedConnector4>
+ <curvedConnector5>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ <gd name="adj3" fmla="val 50000" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x3" fmla="*/ w adj1 100000" />
+ <gd name="x6" fmla="*/ w adj3 100000" />
+ <gd name="x1" fmla="+/ x3 x6 2" />
+ <gd name="x2" fmla="+/ l x3 2" />
+ <gd name="x4" fmla="+/ x3 x1 2" />
+ <gd name="x5" fmla="+/ x6 x1 2" />
+ <gd name="x7" fmla="+/ x6 r 2" />
+ <gd name="y4" fmla="*/ h adj2 100000" />
+ <gd name="y1" fmla="+/ t y4 2" />
+ <gd name="y2" fmla="+/ t y1 2" />
+ <gd name="y3" fmla="+/ y1 y4 2" />
+ <gd name="y5" fmla="+/ b y4 2" />
+ <gd name="y6" fmla="+/ y5 y4 2" />
+ <gd name="y7" fmla="+/ y5 b 2" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647">
+ <pos x="x3" y="y1" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="-2147483647" maxY="2147483647">
+ <pos x="x1" y="y4" />
+ </ahXY>
+ <ahXY gdRefX="adj3" minX="-2147483647" maxX="2147483647">
+ <pos x="x6" y="y5" />
+ </ahXY>
+ </ahLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x2" y="t" />
+ <pt x="x3" y="y2" />
+ <pt x="x3" y="y1" />
+ </cubicBezTo>
+ <cubicBezTo>
+ <pt x="x3" y="y3" />
+ <pt x="x4" y="y4" />
+ <pt x="x1" y="y4" />
+ </cubicBezTo>
+ <cubicBezTo>
+ <pt x="x5" y="y4" />
+ <pt x="x6" y="y6" />
+ <pt x="x6" y="y5" />
+ </cubicBezTo>
+ <cubicBezTo>
+ <pt x="x6" y="y7" />
+ <pt x="x7" y="b" />
+ <pt x="r" y="b" />
+ </cubicBezTo>
+ </path>
+ </pathLst>
+
+ </curvedConnector5>
+ <curvedDownArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 50000 w ss" />
+
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="a1" fmla="pin 0 adj1 100000" />
+ <gd name="th" fmla="*/ ss a1 100000" />
+
+ <gd name="aw" fmla="*/ ss a2 100000" />
+
+ <gd name="q1" fmla="+/ th aw 4" />
+
+ <gd name="wR" fmla="+- wd2 0 q1" />
+
+ <gd name="q7" fmla="*/ wR 2 1" />
+
+ <gd name="q8" fmla="*/ q7 q7 1" />
+
+ <gd name="q9" fmla="*/ th th 1" />
+
+ <gd name="q10" fmla="+- q8 0 q9" />
+ <gd name="q11" fmla="sqrt q10" />
+ <gd name="idy" fmla="*/ q11 h q7" />
+ <gd name="maxAdj3" fmla="*/ 100000 idy ss" />
+
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="ah" fmla="*/ ss adj3 100000" />
+
+
+
+
+
+ <gd name="x3" fmla="+- wR th 0" />
+
+ <gd name="q2" fmla="*/ h h 1" />
+ <gd name="q3" fmla="*/ ah ah 1" />
+ <gd name="q4" fmla="+- q2 0 q3" />
+ <gd name="q5" fmla="sqrt q4" />
+ <gd name="dx" fmla="*/ q5 wR h" />
+ <gd name="x5" fmla="+- wR dx 0" />
+
+ <gd name="x7" fmla="+- x3 dx 0" />
+
+ <gd name="q6" fmla="+- aw 0 th" />
+ <gd name="dh" fmla="*/ q6 1 2" />
+
+ <gd name="x4" fmla="+- x5 0 dh" />
+
+ <gd name="x8" fmla="+- x7 dh 0" />
+
+ <gd name="aw2" fmla="*/ aw 1 2" />
+ <gd name="x6" fmla="+- r 0 aw2" />
+
+ <gd name="y1" fmla="+- b 0 ah" />
+ <gd name="swAng" fmla="at2 ah dx" />
+
+ <gd name="mswAng" fmla="+- 0 0 swAng" />
+ <gd name="iy" fmla="+- b 0 idy" />
+
+ <gd name="ix" fmla="+/ wR x3 2" />
+
+ <gd name="q12" fmla="*/ th 1 2" />
+ <gd name="dang2" fmla="at2 idy q12" />
+ <gd name="stAng" fmla="+- 3cd4 swAng 0" />
+ <gd name="stAng2" fmla="+- 3cd4 0 dang2" />
+ <gd name="swAng2" fmla="+- dang2 0 cd4" />
+ <gd name="swAng3" fmla="+- cd4 dang2 0" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="adj2">
+ <pos x="x7" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="x4" y="b" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">
+ <pos x="r" y="y1" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="ix" y="t" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="q12" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x4" y="y1" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x6" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x8" y="y1" />
+ </cxn>
+ </cxnLst>
+
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="x6" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y1" />
+ </lnTo>
+ <arcTo wR="wR" hR="h" stAng="stAng" swAng="mswAng" />
+ <lnTo>
+ <pt x="x3" y="t" />
+ </lnTo>
+ <arcTo wR="wR" hR="h" stAng="3cd4" swAng="swAng" />
+ <lnTo>
+ <pt x="x8" y="y1" />
+ </lnTo>
+ <close />
+ </path>
+
+ <path fill="darkenLess" stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="ix" y="iy" />
+ </moveTo>
+ <arcTo wR="wR" hR="h" stAng="stAng2" swAng="swAng2" />
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <arcTo wR="wR" hR="h" stAng="cd2" swAng="swAng3" />
+ <close />
+ </path>
+
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="ix" y="iy" />
+ </moveTo>
+ <arcTo wR="wR" hR="h" stAng="stAng2" swAng="swAng2" />
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <arcTo wR="wR" hR="h" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="x3" y="t" />
+ </lnTo>
+ <arcTo wR="wR" hR="h" stAng="3cd4" swAng="swAng" />
+ <lnTo>
+ <pt x="x8" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y1" />
+ </lnTo>
+ <arcTo wR="wR" hR="h" stAng="stAng" swAng="mswAng" />
+ </path>
+ </pathLst>
+
+ </curvedDownArrow>
+ <curvedLeftArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 50000 h ss" />
+
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="a1" fmla="pin 0 adj1 a2" />
+ <gd name="th" fmla="*/ ss a1 100000" />
+
+ <gd name="aw" fmla="*/ ss a2 100000" />
+
+ <gd name="q1" fmla="+/ th aw 4" />
+
+ <gd name="hR" fmla="+- hd2 0 q1" />
+
+ <gd name="q7" fmla="*/ hR 2 1" />
+
+ <gd name="q8" fmla="*/ q7 q7 1" />
+
+ <gd name="q9" fmla="*/ th th 1" />
+
+ <gd name="q10" fmla="+- q8 0 q9" />
+ <gd name="q11" fmla="sqrt q10" />
+ <gd name="idx" fmla="*/ q11 w q7" />
+ <gd name="maxAdj3" fmla="*/ 100000 idx ss" />
+
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="ah" fmla="*/ ss a3 100000" />
+
+
+
+
+
+ <gd name="y3" fmla="+- hR th 0" />
+
+ <gd name="q2" fmla="*/ w w 1" />
+ <gd name="q3" fmla="*/ ah ah 1" />
+ <gd name="q4" fmla="+- q2 0 q3" />
+ <gd name="q5" fmla="sqrt q4" />
+ <gd name="dy" fmla="*/ q5 hR w" />
+ <gd name="y5" fmla="+- hR dy 0" />
+
+ <gd name="y7" fmla="+- y3 dy 0" />
+
+ <gd name="q6" fmla="+- aw 0 th" />
+ <gd name="dh" fmla="*/ q6 1 2" />
+
+ <gd name="y4" fmla="+- y5 0 dh" />
+
+ <gd name="y8" fmla="+- y7 dh 0" />
+
+ <gd name="aw2" fmla="*/ aw 1 2" />
+ <gd name="y6" fmla="+- b 0 aw2" />
+
+ <gd name="x1" fmla="+- l ah 0" />
+ <gd name="swAng" fmla="at2 ah dy" />
+
+ <gd name="mswAng" fmla="+- 0 0 swAng" />
+ <gd name="ix" fmla="+- l idx 0" />
+
+ <gd name="iy" fmla="+/ hR y3 2" />
+
+ <gd name="q12" fmla="*/ th 1 2" />
+ <gd name="dang2" fmla="at2 idx q12" />
+ <gd name="swAng2" fmla="+- dang2 0 swAng" />
+ <gd name="swAng3" fmla="+- swAng dang2 0" />
+ <gd name="stAng3" fmla="+- 0 0 dang2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="a2">
+ <pos x="x1" y="y5" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">
+ <pos x="r" y="y4" />
+ </ahXY>
+ <ahXY gdRefX="adj3" minX="0" maxX="maxAdj3">
+ <pos x="x1" y="b" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd2">
+ <pos x="l" y="q12" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y4" />
+ </cxn>
+ <cxn ang="cd3">
+ <pos x="l" y="y6" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x1" y="y8" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="iy" />
+ </cxn>
+ </cxnLst>
+
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="y6" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y5" />
+ </lnTo>
+ <arcTo wR="w" hR="hR" stAng="swAng" swAng="swAng2" />
+ <arcTo wR="w" hR="hR" stAng="stAng3" swAng="swAng3" />
+ <lnTo>
+ <pt x="x1" y="y8" />
+ </lnTo>
+ <close />
+ </path>
+
+ <path fill="darkenLess" stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="r" y="y3" />
+ </moveTo>
+ <arcTo wR="w" hR="hR" stAng="0" swAng="-5400000" />
+ <lnTo>
+ <pt x="l" y="t" />
+ </lnTo>
+ <arcTo wR="w" hR="hR" stAng="3cd4" swAng="cd4" />
+ <close />
+ </path>
+
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="r" y="y3" />
+ </moveTo>
+ <arcTo wR="w" hR="hR" stAng="0" swAng="-5400000" />
+ <lnTo>
+ <pt x="l" y="t" />
+ </lnTo>
+ <arcTo wR="w" hR="hR" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="y3" />
+ </lnTo>
+ <arcTo wR="w" hR="hR" stAng="0" swAng="swAng" />
+ <lnTo>
+ <pt x="x1" y="y8" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y5" />
+ </lnTo>
+ <arcTo wR="w" hR="hR" stAng="swAng" swAng="swAng2" />
+ </path>
+ </pathLst>
+
+ </curvedLeftArrow>
+ <curvedRightArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 50000 h ss" />
+
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="a1" fmla="pin 0 adj1 a2" />
+ <gd name="th" fmla="*/ ss a1 100000" />
+
+ <gd name="aw" fmla="*/ ss a2 100000" />
+
+ <gd name="q1" fmla="+/ th aw 4" />
+
+ <gd name="hR" fmla="+- hd2 0 q1" />
+
+ <gd name="q7" fmla="*/ hR 2 1" />
+
+ <gd name="q8" fmla="*/ q7 q7 1" />
+
+ <gd name="q9" fmla="*/ th th 1" />
+
+ <gd name="q10" fmla="+- q8 0 q9" />
+ <gd name="q11" fmla="sqrt q10" />
+ <gd name="idx" fmla="*/ q11 w q7" />
+ <gd name="maxAdj3" fmla="*/ 100000 idx ss" />
+
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="ah" fmla="*/ ss a3 100000" />
+
+
+
+
+
+ <gd name="y3" fmla="+- hR th 0" />
+
+ <gd name="q2" fmla="*/ w w 1" />
+ <gd name="q3" fmla="*/ ah ah 1" />
+ <gd name="q4" fmla="+- q2 0 q3" />
+ <gd name="q5" fmla="sqrt q4" />
+ <gd name="dy" fmla="*/ q5 hR w" />
+ <gd name="y5" fmla="+- hR dy 0" />
+
+ <gd name="y7" fmla="+- y3 dy 0" />
+
+ <gd name="q6" fmla="+- aw 0 th" />
+ <gd name="dh" fmla="*/ q6 1 2" />
+
+ <gd name="y4" fmla="+- y5 0 dh" />
+
+ <gd name="y8" fmla="+- y7 dh 0" />
+
+ <gd name="aw2" fmla="*/ aw 1 2" />
+ <gd name="y6" fmla="+- b 0 aw2" />
+
+ <gd name="x1" fmla="+- r 0 ah" />
+ <gd name="swAng" fmla="at2 ah dy" />
+
+ <gd name="stAng" fmla="+- cd2 0 swAng" />
+ <gd name="mswAng" fmla="+- 0 0 swAng" />
+ <gd name="ix" fmla="+- r 0 idx" />
+
+ <gd name="iy" fmla="+/ hR y3 2" />
+
+ <gd name="q12" fmla="*/ th 1 2" />
+ <gd name="dang2" fmla="at2 idx q12" />
+ <gd name="swAng2" fmla="+- dang2 0 cd4" />
+ <gd name="swAng3" fmla="+- cd4 dang2 0" />
+ <gd name="stAng3" fmla="+- cd2 0 dang2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="a2">
+ <pos x="x1" y="y5" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">
+ <pos x="r" y="y4" />
+ </ahXY>
+ <ahXY gdRefX="adj3" minX="0" maxX="maxAdj3">
+ <pos x="x1" y="b" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd2">
+ <pos x="l" y="iy" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x1" y="y8" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y6" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x1" y="y4" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="q12" />
+ </cxn>
+ </cxnLst>
+
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="hR" />
+ </moveTo>
+ <arcTo wR="w" hR="hR" stAng="cd2" swAng="mswAng" />
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y8" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y7" />
+ </lnTo>
+ <arcTo wR="w" hR="hR" stAng="stAng" swAng="swAng" />
+ <close />
+ </path>
+
+ <path fill="darkenLess" stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="r" y="th" />
+ </moveTo>
+ <arcTo wR="w" hR="hR" stAng="3cd4" swAng="swAng2" />
+ <arcTo wR="w" hR="hR" stAng="stAng3" swAng="swAng3" />
+ <close />
+ </path>
+
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="hR" />
+ </moveTo>
+ <arcTo wR="w" hR="hR" stAng="cd2" swAng="mswAng" />
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y8" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y7" />
+ </lnTo>
+ <arcTo wR="w" hR="hR" stAng="stAng" swAng="swAng" />
+ <lnTo>
+ <pt x="l" y="hR" />
+ </lnTo>
+ <arcTo wR="w" hR="hR" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="th" />
+ </lnTo>
+ <arcTo wR="w" hR="hR" stAng="3cd4" swAng="swAng2" />
+ </path>
+ </pathLst>
+
+ </curvedRightArrow>
+ <curvedUpArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 50000 w ss" />
+
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="a1" fmla="pin 0 adj1 100000" />
+ <gd name="th" fmla="*/ ss a1 100000" />
+
+ <gd name="aw" fmla="*/ ss a2 100000" />
+
+ <gd name="q1" fmla="+/ th aw 4" />
+
+ <gd name="wR" fmla="+- wd2 0 q1" />
+
+ <gd name="q7" fmla="*/ wR 2 1" />
+
+ <gd name="q8" fmla="*/ q7 q7 1" />
+
+ <gd name="q9" fmla="*/ th th 1" />
+
+ <gd name="q10" fmla="+- q8 0 q9" />
+ <gd name="q11" fmla="sqrt q10" />
+ <gd name="idy" fmla="*/ q11 h q7" />
+ <gd name="maxAdj3" fmla="*/ 100000 idy ss" />
+
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="ah" fmla="*/ ss adj3 100000" />
+
+
+
+
+
+ <gd name="x3" fmla="+- wR th 0" />
+
+ <gd name="q2" fmla="*/ h h 1" />
+ <gd name="q3" fmla="*/ ah ah 1" />
+ <gd name="q4" fmla="+- q2 0 q3" />
+ <gd name="q5" fmla="sqrt q4" />
+ <gd name="dx" fmla="*/ q5 wR h" />
+ <gd name="x5" fmla="+- wR dx 0" />
+
+ <gd name="x7" fmla="+- x3 dx 0" />
+
+ <gd name="q6" fmla="+- aw 0 th" />
+ <gd name="dh" fmla="*/ q6 1 2" />
+
+ <gd name="x4" fmla="+- x5 0 dh" />
+
+ <gd name="x8" fmla="+- x7 dh 0" />
+
+ <gd name="aw2" fmla="*/ aw 1 2" />
+ <gd name="x6" fmla="+- r 0 aw2" />
+
+ <gd name="y1" fmla="+- t ah 0" />
+ <gd name="swAng" fmla="at2 ah dx" />
+
+ <gd name="mswAng" fmla="+- 0 0 swAng" />
+ <gd name="iy" fmla="+- t idy 0" />
+
+ <gd name="ix" fmla="+/ wR x3 2" />
+
+ <gd name="q12" fmla="*/ th 1 2" />
+ <gd name="dang2" fmla="at2 idy q12" />
+ <gd name="swAng2" fmla="+- dang2 0 swAng" />
+ <gd name="mswAng2" fmla="+- 0 0 swAng2" />
+ <gd name="stAng3" fmla="+- cd4 0 swAng" />
+ <gd name="swAng3" fmla="+- swAng dang2 0" />
+ <gd name="stAng2" fmla="+- cd4 0 dang2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="a2">
+ <pos x="x7" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="x4" y="t" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">
+ <pos x="r" y="y1" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x6" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x4" y="y1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="q12" y="t" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="ix" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x8" y="y1" />
+ </cxn>
+ </cxnLst>
+
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="x6" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x8" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x7" y="y1" />
+ </lnTo>
+ <arcTo wR="wR" hR="h" stAng="stAng3" swAng="swAng3" />
+ <arcTo wR="wR" hR="h" stAng="stAng2" swAng="swAng2" />
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <close />
+ </path>
+
+ <path fill="darkenLess" stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="wR" y="b" />
+ </moveTo>
+ <arcTo wR="wR" hR="h" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="th" y="t" />
+ </lnTo>
+ <arcTo wR="wR" hR="h" stAng="cd2" swAng="-5400000" />
+ <close />
+ </path>
+
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="ix" y="iy" />
+ </moveTo>
+ <arcTo wR="wR" hR="h" stAng="stAng2" swAng="swAng2" />
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x7" y="y1" />
+ </lnTo>
+ <arcTo wR="wR" hR="h" stAng="stAng3" swAng="swAng" />
+ <lnTo>
+ <pt x="wR" y="b" />
+ </lnTo>
+ <arcTo wR="wR" hR="h" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="th" y="t" />
+ </lnTo>
+ <arcTo wR="wR" hR="h" stAng="cd2" swAng="-5400000" />
+ </path>
+ </pathLst>
+
+ </curvedUpArrow>
+ <decagon>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="vf" fmla="val 105146" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="shd2" fmla="*/ hd2 vf 100000" />
+ <gd name="dx1" fmla="cos wd2 2160000" />
+ <gd name="dx2" fmla="cos wd2 4320000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x3" fmla="+- hc dx2 0" />
+ <gd name="x4" fmla="+- hc dx1 0" />
+ <gd name="dy1" fmla="sin shd2 4320000" />
+ <gd name="dy2" fmla="sin shd2 2160000" />
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc 0 dy2" />
+ <gd name="y3" fmla="+- vc dy2 0" />
+ <gd name="y4" fmla="+- vc dy1 0" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x4" y="y2" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x4" y="y3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="y4" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x2" y="y4" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y3" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y2" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x2" y="y1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x3" y="y1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x1" t="y2" r="x4" b="y3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </decagon>
+ <diagStripe>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 50000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 100000" />
+ <gd name="x2" fmla="*/ w a 100000" />
+ <gd name="x1" fmla="*/ x2 1 2" />
+ <gd name="x3" fmla="+/ x2 r 2" />
+ <gd name="y2" fmla="*/ h a 100000" />
+ <gd name="y1" fmla="*/ y2 1 2" />
+ <gd name="y3" fmla="+/ y2 b 2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="100000">
+ <pos x="l" y="y2" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="hc" y="vc" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y3" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x3" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="x3" b="y3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </diagStripe>
+ <diamond>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="ir" fmla="*/ w 3 4" />
+ <gd name="ib" fmla="*/ h 3 4" />
+ </gdLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+ <rect l="wd4" t="hd4" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </diamond>
+ <dodecagon>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x1" fmla="*/ w 2894 21600" />
+ <gd name="x2" fmla="*/ w 7906 21600" />
+ <gd name="x3" fmla="*/ w 13694 21600" />
+ <gd name="x4" fmla="*/ w 18706 21600" />
+ <gd name="y1" fmla="*/ h 2894 21600" />
+ <gd name="y2" fmla="*/ h 7906 21600" />
+ <gd name="y3" fmla="*/ h 13694 21600" />
+ <gd name="y4" fmla="*/ h 18706 21600" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x4" y="y1" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y2" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y3" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x4" y="y4" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x2" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y4" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y3" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x2" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x3" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x1" t="y1" r="x4" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y3" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </dodecagon>
+ <donut>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 25000" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="dr" fmla="*/ ss a 100000" />
+ <gd name="iwd2" fmla="+- wd2 0 dr" />
+ <gd name="ihd2" fmla="+- hd2 0 dr" />
+ <gd name="idx" fmla="cos wd2 2700000" />
+ <gd name="idy" fmla="sin hd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefR="adj" minR="0" maxR="50000">
+ <pos x="dr" y="vc" />
+ </ahPolar>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="il" y="it" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="il" y="ib" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="ir" y="ib" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="ir" y="it" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />
+ <close />
+ <moveTo>
+ <pt x="dr" y="vc" />
+ </moveTo>
+ <arcTo wR="iwd2" hR="ihd2" stAng="cd2" swAng="-5400000" />
+ <arcTo wR="iwd2" hR="ihd2" stAng="cd4" swAng="-5400000" />
+ <arcTo wR="iwd2" hR="ihd2" stAng="0" swAng="-5400000" />
+ <arcTo wR="iwd2" hR="ihd2" stAng="3cd4" swAng="-5400000" />
+ <close />
+ </path>
+ </pathLst>
+
+ </donut>
+ <doubleWave>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 6250" />
+
+ <gd name="adj2" fmla="val 0" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 12500" />
+ <gd name="a2" fmla="pin -10000 adj2 10000" />
+ <gd name="y1" fmla="*/ h a1 100000" />
+
+ <gd name="dy2" fmla="*/ y1 10 3" />
+ <gd name="y2" fmla="+- y1 0 dy2" />
+
+ <gd name="y3" fmla="+- y1 dy2 0" />
+
+ <gd name="y4" fmla="+- b 0 y1" />
+
+ <gd name="y5" fmla="+- y4 0 dy2" />
+
+ <gd name="y6" fmla="+- y4 dy2 0" />
+
+ <gd name="dx1" fmla="*/ w a2 100000" />
+
+ <gd name="of2" fmla="*/ w a2 50000" />
+
+ <gd name="x1" fmla="abs dx1" />
+
+ <gd name="dx2" fmla="?: of2 0 of2" />
+ <gd name="x2" fmla="+- l 0 dx2" />
+
+ <gd name="dx8" fmla="?: of2 of2 0" />
+ <gd name="x8" fmla="+- r 0 dx8" />
+
+ <gd name="dx3" fmla="+/ dx2 x8 6" />
+ <gd name="x3" fmla="+- x2 dx3 0" />
+
+ <gd name="dx4" fmla="+/ dx2 x8 3" />
+ <gd name="x4" fmla="+- x2 dx4 0" />
+
+ <gd name="x5" fmla="+/ x2 x8 2" />
+
+ <gd name="x6" fmla="+- x5 dx3 0" />
+
+ <gd name="x7" fmla="+/ x6 x8 2" />
+
+ <gd name="x9" fmla="+- l dx8 0" />
+
+ <gd name="x15" fmla="+- r dx2 0" />
+
+ <gd name="x10" fmla="+- x9 dx3 0" />
+
+ <gd name="x11" fmla="+- x9 dx4 0" />
+
+ <gd name="x12" fmla="+/ x9 x15 2" />
+
+ <gd name="x13" fmla="+- x12 dx3 0" />
+
+ <gd name="x14" fmla="+/ x13 x15 2" />
+
+ <gd name="x16" fmla="+- r 0 x1" />
+
+ <gd name="xAdj" fmla="+- hc dx1 0" />
+ <gd name="il" fmla="max x2 x9" />
+ <gd name="ir" fmla="min x8 x15" />
+ <gd name="it" fmla="*/ h a1 50000" />
+ <gd name="ib" fmla="+- b 0 it" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="12500">
+ <pos x="l" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="-10000" maxX="10000">
+ <pos x="xAdj" y="b" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd4">
+ <pos x="x12" y="y1" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x5" y="y4" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x16" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x2" y="y1" />
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x3" y="y2" />
+ <pt x="x4" y="y3" />
+ <pt x="x5" y="y1" />
+ </cubicBezTo>
+ <cubicBezTo>
+ <pt x="x6" y="y2" />
+ <pt x="x7" y="y3" />
+ <pt x="x8" y="y1" />
+ </cubicBezTo>
+ <lnTo>
+ <pt x="x15" y="y4" />
+ </lnTo>
+ <cubicBezTo>
+ <pt x="x14" y="y6" />
+ <pt x="x13" y="y5" />
+ <pt x="x12" y="y4" />
+ </cubicBezTo>
+ <cubicBezTo>
+ <pt x="x11" y="y6" />
+ <pt x="x10" y="y5" />
+ <pt x="x9" y="y4" />
+ </cubicBezTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </doubleWave>
+ <downArrow>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+ <gd name="adj2" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 100000 h ss" />
+ <gd name="a1" fmla="pin 0 adj1 100000" />
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="dy1" fmla="*/ ss a2 100000" />
+ <gd name="y1" fmla="+- b 0 dy1" />
+ <gd name="dx1" fmla="*/ w a1 200000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc dx1 0" />
+ <gd name="dy2" fmla="*/ x1 dy1 wd2" />
+ <gd name="y2" fmla="+- y1 dy2 0" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="100000">
+ <pos x="x1" y="t" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">
+ <pos x="l" y="y1" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y1" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y1" />
+ </cxn>
+ </cxnLst>
+ <rect l="x1" t="t" r="x2" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </downArrow>
+ <downArrowCallout>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 25000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ <gd name="adj4" fmla="val 64977" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 50000 w ss" />
+
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="maxAdj1" fmla="*/ a2 2 1" />
+
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="maxAdj3" fmla="*/ 100000 h ss" />
+
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="q2" fmla="*/ a3 ss h" />
+
+ <gd name="maxAdj4" fmla="+- 100000 0 q2" />
+
+ <gd name="a4" fmla="pin 0 adj4 maxAdj4" />
+ <gd name="dx1" fmla="*/ ss a2 100000" />
+
+ <gd name="dx2" fmla="*/ ss a1 200000" />
+
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x3" fmla="+- hc dx2 0" />
+ <gd name="x4" fmla="+- hc dx1 0" />
+ <gd name="dy3" fmla="*/ ss a3 100000" />
+
+ <gd name="y3" fmla="+- b 0 dy3" />
+ <gd name="y2" fmla="*/ h a4 100000" />
+
+ <gd name="y1" fmla="*/ y2 1 2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">
+ <pos x="x2" y="y3" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="x1" y="b" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">
+ <pos x="r" y="y3" />
+ </ahXY>
+ <ahXY gdRefY="adj4" minY="0" maxY="maxAdj4">
+ <pos x="l" y="y2" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y1" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </downArrowCallout>
+ <ellipse>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="idx" fmla="cos wd2 2700000" />
+ <gd name="idy" fmla="sin hd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="il" y="it" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="il" y="ib" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="ir" y="ib" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="ir" y="it" />
+ </cxn>
+ </cxnLst>
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />
+ <close />
+ </path>
+ </pathLst>
+ </ellipse>
+ <ellipseRibbon>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ <gd name="adj3" fmla="val 12500" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 100000" />
+ <gd name="a2" fmla="pin 25000 adj2 75000" />
+ <gd name="q10" fmla="+- 100000 0 a1" />
+ <gd name="q11" fmla="*/ q10 1 2" />
+ <gd name="q12" fmla="+- a1 0 q11" />
+ <gd name="minAdj3" fmla="max 0 q12" />
+ <gd name="a3" fmla="pin minAdj3 adj3 a1" />
+
+
+ <gd name="dx2" fmla="*/ w a2 200000" />
+
+ <gd name="x2" fmla="+- hc 0 dx2" />
+
+ <gd name="x3" fmla="+- x2 wd8 0" />
+
+ <gd name="x4" fmla="+- r 0 x3" />
+
+ <gd name="x5" fmla="+- r 0 x2" />
+
+ <gd name="x6" fmla="+- r 0 wd8" />
+
+ <gd name="dy1" fmla="*/ h a3 100000" />
+
+ <gd name="f1" fmla="*/ 4 dy1 w" />
+
+ <gd name="q1" fmla="*/ x3 x3 w" />
+ <gd name="q2" fmla="+- x3 0 q1" />
+ <gd name="y1" fmla="*/ f1 q2 1" />
+
+ <gd name="cx1" fmla="*/ x3 1 2" />
+
+ <gd name="cy1" fmla="*/ f1 cx1 1" />
+
+ <gd name="cx2" fmla="+- r 0 cx1" />
+
+
+
+ <gd name="q1" fmla="*/ h a1 100000" />
+
+ <gd name="dy3" fmla="+- q1 0 dy1" />
+
+ <gd name="q3" fmla="*/ x2 x2 w" />
+ <gd name="q4" fmla="+- x2 0 q3" />
+ <gd name="q5" fmla="*/ f1 q4 1" />
+ <gd name="y3" fmla="+- q5 dy3 0" />
+
+
+
+ <gd name="q6" fmla="+- dy1 dy3 y3" />
+ <gd name="q7" fmla="+- q6 dy1 0" />
+ <gd name="cy3" fmla="+- q7 dy3 0" />
+
+ <gd name="rh" fmla="+- b 0 q1" />
+
+ <gd name="q8" fmla="*/ dy1 14 16" />
+ <gd name="y2" fmla="+/ q8 rh 2" />
+
+
+ <gd name="y5" fmla="+- q5 rh 0" />
+
+ <gd name="y6" fmla="+- y3 rh 0" />
+
+ <gd name="cx4" fmla="*/ x2 1 2" />
+
+ <gd name="q9" fmla="*/ f1 cx4 1" />
+ <gd name="cy4" fmla="+- q9 rh 0" />
+
+ <gd name="cx5" fmla="+- r 0 cx4" />
+
+
+
+
+
+ <gd name="cy6" fmla="+- cy3 rh 0" />
+
+ <gd name="y7" fmla="+- y1 dy3 0" />
+ <gd name="cy7" fmla="+- q1 q1 y7" />
+ <gd name="y8" fmla="+- b 0 dy1" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="100000">
+ <pos x="hc" y="q1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="25000" maxX="75000">
+ <pos x="x2" y="b" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="minAdj3" maxY="a1">
+ <pos x="l" y="y8" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="q1" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="wd8" y="y2" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x6" y="y2" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x2" t="q1" r="x5" b="y6" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <quadBezTo>
+ <pt x="cx1" y="cy1" />
+ <pt x="x3" y="y1" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="hc" y="cy3" />
+ <pt x="x5" y="y3" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="cx2" y="cy1" />
+ <pt x="r" y="t" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x6" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="rh" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="cx5" y="cy4" />
+ <pt x="x5" y="y5" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x5" y="y6" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="hc" y="cy6" />
+ <pt x="x2" y="y6" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x2" y="y5" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="cx4" y="cy4" />
+ <pt x="l" y="rh" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="wd8" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="darkenLess" stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="x3" y="y7" />
+ </moveTo>
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="hc" y="cy3" />
+ <pt x="x5" y="y3" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y7" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="hc" y="cy7" />
+ <pt x="x3" y="y7" />
+ </quadBezTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <quadBezTo>
+ <pt x="cx1" y="cy1" />
+ <pt x="x3" y="y1" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="hc" y="cy3" />
+ <pt x="x5" y="y3" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="cx2" y="cy1" />
+ <pt x="r" y="t" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x6" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="rh" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="cx5" y="cy4" />
+ <pt x="x5" y="y5" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x5" y="y6" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="hc" y="cy6" />
+ <pt x="x2" y="y6" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x2" y="y5" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="cx4" y="cy4" />
+ <pt x="l" y="rh" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="wd8" y="y2" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="x2" y="y5" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <moveTo>
+ <pt x="x5" y="y3" />
+ </moveTo>
+ <lnTo>
+ <pt x="x5" y="y5" />
+ </lnTo>
+ <moveTo>
+ <pt x="x3" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x3" y="y7" />
+ </lnTo>
+ <moveTo>
+ <pt x="x4" y="y7" />
+ </moveTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </ellipseRibbon>
+ <ellipseRibbon2>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ <gd name="adj3" fmla="val 12500" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+
+ <gd name="a1" fmla="pin 0 adj1 100000" />
+ <gd name="a2" fmla="pin 25000 adj2 75000" />
+ <gd name="q10" fmla="+- 100000 0 a1" />
+ <gd name="q11" fmla="*/ q10 1 2" />
+ <gd name="q12" fmla="+- a1 0 q11" />
+ <gd name="minAdj3" fmla="max 0 q12" />
+ <gd name="a3" fmla="pin minAdj3 adj3 a1" />
+ <gd name="dx2" fmla="*/ w a2 200000" />
+
+ <gd name="x2" fmla="+- hc 0 dx2" />
+
+ <gd name="x3" fmla="+- x2 wd8 0" />
+
+ <gd name="x4" fmla="+- r 0 x3" />
+
+ <gd name="x5" fmla="+- r 0 x2" />
+
+ <gd name="x6" fmla="+- r 0 wd8" />
+
+ <gd name="dy1" fmla="*/ h a3 100000" />
+
+ <gd name="f1" fmla="*/ 4 dy1 w" />
+
+ <gd name="q1" fmla="*/ x3 x3 w" />
+ <gd name="q2" fmla="+- x3 0 q1" />
+ <gd name="u1" fmla="*/ f1 q2 1" />
+
+ <gd name="y1" fmla="+- b 0 u1" />
+ <gd name="cx1" fmla="*/ x3 1 2" />
+
+ <gd name="cu1" fmla="*/ f1 cx1 1" />
+
+ <gd name="cy1" fmla="+- b 0 cu1" />
+ <gd name="cx2" fmla="+- r 0 cx1" />
+
+
+
+ <gd name="q1" fmla="*/ h a1 100000" />
+
+ <gd name="dy3" fmla="+- q1 0 dy1" />
+
+ <gd name="q3" fmla="*/ x2 x2 w" />
+ <gd name="q4" fmla="+- x2 0 q3" />
+ <gd name="q5" fmla="*/ f1 q4 1" />
+ <gd name="u3" fmla="+- q5 dy3 0" />
+
+ <gd name="y3" fmla="+- b 0 u3" />
+
+
+ <gd name="q6" fmla="+- dy1 dy3 u3" />
+ <gd name="q7" fmla="+- q6 dy1 0" />
+ <gd name="cu3" fmla="+- q7 dy3 0" />
+
+ <gd name="cy3" fmla="+- b 0 cu3" />
+ <gd name="rh" fmla="+- b 0 q1" />
+
+ <gd name="q8" fmla="*/ dy1 14 16" />
+ <gd name="u2" fmla="+/ q8 rh 2" />
+
+ <gd name="y2" fmla="+- b 0 u2" />
+
+ <gd name="u5" fmla="+- q5 rh 0" />
+
+ <gd name="y5" fmla="+- b 0 u5" />
+ <gd name="u6" fmla="+- u3 rh 0" />
+
+ <gd name="y6" fmla="+- b 0 u6" />
+ <gd name="cx4" fmla="*/ x2 1 2" />
+
+ <gd name="q9" fmla="*/ f1 cx4 1" />
+ <gd name="cu4" fmla="+- q9 rh 0" />
+
+ <gd name="cy4" fmla="+- b 0 cu4" />
+ <gd name="cx5" fmla="+- r 0 cx4" />
+
+
+
+
+
+ <gd name="cu6" fmla="+- cu3 rh 0" />
+
+ <gd name="cy6" fmla="+- b 0 cu6" />
+ <gd name="u7" fmla="+- u1 dy3 0" />
+ <gd name="y7" fmla="+- b 0 u7" />
+ <gd name="cu7" fmla="+- q1 q1 u7" />
+ <gd name="cy7" fmla="+- b 0 cu7" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="100000">
+ <pos x="hc" y="rh" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="25000" maxX="100000">
+ <pos x="x2" y="t" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="minAdj3" maxY="a1">
+ <pos x="l" y="dy1" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="wd8" y="y2" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="rh" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x6" y="y2" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x2" t="y6" r="x5" b="rh" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <quadBezTo>
+ <pt x="cx1" y="cy1" />
+ <pt x="x3" y="y1" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="hc" y="cy3" />
+ <pt x="x5" y="y3" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="cx2" y="cy1" />
+ <pt x="r" y="b" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x6" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="q1" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="cx5" y="cy4" />
+ <pt x="x5" y="y5" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x5" y="y6" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="hc" y="cy6" />
+ <pt x="x2" y="y6" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x2" y="y5" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="cx4" y="cy4" />
+ <pt x="l" y="q1" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="wd8" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="darkenLess" stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="x3" y="y7" />
+ </moveTo>
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="hc" y="cy3" />
+ <pt x="x5" y="y3" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y7" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="hc" y="cy7" />
+ <pt x="x3" y="y7" />
+ </quadBezTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="wd8" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="q1" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="cx4" y="cy4" />
+ <pt x="x2" y="y5" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x2" y="y6" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="hc" y="cy6" />
+ <pt x="x5" y="y6" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x5" y="y5" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="cx5" y="cy4" />
+ <pt x="r" y="q1" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x6" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="cx2" y="cy1" />
+ <pt x="x4" y="y1" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x5" y="y3" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="hc" y="cy3" />
+ <pt x="x2" y="y3" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="cx1" y="cy1" />
+ <pt x="l" y="b" />
+ </quadBezTo>
+ <close />
+ <moveTo>
+ <pt x="x2" y="y3" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y5" />
+ </lnTo>
+ <moveTo>
+ <pt x="x5" y="y5" />
+ </moveTo>
+ <lnTo>
+ <pt x="x5" y="y3" />
+ </lnTo>
+ <moveTo>
+ <pt x="x3" y="y7" />
+ </moveTo>
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <moveTo>
+ <pt x="x4" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x4" y="y7" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </ellipseRibbon2>
+ <flowChartAlternateProcess>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x2" fmla="+- r 0 ssd6" />
+ <gd name="y2" fmla="+- b 0 ssd6" />
+ <gd name="il" fmla="*/ ssd6 29289 100000" />
+
+
+ <gd name="ir" fmla="+- r 0 il" />
+ <gd name="ib" fmla="+- b 0 il" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="ssd6" />
+ </moveTo>
+ <arcTo wR="ssd6" hR="ssd6" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <arcTo wR="ssd6" hR="ssd6" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <arcTo wR="ssd6" hR="ssd6" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="ssd6" y="b" />
+ </lnTo>
+ <arcTo wR="ssd6" hR="ssd6" stAng="cd4" swAng="cd4" />
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartAlternateProcess>
+ <flowChartCollate>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="ir" fmla="*/ w 3 4" />
+ <gd name="ib" fmla="*/ h 3 4" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd4" t="hd4" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="2" h="2">
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="2" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="1" />
+ </lnTo>
+ <lnTo>
+ <pt x="2" y="2" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="2" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="1" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartCollate>
+ <flowChartConnector>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="idx" fmla="cos wd2 2700000" />
+ <gd name="idy" fmla="sin hd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="il" y="it" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="il" y="ib" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="ir" y="ib" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="ir" y="it" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartConnector>
+ <flowChartDecision>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="ir" fmla="*/ w 3 4" />
+ <gd name="ib" fmla="*/ h 3 4" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd4" t="hd4" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="2" h="2">
+ <moveTo>
+ <pt x="0" y="1" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="2" y="1" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartDecision>
+ <flowChartDelay>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="idx" fmla="cos wd2 2700000" />
+ <gd name="idy" fmla="sin hd2 2700000" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartDelay>
+ <flowChartDisplay>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x2" fmla="*/ w 5 6" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd6" t="t" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="6" h="6">
+ <moveTo>
+ <pt x="0" y="3" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="5" y="0" />
+ </lnTo>
+ <arcTo wR="1" hR="3" stAng="3cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="1" y="6" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartDisplay>
+ <flowChartDocument>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h 17322 21600" />
+ <gd name="y2" fmla="*/ h 20172 21600" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="y2" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="y1" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="21600" h="21600">
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="21600" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="21600" y="17322" />
+ </lnTo>
+ <cubicBezTo>
+ <pt x="10800" y="17322" />
+ <pt x="10800" y="23922" />
+ <pt x="0" y="20172" />
+ </cubicBezTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartDocument>
+ <flowChartExtract>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x2" fmla="*/ w 3 4" />
+ </gdLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="wd4" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x2" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd4" t="vc" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="2" h="2">
+ <moveTo>
+ <pt x="0" y="2" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="2" y="2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartExtract>
+ <flowChartInputOutput>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x3" fmla="*/ w 2 5" />
+ <gd name="x4" fmla="*/ w 3 5" />
+ <gd name="x5" fmla="*/ w 4 5" />
+ <gd name="x6" fmla="*/ w 9 10" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x4" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="wd10" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x6" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd5" t="t" r="x5" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="5" h="5">
+ <moveTo>
+ <pt x="0" y="5" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="5" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="4" y="5" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartInputOutput>
+ <flowChartInternalStorage>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd8" t="hd8" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false" w="1" h="1">
+
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="1" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="1" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false" w="8" h="8">
+
+ <moveTo>
+ <pt x="1" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="8" />
+ </lnTo>
+ <moveTo>
+ <pt x="0" y="1" />
+ </moveTo>
+ <lnTo>
+ <pt x="8" y="1" />
+ </lnTo>
+ </path>
+ <path fill="none" w="1" h="1">
+
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="1" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="1" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartInternalStorage>
+ <flowChartMagneticDisk>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y3" fmla="*/ h 5 6" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="hd3" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="hd3" r="r" b="y3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false" w="6" h="6">
+
+ <moveTo>
+ <pt x="0" y="1" />
+ </moveTo>
+ <arcTo wR="3" hR="1" stAng="cd2" swAng="cd2" />
+ <lnTo>
+ <pt x="6" y="5" />
+ </lnTo>
+ <arcTo wR="3" hR="1" stAng="0" swAng="cd2" />
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false" w="6" h="6">
+
+ <moveTo>
+ <pt x="6" y="1" />
+ </moveTo>
+ <arcTo wR="3" hR="1" stAng="0" swAng="cd2" />
+ </path>
+ <path fill="none" w="6" h="6">
+
+ <moveTo>
+ <pt x="0" y="1" />
+ </moveTo>
+ <arcTo wR="3" hR="1" stAng="cd2" swAng="cd2" />
+ <lnTo>
+ <pt x="6" y="5" />
+ </lnTo>
+ <arcTo wR="3" hR="1" stAng="0" swAng="cd2" />
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartMagneticDisk>
+ <flowChartMagneticDrum>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x2" fmla="*/ w 2 3" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x2" y="vc" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd6" t="t" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false" w="6" h="6">
+
+ <moveTo>
+ <pt x="1" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="5" y="0" />
+ </lnTo>
+ <arcTo wR="1" hR="3" stAng="3cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="1" y="6" />
+ </lnTo>
+ <arcTo wR="1" hR="3" stAng="cd4" swAng="cd2" />
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false" w="6" h="6">
+
+ <moveTo>
+ <pt x="5" y="6" />
+ </moveTo>
+ <arcTo wR="1" hR="3" stAng="cd4" swAng="cd2" />
+ </path>
+ <path fill="none" w="6" h="6">
+
+ <moveTo>
+ <pt x="1" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="5" y="0" />
+ </lnTo>
+ <arcTo wR="1" hR="3" stAng="3cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="1" y="6" />
+ </lnTo>
+ <arcTo wR="1" hR="3" stAng="cd4" swAng="cd2" />
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartMagneticDrum>
+ <flowChartMagneticTape>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="idx" fmla="cos wd2 2700000" />
+ <gd name="idy" fmla="sin hd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ <gd name="ang1" fmla="at2 w h" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="hc" y="b" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="0" swAng="ang1" />
+ <lnTo>
+ <pt x="r" y="ib" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartMagneticTape>
+ <flowChartManualInput>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="hd10" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="hd5" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="5" h="5">
+ <moveTo>
+ <pt x="0" y="1" />
+ </moveTo>
+ <lnTo>
+ <pt x="5" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="5" y="5" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="5" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartManualInput>
+ <flowChartManualOperation>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x3" fmla="*/ w 4 5" />
+ <gd name="x4" fmla="*/ w 9 10" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="wd10" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x4" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd5" t="t" r="x3" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="5" h="5">
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="5" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="4" y="5" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="5" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartManualOperation>
+ <flowChartMerge>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x2" fmla="*/ w 3 4" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="wd4" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x2" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd4" t="t" r="x2" b="vc" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="2" h="2">
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="2" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartMerge>
+ <flowChartMultidocument>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y2" fmla="*/ h 3675 21600" />
+ <gd name="y8" fmla="*/ h 20782 21600" />
+ <gd name="x3" fmla="*/ w 9298 21600" />
+ <gd name="x4" fmla="*/ w 12286 21600" />
+ <gd name="x5" fmla="*/ w 18595 21600" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x4" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="y8" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="y2" r="x5" b="y8" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false" w="21600" h="21600">
+
+ <moveTo>
+ <pt x="0" y="20782" />
+ </moveTo>
+ <cubicBezTo>
+ <pt x="9298" y="23542" />
+ <pt x="9298" y="18022" />
+ <pt x="18595" y="18022" />
+ </cubicBezTo>
+ <lnTo>
+ <pt x="18595" y="3675" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="3675" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="1532" y="3675" />
+ </moveTo>
+ <lnTo>
+ <pt x="1532" y="1815" />
+ </lnTo>
+ <lnTo>
+ <pt x="20000" y="1815" />
+ </lnTo>
+ <lnTo>
+ <pt x="20000" y="16252" />
+ </lnTo>
+ <cubicBezTo>
+ <pt x="19298" y="16252" />
+ <pt x="18595" y="16352" />
+ <pt x="18595" y="16352" />
+ </cubicBezTo>
+ <lnTo>
+ <pt x="18595" y="3675" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="2972" y="1815" />
+ </moveTo>
+ <lnTo>
+ <pt x="2972" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="21600" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="21600" y="14392" />
+ </lnTo>
+ <cubicBezTo>
+ <pt x="20800" y="14392" />
+ <pt x="20000" y="14467" />
+ <pt x="20000" y="14467" />
+ </cubicBezTo>
+ <lnTo>
+ <pt x="20000" y="1815" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false" w="21600" h="21600">
+
+ <moveTo>
+ <pt x="0" y="3675" />
+ </moveTo>
+ <lnTo>
+ <pt x="18595" y="3675" />
+ </lnTo>
+ <lnTo>
+ <pt x="18595" y="18022" />
+ </lnTo>
+ <cubicBezTo>
+ <pt x="9298" y="18022" />
+ <pt x="9298" y="23542" />
+ <pt x="0" y="20782" />
+ </cubicBezTo>
+ <close />
+ <moveTo>
+ <pt x="1532" y="3675" />
+ </moveTo>
+ <lnTo>
+ <pt x="1532" y="1815" />
+ </lnTo>
+ <lnTo>
+ <pt x="20000" y="1815" />
+ </lnTo>
+ <lnTo>
+ <pt x="20000" y="16252" />
+ </lnTo>
+ <cubicBezTo>
+ <pt x="19298" y="16252" />
+ <pt x="18595" y="16352" />
+ <pt x="18595" y="16352" />
+ </cubicBezTo>
+ <moveTo>
+ <pt x="2972" y="1815" />
+ </moveTo>
+ <lnTo>
+ <pt x="2972" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="21600" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="21600" y="14392" />
+ </lnTo>
+ <cubicBezTo>
+ <pt x="20800" y="14392" />
+ <pt x="20000" y="14467" />
+ <pt x="20000" y="14467" />
+ </cubicBezTo>
+ </path>
+ <path stroke="false" fill="none" w="21600" h="21600">
+
+ <moveTo>
+ <pt x="0" y="20782" />
+ </moveTo>
+ <cubicBezTo>
+ <pt x="9298" y="23542" />
+ <pt x="9298" y="18022" />
+ <pt x="18595" y="18022" />
+ </cubicBezTo>
+ <lnTo>
+ <pt x="18595" y="16352" />
+ </lnTo>
+ <cubicBezTo>
+ <pt x="18595" y="16352" />
+ <pt x="19298" y="16252" />
+ <pt x="20000" y="16252" />
+ </cubicBezTo>
+ <lnTo>
+ <pt x="20000" y="14467" />
+ </lnTo>
+ <cubicBezTo>
+ <pt x="20000" y="14467" />
+ <pt x="20800" y="14392" />
+ <pt x="21600" y="14392" />
+ </cubicBezTo>
+ <lnTo>
+ <pt x="21600" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="2972" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="2972" y="1815" />
+ </lnTo>
+ <lnTo>
+ <pt x="1532" y="1815" />
+ </lnTo>
+ <lnTo>
+ <pt x="1532" y="3675" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="3675" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartMultidocument>
+ <flowChartOfflineStorage>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x4" fmla="*/ w 3 4" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x4" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="wd4" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd4" t="t" r="x4" b="vc" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false" w="2" h="2">
+
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="2" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="2" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false" w="5" h="5">
+
+ <moveTo>
+ <pt x="2" y="4" />
+ </moveTo>
+ <lnTo>
+ <pt x="3" y="4" />
+ </lnTo>
+ </path>
+ <path fill="none" extrusionOk="true" w="2" h="2">
+
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="2" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartOfflineStorage>
+ <flowChartOffpageConnector>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y1" fmla="*/ h 4 5" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="y1" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="10" h="10">
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="10" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="10" y="8" />
+ </lnTo>
+ <lnTo>
+ <pt x="5" y="10" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="8" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartOffpageConnector>
+ <flowChartOnlineStorage>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x2" fmla="*/ w 5 6" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x2" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd6" t="t" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="6" h="6">
+ <moveTo>
+ <pt x="1" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="6" y="0" />
+ </lnTo>
+ <arcTo wR="1" hR="3" stAng="3cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="1" y="6" />
+ </lnTo>
+ <arcTo wR="1" hR="3" stAng="cd4" swAng="cd2" />
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartOnlineStorage>
+ <flowChartOr>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="idx" fmla="cos wd2 2700000" />
+ <gd name="idy" fmla="sin hd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="il" y="it" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="il" y="ib" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="ir" y="ib" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="ir" y="it" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+
+ <moveTo>
+ <pt x="hc" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ </path>
+ <path fill="none">
+
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartOr>
+ <flowChartPredefinedProcess>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x2" fmla="*/ w 7 8" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd8" t="t" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false" w="1" h="1">
+
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="1" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="1" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false" w="8" h="8">
+
+ <moveTo>
+ <pt x="1" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="8" />
+ </lnTo>
+ <moveTo>
+ <pt x="7" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="7" y="8" />
+ </lnTo>
+ </path>
+ <path fill="none" w="1" h="1">
+
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="1" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="1" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartPredefinedProcess>
+ <flowChartPreparation>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x2" fmla="*/ w 4 5" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd5" t="t" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="10" h="10">
+ <moveTo>
+ <pt x="0" y="5" />
+ </moveTo>
+ <lnTo>
+ <pt x="2" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="8" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="10" y="5" />
+ </lnTo>
+ <lnTo>
+ <pt x="8" y="10" />
+ </lnTo>
+ <lnTo>
+ <pt x="2" y="10" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartPreparation>
+ <flowChartProcess>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="1" h="1">
+ <moveTo>
+ <pt x="0" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="1" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="1" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartProcess>
+ <flowChartPunchedCard>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="hd5" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="5" h="5">
+ <moveTo>
+ <pt x="0" y="1" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="5" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="5" y="5" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="5" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartPunchedCard>
+ <flowChartPunchedTape>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="y2" fmla="*/ h 9 10" />
+ <gd name="ib" fmla="*/ h 4 5" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="hd10" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="y2" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="hd5" r="r" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="20" h="20">
+ <moveTo>
+ <pt x="0" y="2" />
+ </moveTo>
+ <arcTo wR="5" hR="2" stAng="cd2" swAng="-10800000" />
+ <arcTo wR="5" hR="2" stAng="cd2" swAng="cd2" />
+ <lnTo>
+ <pt x="20" y="18" />
+ </lnTo>
+ <arcTo wR="5" hR="2" stAng="0" swAng="-10800000" />
+ <arcTo wR="5" hR="2" stAng="0" swAng="cd2" />
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartPunchedTape>
+ <flowChartSort>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="ir" fmla="*/ w 3 4" />
+ <gd name="ib" fmla="*/ h 3 4" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="wd4" t="hd4" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false" w="2" h="2">
+
+ <moveTo>
+ <pt x="0" y="1" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="2" y="1" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="2" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false" w="2" h="2">
+
+ <moveTo>
+ <pt x="0" y="1" />
+ </moveTo>
+ <lnTo>
+ <pt x="2" y="1" />
+ </lnTo>
+ </path>
+ <path fill="none" w="2" h="2">
+
+ <moveTo>
+ <pt x="0" y="1" />
+ </moveTo>
+ <lnTo>
+ <pt x="1" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="2" y="1" />
+ </lnTo>
+ <lnTo>
+ <pt x="1" y="2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartSort>
+ <flowChartSummingJunction>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="idx" fmla="cos wd2 2700000" />
+ <gd name="idy" fmla="sin hd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="il" y="it" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="il" y="ib" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="ir" y="ib" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="ir" y="it" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+
+ <moveTo>
+ <pt x="il" y="it" />
+ </moveTo>
+ <lnTo>
+ <pt x="ir" y="ib" />
+ </lnTo>
+ <moveTo>
+ <pt x="ir" y="it" />
+ </moveTo>
+ <lnTo>
+ <pt x="il" y="ib" />
+ </lnTo>
+ </path>
+ <path fill="none">
+
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartSummingJunction>
+ <flowChartTerminator>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="il" fmla="*/ w 1018 21600" />
+ <gd name="ir" fmla="*/ w 20582 21600" />
+ <gd name="it" fmla="*/ h 3163 21600" />
+ <gd name="ib" fmla="*/ h 18437 21600" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="21600" h="21600">
+ <moveTo>
+ <pt x="3475" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="18125" y="0" />
+ </lnTo>
+ <arcTo wR="3475" hR="10800" stAng="3cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="3475" y="21600" />
+ </lnTo>
+ <arcTo wR="3475" hR="10800" stAng="cd4" swAng="cd2" />
+ <close />
+ </path>
+ </pathLst>
+
+ </flowChartTerminator>
+ <foldedCorner>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 16667" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="dy2" fmla="*/ ss a 100000" />
+ <gd name="dy1" fmla="*/ dy2 1 5" />
+ <gd name="x1" fmla="+- r 0 dy2" />
+ <gd name="x2" fmla="+- x1 dy1 0" />
+ <gd name="y2" fmla="+- b 0 dy2" />
+ <gd name="y1" fmla="+- y2 dy1 0" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="50000">
+ <pos x="x1" y="b" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darkenLess" extrusionOk="false">
+
+ <moveTo>
+ <pt x="x1" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+ <moveTo>
+ <pt x="x1" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </foldedCorner>
+ <frame>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 12500" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 50000" />
+ <gd name="x1" fmla="*/ ss a1 100000" />
+
+ <gd name="x4" fmla="+- r 0 x1" />
+
+
+
+ <gd name="y4" fmla="+- b 0 x1" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="50000">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x1" t="x1" r="x4" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="x1" y="x1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="x1" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </frame>
+ <funnel>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="d" fmla="*/ ss 1 20" />
+
+
+ <gd name="rw2" fmla="+- wd2 0 d" />
+
+ <gd name="rh2" fmla="+- hd4 0 d" />
+
+
+
+ <gd name="t1" fmla="cos wd2 480000" />
+
+ <gd name="t2" fmla="sin hd4 480000" />
+
+ <gd name="da" fmla="at2 t1 t2" />
+
+
+ <gd name="2da" fmla="*/ da 2 1" />
+ <gd name="stAng1" fmla="+- cd2 0 da" />
+ <gd name="swAng1" fmla="+- cd2 2da 0" />
+
+
+ <gd name="swAng3" fmla="+- cd2 0 2da" />
+
+
+ <gd name="rw3" fmla="*/ wd2 1 4" />
+ <gd name="rh3" fmla="*/ hd4 1 4" />
+
+
+ <gd name="ct1" fmla="cos hd4 stAng1" />
+ <gd name="st1" fmla="sin wd2 stAng1" />
+ <gd name="m1" fmla="mod ct1 st1 0" />
+ <gd name="n1" fmla="*/ wd2 hd4 m1" />
+ <gd name="dx1" fmla="cos n1 stAng1" />
+ <gd name="dy1" fmla="sin n1 stAng1" />
+ <gd name="x1" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- hd4 dy1 0" />
+
+
+ <gd name="ct3" fmla="cos rh3 da" />
+ <gd name="st3" fmla="sin rw3 da" />
+ <gd name="m3" fmla="mod ct3 st3 0" />
+ <gd name="n3" fmla="*/ rw3 rh3 m3" />
+ <gd name="dx3" fmla="cos n3 da" />
+ <gd name="dy3" fmla="sin n3 da" />
+ <gd name="x3" fmla="+- hc dx3 0" />
+ <gd name="vc3" fmla="+- b 0 rh3" />
+ <gd name="y2" fmla="+- vc3 dy3 0" />
+
+
+ <gd name="x2" fmla="+- wd2 0 rw2" />
+
+ <gd name="cd" fmla="*/ cd2 2 1" />
+ </gdLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <arcTo hR="hd4" wR="wd2" stAng="stAng1" swAng="swAng1" />
+ <lnTo>
+ <pt x="x3" y="y2" />
+ </lnTo>
+ <arcTo hR="rh3" wR="rw3" stAng="da" swAng="swAng3" />
+ <close />
+ <moveTo>
+ <pt x="x2" y="hd4" />
+ </moveTo>
+ <arcTo hR="rh2" wR="rw2" stAng="cd2" swAng="-21600000" />
+ <close />
+ </path>
+ </pathLst>
+
+ </funnel>
+ <gear6>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 15000" />
+
+ <gd name="adj2" fmla="val 3526" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+
+
+
+ <gd name="a1" fmla="pin 0 adj1 20000" />
+ <gd name="a2" fmla="pin 0 adj2 5358" />
+
+
+ <gd name="th" fmla="*/ ss a1 100000" />
+ <gd name="lFD" fmla="*/ ss a2 100000" />
+
+ <gd name="th2" fmla="*/ th 1 2" />
+ <gd name="l2" fmla="*/ lFD 1 2" />
+ <gd name="l3" fmla="+- th2 l2 0" />
+
+
+ <gd name="rh" fmla="+- hd2 0 th" />
+ <gd name="rw" fmla="+- wd2 0 th" />
+
+
+ <gd name="dr" fmla="+- rw 0 rh" />
+ <gd name="maxr" fmla="?: dr rh rw" />
+ <gd name="ha" fmla="at2 maxr l3" />
+
+
+ <gd name="aA1" fmla="+- 19800000 0 ha" />
+ <gd name="aD1" fmla="+- 19800000 ha 0" />
+
+
+ <gd name="ta11" fmla="cos rw aA1" />
+ <gd name="ta12" fmla="sin rh aA1" />
+ <gd name="bA1" fmla="at2 ta11 ta12" />
+
+ <gd name="cta1" fmla="cos rh bA1" />
+ <gd name="sta1" fmla="sin rw bA1" />
+ <gd name="ma1" fmla="mod cta1 sta1 0" />
+ <gd name="na1" fmla="*/ rw rh ma1" />
+ <gd name="dxa1" fmla="cos na1 bA1" />
+ <gd name="dya1" fmla="sin na1 bA1" />
+ <gd name="xA1" fmla="+- hc dxa1 0" />
+ <gd name="yA1" fmla="+- vc dya1 0" />
+
+
+ <gd name="td11" fmla="cos rw aD1" />
+ <gd name="td12" fmla="sin rh aD1" />
+ <gd name="bD1" fmla="at2 td11 td12" />
+
+ <gd name="ctd1" fmla="cos rh bD1" />
+ <gd name="std1" fmla="sin rw bD1" />
+ <gd name="md1" fmla="mod ctd1 std1 0" />
+ <gd name="nd1" fmla="*/ rw rh md1" />
+ <gd name="dxd1" fmla="cos nd1 bD1" />
+ <gd name="dyd1" fmla="sin nd1 bD1" />
+ <gd name="xD1" fmla="+- hc dxd1 0" />
+ <gd name="yD1" fmla="+- vc dyd1 0" />
+
+
+ <gd name="xAD1" fmla="+- xA1 0 xD1" />
+ <gd name="yAD1" fmla="+- yA1 0 yD1" />
+ <gd name="lAD1" fmla="mod xAD1 yAD1 0" />
+ <gd name="a1" fmla="at2 yAD1 xAD1" />
+
+
+ <gd name="dxF1" fmla="sin lFD a1" />
+ <gd name="dyF1" fmla="cos lFD a1" />
+ <gd name="xF1" fmla="+- xD1 dxF1 0" />
+ <gd name="yF1" fmla="+- yD1 dyF1 0" />
+ <gd name="xE1" fmla="+- xA1 0 dxF1" />
+ <gd name="yE1" fmla="+- yA1 0 dyF1" />
+
+
+ <gd name="yC1t" fmla="sin th a1" />
+ <gd name="xC1t" fmla="cos th a1" />
+ <gd name="yC1" fmla="+- yF1 yC1t 0" />
+ <gd name="xC1" fmla="+- xF1 0 xC1t" />
+
+
+ <gd name="yB1" fmla="+- yE1 yC1t 0" />
+ <gd name="xB1" fmla="+- xE1 0 xC1t" />
+
+
+ <gd name="aD6" fmla="+- 3cd4 ha 0" />
+
+
+ <gd name="td61" fmla="cos rw aD6" />
+ <gd name="td62" fmla="sin rh aD6" />
+ <gd name="bD6" fmla="at2 td61 td62" />
+
+ <gd name="ctd6" fmla="cos rh bD6" />
+ <gd name="std6" fmla="sin rw bD6" />
+ <gd name="md6" fmla="mod ctd6 std6 0" />
+ <gd name="nd6" fmla="*/ rw rh md6" />
+ <gd name="dxd6" fmla="cos nd6 bD6" />
+ <gd name="dyd6" fmla="sin nd6 bD6" />
+ <gd name="xD6" fmla="+- hc dxd6 0" />
+ <gd name="yD6" fmla="+- vc dyd6 0" />
+
+
+ <gd name="xA6" fmla="+- hc 0 dxd6" />
+
+
+ <gd name="xF6" fmla="+- xD6 0 lFD" />
+ <gd name="xE6" fmla="+- xA6 lFD 0" />
+
+
+ <gd name="yC6" fmla="+- yD6 0 th" />
+
+ <gd name="swAng1" fmla="+- bA1 0 bD6" />
+
+
+ <gd name="aA2" fmla="+- 1800000 0 ha" />
+ <gd name="aD2" fmla="+- 1800000 ha 0" />
+
+
+ <gd name="ta21" fmla="cos rw aA2" />
+ <gd name="ta22" fmla="sin rh aA2" />
+ <gd name="bA2" fmla="at2 ta21 ta22" />
+
+ <gd name="yA2" fmla="+- h 0 yD1" />
+
+
+ <gd name="td21" fmla="cos rw aD2" />
+ <gd name="td22" fmla="sin rh aD2" />
+ <gd name="bD2" fmla="at2 td21 td22" />
+
+ <gd name="yD2" fmla="+- h 0 yA1" />
+
+
+ <gd name="yC2" fmla="+- h 0 yB1" />
+
+
+ <gd name="yB2" fmla="+- h 0 yC1" />
+ <gd name="xB2" fmla="val xC1" />
+
+ <gd name="swAng2" fmla="+- bA2 0 bD1" />
+
+
+ <gd name="aD3" fmla="+- cd4 ha 0" />
+
+ <gd name="td31" fmla="cos rw aD3" />
+ <gd name="td32" fmla="sin rh aD3" />
+ <gd name="bD3" fmla="at2 td31 td32" />
+
+
+ <gd name="yD3" fmla="+- h 0 yD6" />
+
+
+ <gd name="yB3" fmla="+- h 0 yC6" />
+
+
+ <gd name="aD4" fmla="+- 9000000 ha 0" />
+
+ <gd name="td41" fmla="cos rw aD4" />
+ <gd name="td42" fmla="sin rh aD4" />
+ <gd name="bD4" fmla="at2 td41 td42" />
+
+
+ <gd name="xD4" fmla="+- w 0 xD1" />
+
+
+ <gd name="xC4" fmla="+- w 0 xC1" />
+
+
+ <gd name="xB4" fmla="+- w 0 xB1" />
+
+
+ <gd name="aD5" fmla="+- 12600000 ha 0" />
+
+ <gd name="td51" fmla="cos rw aD5" />
+ <gd name="td52" fmla="sin rh aD5" />
+ <gd name="bD5" fmla="at2 td51 td52" />
+
+
+ <gd name="xD5" fmla="+- w 0 xA1" />
+
+
+ <gd name="xC5" fmla="+- w 0 xB1" />
+
+
+ <gd name="xB5" fmla="+- w 0 xC1" />
+
+
+ <gd name="xCxn1" fmla="+/ xB1 xC1 2" />
+ <gd name="yCxn1" fmla="+/ yB1 yC1 2" />
+ <gd name="yCxn2" fmla="+- b 0 yCxn1" />
+ <gd name="xCxn4" fmla="+/ r 0 xCxn1" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="20000">
+ <pos x="xD6" y="yD6" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="5358">
+ <pos x="xA6" y="yD6" />
+ </ahXY>
+
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="19800000">
+ <pos x="xCxn1" y="yCxn1" />
+ </cxn>
+
+ <cxn ang="1800000">
+ <pos x="xCxn1" y="yCxn2" />
+ </cxn>
+
+ <cxn ang="cd4">
+ <pos x="hc" y="yB3" />
+ </cxn>
+
+ <cxn ang="9000000">
+ <pos x="xCxn4" y="yCxn2" />
+ </cxn>
+
+ <cxn ang="12600000">
+ <pos x="xCxn4" y="yCxn1" />
+ </cxn>
+
+ <cxn ang="3cd4">
+ <pos x="hc" y="yC6" />
+ </cxn>
+
+ </cxnLst>
+
+ <rect l="xD5" t="yA1" r="xA1" b="yD2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="xA1" y="yA1" />
+ </moveTo>
+ <lnTo>
+ <pt x="xB1" y="yB1" />
+ </lnTo>
+ <lnTo>
+ <pt x="xC1" y="yC1" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD1" y="yD1" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD1" swAng="swAng2" />
+
+ <lnTo>
+ <pt x="xC1" y="yB2" />
+ </lnTo>
+ <lnTo>
+ <pt x="xB1" y="yC2" />
+ </lnTo>
+ <lnTo>
+ <pt x="xA1" y="yD2" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD2" swAng="swAng1" />
+
+ <lnTo>
+ <pt x="xF6" y="yB3" />
+ </lnTo>
+ <lnTo>
+ <pt x="xE6" y="yB3" />
+ </lnTo>
+ <lnTo>
+ <pt x="xA6" y="yD3" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD3" swAng="swAng1" />
+
+ <lnTo>
+ <pt x="xB4" y="yC2" />
+ </lnTo>
+ <lnTo>
+ <pt x="xC4" y="yB2" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD4" y="yA2" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD4" swAng="swAng2" />
+
+ <lnTo>
+ <pt x="xB5" y="yC1" />
+ </lnTo>
+ <lnTo>
+ <pt x="xC5" y="yB1" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD5" y="yA1" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD5" swAng="swAng1" />
+
+ <lnTo>
+ <pt x="xE6" y="yC6" />
+ </lnTo>
+ <lnTo>
+ <pt x="xF6" y="yC6" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD6" y="yD6" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD6" swAng="swAng1" />
+ <close />
+ </path>
+ </pathLst>
+
+ </gear6>
+ <gear9>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 10000" />
+
+ <gd name="adj2" fmla="val 1763" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+
+
+
+ <gd name="a1" fmla="pin 0 adj1 20000" />
+ <gd name="a2" fmla="pin 0 adj2 2679" />
+
+
+ <gd name="th" fmla="*/ ss a1 100000" />
+ <gd name="lFD" fmla="*/ ss a2 100000" />
+
+ <gd name="th2" fmla="*/ th 1 2" />
+ <gd name="l2" fmla="*/ lFD 1 2" />
+ <gd name="l3" fmla="+- th2 l2 0" />
+
+
+ <gd name="rh" fmla="+- hd2 0 th" />
+ <gd name="rw" fmla="+- wd2 0 th" />
+
+
+ <gd name="dr" fmla="+- rw 0 rh" />
+ <gd name="maxr" fmla="?: dr rh rw" />
+ <gd name="ha" fmla="at2 maxr l3" />
+
+
+ <gd name="aA1" fmla="+- 18600000 0 ha" />
+ <gd name="aD1" fmla="+- 18600000 ha 0" />
+
+
+ <gd name="ta11" fmla="cos rw aA1" />
+ <gd name="ta12" fmla="sin rh aA1" />
+ <gd name="bA1" fmla="at2 ta11 ta12" />
+
+ <gd name="cta1" fmla="cos rh bA1" />
+ <gd name="sta1" fmla="sin rw bA1" />
+ <gd name="ma1" fmla="mod cta1 sta1 0" />
+ <gd name="na1" fmla="*/ rw rh ma1" />
+ <gd name="dxa1" fmla="cos na1 bA1" />
+ <gd name="dya1" fmla="sin na1 bA1" />
+ <gd name="xA1" fmla="+- hc dxa1 0" />
+ <gd name="yA1" fmla="+- vc dya1 0" />
+
+
+ <gd name="td11" fmla="cos rw aD1" />
+ <gd name="td12" fmla="sin rh aD1" />
+ <gd name="bD1" fmla="at2 td11 td12" />
+
+ <gd name="ctd1" fmla="cos rh bD1" />
+ <gd name="std1" fmla="sin rw bD1" />
+ <gd name="md1" fmla="mod ctd1 std1 0" />
+ <gd name="nd1" fmla="*/ rw rh md1" />
+ <gd name="dxd1" fmla="cos nd1 bD1" />
+ <gd name="dyd1" fmla="sin nd1 bD1" />
+ <gd name="xD1" fmla="+- hc dxd1 0" />
+ <gd name="yD1" fmla="+- vc dyd1 0" />
+
+
+ <gd name="xAD1" fmla="+- xA1 0 xD1" />
+ <gd name="yAD1" fmla="+- yA1 0 yD1" />
+ <gd name="lAD1" fmla="mod xAD1 yAD1 0" />
+ <gd name="a1" fmla="at2 yAD1 xAD1" />
+
+
+ <gd name="dxF1" fmla="sin lFD a1" />
+ <gd name="dyF1" fmla="cos lFD a1" />
+ <gd name="xF1" fmla="+- xD1 dxF1 0" />
+ <gd name="yF1" fmla="+- yD1 dyF1 0" />
+ <gd name="xE1" fmla="+- xA1 0 dxF1" />
+ <gd name="yE1" fmla="+- yA1 0 dyF1" />
+
+
+ <gd name="yC1t" fmla="sin th a1" />
+ <gd name="xC1t" fmla="cos th a1" />
+ <gd name="yC1" fmla="+- yF1 yC1t 0" />
+ <gd name="xC1" fmla="+- xF1 0 xC1t" />
+
+
+ <gd name="yB1" fmla="+- yE1 yC1t 0" />
+ <gd name="xB1" fmla="+- xE1 0 xC1t" />
+
+
+ <gd name="aA2" fmla="+- 21000000 0 ha" />
+ <gd name="aD2" fmla="+- 21000000 ha 0" />
+
+
+ <gd name="ta21" fmla="cos rw aA2" />
+ <gd name="ta22" fmla="sin rh aA2" />
+ <gd name="bA2" fmla="at2 ta21 ta22" />
+
+ <gd name="cta2" fmla="cos rh bA2" />
+ <gd name="sta2" fmla="sin rw bA2" />
+ <gd name="ma2" fmla="mod cta2 sta2 0" />
+ <gd name="na2" fmla="*/ rw rh ma2" />
+ <gd name="dxa2" fmla="cos na2 bA2" />
+ <gd name="dya2" fmla="sin na2 bA2" />
+ <gd name="xA2" fmla="+- hc dxa2 0" />
+ <gd name="yA2" fmla="+- vc dya2 0" />
+
+
+ <gd name="td21" fmla="cos rw aD2" />
+ <gd name="td22" fmla="sin rh aD2" />
+ <gd name="bD2" fmla="at2 td21 td22" />
+
+ <gd name="ctd2" fmla="cos rh bD2" />
+ <gd name="std2" fmla="sin rw bD2" />
+ <gd name="md2" fmla="mod ctd2 std2 0" />
+ <gd name="nd2" fmla="*/ rw rh md2" />
+ <gd name="dxd2" fmla="cos nd2 bD2" />
+ <gd name="dyd2" fmla="sin nd2 bD2" />
+ <gd name="xD2" fmla="+- hc dxd2 0" />
+ <gd name="yD2" fmla="+- vc dyd2 0" />
+
+
+ <gd name="xAD2" fmla="+- xA2 0 xD2" />
+ <gd name="yAD2" fmla="+- yA2 0 yD2" />
+ <gd name="lAD2" fmla="mod xAD2 yAD2 0" />
+ <gd name="a2" fmla="at2 yAD2 xAD2" />
+
+
+ <gd name="dxF2" fmla="sin lFD a2" />
+ <gd name="dyF2" fmla="cos lFD a2" />
+ <gd name="xF2" fmla="+- xD2 dxF2 0" />
+ <gd name="yF2" fmla="+- yD2 dyF2 0" />
+ <gd name="xE2" fmla="+- xA2 0 dxF2" />
+ <gd name="yE2" fmla="+- yA2 0 dyF2" />
+
+
+ <gd name="yC2t" fmla="sin th a2" />
+ <gd name="xC2t" fmla="cos th a2" />
+ <gd name="yC2" fmla="+- yF2 yC2t 0" />
+ <gd name="xC2" fmla="+- xF2 0 xC2t" />
+
+
+ <gd name="yB2" fmla="+- yE2 yC2t 0" />
+ <gd name="xB2" fmla="+- xE2 0 xC2t" />
+
+ <gd name="swAng1" fmla="+- bA2 0 bD1" />
+
+
+ <gd name="aA3" fmla="+- 1800000 0 ha" />
+ <gd name="aD3" fmla="+- 1800000 ha 0" />
+
+
+ <gd name="ta31" fmla="cos rw aA3" />
+ <gd name="ta32" fmla="sin rh aA3" />
+ <gd name="bA3" fmla="at2 ta31 ta32" />
+
+ <gd name="cta3" fmla="cos rh bA3" />
+ <gd name="sta3" fmla="sin rw bA3" />
+ <gd name="ma3" fmla="mod cta3 sta3 0" />
+ <gd name="na3" fmla="*/ rw rh ma3" />
+ <gd name="dxa3" fmla="cos na3 bA3" />
+ <gd name="dya3" fmla="sin na3 bA3" />
+ <gd name="xA3" fmla="+- hc dxa3 0" />
+ <gd name="yA3" fmla="+- vc dya3 0" />
+
+
+ <gd name="td31" fmla="cos rw aD3" />
+ <gd name="td32" fmla="sin rh aD3" />
+ <gd name="bD3" fmla="at2 td31 td32" />
+
+ <gd name="ctd3" fmla="cos rh bD3" />
+ <gd name="std3" fmla="sin rw bD3" />
+ <gd name="md3" fmla="mod ctd3 std3 0" />
+ <gd name="nd3" fmla="*/ rw rh md3" />
+ <gd name="dxd3" fmla="cos nd3 bD3" />
+ <gd name="dyd3" fmla="sin nd3 bD3" />
+ <gd name="xD3" fmla="+- hc dxd3 0" />
+ <gd name="yD3" fmla="+- vc dyd3 0" />
+
+
+ <gd name="xAD3" fmla="+- xA3 0 xD3" />
+ <gd name="yAD3" fmla="+- yA3 0 yD3" />
+ <gd name="lAD3" fmla="mod xAD3 yAD3 0" />
+ <gd name="a3" fmla="at2 yAD3 xAD3" />
+
+
+ <gd name="dxF3" fmla="sin lFD a3" />
+ <gd name="dyF3" fmla="cos lFD a3" />
+ <gd name="xF3" fmla="+- xD3 dxF3 0" />
+ <gd name="yF3" fmla="+- yD3 dyF3 0" />
+ <gd name="xE3" fmla="+- xA3 0 dxF3" />
+ <gd name="yE3" fmla="+- yA3 0 dyF3" />
+
+
+ <gd name="yC3t" fmla="sin th a3" />
+ <gd name="xC3t" fmla="cos th a3" />
+ <gd name="yC3" fmla="+- yF3 yC3t 0" />
+ <gd name="xC3" fmla="+- xF3 0 xC3t" />
+
+
+ <gd name="yB3" fmla="+- yE3 yC3t 0" />
+ <gd name="xB3" fmla="+- xE3 0 xC3t" />
+
+ <gd name="swAng2" fmla="+- bA3 0 bD2" />
+
+
+ <gd name="aA4" fmla="+- 4200000 0 ha" />
+ <gd name="aD4" fmla="+- 4200000 ha 0" />
+
+
+ <gd name="ta41" fmla="cos rw aA4" />
+ <gd name="ta42" fmla="sin rh aA4" />
+ <gd name="bA4" fmla="at2 ta41 ta42" />
+
+ <gd name="cta4" fmla="cos rh bA4" />
+ <gd name="sta4" fmla="sin rw bA4" />
+ <gd name="ma4" fmla="mod cta4 sta4 0" />
+ <gd name="na4" fmla="*/ rw rh ma4" />
+ <gd name="dxa4" fmla="cos na4 bA4" />
+ <gd name="dya4" fmla="sin na4 bA4" />
+ <gd name="xA4" fmla="+- hc dxa4 0" />
+ <gd name="yA4" fmla="+- vc dya4 0" />
+
+
+ <gd name="td41" fmla="cos rw aD4" />
+ <gd name="td42" fmla="sin rh aD4" />
+ <gd name="bD4" fmla="at2 td41 td42" />
+
+ <gd name="ctd4" fmla="cos rh bD4" />
+ <gd name="std4" fmla="sin rw bD4" />
+ <gd name="md4" fmla="mod ctd4 std4 0" />
+ <gd name="nd4" fmla="*/ rw rh md4" />
+ <gd name="dxd4" fmla="cos nd4 bD4" />
+ <gd name="dyd4" fmla="sin nd4 bD4" />
+ <gd name="xD4" fmla="+- hc dxd4 0" />
+ <gd name="yD4" fmla="+- vc dyd4 0" />
+
+
+ <gd name="xAD4" fmla="+- xA4 0 xD4" />
+ <gd name="yAD4" fmla="+- yA4 0 yD4" />
+ <gd name="lAD4" fmla="mod xAD4 yAD4 0" />
+ <gd name="a4" fmla="at2 yAD4 xAD4" />
+
+
+ <gd name="dxF4" fmla="sin lFD a4" />
+ <gd name="dyF4" fmla="cos lFD a4" />
+ <gd name="xF4" fmla="+- xD4 dxF4 0" />
+ <gd name="yF4" fmla="+- yD4 dyF4 0" />
+ <gd name="xE4" fmla="+- xA4 0 dxF4" />
+ <gd name="yE4" fmla="+- yA4 0 dyF4" />
+
+
+ <gd name="yC4t" fmla="sin th a4" />
+ <gd name="xC4t" fmla="cos th a4" />
+ <gd name="yC4" fmla="+- yF4 yC4t 0" />
+ <gd name="xC4" fmla="+- xF4 0 xC4t" />
+
+
+ <gd name="yB4" fmla="+- yE4 yC4t 0" />
+ <gd name="xB4" fmla="+- xE4 0 xC4t" />
+
+ <gd name="swAng3" fmla="+- bA4 0 bD3" />
+
+
+ <gd name="aA5" fmla="+- 6600000 0 ha" />
+ <gd name="aD5" fmla="+- 6600000 ha 0" />
+
+ <gd name="ta51" fmla="cos rw aA5" />
+ <gd name="ta52" fmla="sin rh aA5" />
+ <gd name="bA5" fmla="at2 ta51 ta52" />
+
+ <gd name="td51" fmla="cos rw aD5" />
+ <gd name="td52" fmla="sin rh aD5" />
+ <gd name="bD5" fmla="at2 td51 td52" />
+
+
+ <gd name="xD5" fmla="+- w 0 xA4" />
+
+
+ <gd name="xC5" fmla="+- w 0 xB4" />
+
+
+ <gd name="xB5" fmla="+- w 0 xC4" />
+
+ <gd name="swAng4" fmla="+- bA5 0 bD4" />
+
+
+ <gd name="aD6" fmla="+- 9000000 ha 0" />
+
+ <gd name="td61" fmla="cos rw aD6" />
+ <gd name="td62" fmla="sin rh aD6" />
+ <gd name="bD6" fmla="at2 td61 td62" />
+
+
+ <gd name="xD6" fmla="+- w 0 xA3" />
+
+
+ <gd name="xC6" fmla="+- w 0 xB3" />
+
+
+ <gd name="xB6" fmla="+- w 0 xC3" />
+
+
+ <gd name="aD7" fmla="+- 11400000 ha 0" />
+
+ <gd name="td71" fmla="cos rw aD7" />
+ <gd name="td72" fmla="sin rh aD7" />
+ <gd name="bD7" fmla="at2 td71 td72" />
+
+
+ <gd name="xD7" fmla="+- w 0 xA2" />
+
+
+ <gd name="xC7" fmla="+- w 0 xB2" />
+
+
+ <gd name="xB7" fmla="+- w 0 xC2" />
+
+
+ <gd name="aD8" fmla="+- 13800000 ha 0" />
+
+ <gd name="td81" fmla="cos rw aD8" />
+ <gd name="td82" fmla="sin rh aD8" />
+ <gd name="bD8" fmla="at2 td81 td82" />
+
+
+ <gd name="xA8" fmla="+- w 0 xD1" />
+
+ <gd name="xD8" fmla="+- w 0 xA1" />
+
+
+ <gd name="xC8" fmla="+- w 0 xB1" />
+
+
+ <gd name="xB8" fmla="+- w 0 xC1" />
+
+
+ <gd name="aA9" fmla="+- 3cd4 0 ha" />
+ <gd name="aD9" fmla="+- 3cd4 ha 0" />
+
+
+ <gd name="td91" fmla="cos rw aD9" />
+ <gd name="td92" fmla="sin rh aD9" />
+ <gd name="bD9" fmla="at2 td91 td92" />
+
+ <gd name="ctd9" fmla="cos rh bD9" />
+ <gd name="std9" fmla="sin rw bD9" />
+ <gd name="md9" fmla="mod ctd9 std9 0" />
+ <gd name="nd9" fmla="*/ rw rh md9" />
+ <gd name="dxd9" fmla="cos nd9 bD9" />
+ <gd name="dyd9" fmla="sin nd9 bD9" />
+ <gd name="xD9" fmla="+- hc dxd9 0" />
+ <gd name="yD9" fmla="+- vc dyd9 0" />
+
+
+ <gd name="ta91" fmla="cos rw aA9" />
+ <gd name="ta92" fmla="sin rh aA9" />
+ <gd name="bA9" fmla="at2 ta91 ta92" />
+
+ <gd name="xA9" fmla="+- hc 0 dxd9" />
+
+
+ <gd name="xF9" fmla="+- xD9 0 lFD" />
+ <gd name="xE9" fmla="+- xA9 lFD 0" />
+
+
+ <gd name="yC9" fmla="+- yD9 0 th" />
+
+ <gd name="swAng5" fmla="+- bA9 0 bD8" />
+
+
+ <gd name="xCxn1" fmla="+/ xB1 xC1 2" />
+ <gd name="yCxn1" fmla="+/ yB1 yC1 2" />
+ <gd name="xCxn2" fmla="+/ xB2 xC2 2" />
+ <gd name="yCxn2" fmla="+/ yB2 yC2 2" />
+ <gd name="xCxn3" fmla="+/ xB3 xC3 2" />
+ <gd name="yCxn3" fmla="+/ yB3 yC3 2" />
+ <gd name="xCxn4" fmla="+/ xB4 xC4 2" />
+ <gd name="yCxn4" fmla="+/ yB4 yC4 2" />
+ <gd name="xCxn5" fmla="+/ r 0 xCxn4" />
+ <gd name="xCxn6" fmla="+/ r 0 xCxn3" />
+ <gd name="xCxn7" fmla="+/ r 0 xCxn2" />
+ <gd name="xCxn8" fmla="+/ r 0 xCxn1" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="20000">
+ <pos x="xD9" y="yD9" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="2679">
+ <pos x="xA9" y="yD9" />
+ </ahXY>
+
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="18600000">
+ <pos x="xCxn1" y="yCxn1" />
+ </cxn>
+
+ <cxn ang="21000000">
+ <pos x="xCxn2" y="yCxn2" />
+ </cxn>
+
+ <cxn ang="1800000">
+ <pos x="xCxn3" y="yCxn3" />
+ </cxn>
+
+ <cxn ang="4200000">
+ <pos x="xCxn4" y="yCxn4" />
+ </cxn>
+
+ <cxn ang="6600000">
+ <pos x="xCxn5" y="yCxn4" />
+ </cxn>
+
+ <cxn ang="9000000">
+ <pos x="xCxn6" y="yCxn3" />
+ </cxn>
+
+ <cxn ang="11400000">
+ <pos x="xCxn7" y="yCxn2" />
+ </cxn>
+
+ <cxn ang="13800000">
+ <pos x="xCxn8" y="yCxn1" />
+ </cxn>
+
+ <cxn ang="3cd4">
+ <pos x="hc" y="yC9" />
+ </cxn>
+
+ </cxnLst>
+
+ <rect l="xA8" t="yD1" r="xD1" b="yD3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="xA1" y="yA1" />
+ </moveTo>
+ <lnTo>
+ <pt x="xB1" y="yB1" />
+ </lnTo>
+ <lnTo>
+ <pt x="xC1" y="yC1" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD1" y="yD1" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD1" swAng="swAng1" />
+
+ <lnTo>
+ <pt x="xB2" y="yB2" />
+ </lnTo>
+ <lnTo>
+ <pt x="xC2" y="yC2" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD2" y="yD2" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD2" swAng="swAng2" />
+
+ <lnTo>
+ <pt x="xB3" y="yB3" />
+ </lnTo>
+ <lnTo>
+ <pt x="xC3" y="yC3" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD3" y="yD3" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD3" swAng="swAng3" />
+
+ <lnTo>
+ <pt x="xB4" y="yB4" />
+ </lnTo>
+ <lnTo>
+ <pt x="xC4" y="yC4" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD4" y="yD4" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD4" swAng="swAng4" />
+
+ <lnTo>
+ <pt x="xB5" y="yC4" />
+ </lnTo>
+ <lnTo>
+ <pt x="xC5" y="yB4" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD5" y="yA4" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD5" swAng="swAng3" />
+
+ <lnTo>
+ <pt x="xB6" y="yC3" />
+ </lnTo>
+ <lnTo>
+ <pt x="xC6" y="yB3" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD6" y="yA3" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD6" swAng="swAng2" />
+
+ <lnTo>
+ <pt x="xB7" y="yC2" />
+ </lnTo>
+ <lnTo>
+ <pt x="xC7" y="yB2" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD7" y="yA2" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD7" swAng="swAng1" />
+
+ <lnTo>
+ <pt x="xB8" y="yC1" />
+ </lnTo>
+ <lnTo>
+ <pt x="xC8" y="yB1" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD8" y="yA1" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD8" swAng="swAng5" />
+
+ <lnTo>
+ <pt x="xE9" y="yC9" />
+ </lnTo>
+ <lnTo>
+ <pt x="xF9" y="yC9" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD9" y="yD9" />
+ </lnTo>
+ <arcTo hR="rh" wR="rw" stAng="bD9" swAng="swAng5" />
+ <close />
+ </path>
+ </pathLst>
+
+ </gear9>
+ <halfFrame>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 33333" />
+
+ <gd name="adj2" fmla="val 33333" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 100000 w ss" />
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="x1" fmla="*/ ss a2 100000" />
+ <gd name="g1" fmla="*/ h x1 w" />
+ <gd name="g2" fmla="+- h 0 g1" />
+ <gd name="maxAdj1" fmla="*/ 100000 g2 ss" />
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="y1" fmla="*/ ss a1 100000" />
+ <gd name="dx2" fmla="*/ y1 w h" />
+ <gd name="x2" fmla="+- r 0 dx2" />
+ <gd name="dy2" fmla="*/ x1 h w" />
+ <gd name="y2" fmla="+- b 0 dy2" />
+ <gd name="cx1" fmla="*/ x1 1 2" />
+ <gd name="cy1" fmla="+/ y2 b 2" />
+ <gd name="cx2" fmla="+/ x2 r 2" />
+ <gd name="cy2" fmla="*/ y1 1 2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">
+ <pos x="l" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="cx2" y="cy2" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="cx1" y="cy1" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </halfFrame>
+ <heart>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dx1" fmla="*/ w 49 48" />
+ <gd name="dx2" fmla="*/ w 10 48" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x3" fmla="+- hc dx2 0" />
+ <gd name="x4" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- t 0 hd3" />
+
+
+ <gd name="il" fmla="*/ w 1 6" />
+ <gd name="ir" fmla="*/ w 5 6" />
+ <gd name="ib" fmla="*/ h 2 3" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="hd4" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="hd4" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="hc" y="hd4" />
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x3" y="y1" />
+ <pt x="x4" y="hd4" />
+ <pt x="hc" y="b" />
+ </cubicBezTo>
+ <cubicBezTo>
+ <pt x="x1" y="hd4" />
+ <pt x="x2" y="y1" />
+ <pt x="hc" y="hd4" />
+ </cubicBezTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </heart>
+ <heptagon>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="hf" fmla="val 102572" />
+ <gd name="vf" fmla="val 105210" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="swd2" fmla="*/ wd2 hf 100000" />
+ <gd name="shd2" fmla="*/ hd2 vf 100000" />
+ <gd name="svc" fmla="*/ vc vf 100000" />
+ <gd name="dx1" fmla="*/ swd2 97493 100000" />
+ <gd name="dx2" fmla="*/ swd2 78183 100000" />
+ <gd name="dx3" fmla="*/ swd2 43388 100000" />
+ <gd name="dy1" fmla="*/ shd2 62349 100000" />
+ <gd name="dy2" fmla="*/ shd2 22252 100000" />
+ <gd name="dy3" fmla="*/ shd2 90097 100000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x3" fmla="+- hc 0 dx3" />
+ <gd name="x4" fmla="+- hc dx3 0" />
+ <gd name="x5" fmla="+- hc dx2 0" />
+ <gd name="x6" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- svc 0 dy1" />
+ <gd name="y2" fmla="+- svc dy2 0" />
+ <gd name="y3" fmla="+- svc dy3 0" />
+ <gd name="ib" fmla="+- b 0 y1" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x5" y="y1" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x6" y="y2" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x4" y="y3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="y3" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x2" y="y1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x2" t="y1" r="x5" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </heptagon>
+ <hexagon>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 25000" />
+ <gd name="vf" fmla="val 115470" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj" fmla="*/ 50000 w ss" />
+ <gd name="a" fmla="pin 0 adj maxAdj" />
+ <gd name="shd2" fmla="*/ hd2 vf 100000" />
+ <gd name="x1" fmla="*/ ss a 100000" />
+ <gd name="x2" fmla="+- r 0 x1" />
+ <gd name="dy1" fmla="sin shd2 3600000" />
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc dy1 0" />
+ <gd name="q1" fmla="*/ maxAdj -1 2" />
+ <gd name="q2" fmla="+- a q1 0" />
+ <gd name="q3" fmla="?: q2 4 2" />
+ <gd name="q4" fmla="?: q2 3 2" />
+ <gd name="q5" fmla="?: q2 q1 0" />
+ <gd name="q6" fmla="+/ a q5 q1" />
+ <gd name="q7" fmla="*/ q6 q4 -1" />
+ <gd name="q8" fmla="+- q3 q7 0" />
+ <gd name="il" fmla="*/ w q8 24" />
+ <gd name="it" fmla="*/ h q8 24" />
+ <gd name="ir" fmla="+- r 0 il" />
+ <gd name="ib" fmla="+- b 0 it" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="maxAdj">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x2" y="y2" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x1" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x1" y="y1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x2" y="y1" />
+ </cxn>
+ </cxnLst>
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </hexagon>
+ <homePlate>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj" fmla="*/ 100000 w ss" />
+ <gd name="a" fmla="pin 0 adj maxAdj" />
+ <gd name="dx1" fmla="*/ ss a 100000" />
+ <gd name="x1" fmla="+- r 0 dx1" />
+ <gd name="ir" fmla="+/ x1 r 2" />
+ <gd name="x2" fmla="*/ x1 1 2" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="maxAdj">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x2" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x1" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </homePlate>
+ <horizontalScroll>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 12500" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 25000" />
+ <gd name="ch" fmla="*/ ss a 100000" />
+
+ <gd name="ch2" fmla="*/ ch 1 2" />
+
+ <gd name="ch4" fmla="*/ ch 1 4" />
+
+
+
+
+
+ <gd name="y3" fmla="+- ch ch2 0" />
+
+ <gd name="y4" fmla="+- ch ch 0" />
+
+ <gd name="y6" fmla="+- b 0 ch" />
+
+ <gd name="y7" fmla="+- b 0 ch2" />
+
+ <gd name="y5" fmla="+- y6 0 ch2" />
+
+
+
+
+
+ <gd name="x3" fmla="+- r 0 ch" />
+
+ <gd name="x4" fmla="+- r 0 ch2" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="25000">
+ <pos x="ch" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd4">
+ <pos x="hc" y="ch" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="y6" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="ch" t="ch" r="x4" b="y6" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="r" y="ch2" />
+ </moveTo>
+ <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="x4" y="ch2" />
+ </lnTo>
+ <arcTo wR="ch4" hR="ch4" stAng="0" swAng="cd2" />
+ <lnTo>
+ <pt x="x3" y="ch" />
+ </lnTo>
+ <lnTo>
+ <pt x="ch2" y="ch" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="3cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="l" y="y7" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="cd2" swAng="-10800000" />
+ <lnTo>
+ <pt x="ch" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y6" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-5400000" />
+ <close />
+ <moveTo>
+ <pt x="ch2" y="y4" />
+ </moveTo>
+ <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-5400000" />
+ <arcTo wR="ch4" hR="ch4" stAng="0" swAng="-10800000" />
+ <close />
+ </path>
+ <path fill="darkenLess" stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="ch2" y="y4" />
+ </moveTo>
+ <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-5400000" />
+ <arcTo wR="ch4" hR="ch4" stAng="0" swAng="-10800000" />
+ <close />
+ <moveTo>
+ <pt x="x4" y="ch" />
+ </moveTo>
+ <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-16200000" />
+ <arcTo wR="ch4" hR="ch4" stAng="cd2" swAng="-10800000" />
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="y3" />
+ </moveTo>
+ <arcTo wR="ch2" hR="ch2" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="x3" y="ch" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="ch2" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="cd2" swAng="cd2" />
+ <lnTo>
+ <pt x="r" y="y5" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="ch" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="ch" y="y7" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd2" />
+ <close />
+ <moveTo>
+ <pt x="x3" y="ch" />
+ </moveTo>
+ <lnTo>
+ <pt x="x4" y="ch" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-5400000" />
+ <moveTo>
+ <pt x="x4" y="ch" />
+ </moveTo>
+ <lnTo>
+ <pt x="x4" y="ch2" />
+ </lnTo>
+ <arcTo wR="ch4" hR="ch4" stAng="0" swAng="cd2" />
+ <moveTo>
+ <pt x="ch2" y="y4" />
+ </moveTo>
+ <lnTo>
+ <pt x="ch2" y="y3" />
+ </lnTo>
+ <arcTo wR="ch4" hR="ch4" stAng="cd2" swAng="cd2" />
+ <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd2" />
+ <moveTo>
+ <pt x="ch" y="y3" />
+ </moveTo>
+ <lnTo>
+ <pt x="ch" y="y6" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </horizontalScroll>
+ <irregularSeal1>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x5" fmla="*/ w 4627 21600" />
+ <gd name="x12" fmla="*/ w 8485 21600" />
+ <gd name="x21" fmla="*/ w 16702 21600" />
+ <gd name="x24" fmla="*/ w 14522 21600" />
+ <gd name="y3" fmla="*/ h 6320 21600" />
+ <gd name="y6" fmla="*/ h 8615 21600" />
+ <gd name="y9" fmla="*/ h 13937 21600" />
+ <gd name="y18" fmla="*/ h 13290 21600" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x24" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y6" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x12" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y18" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x5" t="y3" r="x21" b="y9" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="21600" h="21600">
+ <moveTo>
+ <pt x="10800" y="5800" />
+ </moveTo>
+ <lnTo>
+ <pt x="14522" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="14155" y="5325" />
+ </lnTo>
+ <lnTo>
+ <pt x="18380" y="4457" />
+ </lnTo>
+ <lnTo>
+ <pt x="16702" y="7315" />
+ </lnTo>
+ <lnTo>
+ <pt x="21097" y="8137" />
+ </lnTo>
+ <lnTo>
+ <pt x="17607" y="10475" />
+ </lnTo>
+ <lnTo>
+ <pt x="21600" y="13290" />
+ </lnTo>
+ <lnTo>
+ <pt x="16837" y="12942" />
+ </lnTo>
+ <lnTo>
+ <pt x="18145" y="18095" />
+ </lnTo>
+ <lnTo>
+ <pt x="14020" y="14457" />
+ </lnTo>
+ <lnTo>
+ <pt x="13247" y="19737" />
+ </lnTo>
+ <lnTo>
+ <pt x="10532" y="14935" />
+ </lnTo>
+ <lnTo>
+ <pt x="8485" y="21600" />
+ </lnTo>
+ <lnTo>
+ <pt x="7715" y="15627" />
+ </lnTo>
+ <lnTo>
+ <pt x="4762" y="17617" />
+ </lnTo>
+ <lnTo>
+ <pt x="5667" y="13937" />
+ </lnTo>
+ <lnTo>
+ <pt x="135" y="14587" />
+ </lnTo>
+ <lnTo>
+ <pt x="3722" y="11775" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="8615" />
+ </lnTo>
+ <lnTo>
+ <pt x="4627" y="7617" />
+ </lnTo>
+ <lnTo>
+ <pt x="370" y="2295" />
+ </lnTo>
+ <lnTo>
+ <pt x="7312" y="6320" />
+ </lnTo>
+ <lnTo>
+ <pt x="8352" y="2295" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </irregularSeal1>
+ <irregularSeal2>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x2" fmla="*/ w 9722 21600" />
+ <gd name="x5" fmla="*/ w 5372 21600" />
+ <gd name="x16" fmla="*/ w 11612 21600" />
+ <gd name="x19" fmla="*/ w 14640 21600" />
+ <gd name="y2" fmla="*/ h 1887 21600" />
+ <gd name="y3" fmla="*/ h 6382 21600" />
+ <gd name="y8" fmla="*/ h 12877 21600" />
+ <gd name="y14" fmla="*/ h 19712 21600" />
+ <gd name="y16" fmla="*/ h 18842 21600" />
+ <gd name="y17" fmla="*/ h 15935 21600" />
+ <gd name="y24" fmla="*/ h 6645 21600" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x2" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y8" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x16" y="y16" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y24" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x5" t="y3" r="x19" b="y17" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="21600" h="21600">
+ <moveTo>
+ <pt x="11462" y="4342" />
+ </moveTo>
+ <lnTo>
+ <pt x="14790" y="0" />
+ </lnTo>
+ <lnTo>
+ <pt x="14525" y="5777" />
+ </lnTo>
+ <lnTo>
+ <pt x="18007" y="3172" />
+ </lnTo>
+ <lnTo>
+ <pt x="16380" y="6532" />
+ </lnTo>
+ <lnTo>
+ <pt x="21600" y="6645" />
+ </lnTo>
+ <lnTo>
+ <pt x="16985" y="9402" />
+ </lnTo>
+ <lnTo>
+ <pt x="18270" y="11290" />
+ </lnTo>
+ <lnTo>
+ <pt x="16380" y="12310" />
+ </lnTo>
+ <lnTo>
+ <pt x="18877" y="15632" />
+ </lnTo>
+ <lnTo>
+ <pt x="14640" y="14350" />
+ </lnTo>
+ <lnTo>
+ <pt x="14942" y="17370" />
+ </lnTo>
+ <lnTo>
+ <pt x="12180" y="15935" />
+ </lnTo>
+ <lnTo>
+ <pt x="11612" y="18842" />
+ </lnTo>
+ <lnTo>
+ <pt x="9872" y="17370" />
+ </lnTo>
+ <lnTo>
+ <pt x="8700" y="19712" />
+ </lnTo>
+ <lnTo>
+ <pt x="7527" y="18125" />
+ </lnTo>
+ <lnTo>
+ <pt x="4917" y="21600" />
+ </lnTo>
+ <lnTo>
+ <pt x="4805" y="18240" />
+ </lnTo>
+ <lnTo>
+ <pt x="1285" y="17825" />
+ </lnTo>
+ <lnTo>
+ <pt x="3330" y="15370" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="12877" />
+ </lnTo>
+ <lnTo>
+ <pt x="3935" y="11592" />
+ </lnTo>
+ <lnTo>
+ <pt x="1172" y="8270" />
+ </lnTo>
+ <lnTo>
+ <pt x="5372" y="7817" />
+ </lnTo>
+ <lnTo>
+ <pt x="4502" y="3625" />
+ </lnTo>
+ <lnTo>
+ <pt x="8550" y="6382" />
+ </lnTo>
+ <lnTo>
+ <pt x="9722" y="1887" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </irregularSeal2>
+ <leftArrow>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+ <gd name="adj2" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 100000 w ss" />
+ <gd name="a1" fmla="pin 0 adj1 100000" />
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="dx2" fmla="*/ ss a2 100000" />
+ <gd name="x2" fmla="+- l dx2 0" />
+ <gd name="dy1" fmla="*/ h a1 200000" />
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc dy1 0" />
+ <gd name="dx1" fmla="*/ y1 dx2 hd2" />
+ <gd name="x1" fmla="+- x2 0 dx1" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="100000">
+ <pos x="r" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="x2" y="t" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x2" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x2" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+ <rect l="x1" t="y1" r="r" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </leftArrow>
+ <leftArrowCallout>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 25000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ <gd name="adj4" fmla="val 64977" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 50000 h ss" />
+
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="maxAdj1" fmla="*/ a2 2 1" />
+
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="maxAdj3" fmla="*/ 100000 w ss" />
+
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="q2" fmla="*/ a3 ss w" />
+
+ <gd name="maxAdj4" fmla="+- 100000 0 q2" />
+
+ <gd name="a4" fmla="pin 0 adj4 maxAdj4" />
+ <gd name="dy1" fmla="*/ ss a2 100000" />
+
+ <gd name="dy2" fmla="*/ ss a1 200000" />
+
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc 0 dy2" />
+ <gd name="y3" fmla="+- vc dy2 0" />
+ <gd name="y4" fmla="+- vc dy1 0" />
+ <gd name="x1" fmla="*/ ss a3 100000" />
+
+ <gd name="dx2" fmla="*/ w a4 100000" />
+
+ <gd name="x2" fmla="+- r 0 dx2" />
+ <gd name="x3" fmla="+/ x2 r 2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">
+ <pos x="x1" y="y2" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">
+ <pos x="l" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj3" minX="0" maxX="maxAdj3">
+ <pos x="x1" y="t" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="0" maxX="maxAdj4">
+ <pos x="x2" y="b" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x3" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x2" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </leftArrowCallout>
+ <leftBrace>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 8333" />
+ <gd name="adj2" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a2" fmla="pin 0 adj2 100000" />
+ <gd name="q1" fmla="+- 100000 0 a2" />
+ <gd name="q2" fmla="min q1 a2" />
+ <gd name="q3" fmla="*/ q2 1 2" />
+ <gd name="maxAdj1" fmla="*/ q3 h ss" />
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="y1" fmla="*/ ss a1 100000" />
+ <gd name="y3" fmla="*/ h a2 100000" />
+ <gd name="y4" fmla="+- y3 y1 0" />
+ <gd name="dx1" fmla="cos wd2 2700000" />
+ <gd name="dy1" fmla="sin y1 2700000" />
+ <gd name="il" fmla="+- r 0 dx1" />
+ <gd name="it" fmla="+- y1 0 dy1" />
+ <gd name="ib" fmla="+- b dy1 y1" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">
+ <pos x="hc" y="y1" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="0" maxY="100000">
+ <pos x="l" y="y3" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd4">
+ <pos x="r" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y3" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="r" y="b" />
+ </cxn>
+ </cxnLst>
+ <rect l="il" t="it" r="r" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="r" y="b" />
+ </moveTo>
+ <arcTo wR="wd2" hR="y1" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="hc" y="y4" />
+ </lnTo>
+ <arcTo wR="wd2" hR="y1" stAng="0" swAng="-5400000" />
+ <arcTo wR="wd2" hR="y1" stAng="cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="hc" y="y1" />
+ </lnTo>
+ <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="cd4" />
+ <close />
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="r" y="b" />
+ </moveTo>
+ <arcTo wR="wd2" hR="y1" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="hc" y="y4" />
+ </lnTo>
+ <arcTo wR="wd2" hR="y1" stAng="0" swAng="-5400000" />
+ <arcTo wR="wd2" hR="y1" stAng="cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="hc" y="y1" />
+ </lnTo>
+ <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="cd4" />
+ </path>
+ </pathLst>
+ </leftBrace>
+ <leftBracket>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 8333" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj" fmla="*/ 50000 h ss" />
+
+ <gd name="a" fmla="pin 0 adj maxAdj" />
+ <gd name="y1" fmla="*/ ss a 100000" />
+
+ <gd name="y2" fmla="+- b 0 y1" />
+
+ <gd name="dx1" fmla="cos w 2700000" />
+ <gd name="dy1" fmla="sin y1 2700000" />
+ <gd name="il" fmla="+- r 0 dx1" />
+ <gd name="it" fmla="+- y1 0 dy1" />
+ <gd name="ib" fmla="+- b dy1 y1" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="maxAdj">
+ <pos x="l" y="y1" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd4">
+ <pos x="r" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="r" y="b" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="r" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="r" y="b" />
+ </moveTo>
+ <arcTo wR="w" hR="y1" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="l" y="y1" />
+ </lnTo>
+ <arcTo wR="w" hR="y1" stAng="cd2" swAng="cd4" />
+ <close />
+ </path>
+ <path fill="none">
+
+ <moveTo>
+ <pt x="r" y="b" />
+ </moveTo>
+ <arcTo wR="w" hR="y1" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="l" y="y1" />
+ </lnTo>
+ <arcTo wR="w" hR="y1" stAng="cd2" swAng="cd4" />
+ </path>
+ </pathLst>
+
+ </leftBracket>
+ <leftCircularArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 12500" />
+
+ <gd name="adj2" fmla="val -1142319" />
+
+ <gd name="adj3" fmla="val 1142319" />
+
+ <gd name="adj4" fmla="val 10800000" />
+
+ <gd name="adj5" fmla="val 12500" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a5" fmla="pin 0 adj5 25000" />
+
+ <gd name="maxAdj1" fmla="*/ a5 2 1" />
+
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="enAng" fmla="pin 1 adj3 21599999" />
+ <gd name="stAng" fmla="pin 0 adj4 21599999" />
+
+ <gd name="th" fmla="*/ ss a1 100000" />
+
+ <gd name="thh" fmla="*/ ss a5 100000" />
+
+ <gd name="th2" fmla="*/ th 1 2" />
+
+
+ <gd name="rw1" fmla="+- wd2 th2 thh" />
+
+ <gd name="rh1" fmla="+- hd2 th2 thh" />
+
+ <gd name="rw2" fmla="+- rw1 0 th" />
+
+ <gd name="rh2" fmla="+- rh1 0 th" />
+
+ <gd name="rw3" fmla="+- rw2 th2 0" />
+
+ <gd name="rh3" fmla="+- rh2 th2 0" />
+
+
+ <gd name="wtH" fmla="sin rw3 enAng" />
+ <gd name="htH" fmla="cos rh3 enAng" />
+ <gd name="dxH" fmla="cat2 rw3 htH wtH" />
+ <gd name="dyH" fmla="sat2 rh3 htH wtH" />
+ <gd name="xH" fmla="+- hc dxH 0" />
+
+ <gd name="yH" fmla="+- vc dyH 0" />
+
+
+ <gd name="rI" fmla="min rw2 rh2" />
+
+ <gd name="u1" fmla="*/ dxH dxH 1" />
+ <gd name="u2" fmla="*/ dyH dyH 1" />
+ <gd name="u3" fmla="*/ rI rI 1" />
+ <gd name="u4" fmla="+- u1 0 u3" />
+ <gd name="u5" fmla="+- u2 0 u3" />
+ <gd name="u6" fmla="*/ u4 u5 u1" />
+ <gd name="u7" fmla="*/ u6 1 u2" />
+ <gd name="u8" fmla="+- 1 0 u7" />
+ <gd name="u9" fmla="sqrt u8" />
+ <gd name="u10" fmla="*/ u4 1 dxH" />
+ <gd name="u11" fmla="*/ u10 1 dyH" />
+ <gd name="u12" fmla="+/ 1 u9 u11" />
+ <gd name="u13" fmla="at2 1 u12" />
+ <gd name="u14" fmla="+- u13 21600000 0" />
+ <gd name="u15" fmla="?: u13 u13 u14" />
+ <gd name="u16" fmla="+- u15 0 enAng" />
+
+ <gd name="u17" fmla="+- u16 21600000 0" />
+ <gd name="u18" fmla="?: u16 u16 u17" />
+ <gd name="u19" fmla="+- u18 0 cd2" />
+ <gd name="u20" fmla="+- u18 0 21600000" />
+ <gd name="u21" fmla="?: u19 u20 u18" />
+ <gd name="u22" fmla="abs u21" />
+ <gd name="minAng" fmla="*/ u22 -1 1" />
+ <gd name="u23" fmla="abs adj2" />
+ <gd name="a2" fmla="*/ u23 -1 1" />
+ <gd name="aAng" fmla="pin minAng a2 0" />
+
+ <gd name="ptAng" fmla="+- enAng aAng 0" />
+
+
+ <gd name="wtA" fmla="sin rw3 ptAng" />
+ <gd name="htA" fmla="cos rh3 ptAng" />
+ <gd name="dxA" fmla="cat2 rw3 htA wtA" />
+ <gd name="dyA" fmla="sat2 rh3 htA wtA" />
+ <gd name="xA" fmla="+- hc dxA 0" />
+
+ <gd name="yA" fmla="+- vc dyA 0" />
+
+
+ <gd name="wtE" fmla="sin rw1 stAng" />
+ <gd name="htE" fmla="cos rh1 stAng" />
+ <gd name="dxE" fmla="cat2 rw1 htE wtE" />
+ <gd name="dyE" fmla="sat2 rh1 htE wtE" />
+ <gd name="xE" fmla="+- hc dxE 0" />
+
+ <gd name="yE" fmla="+- vc dyE 0" />
+
+
+ <gd name="wtD" fmla="sin rw2 stAng" />
+ <gd name="htD" fmla="cos rh2 stAng" />
+ <gd name="dxD" fmla="cat2 rw2 htD wtD" />
+ <gd name="dyD" fmla="sat2 rh2 htD wtD" />
+ <gd name="xD" fmla="+- hc dxD 0" />
+
+ <gd name="yD" fmla="+- vc dyD 0" />
+
+
+ <gd name="dxG" fmla="cos thh ptAng" />
+ <gd name="dyG" fmla="sin thh ptAng" />
+ <gd name="xG" fmla="+- xH dxG 0" />
+
+ <gd name="yG" fmla="+- yH dyG 0" />
+
+
+ <gd name="dxB" fmla="cos thh ptAng" />
+ <gd name="dyB" fmla="sin thh ptAng" />
+ <gd name="xB" fmla="+- xH 0 dxB 0" />
+
+ <gd name="yB" fmla="+- yH 0 dyB 0" />
+
+
+ <gd name="sx1" fmla="+- xB 0 hc" />
+
+ <gd name="sy1" fmla="+- yB 0 vc" />
+
+ <gd name="sx2" fmla="+- xG 0 hc" />
+
+ <gd name="sy2" fmla="+- yG 0 vc" />
+
+
+ <gd name="rO" fmla="min rw1 rh1" />
+
+ <gd name="x1O" fmla="*/ sx1 rO rw1" />
+
+ <gd name="y1O" fmla="*/ sy1 rO rh1" />
+
+ <gd name="x2O" fmla="*/ sx2 rO rw1" />
+
+ <gd name="y2O" fmla="*/ sy2 rO rh1" />
+
+
+ <gd name="dxO" fmla="+- x2O 0 x1O" />
+ <gd name="dyO" fmla="+- y2O 0 y1O" />
+ <gd name="dO" fmla="mod dxO dyO 0" />
+
+ <gd name="q1" fmla="*/ x1O y2O 1" />
+ <gd name="q2" fmla="*/ x2O y1O 1" />
+ <gd name="DO" fmla="+- q1 0 q2" />
+
+
+ <gd name="q3" fmla="*/ rO rO 1" />
+
+ <gd name="q4" fmla="*/ dO dO 1" />
+
+ <gd name="q5" fmla="*/ q3 q4 1" />
+
+ <gd name="q6" fmla="*/ DO DO 1" />
+
+ <gd name="q7" fmla="+- q5 0 q6" />
+
+ <gd name="q8" fmla="max q7 0" />
+
+ <gd name="sdelO" fmla="sqrt q8" />
+
+ <gd name="ndyO" fmla="*/ dyO -1 1" />
+ <gd name="sdyO" fmla="?: ndyO -1 1" />
+
+ <gd name="q9" fmla="*/ sdyO dxO 1" />
+
+ <gd name="q10" fmla="*/ q9 sdelO 1" />
+
+ <gd name="q11" fmla="*/ DO dyO 1" />
+
+ <gd name="dxF1" fmla="+/ q11 q10 q4" />
+
+ <gd name="q12" fmla="+- q11 0 q10" />
+ <gd name="dxF2" fmla="*/ q12 1 q4" />
+
+
+ <gd name="adyO" fmla="abs dyO" />
+ <gd name="q13" fmla="*/ adyO sdelO 1" />
+
+ <gd name="q14" fmla="*/ DO dxO -1" />
+
+ <gd name="dyF1" fmla="+/ q14 q13 q4" />
+
+ <gd name="q15" fmla="+- q14 0 q13" />
+ <gd name="dyF2" fmla="*/ q15 1 q4" />
+
+
+
+ <gd name="q16" fmla="+- x2O 0 dxF1" />
+ <gd name="q17" fmla="+- x2O 0 dxF2" />
+ <gd name="q18" fmla="+- y2O 0 dyF1" />
+ <gd name="q19" fmla="+- y2O 0 dyF2" />
+ <gd name="q20" fmla="mod q16 q18 0" />
+
+ <gd name="q21" fmla="mod q17 q19 0" />
+
+ <gd name="q22" fmla="+- q21 0 q20" />
+ <gd name="dxF" fmla="?: q22 dxF1 dxF2" />
+
+ <gd name="dyF" fmla="?: q22 dyF1 dyF2" />
+
+ <gd name="sdxF" fmla="*/ dxF rw1 rO" />
+
+ <gd name="sdyF" fmla="*/ dyF rh1 rO" />
+
+ <gd name="xF" fmla="+- hc sdxF 0" />
+
+ <gd name="yF" fmla="+- vc sdyF 0" />
+
+
+
+
+ <gd name="x1I" fmla="*/ sx1 rI rw2" />
+
+ <gd name="y1I" fmla="*/ sy1 rI rh2" />
+
+ <gd name="x2I" fmla="*/ sx2 rI rw2" />
+
+ <gd name="y2I" fmla="*/ sy2 rI rh2" />
+
+
+ <gd name="dxI" fmla="+- x2I 0 x1I" />
+ <gd name="dyI" fmla="+- y2I 0 y1I" />
+ <gd name="dI" fmla="mod dxI dyI 0" />
+ <gd name="v1" fmla="*/ x1I y2I 1" />
+ <gd name="v2" fmla="*/ x2I y1I 1" />
+ <gd name="DI" fmla="+- v1 0 v2" />
+
+ <gd name="v3" fmla="*/ rI rI 1" />
+ <gd name="v4" fmla="*/ dI dI 1" />
+ <gd name="v5" fmla="*/ v3 v4 1" />
+ <gd name="v6" fmla="*/ DI DI 1" />
+ <gd name="v7" fmla="+- v5 0 v6" />
+ <gd name="v8" fmla="max v7 0" />
+ <gd name="sdelI" fmla="sqrt v8" />
+ <gd name="v9" fmla="*/ sdyO dxI 1" />
+ <gd name="v10" fmla="*/ v9 sdelI 1" />
+ <gd name="v11" fmla="*/ DI dyI 1" />
+ <gd name="dxC1" fmla="+/ v11 v10 v4" />
+ <gd name="v12" fmla="+- v11 0 v10" />
+ <gd name="dxC2" fmla="*/ v12 1 v4" />
+
+ <gd name="adyI" fmla="abs dyI" />
+ <gd name="v13" fmla="*/ adyI sdelI 1" />
+ <gd name="v14" fmla="*/ DI dxI -1" />
+ <gd name="dyC1" fmla="+/ v14 v13 v4" />
+ <gd name="v15" fmla="+- v14 0 v13" />
+ <gd name="dyC2" fmla="*/ v15 1 v4" />
+
+ <gd name="v16" fmla="+- x1I 0 dxC1" />
+ <gd name="v17" fmla="+- x1I 0 dxC2" />
+ <gd name="v18" fmla="+- y1I 0 dyC1" />
+ <gd name="v19" fmla="+- y1I 0 dyC2" />
+ <gd name="v20" fmla="mod v16 v18 0" />
+ <gd name="v21" fmla="mod v17 v19 0" />
+ <gd name="v22" fmla="+- v21 0 v20" />
+ <gd name="dxC" fmla="?: v22 dxC1 dxC2" />
+ <gd name="dyC" fmla="?: v22 dyC1 dyC2" />
+ <gd name="sdxC" fmla="*/ dxC rw2 rI" />
+ <gd name="sdyC" fmla="*/ dyC rh2 rI" />
+ <gd name="xC" fmla="+- hc sdxC 0" />
+
+ <gd name="yC" fmla="+- vc sdyC 0" />
+
+
+ <gd name="ist0" fmla="at2 sdxC sdyC" />
+ <gd name="ist1" fmla="+- ist0 21600000 0" />
+ <gd name="istAng0" fmla="?: ist0 ist0 ist1" />
+ <gd name="isw1" fmla="+- stAng 0 istAng0" />
+ <gd name="isw2" fmla="+- isw1 21600000 0" />
+ <gd name="iswAng0" fmla="?: isw1 isw1 isw2" />
+
+ <gd name="istAng" fmla="+- istAng0 iswAng0 0" />
+ <gd name="iswAng" fmla="+- 0 0 iswAng0" />
+
+ <gd name="p1" fmla="+- xF 0 xC" />
+ <gd name="p2" fmla="+- yF 0 yC" />
+ <gd name="p3" fmla="mod p1 p2 0" />
+ <gd name="p4" fmla="*/ p3 1 2" />
+ <gd name="p5" fmla="+- p4 0 thh" />
+ <gd name="xGp" fmla="?: p5 xF xG" />
+ <gd name="yGp" fmla="?: p5 yF yG" />
+ <gd name="xBp" fmla="?: p5 xC xB" />
+ <gd name="yBp" fmla="?: p5 yC yB" />
+
+ <gd name="en0" fmla="at2 sdxF sdyF" />
+ <gd name="en1" fmla="+- en0 21600000 0" />
+ <gd name="en2" fmla="?: en0 en0 en1" />
+ <gd name="sw0" fmla="+- en2 0 stAng" />
+ <gd name="sw1" fmla="+- sw0 0 21600000" />
+ <gd name="swAng" fmla="?: sw0 sw1 sw0" />
+
+
+ <gd name="stAng0" fmla="+- stAng swAng 0" />
+
+ <gd name="swAng0" fmla="+- 0 0 swAng" />
+
+
+ <gd name="wtI" fmla="sin rw3 stAng" />
+ <gd name="htI" fmla="cos rh3 stAng" />
+ <gd name="dxI" fmla="cat2 rw3 htI wtI" />
+ <gd name="dyI" fmla="sat2 rh3 htI wtI" />
+ <gd name="xI" fmla="+- hc dxI 0" />
+
+ <gd name="yI" fmla="+- vc dyI 0" />
+
+
+ <gd name="aI" fmla="+- stAng cd4 0" />
+ <gd name="aA" fmla="+- ptAng 0 cd4" />
+ <gd name="aB" fmla="+- ptAng cd2 0" />
+
+ <gd name="idx" fmla="cos rw1 2700000" />
+ <gd name="idy" fmla="sin rh1 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefAng="adj2" minAng="minAng" maxAng="0">
+ <pos x="xA" y="yA" />
+ </ahPolar>
+ <ahPolar gdRefAng="adj4" minAng="0" maxAng="21599999">
+ <pos x="xE" y="yE" />
+ </ahPolar>
+ <ahPolar gdRefR="adj1" minR="0" maxR="maxAdj1" gdRefAng="adj3" minAng="0" maxAng="21599999">
+ <pos x="xF" y="yF" />
+ </ahPolar>
+ <ahPolar gdRefR="adj5" minR="0" maxR="25000">
+ <pos x="xB" y="yB" />
+ </ahPolar>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="aI">
+ <pos x="xI" y="yI" />
+ </cxn>
+ <cxn ang="ptAng">
+ <pos x="xGp" y="yGp" />
+ </cxn>
+ <cxn ang="aA">
+ <pos x="xA" y="yA" />
+ </cxn>
+ <cxn ang="aB">
+ <pos x="xBp" y="yBp" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="xE" y="yE" />
+ </moveTo>
+ <lnTo>
+ <pt x="xD" y="yD" />
+ </lnTo>
+ <arcTo wR="rw2" hR="rh2" stAng="istAng" swAng="iswAng" />
+ <lnTo>
+ <pt x="xBp" y="yBp" />
+ </lnTo>
+ <lnTo>
+ <pt x="xA" y="yA" />
+ </lnTo>
+ <lnTo>
+ <pt x="xGp" y="yGp" />
+ </lnTo>
+ <lnTo>
+ <pt x="xF" y="yF" />
+ </lnTo>
+ <arcTo wR="rw1" hR="rh1" stAng="stAng0" swAng="swAng0" />
+ <close />
+ </path>
+ </pathLst>
+
+ </leftCircularArrow>
+ <leftRightArrow>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+ <gd name="adj2" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 50000 w ss" />
+ <gd name="a1" fmla="pin 0 adj1 100000" />
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="x2" fmla="*/ ss a2 100000" />
+ <gd name="x3" fmla="+- r 0 x2" />
+ <gd name="dy" fmla="*/ h a1 200000" />
+ <gd name="y1" fmla="+- vc 0 dy" />
+ <gd name="y2" fmla="+- vc dy 0" />
+ <gd name="dx1" fmla="*/ y1 x2 hd2" />
+ <gd name="x1" fmla="+- x2 0 dx1" />
+ <gd name="x4" fmla="+- x3 dx1 0" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="100000">
+ <pos x="x3" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="x2" y="t" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x2" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x2" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x3" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="x1" t="y1" r="x4" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </leftRightArrow>
+ <leftRightArrowCallout>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 25000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ <gd name="adj4" fmla="val 48123" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 50000 h ss" />
+
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="maxAdj1" fmla="*/ a2 2 1" />
+
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="maxAdj3" fmla="*/ 50000 w ss" />
+
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="q2" fmla="*/ a3 ss wd2" />
+
+ <gd name="maxAdj4" fmla="+- 100000 0 q2" />
+
+ <gd name="a4" fmla="pin 0 adj4 maxAdj4" />
+ <gd name="dy1" fmla="*/ ss a2 100000" />
+
+ <gd name="dy2" fmla="*/ ss a1 200000" />
+
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc 0 dy2" />
+ <gd name="y3" fmla="+- vc dy2 0" />
+ <gd name="y4" fmla="+- vc dy1 0" />
+ <gd name="x1" fmla="*/ ss a3 100000" />
+
+ <gd name="x4" fmla="+- r 0 x1" />
+
+ <gd name="dx2" fmla="*/ w a4 200000" />
+
+ <gd name="x2" fmla="+- hc 0 dx2" />
+
+ <gd name="x3" fmla="+- hc dx2 0" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">
+ <pos x="x1" y="y2" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">
+ <pos x="l" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj3" minX="0" maxX="maxAdj3">
+ <pos x="x1" y="t" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="0" maxX="maxAdj4">
+ <pos x="x2" y="b" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x2" t="t" r="x3" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </leftRightArrowCallout>
+ <leftRightCircularArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 12500" />
+
+ <gd name="adj2" fmla="val 1142319" />
+
+ <gd name="adj3" fmla="val 20457681" />
+
+ <gd name="adj4" fmla="val 11942319" />
+
+ <gd name="adj5" fmla="val 12500" />
+
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a5" fmla="pin 0 adj5 25000" />
+
+ <gd name="maxAdj1" fmla="*/ a5 2 1" />
+
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="enAng" fmla="pin 1 adj3 21599999" />
+ <gd name="stAng" fmla="pin 0 adj4 21599999" />
+
+ <gd name="th" fmla="*/ ss a1 100000" />
+
+ <gd name="thh" fmla="*/ ss a5 100000" />
+
+ <gd name="th2" fmla="*/ th 1 2" />
+
+
+ <gd name="rw1" fmla="+- wd2 th2 thh" />
+
+ <gd name="rh1" fmla="+- hd2 th2 thh" />
+
+ <gd name="rw2" fmla="+- rw1 0 th" />
+
+ <gd name="rh2" fmla="+- rh1 0 th" />
+
+ <gd name="rw3" fmla="+- rw2 th2 0" />
+
+ <gd name="rh3" fmla="+- rh2 th2 0" />
+
+
+ <gd name="wtH" fmla="sin rw3 enAng" />
+ <gd name="htH" fmla="cos rh3 enAng" />
+ <gd name="dxH" fmla="cat2 rw3 htH wtH" />
+ <gd name="dyH" fmla="sat2 rh3 htH wtH" />
+ <gd name="xH" fmla="+- hc dxH 0" />
+
+ <gd name="yH" fmla="+- vc dyH 0" />
+
+
+ <gd name="rI" fmla="min rw2 rh2" />
+
+ <gd name="u1" fmla="*/ dxH dxH 1" />
+ <gd name="u2" fmla="*/ dyH dyH 1" />
+ <gd name="u3" fmla="*/ rI rI 1" />
+ <gd name="u4" fmla="+- u1 0 u3" />
+ <gd name="u5" fmla="+- u2 0 u3" />
+ <gd name="u6" fmla="*/ u4 u5 u1" />
+ <gd name="u7" fmla="*/ u6 1 u2" />
+ <gd name="u8" fmla="+- 1 0 u7" />
+ <gd name="u9" fmla="sqrt u8" />
+ <gd name="u10" fmla="*/ u4 1 dxH" />
+ <gd name="u11" fmla="*/ u10 1 dyH" />
+ <gd name="u12" fmla="+/ 1 u9 u11" />
+ <gd name="u13" fmla="at2 1 u12" />
+ <gd name="u14" fmla="+- u13 21600000 0" />
+ <gd name="u15" fmla="?: u13 u13 u14" />
+ <gd name="u16" fmla="+- u15 0 enAng" />
+
+ <gd name="u17" fmla="+- u16 21600000 0" />
+ <gd name="u18" fmla="?: u16 u16 u17" />
+ <gd name="u19" fmla="+- u18 0 cd2" />
+ <gd name="u20" fmla="+- u18 0 21600000" />
+ <gd name="u21" fmla="?: u19 u20 u18" />
+ <gd name="maxAng" fmla="abs u21" />
+ <gd name="aAng" fmla="pin 0 adj2 maxAng" />
+
+ <gd name="ptAng" fmla="+- enAng aAng 0" />
+
+
+ <gd name="wtA" fmla="sin rw3 ptAng" />
+ <gd name="htA" fmla="cos rh3 ptAng" />
+ <gd name="dxA" fmla="cat2 rw3 htA wtA" />
+ <gd name="dyA" fmla="sat2 rh3 htA wtA" />
+ <gd name="xA" fmla="+- hc dxA 0" />
+
+ <gd name="yA" fmla="+- vc dyA 0" />
+
+
+ <gd name="dxG" fmla="cos thh ptAng" />
+ <gd name="dyG" fmla="sin thh ptAng" />
+ <gd name="xG" fmla="+- xH dxG 0" />
+
+ <gd name="yG" fmla="+- yH dyG 0" />
+
+
+ <gd name="dxB" fmla="cos thh ptAng" />
+ <gd name="dyB" fmla="sin thh ptAng" />
+ <gd name="xB" fmla="+- xH 0 dxB 0" />
+
+ <gd name="yB" fmla="+- yH 0 dyB 0" />
+
+
+ <gd name="sx1" fmla="+- xB 0 hc" />
+
+ <gd name="sy1" fmla="+- yB 0 vc" />
+
+ <gd name="sx2" fmla="+- xG 0 hc" />
+
+ <gd name="sy2" fmla="+- yG 0 vc" />
+
+
+ <gd name="rO" fmla="min rw1 rh1" />
+
+ <gd name="x1O" fmla="*/ sx1 rO rw1" />
+
+ <gd name="y1O" fmla="*/ sy1 rO rh1" />
+
+ <gd name="x2O" fmla="*/ sx2 rO rw1" />
+
+ <gd name="y2O" fmla="*/ sy2 rO rh1" />
+
+
+ <gd name="dxO" fmla="+- x2O 0 x1O" />
+ <gd name="dyO" fmla="+- y2O 0 y1O" />
+ <gd name="dO" fmla="mod dxO dyO 0" />
+
+ <gd name="q1" fmla="*/ x1O y2O 1" />
+ <gd name="q2" fmla="*/ x2O y1O 1" />
+ <gd name="DO" fmla="+- q1 0 q2" />
+
+
+ <gd name="q3" fmla="*/ rO rO 1" />
+
+ <gd name="q4" fmla="*/ dO dO 1" />
+
+ <gd name="q5" fmla="*/ q3 q4 1" />
+
+ <gd name="q6" fmla="*/ DO DO 1" />
+
+ <gd name="q7" fmla="+- q5 0 q6" />
+
+ <gd name="q8" fmla="max q7 0" />
+
+ <gd name="sdelO" fmla="sqrt q8" />
+
+ <gd name="ndyO" fmla="*/ dyO -1 1" />
+ <gd name="sdyO" fmla="?: ndyO -1 1" />
+
+ <gd name="q9" fmla="*/ sdyO dxO 1" />
+
+ <gd name="q10" fmla="*/ q9 sdelO 1" />
+
+ <gd name="q11" fmla="*/ DO dyO 1" />
+
+ <gd name="dxF1" fmla="+/ q11 q10 q4" />
+
+ <gd name="q12" fmla="+- q11 0 q10" />
+ <gd name="dxF2" fmla="*/ q12 1 q4" />
+
+
+ <gd name="adyO" fmla="abs dyO" />
+ <gd name="q13" fmla="*/ adyO sdelO 1" />
+
+ <gd name="q14" fmla="*/ DO dxO -1" />
+
+ <gd name="dyF1" fmla="+/ q14 q13 q4" />
+
+ <gd name="q15" fmla="+- q14 0 q13" />
+ <gd name="dyF2" fmla="*/ q15 1 q4" />
+
+
+
+ <gd name="q16" fmla="+- x2O 0 dxF1" />
+ <gd name="q17" fmla="+- x2O 0 dxF2" />
+ <gd name="q18" fmla="+- y2O 0 dyF1" />
+ <gd name="q19" fmla="+- y2O 0 dyF2" />
+ <gd name="q20" fmla="mod q16 q18 0" />
+
+ <gd name="q21" fmla="mod q17 q19 0" />
+
+ <gd name="q22" fmla="+- q21 0 q20" />
+ <gd name="dxF" fmla="?: q22 dxF1 dxF2" />
+
+ <gd name="dyF" fmla="?: q22 dyF1 dyF2" />
+
+ <gd name="sdxF" fmla="*/ dxF rw1 rO" />
+
+ <gd name="sdyF" fmla="*/ dyF rh1 rO" />
+
+ <gd name="xF" fmla="+- hc sdxF 0" />
+
+ <gd name="yF" fmla="+- vc sdyF 0" />
+
+
+
+
+ <gd name="x1I" fmla="*/ sx1 rI rw2" />
+
+ <gd name="y1I" fmla="*/ sy1 rI rh2" />
+
+ <gd name="x2I" fmla="*/ sx2 rI rw2" />
+
+ <gd name="y2I" fmla="*/ sy2 rI rh2" />
+
+
+ <gd name="dxI" fmla="+- x2I 0 x1I" />
+ <gd name="dyI" fmla="+- y2I 0 y1I" />
+ <gd name="dI" fmla="mod dxI dyI 0" />
+ <gd name="v1" fmla="*/ x1I y2I 1" />
+ <gd name="v2" fmla="*/ x2I y1I 1" />
+ <gd name="DI" fmla="+- v1 0 v2" />
+
+ <gd name="v3" fmla="*/ rI rI 1" />
+ <gd name="v4" fmla="*/ dI dI 1" />
+ <gd name="v5" fmla="*/ v3 v4 1" />
+ <gd name="v6" fmla="*/ DI DI 1" />
+ <gd name="v7" fmla="+- v5 0 v6" />
+ <gd name="v8" fmla="max v7 0" />
+ <gd name="sdelI" fmla="sqrt v8" />
+ <gd name="v9" fmla="*/ sdyO dxI 1" />
+ <gd name="v10" fmla="*/ v9 sdelI 1" />
+ <gd name="v11" fmla="*/ DI dyI 1" />
+ <gd name="dxC1" fmla="+/ v11 v10 v4" />
+ <gd name="v12" fmla="+- v11 0 v10" />
+ <gd name="dxC2" fmla="*/ v12 1 v4" />
+
+ <gd name="adyI" fmla="abs dyI" />
+ <gd name="v13" fmla="*/ adyI sdelI 1" />
+ <gd name="v14" fmla="*/ DI dxI -1" />
+ <gd name="dyC1" fmla="+/ v14 v13 v4" />
+ <gd name="v15" fmla="+- v14 0 v13" />
+ <gd name="dyC2" fmla="*/ v15 1 v4" />
+
+ <gd name="v16" fmla="+- x1I 0 dxC1" />
+ <gd name="v17" fmla="+- x1I 0 dxC2" />
+ <gd name="v18" fmla="+- y1I 0 dyC1" />
+ <gd name="v19" fmla="+- y1I 0 dyC2" />
+ <gd name="v20" fmla="mod v16 v18 0" />
+ <gd name="v21" fmla="mod v17 v19 0" />
+ <gd name="v22" fmla="+- v21 0 v20" />
+ <gd name="dxC" fmla="?: v22 dxC1 dxC2" />
+ <gd name="dyC" fmla="?: v22 dyC1 dyC2" />
+ <gd name="sdxC" fmla="*/ dxC rw2 rI" />
+ <gd name="sdyC" fmla="*/ dyC rh2 rI" />
+ <gd name="xC" fmla="+- hc sdxC 0" />
+
+ <gd name="yC" fmla="+- vc sdyC 0" />
+
+
+ <gd name="wtI" fmla="sin rw3 stAng" />
+ <gd name="htI" fmla="cos rh3 stAng" />
+ <gd name="dxI" fmla="cat2 rw3 htI wtI" />
+ <gd name="dyI" fmla="sat2 rh3 htI wtI" />
+ <gd name="xI" fmla="+- hc dxI 0" />
+
+ <gd name="yI" fmla="+- vc dyI 0" />
+
+
+ <gd name="lptAng" fmla="+- stAng 0 aAng" />
+
+
+ <gd name="wtL" fmla="sin rw3 lptAng" />
+ <gd name="htL" fmla="cos rh3 lptAng" />
+ <gd name="dxL" fmla="cat2 rw3 htL wtL" />
+ <gd name="dyL" fmla="sat2 rh3 htL wtL" />
+ <gd name="xL" fmla="+- hc dxL 0" />
+
+ <gd name="yL" fmla="+- vc dyL 0" />
+
+
+ <gd name="dxK" fmla="cos thh lptAng" />
+ <gd name="dyK" fmla="sin thh lptAng" />
+ <gd name="xK" fmla="+- xI dxK 0" />
+
+ <gd name="yK" fmla="+- yI dyK 0" />
+
+
+ <gd name="dxJ" fmla="cos thh lptAng" />
+ <gd name="dyJ" fmla="sin thh lptAng" />
+ <gd name="xJ" fmla="+- xI 0 dxJ 0" />
+
+ <gd name="yJ" fmla="+- yI 0 dyJ 0" />
+
+
+ <gd name="p1" fmla="+- xF 0 xC" />
+ <gd name="p2" fmla="+- yF 0 yC" />
+ <gd name="p3" fmla="mod p1 p2 0" />
+ <gd name="p4" fmla="*/ p3 1 2" />
+ <gd name="p5" fmla="+- p4 0 thh" />
+ <gd name="xGp" fmla="?: p5 xF xG" />
+ <gd name="yGp" fmla="?: p5 yF yG" />
+ <gd name="xBp" fmla="?: p5 xC xB" />
+ <gd name="yBp" fmla="?: p5 yC yB" />
+
+ <gd name="en0" fmla="at2 sdxF sdyF" />
+ <gd name="en1" fmla="+- en0 21600000 0" />
+ <gd name="en2" fmla="?: en0 en0 en1" />
+ <gd name="od0" fmla="+- en2 0 enAng" />
+ <gd name="od1" fmla="+- od0 21600000 0" />
+ <gd name="od2" fmla="?: od0 od0 od1" />
+
+ <gd name="st0" fmla="+- stAng 0 od2" />
+ <gd name="st1" fmla="+- st0 21600000 0" />
+ <gd name="st2" fmla="?: st0 st0 st1" />
+
+ <gd name="sw0" fmla="+- en2 0 st2" />
+ <gd name="sw1" fmla="+- sw0 21600000 0" />
+ <gd name="swAng" fmla="?: sw0 sw0 sw1" />
+
+
+ <gd name="ist0" fmla="at2 sdxC sdyC" />
+ <gd name="ist1" fmla="+- ist0 21600000 0" />
+ <gd name="istAng" fmla="?: ist0 ist0 ist1" />
+
+ <gd name="id0" fmla="+- istAng 0 enAng" />
+ <gd name="id1" fmla="+- id0 0 21600000" />
+ <gd name="id2" fmla="?: id0 id1 id0" />
+
+ <gd name="ien0" fmla="+- stAng 0 id2" />
+ <gd name="ien1" fmla="+- ien0 0 21600000" />
+ <gd name="ien2" fmla="?: ien1 ien1 ien0" />
+
+ <gd name="isw1" fmla="+- ien2 0 istAng" />
+ <gd name="isw2" fmla="+- isw1 0 21600000" />
+ <gd name="iswAng" fmla="?: isw1 isw2 isw1" />
+
+
+ <gd name="wtE" fmla="sin rw1 st2" />
+ <gd name="htE" fmla="cos rh1 st2" />
+ <gd name="dxE" fmla="cat2 rw1 htE wtE" />
+ <gd name="dyE" fmla="sat2 rh1 htE wtE" />
+ <gd name="xE" fmla="+- hc dxE 0" />
+
+ <gd name="yE" fmla="+- vc dyE 0" />
+
+
+ <gd name="wtD" fmla="sin rw2 ien2" />
+ <gd name="htD" fmla="cos rh2 ien2" />
+ <gd name="dxD" fmla="cat2 rw2 htD wtD" />
+ <gd name="dyD" fmla="sat2 rh2 htD wtD" />
+ <gd name="xD" fmla="+- hc dxD 0" />
+
+ <gd name="yD" fmla="+- vc dyD 0" />
+
+
+ <gd name="xKp" fmla="?: p5 xE xK" />
+ <gd name="yKp" fmla="?: p5 yE yK" />
+ <gd name="xJp" fmla="?: p5 xD xJ" />
+ <gd name="yJp" fmla="?: p5 yD yJ" />
+
+ <gd name="aL" fmla="+- lptAng 0 cd4" />
+ <gd name="aA" fmla="+- ptAng cd4 0" />
+ <gd name="aB" fmla="+- ptAng cd2 0" />
+ <gd name="aJ" fmla="+- lptAng cd2 0" />
+
+ <gd name="idx" fmla="cos rw1 2700000" />
+ <gd name="idy" fmla="sin rh1 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefAng="adj2" minAng="0" maxAng="maxAng">
+ <pos x="xA" y="yA" />
+ </ahPolar>
+ <ahPolar gdRefAng="adj4" minAng="0" maxAng="21599999">
+ <pos x="xE" y="yE" />
+ </ahPolar>
+ <ahPolar gdRefR="adj1" minR="0" maxR="maxAdj1" gdRefAng="adj3" minAng="0" maxAng="21599999">
+ <pos x="xF" y="yF" />
+ </ahPolar>
+ <ahPolar gdRefR="adj5" minR="0" maxR="25000">
+ <pos x="xB" y="yB" />
+ </ahPolar>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="aL">
+ <pos x="xL" y="yL" />
+ </cxn>
+ <cxn ang="lptAng">
+ <pos x="xKp" y="yKp" />
+ </cxn>
+ <cxn ang="ptAng">
+ <pos x="xGp" y="yGp" />
+ </cxn>
+ <cxn ang="aA">
+ <pos x="xA" y="yA" />
+ </cxn>
+ <cxn ang="aB">
+ <pos x="xBp" y="yBp" />
+ </cxn>
+ <cxn ang="aJ">
+ <pos x="xJp" y="yJp" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="xL" y="yL" />
+ </moveTo>
+ <lnTo>
+ <pt x="xKp" y="yKp" />
+ </lnTo>
+ <lnTo>
+ <pt x="xE" y="yE" />
+ </lnTo>
+ <arcTo wR="rw1" hR="rh1" stAng="st2" swAng="swAng" />
+ <lnTo>
+ <pt x="xGp" y="yGp" />
+ </lnTo>
+ <lnTo>
+ <pt x="xA" y="yA" />
+ </lnTo>
+ <lnTo>
+ <pt x="xBp" y="yBp" />
+ </lnTo>
+ <lnTo>
+ <pt x="xC" y="yC" />
+ </lnTo>
+ <arcTo wR="rw2" hR="rh2" stAng="istAng" swAng="iswAng" />
+ <lnTo>
+ <pt x="xJp" y="yJp" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </leftRightCircularArrow>
+ <leftRightRibbon>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ <gd name="adj3" fmla="val 16667" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a3" fmla="pin 0 adj3 33333" />
+ <gd name="maxAdj1" fmla="+- 100000 0 a3" />
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+
+ <gd name="w1" fmla="+- wd2 0 wd32" />
+ <gd name="maxAdj2" fmla="*/ 100000 w1 ss" />
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+
+ <gd name="x1" fmla="*/ ss a2 100000" />
+
+ <gd name="x4" fmla="+- r 0 x1" />
+
+ <gd name="dy1" fmla="*/ h a1 200000" />
+
+ <gd name="dy2" fmla="*/ h a3 -200000" />
+
+ <gd name="ly1" fmla="+- vc dy2 dy1" />
+
+ <gd name="ry4" fmla="+- vc dy1 dy2" />
+
+ <gd name="ly2" fmla="+- ly1 dy1 0" />
+
+ <gd name="ry3" fmla="+- b 0 ly2" />
+
+ <gd name="ly4" fmla="*/ ly2 2 1" />
+
+ <gd name="ry1" fmla="+- b 0 ly4" />
+
+ <gd name="ly3" fmla="+- ly4 0 ly1" />
+
+ <gd name="ry2" fmla="+- b 0 ly3" />
+
+
+ <gd name="hR" fmla="*/ a3 ss 400000" />
+
+ <gd name="x2" fmla="+- hc 0 wd32" />
+
+ <gd name="x3" fmla="+- hc wd32 0" />
+
+ <gd name="y1" fmla="+- ly1 hR 0" />
+
+ <gd name="y2" fmla="+- ry2 0 hR" />
+
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">
+ <pos x="x4" y="ry2" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="x1" y="t" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="0" maxY="33333">
+ <pos x="x3" y="ry2" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="ry3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x4" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x1" y="ly4" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="ly2" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x1" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x4" y="ry1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x1" t="ly1" r="x4" b="ry4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="ly2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="ly1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="ly1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="x4" y="ry2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="ry1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="ry3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="ry4" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="ry4" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="x2" y="ly3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="ly3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="ly4" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darkenLess" extrusionOk="false">
+
+ <moveTo>
+ <pt x="x3" y="y1" />
+ </moveTo>
+ <arcTo wR="wd32" hR="hR" stAng="0" swAng="cd4" />
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="x3" y="ry2" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="ly2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="ly1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="ly1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="x4" y="ry2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="ry1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="ry3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="ry4" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="ry4" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="x2" y="ly3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="ly3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="ly4" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="x3" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x3" y="ry2" />
+ </lnTo>
+ <moveTo>
+ <pt x="x2" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="ly3" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </leftRightRibbon>
+ <leftRightUpArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 25000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a2" fmla="pin 0 adj2 50000" />
+ <gd name="maxAdj1" fmla="*/ a2 2 1" />
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="q1" fmla="+- 100000 0 maxAdj1" />
+ <gd name="maxAdj3" fmla="*/ q1 1 2" />
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="x1" fmla="*/ ss a3 100000" />
+ <gd name="dx2" fmla="*/ ss a2 100000" />
+
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x5" fmla="+- hc dx2 0" />
+ <gd name="dx3" fmla="*/ ss a1 200000" />
+
+ <gd name="x3" fmla="+- hc 0 dx3" />
+ <gd name="x4" fmla="+- hc dx3 0" />
+ <gd name="x6" fmla="+- r 0 x1" />
+
+ <gd name="dy2" fmla="*/ ss a2 50000" />
+
+ <gd name="y2" fmla="+- b 0 dy2" />
+ <gd name="y4" fmla="+- b 0 dx2" />
+ <gd name="y3" fmla="+- y4 0 dx3" />
+ <gd name="y5" fmla="+- y4 dx3 0" />
+ <gd name="il" fmla="*/ dx3 x1 dx2" />
+ <gd name="ir" fmla="+- r 0 il" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">
+ <pos x="x3" y="x1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="50000">
+ <pos x="x2" y="t" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">
+ <pos x="r" y="x1" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y4" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="y5" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y4" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="y3" r="ir" b="y5" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y4" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </leftRightUpArrow>
+ <leftUpArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 25000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a2" fmla="pin 0 adj2 50000" />
+ <gd name="maxAdj1" fmla="*/ a2 2 1" />
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="maxAdj3" fmla="+- 100000 0 maxAdj1" />
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="x1" fmla="*/ ss a3 100000" />
+
+ <gd name="dx2" fmla="*/ ss a2 50000" />
+
+ <gd name="x2" fmla="+- r 0 dx2" />
+ <gd name="y2" fmla="+- b 0 dx2" />
+ <gd name="dx4" fmla="*/ ss a2 100000" />
+
+ <gd name="x4" fmla="+- r 0 dx4" />
+ <gd name="y4" fmla="+- b 0 dx4" />
+ <gd name="dx3" fmla="*/ ss a1 200000" />
+
+ <gd name="x3" fmla="+- x4 0 dx3" />
+ <gd name="x5" fmla="+- x4 dx3 0" />
+ <gd name="y3" fmla="+- y4 0 dx3" />
+ <gd name="y5" fmla="+- y4 dx3 0" />
+ <gd name="il" fmla="*/ dx3 x1 dx4" />
+ <gd name="cx1" fmla="+/ x1 x5 2" />
+ <gd name="cy1" fmla="+/ x1 y5 2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">
+ <pos x="x3" y="y3" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="50000">
+ <pos x="x2" y="t" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">
+ <pos x="x3" y="x1" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x4" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x2" y="x1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x1" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y4" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x1" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="cx1" y="y5" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x5" y="cy1" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="x1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="y3" r="x4" b="y5" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y4" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </leftUpArrow>
+ <lightningBolt>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="x1" fmla="*/ w 5022 21600" />
+ <gd name="x3" fmla="*/ w 8472 21600" />
+ <gd name="x4" fmla="*/ w 8757 21600" />
+
+ <gd name="x5" fmla="*/ w 10012 21600" />
+ <gd name="x8" fmla="*/ w 12860 21600" />
+ <gd name="x9" fmla="*/ w 13917 21600" />
+
+ <gd name="x11" fmla="*/ w 16577 21600" />
+ <gd name="y1" fmla="*/ h 3890 21600" />
+ <gd name="y2" fmla="*/ h 6080 21600" />
+ <gd name="y4" fmla="*/ h 7437 21600" />
+
+ <gd name="y6" fmla="*/ h 9705 21600" />
+ <gd name="y7" fmla="*/ h 12007 21600" />
+ <gd name="y10" fmla="*/ h 14277 21600" />
+
+ <gd name="y11" fmla="*/ h 14915 21600" />
+
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x3" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="l" y="y1" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y6" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x5" y="y11" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="r" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x11" y="y7" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x8" y="y2" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x4" t="y4" r="x9" b="y10" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path w="21600" h="21600">
+ <moveTo>
+ <pt x="8472" y="0" />
+ </moveTo>
+ <lnTo>
+ <pt x="12860" y="6080" />
+ </lnTo>
+ <lnTo>
+ <pt x="11050" y="6797" />
+ </lnTo>
+ <lnTo>
+ <pt x="16577" y="12007" />
+ </lnTo>
+ <lnTo>
+ <pt x="14767" y="12877" />
+ </lnTo>
+ <lnTo>
+ <pt x="21600" y="21600" />
+ </lnTo>
+ <lnTo>
+ <pt x="10012" y="14915" />
+ </lnTo>
+ <lnTo>
+ <pt x="12222" y="13987" />
+ </lnTo>
+ <lnTo>
+ <pt x="5022" y="9705" />
+ </lnTo>
+ <lnTo>
+ <pt x="7602" y="8382" />
+ </lnTo>
+ <lnTo>
+ <pt x="0" y="3890" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </lightningBolt>
+ <line>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd4">
+ <pos x="l" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="r" y="b" />
+ </cxn>
+ </cxnLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ </path>
+ </pathLst>
+ </line>
+ <lineInv>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd4">
+ <pos x="l" y="b" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="r" y="t" />
+ </cxn>
+ </cxnLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ </path>
+ </pathLst>
+ </lineInv>
+ <mathDivide>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 23520" />
+
+ <gd name="adj2" fmla="val 5880" />
+
+ <gd name="adj3" fmla="val 11760" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+ <gd name="a1" fmla="pin 1000 adj1 36745" />
+ <gd name="ma1" fmla="+- 0 0 a1" />
+
+ <gd name="ma3h" fmla="+/ 73490 ma1 4" />
+
+ <gd name="ma3w" fmla="*/ 36745 w h" />
+
+ <gd name="maxAdj3" fmla="min ma3h ma3w" />
+ <gd name="a3" fmla="pin 1000 adj3 maxAdj3" />
+ <gd name="m4a3" fmla="*/ -4 a3 1" />
+
+ <gd name="maxAdj2" fmla="+- 73490 m4a3 a1" />
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+
+ <gd name="dy1" fmla="*/ h a1 200000" />
+
+ <gd name="yg" fmla="*/ h a2 100000" />
+
+ <gd name="rad" fmla="*/ h a3 100000" />
+
+ <gd name="dx1" fmla="*/ w 73490 200000" />
+
+
+ <gd name="y3" fmla="+- vc 0 dy1" />
+
+ <gd name="y4" fmla="+- vc dy1 0" />
+
+ <gd name="a" fmla="+- yg rad 0" />
+ <gd name="y2" fmla="+- y3 0 a" />
+
+ <gd name="y1" fmla="+- y2 0 rad" />
+
+ <gd name="y5" fmla="+- b 0 y1" />
+
+
+ <gd name="x1" fmla="+- hc 0 dx1" />
+
+ <gd name="x3" fmla="+- hc dx1 0" />
+
+ <gd name="x2" fmla="+- hc 0 rad" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="1000" maxY="36745">
+ <pos x="l" y="y3" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">
+ <pos x="r" y="y2" />
+ </ahXY>
+ <ahXY gdRefX="adj3" minX="1000" maxX="maxAdj3">
+ <pos x="x2" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x3" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="y5" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="y1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x1" t="y3" r="x3" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="hc" y="y1" />
+ </moveTo>
+ <arcTo hR="rad" wR="rad" stAng="3cd4" swAng="21600000" />
+ <close />
+ <moveTo>
+ <pt x="hc" y="y5" />
+ </moveTo>
+ <arcTo hR="rad" wR="rad" stAng="cd4" swAng="21600000" />
+ <close />
+ <moveTo>
+ <pt x="x1" y="y3" />
+ </moveTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </mathDivide>
+ <mathEqual>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 23520" />
+
+ <gd name="adj2" fmla="val 11760" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 36745" />
+
+
+ <gd name="2a1" fmla="*/ a1 2 1" />
+
+ <gd name="mAdj2" fmla="+- 100000 0 2a1" />
+
+ <gd name="a2" fmla="pin 0 adj2 mAdj2" />
+ <gd name="dy1" fmla="*/ h a1 100000" />
+
+ <gd name="dy2" fmla="*/ h a2 200000" />
+
+ <gd name="dx1" fmla="*/ w 73490 200000" />
+
+
+ <gd name="y2" fmla="+- vc 0 dy2" />
+
+ <gd name="y3" fmla="+- vc dy2 0" />
+
+ <gd name="y1" fmla="+- y2 0 dy1" />
+
+ <gd name="y4" fmla="+- y3 dy1 0" />
+
+
+ <gd name="x1" fmla="+- hc 0 dx1" />
+
+ <gd name="x2" fmla="+- hc dx1 0" />
+
+
+
+ <gd name="yC1" fmla="+/ y1 y2 2" />
+
+ <gd name="yC2" fmla="+/ y3 y4 2" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="36745">
+ <pos x="l" y="y1" />
+ </ahXY>
+
+ <ahXY gdRefY="adj2" minY="0" maxY="mAdj2">
+ <pos x="r" y="y2" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x2" y="yC1" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x2" y="yC2" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="y4" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="yC1" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="yC2" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="y1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x1" t="y1" r="x2" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="x1" y="y3" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </mathEqual>
+ <mathMinus>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 23520" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 100000" />
+ <gd name="dy1" fmla="*/ h a1 200000" />
+
+ <gd name="dx1" fmla="*/ w 73490 200000" />
+
+
+ <gd name="y1" fmla="+- vc 0 dy1" />
+
+ <gd name="y2" fmla="+- vc dy1 0" />
+
+
+ <gd name="x1" fmla="+- hc 0 dx1" />
+
+ <gd name="x2" fmla="+- hc dx1 0" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="100000">
+ <pos x="l" y="y1" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x2" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="y1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x1" t="y1" r="x2" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </mathMinus>
+ <mathMultiply>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 23520" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+
+
+
+
+ <gd name="a1" fmla="pin 0 adj1 51965" />
+
+ <gd name="th" fmla="*/ ss a1 100000" />
+
+
+ <gd name="a" fmla="at2 w h" />
+
+ <gd name="sa" fmla="sin 1 a" />
+ <gd name="ca" fmla="cos 1 a" />
+ <gd name="ta" fmla="tan 1 a" />
+
+
+ <gd name="dl" fmla="mod w h 0" />
+
+ <gd name="rw" fmla="*/ dl 51965 100000" />
+
+
+
+ <gd name="lM" fmla="+- dl 0 rw" />
+ <gd name="xM" fmla="*/ ca lM 2" />
+ <gd name="yM" fmla="*/ sa lM 2" />
+
+
+ <gd name="dxAM" fmla="*/ sa th 2" />
+ <gd name="dyAM" fmla="*/ ca th 2" />
+ <gd name="xA" fmla="+- xM 0 dxAM" />
+ <gd name="yA" fmla="+- yM dyAM 0" />
+
+
+ <gd name="xB" fmla="+- xM dxAM 0" />
+ <gd name="yB" fmla="+- yM 0 dyAM" />
+
+
+ <gd name="xBC" fmla="+- hc 0 xB" />
+ <gd name="yBC" fmla="*/ xBC ta 1" />
+ <gd name="yC" fmla="+- yBC yB 0" />
+
+
+ <gd name="xD" fmla="+- r 0 xB" />
+ <gd name="xE" fmla="+- r 0 xA" />
+
+ <gd name="yFE" fmla="+- vc 0 yA" />
+ <gd name="xFE" fmla="*/ yFE 1 ta" />
+ <gd name="xF" fmla="+- xE 0 xFE" />
+ <gd name="xL" fmla="+- xA xFE 0" />
+ <gd name="yG" fmla="+- b 0 yA" />
+ <gd name="yH" fmla="+- b 0 yB" />
+ <gd name="yI" fmla="+- b 0 yC" />
+
+
+ <gd name="xC2" fmla="+- r 0 xM" />
+
+ <gd name="yC3" fmla="+- b 0 yM" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="51965">
+ <pos x="l" y="th" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd2">
+ <pos x="xM" y="yM" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="xC2" y="yM" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="xC2" y="yC3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="xM" y="yC3" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="xA" t="yB" r="xE" b="yH" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="xA" y="yA" />
+ </moveTo>
+ <lnTo>
+ <pt x="xB" y="yB" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="yC" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD" y="yB" />
+ </lnTo>
+ <lnTo>
+ <pt x="xE" y="yA" />
+ </lnTo>
+ <lnTo>
+ <pt x="xF" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="xE" y="yG" />
+ </lnTo>
+ <lnTo>
+ <pt x="xD" y="yH" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="yI" />
+ </lnTo>
+ <lnTo>
+ <pt x="xB" y="yH" />
+ </lnTo>
+ <lnTo>
+ <pt x="xA" y="yG" />
+ </lnTo>
+ <lnTo>
+ <pt x="xL" y="vc" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </mathMultiply>
+ <mathNotEqual>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 23520" />
+
+ <gd name="adj2" fmla="val 6600000" />
+
+ <gd name="adj3" fmla="val 11760" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 50000" />
+ <gd name="crAng" fmla="pin 4200000 adj2 6600000" />
+
+
+ <gd name="2a1" fmla="*/ a1 2 1" />
+ <gd name="maxAdj3" fmla="+- 100000 0 2a1" />
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+
+ <gd name="dy1" fmla="*/ h a1 100000" />
+
+ <gd name="dy2" fmla="*/ h a3 200000" />
+
+ <gd name="dx1" fmla="*/ w 73490 200000" />
+
+
+ <gd name="x1" fmla="+- hc 0 dx1" />
+
+ <gd name="x8" fmla="+- hc dx1 0" />
+
+
+
+ <gd name="y2" fmla="+- vc 0 dy2" />
+
+ <gd name="y3" fmla="+- vc dy2 0" />
+
+ <gd name="y1" fmla="+- y2 0 dy1" />
+
+ <gd name="y4" fmla="+- y3 dy1 0" />
+
+
+ <gd name="cadj2" fmla="+- crAng 0 cd4" />
+ <gd name="xadj2" fmla="tan hd2 cadj2" />
+
+
+
+ <gd name="len" fmla="mod xadj2 hd2 0" />
+
+
+
+ <gd name="bhw" fmla="*/ len dy1 hd2" />
+
+ <gd name="bhw2" fmla="*/ bhw 1 2" />
+ <gd name="x7" fmla="+- hc xadj2 bhw2" />
+
+ <gd name="dx67" fmla="*/ xadj2 y1 hd2" />
+ <gd name="x6" fmla="+- x7 0 dx67" />
+
+ <gd name="dx57" fmla="*/ xadj2 y2 hd2" />
+ <gd name="x5" fmla="+- x7 0 dx57" />
+
+ <gd name="dx47" fmla="*/ xadj2 y3 hd2" />
+ <gd name="x4" fmla="+- x7 0 dx47" />
+
+ <gd name="dx37" fmla="*/ xadj2 y4 hd2" />
+ <gd name="x3" fmla="+- x7 0 dx37" />
+
+ <gd name="dx27" fmla="*/ xadj2 2 1" />
+ <gd name="x2" fmla="+- x7 0 dx27" />
+
+
+ <gd name="rx7" fmla="+- x7 bhw 0" />
+
+ <gd name="rx6" fmla="+- x6 bhw 0" />
+
+ <gd name="rx5" fmla="+- x5 bhw 0" />
+
+ <gd name="rx4" fmla="+- x4 bhw 0" />
+
+ <gd name="rx3" fmla="+- x3 bhw 0" />
+
+ <gd name="rx2" fmla="+- x2 bhw 0" />
+
+
+
+ <gd name="dx7" fmla="*/ dy1 hd2 len" />
+ <gd name="rxt" fmla="+- x7 dx7 0" />
+
+ <gd name="lxt" fmla="+- rx7 0 dx7" />
+
+ <gd name="rx" fmla="?: cadj2 rxt rx7" />
+
+ <gd name="lx" fmla="?: cadj2 x7 lxt" />
+
+
+ <gd name="dy3" fmla="*/ dy1 xadj2 len" />
+ <gd name="dy4" fmla="+- 0 0 dy3" />
+ <gd name="ry" fmla="?: cadj2 dy3 t" />
+
+ <gd name="ly" fmla="?: cadj2 t dy4" />
+
+
+ <gd name="dlx" fmla="+- w 0 rx" />
+
+ <gd name="drx" fmla="+- w 0 lx" />
+
+
+ <gd name="dly" fmla="+- h 0 ry" />
+
+ <gd name="dry" fmla="+- h 0 ly" />
+
+
+
+ <gd name="xC1" fmla="+/ rx lx 2" />
+
+ <gd name="xC2" fmla="+/ drx dlx 2" />
+
+
+ <gd name="yC1" fmla="+/ ry ly 2" />
+
+ <gd name="yC2" fmla="+/ y1 y2 2" />
+
+ <gd name="yC3" fmla="+/ y3 y4 2" />
+
+ <gd name="yC4" fmla="+/ dry dly 2" />
+
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="50000">
+ <pos x="l" y="y1" />
+ </ahXY>
+ <ahPolar gdRefAng="adj2" minAng="4200000" maxAng="6600000">
+ <pos x="lx" y="t" />
+ </ahPolar>
+ <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">
+ <pos x="r" y="y2" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x8" y="yC2" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x8" y="yC3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="xC2" y="yC4" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="yC2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="yC3" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="xC1" y="yC1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x1" t="y1" r="x8" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x6" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="lx" y="ly" />
+ </lnTo>
+ <lnTo>
+ <pt x="rx" y="ry" />
+ </lnTo>
+ <lnTo>
+ <pt x="rx6" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="rx5" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="rx4" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="rx3" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="drx" y="dry" />
+ </lnTo>
+ <lnTo>
+ <pt x="dlx" y="dly" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </mathNotEqual>
+ <mathPlus>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 23520" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 73490" />
+ <gd name="dx1" fmla="*/ w 73490 200000" />
+
+ <gd name="dy1" fmla="*/ h 73490 200000" />
+
+ <gd name="dx2" fmla="*/ ss a1 200000" />
+
+
+ <gd name="x1" fmla="+- hc 0 dx1" />
+
+ <gd name="x2" fmla="+- hc 0 dx2" />
+
+ <gd name="x3" fmla="+- hc dx2 0" />
+
+ <gd name="x4" fmla="+- hc dx1 0" />
+
+
+ <gd name="y1" fmla="+- vc 0 dy1" />
+
+ <gd name="y2" fmla="+- vc 0 dx2" />
+
+ <gd name="y3" fmla="+- vc dx2 0" />
+
+ <gd name="y4" fmla="+- vc dy1 0" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="73490">
+ <pos x="l" y="y2" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x4" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="y4" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="y1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x1" t="y2" r="x4" b="y3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </mathPlus>
+ <moon>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 50000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 87500" />
+ <gd name="g0" fmla="*/ ss a 100000" />
+ <gd name="g0w" fmla="*/ g0 w ss" />
+ <gd name="g1" fmla="+- ss 0 g0" />
+ <gd name="g2" fmla="*/ g0 g0 g1" />
+ <gd name="g3" fmla="*/ ss ss g1" />
+ <gd name="g4" fmla="*/ g3 2 1" />
+ <gd name="g5" fmla="+- g4 0 g2" />
+ <gd name="g6" fmla="+- g5 0 g0" />
+ <gd name="g6w" fmla="*/ g6 w ss" />
+ <gd name="g7" fmla="*/ g5 1 2" />
+ <gd name="g8" fmla="+- g7 0 g0" />
+ <gd name="dy1" fmla="*/ g8 hd2 ss" />
+
+ <gd name="g10h" fmla="+- vc 0 dy1" />
+ <gd name="g11h" fmla="+- vc dy1 0" />
+ <gd name="g12" fmla="*/ g0 9598 32768" />
+ <gd name="g12w" fmla="*/ g12 w ss" />
+ <gd name="g13" fmla="+- ss 0 g12" />
+ <gd name="q1" fmla="*/ ss ss 1" />
+ <gd name="q2" fmla="*/ g13 g13 1" />
+ <gd name="q3" fmla="+- q1 0 q2" />
+ <gd name="q4" fmla="sqrt q3" />
+ <gd name="dy4" fmla="*/ q4 hd2 ss" />
+ <gd name="g15h" fmla="+- vc 0 dy4" />
+ <gd name="g16h" fmla="+- vc dy4 0" />
+ <gd name="g17w" fmla="+- g6w 0 g0w" />
+ <gd name="g18w" fmla="*/ g17w 1 2" />
+
+
+ <gd name="dx2p" fmla="+- g0w g18w w" />
+ <gd name="dx2" fmla="*/ dx2p -1 1" />
+
+ <gd name="dy2" fmla="*/ hd2 -1 1" />
+
+ <gd name="stAng1" fmla="at2 dx2 dy2" />
+ <gd name="enAngp1" fmla="at2 dx2 hd2" />
+ <gd name="enAng1" fmla="+- enAngp1 0 21600000" />
+ <gd name="swAng1" fmla="+- enAng1 0 stAng1" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="87500">
+ <pos x="g0w" y="vc" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="r" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="r" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="g0w" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="g12w" t="g15h" r="g0w" b="g16h" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="r" y="b" />
+ </moveTo>
+ <arcTo wR="w" hR="hd2" stAng="cd4" swAng="cd2" />
+ <arcTo wR="g18w" hR="dy1" stAng="stAng1" swAng="swAng1" />
+ <close />
+ </path>
+ </pathLst>
+
+ </moon>
+ <nonIsoscelesTrapezoid>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 25000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj" fmla="*/ 50000 w ss" />
+
+ <gd name="a1" fmla="pin 0 adj1 maxAdj" />
+ <gd name="a2" fmla="pin 0 adj2 maxAdj" />
+ <gd name="x1" fmla="*/ ss a1 200000" />
+
+ <gd name="x2" fmla="*/ ss a1 100000" />
+
+ <gd name="dx3" fmla="*/ ss a2 100000" />
+
+ <gd name="x3" fmla="+- r 0 dx3" />
+ <gd name="x4" fmla="+/ r x3 2" />
+ <gd name="il" fmla="*/ wd3 a1 maxAdj" />
+
+ <gd name="adjm" fmla="max a1 a2" />
+ <gd name="it" fmla="*/ hd3 adjm maxAdj" />
+
+ <gd name="irt" fmla="*/ wd3 a2 maxAdj" />
+ <gd name="ir" fmla="+- r 0 irt" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="maxAdj">
+ <pos x="x2" y="t" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj">
+ <pos x="x3" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x4" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+
+ <rect l="il" t="it" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </nonIsoscelesTrapezoid>
+ <noSmoking>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 18750" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="dr" fmla="*/ ss a 100000" />
+ <gd name="iwd2" fmla="+- wd2 0 dr" />
+ <gd name="ihd2" fmla="+- hd2 0 dr" />
+ <gd name="ang" fmla="at2 w h" />
+ <gd name="ct" fmla="cos ihd2 ang" />
+ <gd name="st" fmla="sin iwd2 ang" />
+ <gd name="m" fmla="mod ct st 0" />
+ <gd name="n" fmla="*/ iwd2 ihd2 m" />
+ <gd name="drd2" fmla="*/ dr 1 2" />
+ <gd name="dang" fmla="at2 n drd2" />
+ <gd name="2dang" fmla="*/ dang 2 1" />
+ <gd name="swAng" fmla="+- -10800000 2dang 0" />
+ <gd name="t3" fmla="at2 w h" />
+ <gd name="stAng1" fmla="+- t3 0 dang" />
+ <gd name="stAng2" fmla="+- stAng1 0 cd2" />
+ <gd name="ct1" fmla="cos ihd2 stAng1" />
+ <gd name="st1" fmla="sin iwd2 stAng1" />
+ <gd name="m1" fmla="mod ct1 st1 0" />
+ <gd name="n1" fmla="*/ iwd2 ihd2 m1" />
+ <gd name="dx1" fmla="cos n1 stAng1" />
+ <gd name="dy1" fmla="sin n1 stAng1" />
+ <gd name="x1" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- vc dy1 0" />
+ <gd name="x2" fmla="+- hc 0 dx1" />
+ <gd name="y2" fmla="+- vc 0 dy1" />
+ <gd name="idx" fmla="cos wd2 2700000" />
+ <gd name="idy" fmla="sin hd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefR="adj" minR="0" maxR="50000">
+ <pos x="dr" y="vc" />
+ </ahPolar>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="il" y="it" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="il" y="ib" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="ir" y="ib" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="ir" y="it" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />
+ <close />
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <arcTo wR="iwd2" hR="ihd2" stAng="stAng1" swAng="swAng" />
+ <close />
+ <moveTo>
+ <pt x="x2" y="y2" />
+ </moveTo>
+ <arcTo wR="iwd2" hR="ihd2" stAng="stAng2" swAng="swAng" />
+ <close />
+ </path>
+ </pathLst>
+
+ </noSmoking>
+ <notchedRightArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 100000 w ss" />
+
+ <gd name="a1" fmla="pin 0 adj1 100000" />
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="dx2" fmla="*/ ss a2 100000" />
+ <gd name="x2" fmla="+- r 0 dx2" />
+ <gd name="dy1" fmla="*/ h a1 200000" />
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc dy1 0" />
+ <gd name="x1" fmla="*/ dy1 dx2 hd2" />
+ <gd name="x3" fmla="+- r 0 x1" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="100000">
+ <pos x="r" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="x2" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x2" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x2" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x1" t="y1" r="x3" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="vc" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </notchedRightArrow>
+ <octagon>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 29289" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="x1" fmla="*/ ss a 100000" />
+ <gd name="x2" fmla="+- r 0 x1" />
+ <gd name="y2" fmla="+- b 0 x1" />
+ <gd name="il" fmla="*/ x1 1 2" />
+ <gd name="ir" fmla="+- r 0 il" />
+ <gd name="ib" fmla="+- b 0 il" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="50000">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="x1" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y2" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x2" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x1" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="x1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x1" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x2" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="x1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </octagon>
+ <parallelogram>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 25000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj" fmla="*/ 100000 w ss" />
+ <gd name="a" fmla="pin 0 adj maxAdj" />
+ <gd name="x1" fmla="*/ ss a 200000" />
+ <gd name="x2" fmla="*/ ss a 100000" />
+ <gd name="x6" fmla="+- r 0 x1" />
+ <gd name="x5" fmla="+- r 0 x2" />
+ <gd name="x3" fmla="*/ x5 1 2" />
+ <gd name="x4" fmla="+- r 0 x3" />
+ <gd name="il" fmla="*/ wd2 a maxAdj" />
+ <gd name="q1" fmla="*/ 5 a maxAdj" />
+ <gd name="q2" fmla="+/ 1 q1 12" />
+ <gd name="il" fmla="*/ q2 w 1" />
+ <gd name="it" fmla="*/ q2 h 1" />
+ <gd name="ir" fmla="+- r 0 il" />
+ <gd name="ib" fmla="+- b 0 it" />
+ <gd name="q3" fmla="*/ h hc x2" />
+ <gd name="y1" fmla="pin 0 q3 h" />
+ <gd name="y2" fmla="+- b 0 y1" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="maxAdj">
+ <pos x="x2" y="t" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="y2" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x4" y="t" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x6" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="y1" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ </cxnLst>
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </parallelogram>
+ <pentagon>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="hf" fmla="val 105146" />
+ <gd name="vf" fmla="val 110557" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="swd2" fmla="*/ wd2 hf 100000" />
+ <gd name="shd2" fmla="*/ hd2 vf 100000" />
+ <gd name="svc" fmla="*/ vc vf 100000" />
+ <gd name="dx1" fmla="cos swd2 1080000" />
+ <gd name="dx2" fmla="cos swd2 18360000" />
+ <gd name="dy1" fmla="sin shd2 1080000" />
+ <gd name="dy2" fmla="sin shd2 18360000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x3" fmla="+- hc dx2 0" />
+ <gd name="x4" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- svc 0 dy1" />
+ <gd name="y2" fmla="+- svc 0 dy2" />
+ <gd name="it" fmla="*/ y1 dx2 dx1" />
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y1" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x2" y="y2" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="y2" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x4" y="y1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x2" t="it" r="x3" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </pentagon>
+ <pie>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 0" />
+ <gd name="adj2" fmla="val 16200000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="stAng" fmla="pin 0 adj1 21599999" />
+ <gd name="enAng" fmla="pin 0 adj2 21599999" />
+ <gd name="sw1" fmla="+- enAng 0 stAng" />
+ <gd name="sw2" fmla="+- sw1 21600000 0" />
+ <gd name="swAng" fmla="?: sw1 sw1 sw2" />
+ <gd name="wt1" fmla="sin wd2 stAng" />
+ <gd name="ht1" fmla="cos hd2 stAng" />
+ <gd name="dx1" fmla="cat2 wd2 ht1 wt1" />
+ <gd name="dy1" fmla="sat2 hd2 ht1 wt1" />
+ <gd name="x1" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- vc dy1 0" />
+ <gd name="wt2" fmla="sin wd2 enAng" />
+ <gd name="ht2" fmla="cos hd2 enAng" />
+ <gd name="dx2" fmla="cat2 wd2 ht2 wt2" />
+ <gd name="dy2" fmla="sat2 hd2 ht2 wt2" />
+ <gd name="x2" fmla="+- hc dx2 0" />
+ <gd name="y2" fmla="+- vc dy2 0" />
+ <gd name="idx" fmla="cos wd2 2700000" />
+ <gd name="idy" fmla="sin hd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefAng="adj1" minAng="0" maxAng="21599999">
+ <pos x="x1" y="y1" />
+ </ahPolar>
+ <ahPolar gdRefAng="adj2" minAng="0" maxAng="21599999">
+ <pos x="x2" y="y2" />
+ </ahPolar>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+ <rect l="il" t="ir" r="it" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="stAng" swAng="swAng" />
+ <lnTo>
+ <pt x="hc" y="vc" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </pie>
+ <pieWedge>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="g1" fmla="cos w 13500000" />
+ <gd name="g2" fmla="sin h 13500000" />
+ <gd name="x1" fmla="+- r g1 0" />
+ <gd name="y1" fmla="+- b g2 0" />
+ </gdLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ </cxnLst>
+ <rect l="x1" t="y1" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <arcTo wR="w" hR="h" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </pieWedge>
+ <plaque>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 16667" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="x1" fmla="*/ ss a 100000" />
+ <gd name="x2" fmla="+- r 0 x1" />
+
+ <gd name="y2" fmla="+- b 0 x1" />
+ <gd name="il" fmla="*/ x1 70711 100000" />
+
+ <gd name="ir" fmla="+- r 0 il" />
+ <gd name="ib" fmla="+- b 0 il" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="50000">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="x1" />
+ </moveTo>
+ <arcTo wR="x1" hR="x1" stAng="cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="cd2" swAng="-5400000" />
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="0" swAng="-5400000" />
+ <close />
+ </path>
+ </pathLst>
+
+ </plaque>
+ <plaqueTabs>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="md" fmla="mod w h 0" />
+ <gd name="dx" fmla="*/ 1 md 20" />
+
+ <gd name="y1" fmla="+- 0 b dx" />
+
+ <gd name="x1" fmla="+- 0 r dx" />
+
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd2">
+ <pos x="l" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="dx" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y1" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="b" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="dx" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x1" y="t" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="dx" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x1" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="t" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="dx" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y1" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="b" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="dx" t="dx" r="x1" b="y1" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="dx" y="t" />
+ </lnTo>
+ <arcTo wR="dx" hR="dx" stAng="0" swAng="cd4" />
+ <close />
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y1" />
+ </moveTo>
+ <arcTo wR="dx" hR="dx" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path>
+ <moveTo>
+ <pt x="r" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="dx" />
+ </lnTo>
+ <arcTo wR="dx" hR="dx" stAng="cd4" swAng="cd4" />
+ <close />
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x1" y="b" />
+ </moveTo>
+ <arcTo wR="dx" hR="dx" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </plaqueTabs>
+ <plus>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 25000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="x1" fmla="*/ ss a 100000" />
+ <gd name="x2" fmla="+- r 0 x1" />
+ <gd name="y2" fmla="+- b 0 x1" />
+ <gd name="d" fmla="+- w 0 h" />
+ <gd name="il" fmla="?: d l x1" />
+ <gd name="ir" fmla="?: d r x2" />
+ <gd name="it" fmla="?: d x1 t" />
+ <gd name="ib" fmla="?: d y2 b" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="50000">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="x1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </plus>
+ <quadArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 22500" />
+
+ <gd name="adj2" fmla="val 22500" />
+
+ <gd name="adj3" fmla="val 22500" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a2" fmla="pin 0 adj2 50000" />
+ <gd name="maxAdj1" fmla="*/ a2 2 1" />
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="q1" fmla="+- 100000 0 maxAdj1" />
+ <gd name="maxAdj3" fmla="*/ q1 1 2" />
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="x1" fmla="*/ ss a3 100000" />
+ <gd name="dx2" fmla="*/ ss a2 100000" />
+
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x5" fmla="+- hc dx2 0" />
+ <gd name="dx3" fmla="*/ ss a1 200000" />
+
+ <gd name="x3" fmla="+- hc 0 dx3" />
+ <gd name="x4" fmla="+- hc dx3 0" />
+ <gd name="x6" fmla="+- r 0 x1" />
+
+ <gd name="y2" fmla="+- vc 0 dx2" />
+ <gd name="y5" fmla="+- vc dx2 0" />
+ <gd name="y3" fmla="+- vc 0 dx3" />
+ <gd name="y4" fmla="+- vc dx3 0" />
+ <gd name="y6" fmla="+- b 0 x1" />
+ <gd name="il" fmla="*/ dx3 x1 dx2" />
+ <gd name="ir" fmla="+- r 0 il" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">
+ <pos x="x3" y="x1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="50000">
+ <pos x="x2" y="t" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">
+ <pos x="r" y="x1" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="y3" r="ir" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="x1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y5" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </quadArrow>
+ <quadArrowCallout>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 18515" />
+
+ <gd name="adj2" fmla="val 18515" />
+
+ <gd name="adj3" fmla="val 18515" />
+
+ <gd name="adj4" fmla="val 48123" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a2" fmla="pin 0 adj2 50000" />
+ <gd name="maxAdj1" fmla="*/ a2 2 1" />
+
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="maxAdj3" fmla="+- 50000 0 a2" />
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="q2" fmla="*/ a3 2 1" />
+
+ <gd name="maxAdj4" fmla="+- 100000 0 q2" />
+
+ <gd name="a4" fmla="pin a1 adj4 maxAdj4" />
+ <gd name="dx2" fmla="*/ ss a2 100000" />
+
+ <gd name="dx3" fmla="*/ ss a1 200000" />
+
+ <gd name="ah" fmla="*/ ss a3 100000" />
+
+ <gd name="dx1" fmla="*/ w a4 200000" />
+
+ <gd name="dy1" fmla="*/ h a4 200000" />
+
+
+ <gd name="x8" fmla="+- r 0 ah" />
+ <gd name="x2" fmla="+- hc 0 dx1" />
+ <gd name="x7" fmla="+- hc dx1 0" />
+ <gd name="x3" fmla="+- hc 0 dx2" />
+ <gd name="x6" fmla="+- hc dx2 0" />
+ <gd name="x4" fmla="+- hc 0 dx3" />
+ <gd name="x5" fmla="+- hc dx3 0" />
+
+ <gd name="y8" fmla="+- b 0 ah" />
+ <gd name="y2" fmla="+- vc 0 dy1" />
+ <gd name="y7" fmla="+- vc dy1 0" />
+ <gd name="y3" fmla="+- vc 0 dx2" />
+ <gd name="y6" fmla="+- vc dx2 0" />
+ <gd name="y4" fmla="+- vc 0 dx3" />
+ <gd name="y5" fmla="+- vc dx3 0" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">
+ <pos x="x4" y="ah" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="50000">
+ <pos x="x3" y="t" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">
+ <pos x="r" y="ah" />
+ </ahXY>
+ <ahXY gdRefY="adj4" minY="a1" maxY="maxAdj4">
+ <pos x="l" y="y2" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x2" t="y2" r="x7" b="y7" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="ah" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="ah" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="ah" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="ah" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="ah" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="ah" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x7" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x7" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x7" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x7" y="y7" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y7" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y8" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y8" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y8" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y8" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y7" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y7" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="ah" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="ah" y="y6" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </quadArrowCallout>
+ <rect>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </rect>
+ <ribbon>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 16667" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 33333" />
+ <gd name="a2" fmla="pin 25000 adj2 75000" />
+
+
+ <gd name="x10" fmla="+- r 0 wd8" />
+
+ <gd name="dx2" fmla="*/ w a2 200000" />
+
+ <gd name="x2" fmla="+- hc 0 dx2" />
+
+ <gd name="x9" fmla="+- hc dx2 0" />
+
+ <gd name="x3" fmla="+- x2 wd32 0" />
+ <gd name="x8" fmla="+- x9 0 wd32" />
+ <gd name="x5" fmla="+- x2 wd8 0" />
+
+ <gd name="x6" fmla="+- x9 0 wd8" />
+
+ <gd name="x4" fmla="+- x5 0 wd32" />
+ <gd name="x7" fmla="+- x6 wd32 0" />
+ <gd name="y1" fmla="*/ h a1 200000" />
+
+ <gd name="y2" fmla="*/ h a1 100000" />
+
+ <gd name="y4" fmla="+- b 0 y2" />
+
+ <gd name="y3" fmla="*/ y4 1 2" />
+
+ <gd name="hR" fmla="*/ h a1 400000" />
+
+ <gd name="y5" fmla="+- b 0 hR" />
+ <gd name="y6" fmla="+- y2 0 hR" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="33333">
+ <pos x="hc" y="y2" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="25000" maxX="75000">
+ <pos x="x2" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="wd8" y="y3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x10" y="y3" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x2" t="y2" r="x9" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x4" y="t" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="x8" y="y2" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="x7" y="y1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x10" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x9" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x9" y="y5" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="x3" y="b" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="x2" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="wd8" y="y3" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darkenLess" extrusionOk="false">
+
+ <moveTo>
+ <pt x="x5" y="hR" />
+ </moveTo>
+ <arcTo wR="wd32" hR="hR" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="x5" y="y2" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="x6" y="hR" />
+ </moveTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd2" swAng="-5400000" />
+ <lnTo>
+ <pt x="x8" y="y1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="x6" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x4" y="t" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="x8" y="y2" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="x7" y="y1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x10" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x9" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x9" y="y5" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="x3" y="b" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="x2" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="wd8" y="y3" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="x5" y="hR" />
+ </moveTo>
+ <lnTo>
+ <pt x="x5" y="y2" />
+ </lnTo>
+ <moveTo>
+ <pt x="x6" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x6" y="hR" />
+ </lnTo>
+ <moveTo>
+ <pt x="x2" y="y4" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y6" />
+ </lnTo>
+ <moveTo>
+ <pt x="x9" y="y6" />
+ </moveTo>
+ <lnTo>
+ <pt x="x9" y="y4" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </ribbon>
+ <ribbon2>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 16667" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 33333" />
+ <gd name="a2" fmla="pin 25000 adj2 75000" />
+
+
+ <gd name="x10" fmla="+- r 0 wd8" />
+
+ <gd name="dx2" fmla="*/ w a2 200000" />
+
+ <gd name="x2" fmla="+- hc 0 dx2" />
+
+ <gd name="x9" fmla="+- hc dx2 0" />
+
+ <gd name="x3" fmla="+- x2 wd32 0" />
+ <gd name="x8" fmla="+- x9 0 wd32" />
+ <gd name="x5" fmla="+- x2 wd8 0" />
+
+ <gd name="x6" fmla="+- x9 0 wd8" />
+
+ <gd name="x4" fmla="+- x5 0 wd32" />
+ <gd name="x7" fmla="+- x6 wd32 0" />
+ <gd name="dy1" fmla="*/ h a1 200000" />
+
+ <gd name="y1" fmla="+- b 0 dy1" />
+ <gd name="dy2" fmla="*/ h a1 100000" />
+
+ <gd name="y2" fmla="+- b 0 dy2" />
+ <gd name="y4" fmla="+- t dy2 0" />
+
+ <gd name="y3" fmla="+/ y4 b 2" />
+
+ <gd name="hR" fmla="*/ h a1 400000" />
+
+
+ <gd name="y6" fmla="+- b 0 hR" />
+ <gd name="y7" fmla="+- y1 0 hR" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="33333">
+ <pos x="hc" y="y2" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="25000" maxX="75000">
+ <pos x="x2" y="b" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="wd8" y="y3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="y2" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x10" y="y3" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x2" t="t" r="x9" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="x4" y="b" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="x8" y="y2" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="x7" y="y1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x10" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x9" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x9" y="hR" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="0" swAng="-5400000" />
+ <lnTo>
+ <pt x="x3" y="t" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="x2" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="wd8" y="y3" />
+ </lnTo>
+ <close />
+ </path>
+ <path stroke="false" fill="darkenLess" extrusionOk="false">
+
+ <moveTo>
+ <pt x="x5" y="y6" />
+ </moveTo>
+ <arcTo wR="wd32" hR="hR" stAng="0" swAng="-5400000" />
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="x5" y="y2" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="x6" y="y6" />
+ </moveTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="x8" y="y1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="x6" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="wd8" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="hR" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="x8" y="t" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="x9" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x9" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x10" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x7" y="b" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="x8" y="y1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="x3" y="y2" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />
+ <close />
+ <moveTo>
+ <pt x="x5" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x5" y="y6" />
+ </lnTo>
+ <moveTo>
+ <pt x="x6" y="y6" />
+ </moveTo>
+ <lnTo>
+ <pt x="x6" y="y2" />
+ </lnTo>
+ <moveTo>
+ <pt x="x2" y="y7" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y4" />
+ </lnTo>
+ <moveTo>
+ <pt x="x9" y="y4" />
+ </moveTo>
+ <lnTo>
+ <pt x="x9" y="y7" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </ribbon2>
+ <rightArrow>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+ <gd name="adj2" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 100000 w ss" />
+ <gd name="a1" fmla="pin 0 adj1 100000" />
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="dx1" fmla="*/ ss a2 100000" />
+ <gd name="x1" fmla="+- r 0 dx1" />
+ <gd name="dy1" fmla="*/ h a1 200000" />
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc dy1 0" />
+ <gd name="dx2" fmla="*/ y1 dx1 hd2" />
+ <gd name="x2" fmla="+- x1 dx2 0" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="100000">
+ <pos x="l" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x1" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x1" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="y1" r="x2" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </rightArrow>
+ <rightArrowCallout>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 25000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ <gd name="adj4" fmla="val 64977" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 50000 h ss" />
+
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="maxAdj1" fmla="*/ a2 2 1" />
+
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="maxAdj3" fmla="*/ 100000 w ss" />
+
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="q2" fmla="*/ a3 ss w" />
+
+ <gd name="maxAdj4" fmla="+- 100000 0 q2" />
+
+ <gd name="a4" fmla="pin 0 adj4 maxAdj4" />
+ <gd name="dy1" fmla="*/ ss a2 100000" />
+
+ <gd name="dy2" fmla="*/ ss a1 200000" />
+
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc 0 dy2" />
+ <gd name="y3" fmla="+- vc dy2 0" />
+ <gd name="y4" fmla="+- vc dy1 0" />
+ <gd name="dx3" fmla="*/ ss a3 100000" />
+
+ <gd name="x3" fmla="+- r 0 dx3" />
+ <gd name="x2" fmla="*/ w a4 100000" />
+
+ <gd name="x1" fmla="*/ x2 1 2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">
+ <pos x="x3" y="y2" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">
+ <pos x="r" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj3" minX="0" maxX="maxAdj3">
+ <pos x="x3" y="t" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="0" maxX="maxAdj4">
+ <pos x="x2" y="b" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x1" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x1" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </rightArrowCallout>
+ <rightBrace>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 8333" />
+ <gd name="adj2" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a2" fmla="pin 0 adj2 100000" />
+ <gd name="q1" fmla="+- 100000 0 a2" />
+ <gd name="q2" fmla="min q1 a2" />
+ <gd name="q3" fmla="*/ q2 1 2" />
+ <gd name="maxAdj1" fmla="*/ q3 h ss" />
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="y1" fmla="*/ ss a1 100000" />
+ <gd name="y3" fmla="*/ h a2 100000" />
+ <gd name="y2" fmla="+- y3 0 y1" />
+ <gd name="y4" fmla="+- b 0 y1" />
+ <gd name="dx1" fmla="cos wd2 2700000" />
+ <gd name="dy1" fmla="sin y1 2700000" />
+ <gd name="ir" fmla="+- l dx1 0" />
+ <gd name="it" fmla="+- y1 0 dy1" />
+ <gd name="ib" fmla="+- b dy1 y1" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">
+ <pos x="hc" y="y1" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="0" maxY="100000">
+ <pos x="r" y="y3" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd4">
+ <pos x="l" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="r" y="y3" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="l" y="b" />
+ </cxn>
+ </cxnLst>
+ <rect l="l" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <arcTo wR="wd2" hR="y1" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="hc" y="y2" />
+ </lnTo>
+ <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="-5400000" />
+ <arcTo wR="wd2" hR="y1" stAng="3cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="hc" y="y4" />
+ </lnTo>
+ <arcTo wR="wd2" hR="y1" stAng="0" swAng="cd4" />
+ <close />
+ </path>
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <arcTo wR="wd2" hR="y1" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="hc" y="y2" />
+ </lnTo>
+ <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="-5400000" />
+ <arcTo wR="wd2" hR="y1" stAng="3cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="hc" y="y4" />
+ </lnTo>
+ <arcTo wR="wd2" hR="y1" stAng="0" swAng="cd4" />
+ </path>
+ </pathLst>
+ </rightBrace>
+ <rightBracket>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 8333" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj" fmla="*/ 50000 h ss" />
+
+ <gd name="a" fmla="pin 0 adj maxAdj" />
+ <gd name="y1" fmla="*/ ss a 100000" />
+
+ <gd name="y2" fmla="+- b 0 y1" />
+
+ <gd name="dx1" fmla="cos w 2700000" />
+ <gd name="dy1" fmla="sin y1 2700000" />
+ <gd name="ir" fmla="+- l dx1 0" />
+ <gd name="it" fmla="+- y1 0 dy1" />
+ <gd name="ib" fmla="+- b dy1 y1" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="maxAdj">
+ <pos x="r" y="y1" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd4">
+ <pos x="l" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="l" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <arcTo wR="w" hR="y1" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <arcTo wR="w" hR="y1" stAng="0" swAng="cd4" />
+ <close />
+ </path>
+ <path fill="none">
+
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <arcTo wR="w" hR="y1" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <arcTo wR="w" hR="y1" stAng="0" swAng="cd4" />
+ </path>
+ </pathLst>
+
+ </rightBracket>
+ <round1Rect>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 16667" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="dx1" fmla="*/ ss a 100000" />
+ <gd name="x1" fmla="+- r 0 dx1" />
+ <gd name="idx" fmla="*/ dx1 29289 100000" />
+ <gd name="ir" fmla="+- r 0 idx" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="50000">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <arcTo wR="dx1" hR="dx1" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </round1Rect>
+ <round2DiagRect>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 16667" />
+ <gd name="adj2" fmla="val 0" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 50000" />
+ <gd name="a2" fmla="pin 0 adj2 50000" />
+ <gd name="x1" fmla="*/ ss a1 100000" />
+ <gd name="y1" fmla="+- b 0 x1" />
+ <gd name="a" fmla="*/ ss a2 100000" />
+ <gd name="x2" fmla="+- r 0 a" />
+ <gd name="y2" fmla="+- b 0 a" />
+ <gd name="dx1" fmla="*/ x1 29289 100000" />
+ <gd name="dx2" fmla="*/ a 29289 100000" />
+ <gd name="d" fmla="+- dx1 0 dx2" />
+ <gd name="dx" fmla="?: d dx1 dx2" />
+ <gd name="ir" fmla="+- r 0 dx" />
+ <gd name="ib" fmla="+- b 0 dx" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="50000">
+ <pos x="x1" y="t" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="50000">
+ <pos x="x2" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="dx" t="dx" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <arcTo wR="a" hR="a" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="y1" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="a" y="b" />
+ </lnTo>
+ <arcTo wR="a" hR="a" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="l" y="x1" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />
+ <close />
+ </path>
+ </pathLst>
+
+ </round2DiagRect>
+ <round2SameRect>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 16667" />
+ <gd name="adj2" fmla="val 0" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 50000" />
+ <gd name="a2" fmla="pin 0 adj2 50000" />
+
+ <gd name="tx1" fmla="*/ ss a1 100000" />
+ <gd name="tx2" fmla="+- r 0 tx1" />
+
+ <gd name="bx1" fmla="*/ ss a2 100000" />
+ <gd name="bx2" fmla="+- r 0 bx1" />
+ <gd name="by1" fmla="+- b 0 bx1" />
+ <gd name="d" fmla="+- tx1 0 bx1" />
+ <gd name="tdx" fmla="*/ tx1 29289 100000" />
+ <gd name="bdx" fmla="*/ bx1 29289 100000" />
+ <gd name="il" fmla="?: d tdx bdx" />
+ <gd name="ir" fmla="+- r 0 il" />
+ <gd name="ib" fmla="+- b 0 bdx" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="50000">
+ <pos x="tx2" y="t" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="50000">
+ <pos x="bx1" y="b" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="tdx" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="tx1" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="tx2" y="t" />
+ </lnTo>
+ <arcTo wR="tx1" hR="tx1" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="by1" />
+ </lnTo>
+ <arcTo wR="bx1" hR="bx1" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="bx1" y="b" />
+ </lnTo>
+ <arcTo wR="bx1" hR="bx1" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="l" y="tx1" />
+ </lnTo>
+ <arcTo wR="tx1" hR="tx1" stAng="cd2" swAng="cd4" />
+ <close />
+ </path>
+ </pathLst>
+
+ </round2SameRect>
+ <roundRect>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 16667" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="x1" fmla="*/ ss a 100000" />
+ <gd name="x2" fmla="+- r 0 x1" />
+ <gd name="y2" fmla="+- b 0 x1" />
+ <gd name="il" fmla="*/ x1 29289 100000" />
+ <gd name="ir" fmla="+- r 0 il" />
+ <gd name="ib" fmla="+- b 0 il" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="50000">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+ <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="x1" />
+ </moveTo>
+ <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="cd4" swAng="cd4" />
+ <close />
+ </path>
+ </pathLst>
+ </roundRect>
+ <rtTriangle>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="it" fmla="*/ h 7 12" />
+ <gd name="ir" fmla="*/ w 7 12" />
+ <gd name="ib" fmla="*/ h 11 12" />
+ </gdLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="l" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="l" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="r" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="hc" y="vc" />
+ </cxn>
+ </cxnLst>
+ <rect l="wd12" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="l" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </rtTriangle>
+ <smileyFace>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 4653" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin -4653 adj 4653" />
+ <gd name="x1" fmla="*/ w 4969 21699" />
+
+ <gd name="x2" fmla="*/ w 6215 21600" />
+
+ <gd name="x3" fmla="*/ w 13135 21600" />
+
+ <gd name="x4" fmla="*/ w 16640 21600" />
+
+ <gd name="y1" fmla="*/ h 7570 21600" />
+
+ <gd name="y3" fmla="*/ h 16515 21600" />
+
+ <gd name="dy2" fmla="*/ h a 100000" />
+
+ <gd name="y2" fmla="+- y3 0 dy2" />
+
+ <gd name="y4" fmla="+- y3 dy2 0" />
+
+ <gd name="dy3" fmla="*/ h a 50000" />
+
+ <gd name="y5" fmla="+- y4 dy3 0" />
+ <gd name="idx" fmla="cos wd2 2700000" />
+ <gd name="idy" fmla="sin hd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ <gd name="wR" fmla="*/ w 1125 21600" />
+ <gd name="hR" fmla="*/ h 1125 21600" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="-4653" maxY="4653">
+ <pos x="hc" y="y4" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="il" y="it" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="il" y="ib" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="ir" y="ib" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="ir" y="it" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="21600000" />
+ <close />
+ </path>
+ <path fill="darkenLess" extrusionOk="false">
+
+ <moveTo>
+ <pt x="x2" y="y1" />
+ </moveTo>
+ <arcTo wR="wR" hR="hR" stAng="cd2" swAng="21600000" />
+ <moveTo>
+ <pt x="x3" y="y1" />
+ </moveTo>
+ <arcTo wR="wR" hR="hR" stAng="cd2" swAng="21600000" />
+ </path>
+ <path fill="none" extrusionOk="false">
+
+ <moveTo>
+ <pt x="x1" y="y2" />
+ </moveTo>
+ <quadBezTo>
+ <pt x="hc" y="y5" />
+ <pt x="x4" y="y2" />
+ </quadBezTo>
+ </path>
+ <path fill="none">
+
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="21600000" />
+ <close />
+ </path>
+ </pathLst>
+
+ </smileyFace>
+ <snip1Rect>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 16667" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="dx1" fmla="*/ ss a 100000" />
+ <gd name="x1" fmla="+- r 0 dx1" />
+ <gd name="it" fmla="*/ dx1 1 2" />
+ <gd name="ir" fmla="+/ x1 r 2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="50000">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="it" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="dx1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </snip1Rect>
+ <snip2DiagRect>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 0" />
+ <gd name="adj2" fmla="val 16667" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 50000" />
+ <gd name="a2" fmla="pin 0 adj2 50000" />
+ <gd name="lx1" fmla="*/ ss a1 100000" />
+ <gd name="lx2" fmla="+- r 0 lx1" />
+ <gd name="ly1" fmla="+- b 0 lx1" />
+ <gd name="rx1" fmla="*/ ss a2 100000" />
+ <gd name="rx2" fmla="+- r 0 rx1" />
+ <gd name="ry1" fmla="+- b 0 rx1" />
+ <gd name="d" fmla="+- lx1 0 rx1" />
+ <gd name="dx" fmla="?: d lx1 rx1" />
+ <gd name="il" fmla="*/ dx 1 2" />
+
+ <gd name="ir" fmla="+- r 0 il" />
+ <gd name="ib" fmla="+- b 0 il" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="50000">
+ <pos x="lx1" y="t" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="50000">
+ <pos x="rx2" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="lx1" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="rx2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="rx1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="ly1" />
+ </lnTo>
+ <lnTo>
+ <pt x="lx2" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="rx1" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="ry1" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="lx1" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </snip2DiagRect>
+ <snip2SameRect>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 16667" />
+ <gd name="adj2" fmla="val 0" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 50000" />
+ <gd name="a2" fmla="pin 0 adj2 50000" />
+ <gd name="tx1" fmla="*/ ss a1 100000" />
+ <gd name="tx2" fmla="+- r 0 tx1" />
+ <gd name="bx1" fmla="*/ ss a2 100000" />
+ <gd name="bx2" fmla="+- r 0 bx1" />
+ <gd name="by1" fmla="+- b 0 bx1" />
+ <gd name="d" fmla="+- tx1 0 bx1" />
+ <gd name="dx" fmla="?: d tx1 bx1" />
+ <gd name="il" fmla="*/ dx 1 2" />
+ <gd name="ir" fmla="+- r 0 il" />
+ <gd name="it" fmla="*/ tx1 1 2" />
+ <gd name="ib" fmla="+/ by1 b 2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="50000">
+ <pos x="tx2" y="t" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="50000">
+ <pos x="bx1" y="b" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="tx1" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="tx2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="tx1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="by1" />
+ </lnTo>
+ <lnTo>
+ <pt x="bx2" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="bx1" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="by1" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="tx1" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </snip2SameRect>
+ <snipRoundRect>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 16667" />
+ <gd name="adj2" fmla="val 16667" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 50000" />
+ <gd name="a2" fmla="pin 0 adj2 50000" />
+ <gd name="x1" fmla="*/ ss a1 100000" />
+ <gd name="dx2" fmla="*/ ss a2 100000" />
+ <gd name="x2" fmla="+- r 0 dx2" />
+ <gd name="il" fmla="*/ x1 29289 100000" />
+
+ <gd name="ir" fmla="+/ x2 r 2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="50000">
+ <pos x="x1" y="t" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="50000">
+ <pos x="x2" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="il" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="dx2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="x1" />
+ </lnTo>
+ <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />
+ <close />
+ </path>
+ </pathLst>
+
+ </snipRoundRect>
+ <squareTabs>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="md" fmla="mod w h 0" />
+ <gd name="dx" fmla="*/ 1 md 20" />
+
+ <gd name="y1" fmla="+- 0 b dx" />
+
+ <gd name="x1" fmla="+- 0 r dx" />
+
+ </gdLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd2">
+ <pos x="l" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="dx" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y1" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="dx" y="dx" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="dx" y="x1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="dx" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x1" y="t" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="dx" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x1" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="t" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="dx" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y1" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x1" y="dx" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x1" y="y1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="dx" t="dx" r="x1" b="y1" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="dx" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="dx" y="dx" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="dx" />
+ </lnTo>
+ <close />
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="dx" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="dx" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x1" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="dx" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="dx" />
+ </lnTo>
+ <close />
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </squareTabs>
+ <star10>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 42533" />
+ <gd name="hf" fmla="val 105146" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="swd2" fmla="*/ wd2 hf 100000" />
+ <gd name="dx1" fmla="*/ swd2 95106 100000" />
+ <gd name="dx2" fmla="*/ swd2 58779 100000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x3" fmla="+- hc dx2 0" />
+ <gd name="x4" fmla="+- hc dx1 0" />
+ <gd name="dy1" fmla="*/ hd2 80902 100000" />
+ <gd name="dy2" fmla="*/ hd2 30902 100000" />
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc 0 dy2" />
+ <gd name="y3" fmla="+- vc dy2 0" />
+ <gd name="y4" fmla="+- vc dy1 0" />
+ <gd name="iwd2" fmla="*/ swd2 a 50000" />
+ <gd name="ihd2" fmla="*/ hd2 a 50000" />
+ <gd name="sdx1" fmla="*/ iwd2 80902 100000" />
+ <gd name="sdx2" fmla="*/ iwd2 30902 100000" />
+ <gd name="sdy1" fmla="*/ ihd2 95106 100000" />
+ <gd name="sdy2" fmla="*/ ihd2 58779 100000" />
+ <gd name="sx1" fmla="+- hc 0 iwd2" />
+ <gd name="sx2" fmla="+- hc 0 sdx1" />
+ <gd name="sx3" fmla="+- hc 0 sdx2" />
+ <gd name="sx4" fmla="+- hc sdx2 0" />
+ <gd name="sx5" fmla="+- hc sdx1 0" />
+ <gd name="sx6" fmla="+- hc iwd2 0" />
+ <gd name="sy1" fmla="+- vc 0 sdy1" />
+ <gd name="sy2" fmla="+- vc 0 sdy2" />
+ <gd name="sy3" fmla="+- vc sdy2 0" />
+ <gd name="sy4" fmla="+- vc sdy1 0" />
+ <gd name="yAdj" fmla="+- vc 0 ihd2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="50000">
+ <pos x="hc" y="yAdj" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x4" y="y2" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x4" y="y3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="y4" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x2" y="y4" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y3" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y2" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x2" y="y1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x3" y="y1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="sx2" t="sy2" r="sx5" b="sy3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="sx2" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx5" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx6" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx5" y="sy3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy4" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx1" y="vc" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </star10>
+ <star12>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 37500" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="dx1" fmla="cos wd2 1800000" />
+
+ <gd name="dy1" fmla="sin hd2 3600000" />
+
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x3" fmla="*/ w 3 4" />
+ <gd name="x4" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y3" fmla="*/ h 3 4" />
+ <gd name="y4" fmla="+- vc dy1 0" />
+ <gd name="iwd2" fmla="*/ wd2 a 50000" />
+ <gd name="ihd2" fmla="*/ hd2 a 50000" />
+ <gd name="sdx1" fmla="cos iwd2 900000" />
+ <gd name="sdx2" fmla="cos iwd2 2700000" />
+ <gd name="sdx3" fmla="cos iwd2 4500000" />
+ <gd name="sdy1" fmla="sin ihd2 4500000" />
+ <gd name="sdy2" fmla="sin ihd2 2700000" />
+ <gd name="sdy3" fmla="sin ihd2 900000" />
+ <gd name="sx1" fmla="+- hc 0 sdx1" />
+ <gd name="sx2" fmla="+- hc 0 sdx2" />
+ <gd name="sx3" fmla="+- hc 0 sdx3" />
+ <gd name="sx4" fmla="+- hc sdx3 0" />
+ <gd name="sx5" fmla="+- hc sdx2 0" />
+ <gd name="sx6" fmla="+- hc sdx1 0" />
+ <gd name="sy1" fmla="+- vc 0 sdy1" />
+ <gd name="sy2" fmla="+- vc 0 sdy2" />
+ <gd name="sy3" fmla="+- vc 0 sdy3" />
+ <gd name="sy4" fmla="+- vc sdy3 0" />
+ <gd name="sy5" fmla="+- vc sdy2 0" />
+ <gd name="sy6" fmla="+- vc sdy1 0" />
+ <gd name="yAdj" fmla="+- vc 0 ihd2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="50000">
+ <pos x="hc" y="yAdj" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x4" y="hd4" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x4" y="y3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="y4" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="wd4" y="y4" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y3" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="hd4" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="wd4" y="y1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x3" y="y1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="sx2" t="sy2" r="sx5" b="sy5" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="sx1" y="sy3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="hd4" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="wd4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx5" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="hd4" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx6" y="sy3" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx6" y="sy4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx5" y="sy5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy6" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy6" />
+ </lnTo>
+ <lnTo>
+ <pt x="wd4" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx1" y="sy4" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </star12>
+ <star16>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 37500" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="dx1" fmla="*/ wd2 92388 100000" />
+ <gd name="dx2" fmla="*/ wd2 70711 100000" />
+ <gd name="dx3" fmla="*/ wd2 38268 100000" />
+ <gd name="dy1" fmla="*/ hd2 92388 100000" />
+ <gd name="dy2" fmla="*/ hd2 70711 100000" />
+ <gd name="dy3" fmla="*/ hd2 38268 100000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x3" fmla="+- hc 0 dx3" />
+ <gd name="x4" fmla="+- hc dx3 0" />
+ <gd name="x5" fmla="+- hc dx2 0" />
+ <gd name="x6" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc 0 dy2" />
+ <gd name="y3" fmla="+- vc 0 dy3" />
+ <gd name="y4" fmla="+- vc dy3 0" />
+ <gd name="y5" fmla="+- vc dy2 0" />
+ <gd name="y6" fmla="+- vc dy1 0" />
+ <gd name="iwd2" fmla="*/ wd2 a 50000" />
+ <gd name="ihd2" fmla="*/ hd2 a 50000" />
+ <gd name="sdx1" fmla="*/ iwd2 98079 100000" />
+ <gd name="sdx2" fmla="*/ iwd2 83147 100000" />
+ <gd name="sdx3" fmla="*/ iwd2 55557 100000" />
+ <gd name="sdx4" fmla="*/ iwd2 19509 100000" />
+ <gd name="sdy1" fmla="*/ ihd2 98079 100000" />
+ <gd name="sdy2" fmla="*/ ihd2 83147 100000" />
+ <gd name="sdy3" fmla="*/ ihd2 55557 100000" />
+ <gd name="sdy4" fmla="*/ ihd2 19509 100000" />
+ <gd name="sx1" fmla="+- hc 0 sdx1" />
+ <gd name="sx2" fmla="+- hc 0 sdx2" />
+ <gd name="sx3" fmla="+- hc 0 sdx3" />
+ <gd name="sx4" fmla="+- hc 0 sdx4" />
+ <gd name="sx5" fmla="+- hc sdx4 0" />
+ <gd name="sx6" fmla="+- hc sdx3 0" />
+ <gd name="sx7" fmla="+- hc sdx2 0" />
+ <gd name="sx8" fmla="+- hc sdx1 0" />
+ <gd name="sy1" fmla="+- vc 0 sdy1" />
+ <gd name="sy2" fmla="+- vc 0 sdy2" />
+ <gd name="sy3" fmla="+- vc 0 sdy3" />
+ <gd name="sy4" fmla="+- vc 0 sdy4" />
+ <gd name="sy5" fmla="+- vc sdy4 0" />
+ <gd name="sy6" fmla="+- vc sdy3 0" />
+ <gd name="sy7" fmla="+- vc sdy2 0" />
+ <gd name="sy8" fmla="+- vc sdy1 0" />
+ <gd name="idx" fmla="cos iwd2 2700000" />
+ <gd name="idy" fmla="sin ihd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ <gd name="yAdj" fmla="+- vc 0 ihd2" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="50000">
+ <pos x="hc" y="yAdj" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x5" y="y2" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x6" y="y3" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x6" y="y4" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x5" y="y5" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x4" y="y6" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="y6" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x2" y="y5" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y4" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y3" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x2" y="y2" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x3" y="y1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x4" y="y1" />
+ </cxn>
+ </cxnLst>
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="sx1" y="sy4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx5" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx6" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx7" y="sy3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx8" y="sy4" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx8" y="sy5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx7" y="sy6" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx6" y="sy7" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx5" y="sy8" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy8" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy7" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy6" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx1" y="sy5" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </star16>
+ <star24>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 37500" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="dx1" fmla="cos wd2 900000" />
+ <gd name="dx2" fmla="cos wd2 1800000" />
+ <gd name="dx3" fmla="cos wd2 2700000" />
+ <gd name="dx4" fmla="val wd4" />
+ <gd name="dx5" fmla="cos wd2 4500000" />
+ <gd name="dy1" fmla="sin hd2 4500000" />
+ <gd name="dy2" fmla="sin hd2 3600000" />
+ <gd name="dy3" fmla="sin hd2 2700000" />
+ <gd name="dy4" fmla="val hd4" />
+ <gd name="dy5" fmla="sin hd2 900000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x3" fmla="+- hc 0 dx3" />
+ <gd name="x4" fmla="+- hc 0 dx4" />
+ <gd name="x5" fmla="+- hc 0 dx5" />
+ <gd name="x6" fmla="+- hc dx5 0" />
+ <gd name="x7" fmla="+- hc dx4 0" />
+ <gd name="x8" fmla="+- hc dx3 0" />
+ <gd name="x9" fmla="+- hc dx2 0" />
+ <gd name="x10" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc 0 dy2" />
+ <gd name="y3" fmla="+- vc 0 dy3" />
+ <gd name="y4" fmla="+- vc 0 dy4" />
+ <gd name="y5" fmla="+- vc 0 dy5" />
+ <gd name="y6" fmla="+- vc dy5 0" />
+ <gd name="y7" fmla="+- vc dy4 0" />
+ <gd name="y8" fmla="+- vc dy3 0" />
+ <gd name="y9" fmla="+- vc dy2 0" />
+ <gd name="y10" fmla="+- vc dy1 0" />
+ <gd name="iwd2" fmla="*/ wd2 a 50000" />
+ <gd name="ihd2" fmla="*/ hd2 a 50000" />
+ <gd name="sdx1" fmla="*/ iwd2 99144 100000" />
+ <gd name="sdx2" fmla="*/ iwd2 92388 100000" />
+ <gd name="sdx3" fmla="*/ iwd2 79335 100000" />
+ <gd name="sdx4" fmla="*/ iwd2 60876 100000" />
+ <gd name="sdx5" fmla="*/ iwd2 38268 100000" />
+ <gd name="sdx6" fmla="*/ iwd2 13053 100000" />
+ <gd name="sdy1" fmla="*/ ihd2 99144 100000" />
+ <gd name="sdy2" fmla="*/ ihd2 92388 100000" />
+ <gd name="sdy3" fmla="*/ ihd2 79335 100000" />
+ <gd name="sdy4" fmla="*/ ihd2 60876 100000" />
+ <gd name="sdy5" fmla="*/ ihd2 38268 100000" />
+ <gd name="sdy6" fmla="*/ ihd2 13053 100000" />
+ <gd name="sx1" fmla="+- hc 0 sdx1" />
+ <gd name="sx2" fmla="+- hc 0 sdx2" />
+ <gd name="sx3" fmla="+- hc 0 sdx3" />
+ <gd name="sx4" fmla="+- hc 0 sdx4" />
+ <gd name="sx5" fmla="+- hc 0 sdx5" />
+ <gd name="sx6" fmla="+- hc 0 sdx6" />
+ <gd name="sx7" fmla="+- hc sdx6 0" />
+ <gd name="sx8" fmla="+- hc sdx5 0" />
+ <gd name="sx9" fmla="+- hc sdx4 0" />
+ <gd name="sx10" fmla="+- hc sdx3 0" />
+ <gd name="sx11" fmla="+- hc sdx2 0" />
+ <gd name="sx12" fmla="+- hc sdx1 0" />
+ <gd name="sy1" fmla="+- vc 0 sdy1" />
+ <gd name="sy2" fmla="+- vc 0 sdy2" />
+ <gd name="sy3" fmla="+- vc 0 sdy3" />
+ <gd name="sy4" fmla="+- vc 0 sdy4" />
+ <gd name="sy5" fmla="+- vc 0 sdy5" />
+ <gd name="sy6" fmla="+- vc 0 sdy6" />
+ <gd name="sy7" fmla="+- vc sdy6 0" />
+ <gd name="sy8" fmla="+- vc sdy5 0" />
+ <gd name="sy9" fmla="+- vc sdy4 0" />
+ <gd name="sy10" fmla="+- vc sdy3 0" />
+ <gd name="sy11" fmla="+- vc sdy2 0" />
+ <gd name="sy12" fmla="+- vc sdy1 0" />
+ <gd name="idx" fmla="cos iwd2 2700000" />
+ <gd name="idy" fmla="sin ihd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ <gd name="yAdj" fmla="+- vc 0 ihd2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="ssd2">
+ <pos x="hc" y="yAdj" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="sx1" y="sy6" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx5" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx6" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx7" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx8" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x7" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx9" y="sy3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx10" y="sy4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x9" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx11" y="sy5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x10" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx12" y="sy6" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx12" y="sy7" />
+ </lnTo>
+ <lnTo>
+ <pt x="x10" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx11" y="sy8" />
+ </lnTo>
+ <lnTo>
+ <pt x="x9" y="y7" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx10" y="sy9" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y8" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx9" y="sy10" />
+ </lnTo>
+ <lnTo>
+ <pt x="x7" y="y9" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx8" y="sy11" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y10" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx7" y="sy12" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx6" y="sy12" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y10" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx5" y="sy11" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y9" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy10" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y8" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy9" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y7" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy8" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx1" y="sy7" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </star24>
+ <star32>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 37500" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="dx1" fmla="*/ wd2 98079 100000" />
+ <gd name="dx2" fmla="*/ wd2 92388 100000" />
+ <gd name="dx3" fmla="*/ wd2 83147 100000" />
+ <gd name="dx4" fmla="cos wd2 2700000" />
+ <gd name="dx5" fmla="*/ wd2 55557 100000" />
+ <gd name="dx6" fmla="*/ wd2 38268 100000" />
+ <gd name="dx7" fmla="*/ wd2 19509 100000" />
+ <gd name="dy1" fmla="*/ hd2 98079 100000" />
+ <gd name="dy2" fmla="*/ hd2 92388 100000" />
+ <gd name="dy3" fmla="*/ hd2 83147 100000" />
+ <gd name="dy4" fmla="sin hd2 2700000" />
+ <gd name="dy5" fmla="*/ hd2 55557 100000" />
+ <gd name="dy6" fmla="*/ hd2 38268 100000" />
+ <gd name="dy7" fmla="*/ hd2 19509 100000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x3" fmla="+- hc 0 dx3" />
+ <gd name="x4" fmla="+- hc 0 dx4" />
+ <gd name="x5" fmla="+- hc 0 dx5" />
+ <gd name="x6" fmla="+- hc 0 dx6" />
+ <gd name="x7" fmla="+- hc 0 dx7" />
+ <gd name="x8" fmla="+- hc dx7 0" />
+ <gd name="x9" fmla="+- hc dx6 0" />
+ <gd name="x10" fmla="+- hc dx5 0" />
+ <gd name="x11" fmla="+- hc dx4 0" />
+ <gd name="x12" fmla="+- hc dx3 0" />
+ <gd name="x13" fmla="+- hc dx2 0" />
+ <gd name="x14" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc 0 dy2" />
+ <gd name="y3" fmla="+- vc 0 dy3" />
+ <gd name="y4" fmla="+- vc 0 dy4" />
+ <gd name="y5" fmla="+- vc 0 dy5" />
+ <gd name="y6" fmla="+- vc 0 dy6" />
+ <gd name="y7" fmla="+- vc 0 dy7" />
+ <gd name="y8" fmla="+- vc dy7 0" />
+ <gd name="y9" fmla="+- vc dy6 0" />
+ <gd name="y10" fmla="+- vc dy5 0" />
+ <gd name="y11" fmla="+- vc dy4 0" />
+ <gd name="y12" fmla="+- vc dy3 0" />
+ <gd name="y13" fmla="+- vc dy2 0" />
+ <gd name="y14" fmla="+- vc dy1 0" />
+ <gd name="iwd2" fmla="*/ wd2 a 50000" />
+ <gd name="ihd2" fmla="*/ hd2 a 50000" />
+ <gd name="sdx1" fmla="*/ iwd2 99518 100000" />
+ <gd name="sdx2" fmla="*/ iwd2 95694 100000" />
+ <gd name="sdx3" fmla="*/ iwd2 88192 100000" />
+ <gd name="sdx4" fmla="*/ iwd2 77301 100000" />
+ <gd name="sdx5" fmla="*/ iwd2 63439 100000" />
+ <gd name="sdx6" fmla="*/ iwd2 47140 100000" />
+ <gd name="sdx7" fmla="*/ iwd2 29028 100000" />
+ <gd name="sdx8" fmla="*/ iwd2 9802 100000" />
+ <gd name="sdy1" fmla="*/ ihd2 99518 100000" />
+ <gd name="sdy2" fmla="*/ ihd2 95694 100000" />
+ <gd name="sdy3" fmla="*/ ihd2 88192 100000" />
+ <gd name="sdy4" fmla="*/ ihd2 77301 100000" />
+ <gd name="sdy5" fmla="*/ ihd2 63439 100000" />
+ <gd name="sdy6" fmla="*/ ihd2 47140 100000" />
+ <gd name="sdy7" fmla="*/ ihd2 29028 100000" />
+ <gd name="sdy8" fmla="*/ ihd2 9802 100000" />
+ <gd name="sx1" fmla="+- hc 0 sdx1" />
+ <gd name="sx2" fmla="+- hc 0 sdx2" />
+ <gd name="sx3" fmla="+- hc 0 sdx3" />
+ <gd name="sx4" fmla="+- hc 0 sdx4" />
+ <gd name="sx5" fmla="+- hc 0 sdx5" />
+ <gd name="sx6" fmla="+- hc 0 sdx6" />
+ <gd name="sx7" fmla="+- hc 0 sdx7" />
+ <gd name="sx8" fmla="+- hc 0 sdx8" />
+ <gd name="sx9" fmla="+- hc sdx8 0" />
+ <gd name="sx10" fmla="+- hc sdx7 0" />
+ <gd name="sx11" fmla="+- hc sdx6 0" />
+ <gd name="sx12" fmla="+- hc sdx5 0" />
+ <gd name="sx13" fmla="+- hc sdx4 0" />
+ <gd name="sx14" fmla="+- hc sdx3 0" />
+ <gd name="sx15" fmla="+- hc sdx2 0" />
+ <gd name="sx16" fmla="+- hc sdx1 0" />
+ <gd name="sy1" fmla="+- vc 0 sdy1" />
+ <gd name="sy2" fmla="+- vc 0 sdy2" />
+ <gd name="sy3" fmla="+- vc 0 sdy3" />
+ <gd name="sy4" fmla="+- vc 0 sdy4" />
+ <gd name="sy5" fmla="+- vc 0 sdy5" />
+ <gd name="sy6" fmla="+- vc 0 sdy6" />
+ <gd name="sy7" fmla="+- vc 0 sdy7" />
+ <gd name="sy8" fmla="+- vc 0 sdy8" />
+ <gd name="sy9" fmla="+- vc sdy8 0" />
+ <gd name="sy10" fmla="+- vc sdy7 0" />
+ <gd name="sy11" fmla="+- vc sdy6 0" />
+ <gd name="sy12" fmla="+- vc sdy5 0" />
+ <gd name="sy13" fmla="+- vc sdy4 0" />
+ <gd name="sy14" fmla="+- vc sdy3 0" />
+ <gd name="sy15" fmla="+- vc sdy2 0" />
+ <gd name="sy16" fmla="+- vc sdy1 0" />
+ <gd name="idx" fmla="cos iwd2 2700000" />
+ <gd name="idy" fmla="sin ihd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ <gd name="yAdj" fmla="+- vc 0 ihd2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="ssd2">
+ <pos x="hc" y="yAdj" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="sx1" y="sy8" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y7" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy7" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy6" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx5" y="sy4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx6" y="sy3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx7" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x7" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx8" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx9" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx10" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x9" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx11" y="sy3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x10" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx12" y="sy4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x11" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx13" y="sy5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x12" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx14" y="sy6" />
+ </lnTo>
+ <lnTo>
+ <pt x="x13" y="y6" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx15" y="sy7" />
+ </lnTo>
+ <lnTo>
+ <pt x="x14" y="y7" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx16" y="sy8" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx16" y="sy9" />
+ </lnTo>
+ <lnTo>
+ <pt x="x14" y="y8" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx15" y="sy10" />
+ </lnTo>
+ <lnTo>
+ <pt x="x13" y="y9" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx14" y="sy11" />
+ </lnTo>
+ <lnTo>
+ <pt x="x12" y="y10" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx13" y="sy12" />
+ </lnTo>
+ <lnTo>
+ <pt x="x11" y="y11" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx12" y="sy13" />
+ </lnTo>
+ <lnTo>
+ <pt x="x10" y="y12" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx11" y="sy14" />
+ </lnTo>
+ <lnTo>
+ <pt x="x9" y="y13" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx10" y="sy15" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y14" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx9" y="sy16" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx8" y="sy16" />
+ </lnTo>
+ <lnTo>
+ <pt x="x7" y="y14" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx7" y="sy15" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y13" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx6" y="sy14" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y12" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx5" y="sy13" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y11" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy12" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y10" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy11" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y9" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy10" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y8" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx1" y="sy9" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </star32>
+ <star4>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 12500" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="iwd2" fmla="*/ wd2 a 50000" />
+ <gd name="ihd2" fmla="*/ hd2 a 50000" />
+ <gd name="sdx" fmla="cos iwd2 2700000" />
+ <gd name="sdy" fmla="sin ihd2 2700000" />
+ <gd name="sx1" fmla="+- hc 0 sdx" />
+ <gd name="sx2" fmla="+- hc sdx 0" />
+ <gd name="sy1" fmla="+- vc 0 sdy" />
+ <gd name="sy2" fmla="+- vc sdy 0" />
+ <gd name="yAdj" fmla="+- vc 0 ihd2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="50000">
+ <pos x="hc" y="yAdj" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="sx1" t="sy1" r="sx2" b="sy2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="sx1" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx1" y="sy2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </star4>
+ <star5>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 19098" />
+ <gd name="hf" fmla="val 105146" />
+ <gd name="vf" fmla="val 110557" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="swd2" fmla="*/ wd2 hf 100000" />
+ <gd name="shd2" fmla="*/ hd2 vf 100000" />
+ <gd name="svc" fmla="*/ vc vf 100000" />
+ <gd name="dx1" fmla="cos swd2 1080000" />
+ <gd name="dx2" fmla="cos swd2 18360000" />
+ <gd name="dy1" fmla="sin shd2 1080000" />
+ <gd name="dy2" fmla="sin shd2 18360000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x3" fmla="+- hc dx2 0" />
+ <gd name="x4" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- svc 0 dy1" />
+ <gd name="y2" fmla="+- svc 0 dy2" />
+ <gd name="iwd2" fmla="*/ swd2 a 50000" />
+ <gd name="ihd2" fmla="*/ shd2 a 50000" />
+ <gd name="sdx1" fmla="cos iwd2 20520000" />
+ <gd name="sdx2" fmla="cos iwd2 3240000" />
+ <gd name="sdy1" fmla="sin ihd2 3240000" />
+ <gd name="sdy2" fmla="sin ihd2 20520000" />
+ <gd name="sx1" fmla="+- hc 0 sdx1" />
+ <gd name="sx2" fmla="+- hc 0 sdx2" />
+ <gd name="sx3" fmla="+- hc sdx2 0" />
+ <gd name="sx4" fmla="+- hc sdx1 0" />
+ <gd name="sy1" fmla="+- svc 0 sdy1" />
+ <gd name="sy2" fmla="+- svc 0 sdy2" />
+ <gd name="sy3" fmla="+- svc ihd2 0" />
+ <gd name="yAdj" fmla="+- svc 0 ihd2" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="50000">
+ <pos x="hc" y="yAdj" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y1" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x2" y="y2" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="y2" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x4" y="y1" />
+ </cxn>
+ </cxnLst>
+ <rect l="sx1" t="sy1" r="sx4" b="sy3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="sx2" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="sy3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx1" y="sy2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </star5>
+ <star6>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 28868" />
+ <gd name="hf" fmla="val 115470" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="swd2" fmla="*/ wd2 hf 100000" />
+ <gd name="dx1" fmla="cos swd2 1800000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc dx1 0" />
+ <gd name="y2" fmla="+- vc hd4 0" />
+ <gd name="iwd2" fmla="*/ swd2 a 50000" />
+ <gd name="ihd2" fmla="*/ hd2 a 50000" />
+ <gd name="sdx2" fmla="*/ iwd2 1 2" />
+ <gd name="sx1" fmla="+- hc 0 iwd2" />
+ <gd name="sx2" fmla="+- hc 0 sdx2" />
+ <gd name="sx3" fmla="+- hc sdx2 0" />
+ <gd name="sx4" fmla="+- hc iwd2 0" />
+ <gd name="sdy1" fmla="sin ihd2 3600000" />
+ <gd name="sy1" fmla="+- vc 0 sdy1" />
+ <gd name="sy2" fmla="+- vc sdy1 0" />
+ <gd name="yAdj" fmla="+- vc 0 ihd2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="50000">
+ <pos x="hc" y="yAdj" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x2" y="hd4" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x2" y="y2" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="hd4" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="sx1" t="sy1" r="sx4" b="sy2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="hd4" />
+ </moveTo>
+ <lnTo>
+ <pt x="sx2" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="hd4" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx1" y="vc" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </star6>
+ <star7>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 34601" />
+ <gd name="hf" fmla="val 102572" />
+ <gd name="vf" fmla="val 105210" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="swd2" fmla="*/ wd2 hf 100000" />
+ <gd name="shd2" fmla="*/ hd2 vf 100000" />
+ <gd name="svc" fmla="*/ vc vf 100000" />
+ <gd name="dx1" fmla="*/ swd2 97493 100000" />
+ <gd name="dx2" fmla="*/ swd2 78183 100000" />
+ <gd name="dx3" fmla="*/ swd2 43388 100000" />
+ <gd name="dy1" fmla="*/ shd2 62349 100000" />
+ <gd name="dy2" fmla="*/ shd2 22252 100000" />
+ <gd name="dy3" fmla="*/ shd2 90097 100000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x3" fmla="+- hc 0 dx3" />
+ <gd name="x4" fmla="+- hc dx3 0" />
+ <gd name="x5" fmla="+- hc dx2 0" />
+ <gd name="x6" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- svc 0 dy1" />
+ <gd name="y2" fmla="+- svc dy2 0" />
+ <gd name="y3" fmla="+- svc dy3 0" />
+ <gd name="iwd2" fmla="*/ swd2 a 50000" />
+ <gd name="ihd2" fmla="*/ shd2 a 50000" />
+ <gd name="sdx1" fmla="*/ iwd2 97493 100000" />
+ <gd name="sdx2" fmla="*/ iwd2 78183 100000" />
+ <gd name="sdx3" fmla="*/ iwd2 43388 100000" />
+ <gd name="sx1" fmla="+- hc 0 sdx1" />
+ <gd name="sx2" fmla="+- hc 0 sdx2" />
+ <gd name="sx3" fmla="+- hc 0 sdx3" />
+ <gd name="sx4" fmla="+- hc sdx3 0" />
+ <gd name="sx5" fmla="+- hc sdx2 0" />
+ <gd name="sx6" fmla="+- hc sdx1 0" />
+ <gd name="sdy1" fmla="*/ ihd2 90097 100000" />
+ <gd name="sdy2" fmla="*/ ihd2 22252 100000" />
+ <gd name="sdy3" fmla="*/ ihd2 62349 100000" />
+ <gd name="sy1" fmla="+- svc 0 sdy1" />
+ <gd name="sy2" fmla="+- svc 0 sdy2" />
+ <gd name="sy3" fmla="+- svc sdy3 0" />
+ <gd name="sy4" fmla="+- svc ihd2 0" />
+ <gd name="yAdj" fmla="+- svc 0 ihd2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="50000">
+ <pos x="hc" y="yAdj" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="x5" y="y1" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x6" y="y2" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x4" y="y3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x3" y="y3" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x2" y="y1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="sx2" t="sy1" r="sx5" b="sy3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="sx1" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx6" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx5" y="sy3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="sy4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy3" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </star7>
+ <star8>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 37500" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000" />
+ <gd name="dx1" fmla="cos wd2 2700000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc dx1 0" />
+ <gd name="dy1" fmla="sin hd2 2700000" />
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc dy1 0" />
+ <gd name="iwd2" fmla="*/ wd2 a 50000" />
+ <gd name="ihd2" fmla="*/ hd2 a 50000" />
+ <gd name="sdx1" fmla="*/ iwd2 92388 100000" />
+ <gd name="sdx2" fmla="*/ iwd2 38268 100000" />
+ <gd name="sdy1" fmla="*/ ihd2 92388 100000" />
+ <gd name="sdy2" fmla="*/ ihd2 38268 100000" />
+ <gd name="sx1" fmla="+- hc 0 sdx1" />
+ <gd name="sx2" fmla="+- hc 0 sdx2" />
+ <gd name="sx3" fmla="+- hc sdx2 0" />
+ <gd name="sx4" fmla="+- hc sdx1 0" />
+ <gd name="sy1" fmla="+- vc 0 sdy1" />
+ <gd name="sy2" fmla="+- vc 0 sdy2" />
+ <gd name="sy3" fmla="+- vc sdy2 0" />
+ <gd name="sy4" fmla="+- vc sdy1 0" />
+ <gd name="yAdj" fmla="+- vc 0 ihd2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="50000">
+ <pos x="hc" y="yAdj" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x2" y="y2" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x1" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x1" y="y1" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x2" y="y1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="sx1" t="sy1" r="sx4" b="sy4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="sx1" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx4" y="sy3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx3" y="sy4" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx2" y="sy4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="sx1" y="sy3" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </star8>
+ <straightConnector1>
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path fill="none">
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ </path>
+ </pathLst>
+ </straightConnector1>
+ <stripedRightArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+
+ <gd name="adj2" fmla="val 50000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 84375 w ss" />
+
+ <gd name="a1" fmla="pin 0 adj1 100000" />
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="x4" fmla="*/ ss 5 32" />
+ <gd name="dx5" fmla="*/ ss a2 100000" />
+ <gd name="x5" fmla="+- r 0 dx5" />
+ <gd name="dy1" fmla="*/ h a1 200000" />
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="y2" fmla="+- vc dy1 0" />
+ <gd name="dx6" fmla="*/ dy1 dx5 hd2" />
+ <gd name="x6" fmla="+- r 0 dx6" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="100000">
+ <pos x="l" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="x5" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x5" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x5" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x4" t="y1" r="x6" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="ssd32" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="ssd32" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y2" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="ssd16" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="ssd8" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="ssd8" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="ssd16" y="y2" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="x4" y="y1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x5" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="vc" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x5" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </stripedRightArrow>
+ <sun>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 25000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 12500 adj 46875" />
+ <gd name="g0" fmla="+- 50000 0 a" />
+ <gd name="g1" fmla="*/ g0 30274 32768" />
+ <gd name="g2" fmla="*/ g0 12540 32768" />
+ <gd name="g3" fmla="+- g1 50000 0" />
+ <gd name="g4" fmla="+- g2 50000 0" />
+ <gd name="g5" fmla="+- 50000 0 g1" />
+ <gd name="g6" fmla="+- 50000 0 g2" />
+ <gd name="g7" fmla="*/ g0 23170 32768" />
+ <gd name="g8" fmla="+- 50000 g7 0" />
+ <gd name="g9" fmla="+- 50000 0 g7" />
+ <gd name="g10" fmla="*/ g5 3 4" />
+ <gd name="g11" fmla="*/ g6 3 4" />
+ <gd name="g12" fmla="+- g10 3662 0" />
+ <gd name="g13" fmla="+- g11 3662 0" />
+ <gd name="g14" fmla="+- g11 12500 0" />
+ <gd name="g15" fmla="+- 100000 0 g10" />
+ <gd name="g16" fmla="+- 100000 0 g12" />
+ <gd name="g17" fmla="+- 100000 0 g13" />
+ <gd name="g18" fmla="+- 100000 0 g14" />
+ <gd name="ox1" fmla="*/ w 18436 21600" />
+ <gd name="oy1" fmla="*/ h 3163 21600" />
+ <gd name="ox2" fmla="*/ w 3163 21600" />
+ <gd name="oy2" fmla="*/ h 18436 21600" />
+ <gd name="x8" fmla="*/ w g8 100000" />
+ <gd name="x9" fmla="*/ w g9 100000" />
+ <gd name="x10" fmla="*/ w g10 100000" />
+ <gd name="x12" fmla="*/ w g12 100000" />
+ <gd name="x13" fmla="*/ w g13 100000" />
+ <gd name="x14" fmla="*/ w g14 100000" />
+ <gd name="x15" fmla="*/ w g15 100000" />
+ <gd name="x16" fmla="*/ w g16 100000" />
+ <gd name="x17" fmla="*/ w g17 100000" />
+ <gd name="x18" fmla="*/ w g18 100000" />
+ <gd name="x19" fmla="*/ w a 100000" />
+ <gd name="wR" fmla="*/ w g0 100000" />
+ <gd name="hR" fmla="*/ h g0 100000" />
+ <gd name="y8" fmla="*/ h g8 100000" />
+ <gd name="y9" fmla="*/ h g9 100000" />
+ <gd name="y10" fmla="*/ h g10 100000" />
+ <gd name="y12" fmla="*/ h g12 100000" />
+ <gd name="y13" fmla="*/ h g13 100000" />
+ <gd name="y14" fmla="*/ h g14 100000" />
+ <gd name="y15" fmla="*/ h g15 100000" />
+ <gd name="y16" fmla="*/ h g16 100000" />
+ <gd name="y17" fmla="*/ h g17 100000" />
+ <gd name="y18" fmla="*/ h g18 100000" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="12500" maxX="46875">
+ <pos x="x19" y="vc" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="x9" t="y9" r="x8" b="y8" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="r" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="x15" y="y18" />
+ </lnTo>
+ <lnTo>
+ <pt x="x15" y="y14" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="ox1" y="oy1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x16" y="y13" />
+ </lnTo>
+ <lnTo>
+ <pt x="x17" y="y12" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="hc" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x18" y="y10" />
+ </lnTo>
+ <lnTo>
+ <pt x="x14" y="y10" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="ox2" y="oy1" />
+ </moveTo>
+ <lnTo>
+ <pt x="x13" y="y12" />
+ </lnTo>
+ <lnTo>
+ <pt x="x12" y="y13" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <lnTo>
+ <pt x="x10" y="y14" />
+ </lnTo>
+ <lnTo>
+ <pt x="x10" y="y18" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="ox2" y="oy2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x12" y="y17" />
+ </lnTo>
+ <lnTo>
+ <pt x="x13" y="y16" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="hc" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="x14" y="y15" />
+ </lnTo>
+ <lnTo>
+ <pt x="x18" y="y15" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="ox1" y="oy2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x17" y="y16" />
+ </lnTo>
+ <lnTo>
+ <pt x="x16" y="y17" />
+ </lnTo>
+ <close />
+ <moveTo>
+ <pt x="x19" y="vc" />
+ </moveTo>
+ <arcTo wR="wR" hR="hR" stAng="cd2" swAng="21600000" />
+ <close />
+ </path>
+ </pathLst>
+
+ </sun>
+ <swooshArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 16667" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+
+
+ <gd name="a1" fmla="pin 1 adj1 75000" />
+
+ <gd name="maxAdj2" fmla="*/ 70000 w ss" />
+
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="ad1" fmla="*/ h a1 100000" />
+ <gd name="ad2" fmla="*/ ss a2 100000" />
+
+ <gd name="xB" fmla="+- r 0 ad2" />
+ <gd name="yB" fmla="+- t ssd8 0" />
+
+ <gd name="alfa" fmla="*/ cd4 1 14" />
+
+ <gd name="dx0" fmla="tan ssd8 alfa" />
+ <gd name="xC" fmla="+- xB 0 dx0" />
+
+ <gd name="dx1" fmla="tan ad1 alfa" />
+
+ <gd name="yF" fmla="+- yB ad1 0" />
+ <gd name="xF" fmla="+- xB dx1 0" />
+
+ <gd name="xE" fmla="+- xF dx0 0" />
+ <gd name="yE" fmla="+- yF ssd8 0" />
+
+ <gd name="dy2" fmla="+- yE 0 t" />
+ <gd name="dy22" fmla="*/ dy2 1 2" />
+ <gd name="dy3" fmla="*/ h 1 20" />
+ <gd name="yD" fmla="+- t dy22 dy3" />
+
+
+ <gd name="dy4" fmla="*/ hd6 1 1" />
+ <gd name="yP1" fmla="+- hd6 dy4 0" />
+ <gd name="xP1" fmla="val wd6" />
+
+
+ <gd name="dy5" fmla="*/ hd6 1 2" />
+ <gd name="yP2" fmla="+- yF dy5 0" />
+ <gd name="xP2" fmla="val wd4" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="1" maxY="75000">
+ <pos x="xF" y="yF" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="xB" y="yB" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd4">
+ <pos x="l" y="b" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="xC" y="t" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="yD" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="xE" y="yE" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <quadBezTo>
+ <pt x="xP1" y="yP1" />
+ <pt x="xB" y="yB" />
+ </quadBezTo>
+ <lnTo>
+ <pt x="xC" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="yD" />
+ </lnTo>
+ <lnTo>
+ <pt x="xE" y="yE" />
+ </lnTo>
+ <lnTo>
+ <pt x="xF" y="yF" />
+ </lnTo>
+ <quadBezTo>
+ <pt x="xP2" y="yP2" />
+ <pt x="l" y="b" />
+ </quadBezTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </swooshArrow>
+ <teardrop>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 100000" />
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 200000" />
+ <gd name="r2" fmla="sqrt 2" />
+ <gd name="tw" fmla="*/ wd2 r2 1" />
+ <gd name="th" fmla="*/ hd2 r2 1" />
+ <gd name="sw" fmla="*/ tw a 100000" />
+ <gd name="sh" fmla="*/ th a 100000" />
+ <gd name="dx1" fmla="cos sw 2700000" />
+ <gd name="dy1" fmla="sin sh 2700000" />
+ <gd name="x1" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- vc 0 dy1" />
+ <gd name="x2" fmla="+/ hc x1 2" />
+ <gd name="y2" fmla="+/ vc y1 2" />
+ <gd name="idx" fmla="cos wd2 2700000" />
+ <gd name="idy" fmla="sin hd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="200000">
+ <pos x="x1" y="t" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="ir" y="ib" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="il" y="ib" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="il" y="it" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="x1" y="y1" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="vc" />
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />
+ <quadBezTo>
+ <pt x="x2" y="t" />
+ <pt x="x1" y="y1" />
+ </quadBezTo>
+ <quadBezTo>
+ <pt x="r" y="y2" />
+ <pt x="r" y="vc" />
+ </quadBezTo>
+ <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />
+ <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />
+ <close />
+ </path>
+ </pathLst>
+
+ </teardrop>
+ <trapezoid>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 25000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj" fmla="*/ 50000 w ss" />
+ <gd name="a" fmla="pin 0 adj maxAdj" />
+ <gd name="x1" fmla="*/ ss a 200000" />
+ <gd name="x2" fmla="*/ ss a 100000" />
+ <gd name="x3" fmla="+- r 0 x2" />
+ <gd name="x4" fmla="+- r 0 x1" />
+ <gd name="il" fmla="*/ wd3 a maxAdj" />
+ <gd name="it" fmla="*/ hd3 a maxAdj" />
+ <gd name="ir" fmla="+- r 0 il" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="maxAdj">
+ <pos x="x2" y="t" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x4" y="vc" />
+ </cxn>
+ </cxnLst>
+ <rect l="il" t="it" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </trapezoid>
+ <triangle>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 100000" />
+ <gd name="x1" fmla="*/ w a 200000" />
+ <gd name="x2" fmla="*/ w a 100000" />
+ <gd name="x3" fmla="+- x1 wd2 0" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="100000">
+ <pos x="x2" y="t" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="x2" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="l" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x2" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="r" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x3" y="vc" />
+ </cxn>
+ </cxnLst>
+ <rect l="x1" t="vc" r="x3" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </triangle>
+ <upArrowCallout>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 25000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ <gd name="adj4" fmla="val 64977" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 50000 w ss" />
+
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="maxAdj1" fmla="*/ a2 2 1" />
+
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="maxAdj3" fmla="*/ 100000 h ss" />
+
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="q2" fmla="*/ a3 ss h" />
+
+ <gd name="maxAdj4" fmla="+- 100000 0 q2" />
+
+ <gd name="a4" fmla="pin 0 adj4 maxAdj4" />
+ <gd name="dx1" fmla="*/ ss a2 100000" />
+
+ <gd name="dx2" fmla="*/ ss a1 200000" />
+
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x3" fmla="+- hc dx2 0" />
+ <gd name="x4" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="*/ ss a3 100000" />
+
+ <gd name="dy2" fmla="*/ h a4 100000" />
+
+ <gd name="y2" fmla="+- b 0 dy2" />
+ <gd name="y3" fmla="+/ y2 b 2" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">
+ <pos x="x2" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="x1" y="t" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">
+ <pos x="r" y="y1" />
+ </ahXY>
+ <ahXY gdRefY="adj4" minY="0" maxY="maxAdj4">
+ <pos x="l" y="y2" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y2" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y2" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="y2" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </upArrowCallout>
+ <upDownArrow>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+ <gd name="adj2" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 50000 h ss" />
+ <gd name="a1" fmla="pin 0 adj1 100000" />
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="y2" fmla="*/ ss a2 100000" />
+ <gd name="y3" fmla="+- b 0 y2" />
+ <gd name="dx1" fmla="*/ w a1 200000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc dx1 0" />
+ <gd name="dy1" fmla="*/ x1 y2 wd2" />
+ <gd name="y1" fmla="+- y2 0 dy1" />
+ <gd name="y4" fmla="+- y3 dy1 0" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="100000">
+ <pos x="x1" y="y3" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">
+ <pos x="l" y="y2" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y3" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x2" y="vc" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y2" />
+ </cxn>
+ </cxnLst>
+ <rect l="x1" t="y1" r="x2" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </upDownArrow>
+ <upDownArrow>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 50000" />
+ <gd name="adj2" fmla="val 50000" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 50000 h ss" />
+ <gd name="a1" fmla="pin 0 adj1 100000" />
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="y2" fmla="*/ ss a2 100000" />
+ <gd name="y3" fmla="+- b 0 y2" />
+ <gd name="dx1" fmla="*/ w a1 200000" />
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc dx1 0" />
+ <gd name="dy1" fmla="*/ x1 y2 wd2" />
+ <gd name="y1" fmla="+- y2 0 dy1" />
+ <gd name="y4" fmla="+- y3 dy1 0" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="100000">
+ <pos x="x1" y="y3" />
+ </ahXY>
+ <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">
+ <pos x="l" y="y2" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y2" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="y3" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y3" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x2" y="vc" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y2" />
+ </cxn>
+ </cxnLst>
+ <rect l="x1" t="y1" r="x2" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y2" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </upDownArrow>
+ <upDownArrowCallout>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 25000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ <gd name="adj4" fmla="val 48123" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="maxAdj2" fmla="*/ 50000 w ss" />
+
+ <gd name="a2" fmla="pin 0 adj2 maxAdj2" />
+ <gd name="maxAdj1" fmla="*/ a2 2 1" />
+
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="maxAdj3" fmla="*/ 50000 h ss" />
+
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="q2" fmla="*/ a3 ss hd2" />
+
+ <gd name="maxAdj4" fmla="+- 100000 0 q2" />
+
+ <gd name="a4" fmla="pin 0 adj4 maxAdj4" />
+ <gd name="dx1" fmla="*/ ss a2 100000" />
+
+ <gd name="dx2" fmla="*/ ss a1 200000" />
+
+ <gd name="x1" fmla="+- hc 0 dx1" />
+ <gd name="x2" fmla="+- hc 0 dx2" />
+ <gd name="x3" fmla="+- hc dx2 0" />
+ <gd name="x4" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="*/ ss a3 100000" />
+
+ <gd name="y4" fmla="+- b 0 y1" />
+
+ <gd name="dy2" fmla="*/ h a4 200000" />
+
+ <gd name="y2" fmla="+- vc 0 dy2" />
+
+ <gd name="y3" fmla="+- vc dy2 0" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">
+ <pos x="x2" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">
+ <pos x="x1" y="t" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">
+ <pos x="r" y="y1" />
+ </ahXY>
+ <ahXY gdRefY="adj4" minY="0" maxY="maxAdj4">
+ <pos x="l" y="y2" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="y2" r="r" b="y3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y2" />
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="x3" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x4" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="hc" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y3" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </upDownArrowCallout>
+ <uturnArrow>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 25000" />
+
+ <gd name="adj2" fmla="val 25000" />
+
+ <gd name="adj3" fmla="val 25000" />
+
+ <gd name="adj4" fmla="val 43750" />
+
+ <gd name="adj5" fmla="val 75000" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a2" fmla="pin 0 adj2 25000" />
+ <gd name="maxAdj1" fmla="*/ a2 2 1" />
+ <gd name="a1" fmla="pin 0 adj1 maxAdj1" />
+ <gd name="q2" fmla="*/ a1 ss h" />
+
+ <gd name="q3" fmla="+- 100000 0 q2" />
+
+ <gd name="maxAdj3" fmla="*/ q3 h ss" />
+
+ <gd name="a3" fmla="pin 0 adj3 maxAdj3" />
+ <gd name="q1" fmla="+- a3 a1 0" />
+ <gd name="minAdj5" fmla="*/ q1 ss h" />
+ <gd name="a5" fmla="pin minAdj5 adj5 100000" />
+ <gd name="th" fmla="*/ ss a1 100000" />
+
+ <gd name="aw2" fmla="*/ ss a2 100000" />
+
+ <gd name="th2" fmla="*/ th 1 2" />
+ <gd name="dh2" fmla="+- aw2 0 th2" />
+
+ <gd name="y5" fmla="*/ h a5 100000" />
+
+ <gd name="ah" fmla="*/ ss a3 100000" />
+
+ <gd name="y4" fmla="+- y5 0 ah" />
+ <gd name="x9" fmla="+- r 0 dh2" />
+
+ <gd name="bw" fmla="*/ x9 1 2" />
+ <gd name="bs" fmla="min bw y4" />
+ <gd name="maxAdj4" fmla="*/ bs 100000 ss" />
+ <gd name="a4" fmla="pin 0 adj4 maxAdj4" />
+
+
+ <gd name="bd" fmla="*/ ss a4 100000" />
+
+
+
+ <gd name="bd3" fmla="+- bd 0 th" />
+ <gd name="bd2" fmla="max bd3 0" />
+ <gd name="x3" fmla="+- th bd2 0" />
+
+ <gd name="x8" fmla="+- r 0 aw2" />
+
+ <gd name="x6" fmla="+- x8 0 aw2" />
+
+ <gd name="x7" fmla="+- x6 dh2 0" />
+
+ <gd name="x4" fmla="+- x9 0 bd" />
+
+ <gd name="x5" fmla="+- x7 0 bd2" />
+
+ <gd name="cx" fmla="+/ th x7 2" />
+
+
+
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">
+ <pos x="th" y="b" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="0" maxX="25000">
+ <pos x="x6" y="b" />
+ </ahXY>
+ <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">
+ <pos x="x6" y="y4" />
+ </ahXY>
+ <ahXY gdRefX="adj4" minX="0" maxX="maxAdj4">
+ <pos x="bd" y="t" />
+ </ahXY>
+ <ahXY gdRefY="adj5" minY="minAdj5" maxY="100000">
+ <pos x="r" y="y5" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd4">
+ <pos x="x6" y="y4" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="x8" y="y5" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="y4" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="cx" y="t" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="th2" y="b" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="b" />
+ </moveTo>
+ <lnTo>
+ <pt x="l" y="bd" />
+ </lnTo>
+ <arcTo wR="bd" hR="bd" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="x4" y="t" />
+ </lnTo>
+ <arcTo wR="bd" hR="bd" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="x9" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x8" y="y5" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x7" y="y4" />
+ </lnTo>
+ <lnTo>
+ <pt x="x7" y="x3" />
+ </lnTo>
+ <arcTo wR="bd2" hR="bd2" stAng="0" swAng="-5400000" />
+ <lnTo>
+ <pt x="x3" y="th" />
+ </lnTo>
+ <arcTo wR="bd2" hR="bd2" stAng="3cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="th" y="b" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </uturnArrow>
+ <verticalScroll>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 12500" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 25000" />
+ <gd name="ch" fmla="*/ ss a 100000" />
+
+ <gd name="ch2" fmla="*/ ch 1 2" />
+
+ <gd name="ch4" fmla="*/ ch 1 4" />
+
+
+
+
+
+ <gd name="x3" fmla="+- ch ch2 0" />
+
+ <gd name="x4" fmla="+- ch ch 0" />
+
+ <gd name="x6" fmla="+- r 0 ch" />
+
+ <gd name="x7" fmla="+- r 0 ch2" />
+
+ <gd name="x5" fmla="+- x6 0 ch2" />
+
+
+
+
+
+ <gd name="y3" fmla="+- b 0 ch" />
+
+ <gd name="y4" fmla="+- b 0 ch2" />
+
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="25000">
+ <pos x="l" y="ch" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="ch" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x6" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="ch" t="ch" r="x6" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="ch2" y="b" />
+ </moveTo>
+ <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="ch2" y="y4" />
+ </lnTo>
+ <arcTo wR="ch4" hR="ch4" stAng="cd4" swAng="-10800000" />
+ <lnTo>
+ <pt x="ch" y="y3" />
+ </lnTo>
+ <lnTo>
+ <pt x="ch" y="ch2" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="x7" y="t" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="3cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="x6" y="ch" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y4" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd4" />
+ <close />
+ <moveTo>
+ <pt x="x4" y="ch2" />
+ </moveTo>
+ <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd4" />
+ <arcTo wR="ch4" hR="ch4" stAng="cd4" swAng="cd2" />
+ <close />
+ </path>
+ <path fill="darkenLess" stroke="false" extrusionOk="false">
+
+ <moveTo>
+ <pt x="x4" y="ch2" />
+ </moveTo>
+ <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd4" />
+ <arcTo wR="ch4" hR="ch4" stAng="cd4" swAng="cd2" />
+ <close />
+ <moveTo>
+ <pt x="ch" y="y4" />
+ </moveTo>
+ <arcTo wR="ch2" hR="ch2" stAng="0" swAng="3cd4" />
+ <arcTo wR="ch4" hR="ch4" stAng="3cd4" swAng="cd2" />
+ <close />
+ </path>
+ <path fill="none" extrusionOk="false">
+
+ <moveTo>
+ <pt x="ch" y="y3" />
+ </moveTo>
+ <lnTo>
+ <pt x="ch" y="ch2" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="x7" y="t" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="3cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="x6" y="ch" />
+ </lnTo>
+ <lnTo>
+ <pt x="x6" y="y4" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="ch2" y="b" />
+ </lnTo>
+ <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="cd2" />
+ <close />
+ <moveTo>
+ <pt x="x3" y="t" />
+ </moveTo>
+ <arcTo wR="ch2" hR="ch2" stAng="3cd4" swAng="cd2" />
+ <arcTo wR="ch4" hR="ch4" stAng="cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="x4" y="ch2" />
+ </lnTo>
+ <moveTo>
+ <pt x="x6" y="ch" />
+ </moveTo>
+ <lnTo>
+ <pt x="x3" y="ch" />
+ </lnTo>
+ <moveTo>
+ <pt x="ch2" y="y3" />
+ </moveTo>
+ <arcTo wR="ch4" hR="ch4" stAng="3cd4" swAng="cd2" />
+ <lnTo>
+ <pt x="ch" y="y4" />
+ </lnTo>
+ <moveTo>
+ <pt x="ch2" y="b" />
+ </moveTo>
+ <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-5400000" />
+ <lnTo>
+ <pt x="ch" y="y3" />
+ </lnTo>
+ </path>
+ </pathLst>
+
+ </verticalScroll>
+ <wave>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 12500" />
+
+ <gd name="adj2" fmla="val 0" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 20000" />
+ <gd name="a2" fmla="pin -10000 adj2 10000" />
+ <gd name="y1" fmla="*/ h a1 100000" />
+
+ <gd name="dy2" fmla="*/ y1 10 3" />
+ <gd name="y2" fmla="+- y1 0 dy2" />
+
+ <gd name="y3" fmla="+- y1 dy2 0" />
+
+ <gd name="y4" fmla="+- b 0 y1" />
+
+ <gd name="y5" fmla="+- y4 0 dy2" />
+
+ <gd name="y6" fmla="+- y4 dy2 0" />
+
+ <gd name="dx1" fmla="*/ w a2 100000" />
+
+ <gd name="of2" fmla="*/ w a2 50000" />
+
+ <gd name="x1" fmla="abs dx1" />
+
+ <gd name="dx2" fmla="?: of2 0 of2" />
+ <gd name="x2" fmla="+- l 0 dx2" />
+
+ <gd name="dx5" fmla="?: of2 of2 0" />
+ <gd name="x5" fmla="+- r 0 dx5" />
+
+ <gd name="dx3" fmla="+/ dx2 x5 3" />
+
+ <gd name="x3" fmla="+- x2 dx3 0" />
+
+ <gd name="x4" fmla="+/ x3 x5 2" />
+
+ <gd name="x6" fmla="+- l dx5 0" />
+
+ <gd name="x10" fmla="+- r dx2 0" />
+
+ <gd name="x7" fmla="+- x6 dx3 0" />
+
+ <gd name="x8" fmla="+/ x7 x10 2" />
+
+ <gd name="x9" fmla="+- r 0 x1" />
+
+ <gd name="xAdj" fmla="+- hc dx1 0" />
+ <gd name="xAdj2" fmla="+- hc 0 dx1" />
+ <gd name="il" fmla="max x2 x6" />
+ <gd name="ir" fmla="min x5 x10" />
+ <gd name="it" fmla="*/ h a1 50000" />
+ <gd name="ib" fmla="+- b 0 it" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="20000">
+ <pos x="l" y="y1" />
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="-10000" maxX="10000">
+ <pos x="xAdj" y="b" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="cd4">
+ <pos x="xAdj2" y="y1" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="x1" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="xAdj" y="y4" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="x9" y="vc" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x2" y="y1" />
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x3" y="y2" />
+ <pt x="x4" y="y3" />
+ <pt x="x5" y="y1" />
+ </cubicBezTo>
+ <lnTo>
+ <pt x="x10" y="y4" />
+ </lnTo>
+ <cubicBezTo>
+ <pt x="x8" y="y6" />
+ <pt x="x7" y="y5" />
+ <pt x="x6" y="y4" />
+ </cubicBezTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </wave>
+ <wedgeEllipseCallout>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val -20833" />
+ <gd name="adj2" fmla="val 62500" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dxPos" fmla="*/ w adj1 100000" />
+ <gd name="dyPos" fmla="*/ h adj2 100000" />
+ <gd name="xPos" fmla="+- hc dxPos 0" />
+ <gd name="yPos" fmla="+- vc dyPos 0" />
+ <gd name="sdx" fmla="*/ dxPos h 1" />
+ <gd name="sdy" fmla="*/ dyPos w 1" />
+ <gd name="pang" fmla="at2 sdx sdy" />
+ <gd name="stAng" fmla="+- pang 660000 0" />
+ <gd name="enAng" fmla="+- pang 0 660000" />
+ <gd name="dx1" fmla="cos wd2 stAng" />
+ <gd name="dy1" fmla="sin hd2 stAng" />
+ <gd name="x1" fmla="+- hc dx1 0" />
+ <gd name="y1" fmla="+- vc dy1 0" />
+ <gd name="dx2" fmla="cos wd2 enAng" />
+ <gd name="dy2" fmla="sin hd2 enAng" />
+ <gd name="x2" fmla="+- hc dx2 0" />
+ <gd name="y2" fmla="+- vc dy2 0" />
+ <gd name="stAng1" fmla="at2 dx1 dy1" />
+ <gd name="enAng1" fmla="at2 dx2 dy2" />
+ <gd name="swAng1" fmla="+- enAng1 0 stAng1" />
+ <gd name="swAng2" fmla="+- swAng1 21600000 0" />
+ <gd name="swAng" fmla="?: swAng1 swAng1 swAng2" />
+ <gd name="idx" fmla="cos wd2 2700000" />
+ <gd name="idy" fmla="sin hd2 2700000" />
+ <gd name="il" fmla="+- hc 0 idx" />
+ <gd name="ir" fmla="+- hc idx 0" />
+ <gd name="it" fmla="+- vc 0 idy" />
+ <gd name="ib" fmla="+- vc idy 0" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647" gdRefY="adj2" minY="-2147483647" maxY="2147483647">
+ <pos x="xPos" y="yPos" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="il" y="it" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="il" y="ib" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="ir" y="ib" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="3cd4">
+ <pos x="ir" y="it" />
+ </cxn>
+ <cxn ang="pang">
+ <pos x="xPos" y="yPos" />
+ </cxn>
+ </cxnLst>
+ <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="xPos" y="yPos" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="y1" />
+ </lnTo>
+ <arcTo wR="wd2" hR="hd2" stAng="stAng1" swAng="swAng" />
+ <close />
+ </path>
+ </pathLst>
+ </wedgeEllipseCallout>
+ <wedgeRectCallout>
+
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val -20833" />
+
+ <gd name="adj2" fmla="val 62500" />
+
+ </avLst>
+
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dxPos" fmla="*/ w adj1 100000" />
+ <gd name="dyPos" fmla="*/ h adj2 100000" />
+ <gd name="xPos" fmla="+- hc dxPos 0" />
+ <gd name="yPos" fmla="+- vc dyPos 0" />
+ <gd name="dx" fmla="+- xPos 0 hc" />
+ <gd name="dy" fmla="+- yPos 0 vc" />
+ <gd name="dq" fmla="*/ dxPos h w" />
+ <gd name="ady" fmla="abs dyPos" />
+ <gd name="adq" fmla="abs dq" />
+ <gd name="dz" fmla="+- ady 0 adq" />
+ <gd name="xg1" fmla="?: dxPos 7 2" />
+ <gd name="xg2" fmla="?: dxPos 10 5" />
+ <gd name="x1" fmla="*/ w xg1 12" />
+ <gd name="x2" fmla="*/ w xg2 12" />
+ <gd name="yg1" fmla="?: dyPos 7 2" />
+ <gd name="yg2" fmla="?: dyPos 10 5" />
+ <gd name="y1" fmla="*/ h yg1 12" />
+ <gd name="y2" fmla="*/ h yg2 12" />
+ <gd name="t1" fmla="?: dxPos l xPos" />
+ <gd name="xl" fmla="?: dz l t1" />
+ <gd name="t2" fmla="?: dyPos x1 xPos" />
+ <gd name="xt" fmla="?: dz t2 x1" />
+ <gd name="t3" fmla="?: dxPos xPos r" />
+ <gd name="xr" fmla="?: dz r t3" />
+ <gd name="t4" fmla="?: dyPos xPos x1" />
+ <gd name="xb" fmla="?: dz t4 x1" />
+ <gd name="t5" fmla="?: dxPos y1 yPos" />
+ <gd name="yl" fmla="?: dz y1 t5" />
+ <gd name="t6" fmla="?: dyPos t yPos" />
+ <gd name="yt" fmla="?: dz t6 t" />
+ <gd name="t7" fmla="?: dxPos yPos y1" />
+ <gd name="yr" fmla="?: dz y1 t7" />
+ <gd name="t8" fmla="?: dyPos yPos b" />
+ <gd name="yb" fmla="?: dz t8 b" />
+ </gdLst>
+
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647" gdRefY="adj2" minY="-2147483647" maxY="2147483647">
+ <pos x="xPos" y="yPos" />
+ </ahXY>
+ </ahLst>
+
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="xPos" y="yPos" />
+ </cxn>
+ </cxnLst>
+
+ <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t" />
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="xt" y="yt" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="xr" y="yr" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="xb" y="yb" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="xl" y="yl" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y1" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+
+ </wedgeRectCallout>
+ <wedgeRoundRectCallout>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val -20833" />
+ <gd name="adj2" fmla="val 62500" />
+ <gd name="adj3" fmla="val 16667" />
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="dxPos" fmla="*/ w adj1 100000" />
+ <gd name="dyPos" fmla="*/ h adj2 100000" />
+ <gd name="xPos" fmla="+- hc dxPos 0" />
+ <gd name="yPos" fmla="+- vc dyPos 0" />
+ <gd name="dq" fmla="*/ dxPos h w" />
+ <gd name="ady" fmla="abs dyPos" />
+ <gd name="adq" fmla="abs dq" />
+ <gd name="dz" fmla="+- ady 0 adq" />
+ <gd name="xg1" fmla="?: dxPos 7 2" />
+ <gd name="xg2" fmla="?: dxPos 10 5" />
+ <gd name="x1" fmla="*/ w xg1 12" />
+ <gd name="x2" fmla="*/ w xg2 12" />
+ <gd name="yg1" fmla="?: dyPos 7 2" />
+ <gd name="yg2" fmla="?: dyPos 10 5" />
+ <gd name="y1" fmla="*/ h yg1 12" />
+ <gd name="y2" fmla="*/ h yg2 12" />
+ <gd name="t1" fmla="?: dxPos l xPos" />
+ <gd name="xl" fmla="?: dz l t1" />
+ <gd name="t2" fmla="?: dyPos x1 xPos" />
+ <gd name="xt" fmla="?: dz t2 x1" />
+ <gd name="t3" fmla="?: dxPos xPos r" />
+ <gd name="xr" fmla="?: dz r t3" />
+ <gd name="t4" fmla="?: dyPos xPos x1" />
+ <gd name="xb" fmla="?: dz t4 x1" />
+ <gd name="t5" fmla="?: dxPos y1 yPos" />
+ <gd name="yl" fmla="?: dz y1 t5" />
+ <gd name="t6" fmla="?: dyPos t yPos" />
+ <gd name="yt" fmla="?: dz t6 t" />
+ <gd name="t7" fmla="?: dxPos yPos y1" />
+ <gd name="yr" fmla="?: dz y1 t7" />
+ <gd name="t8" fmla="?: dyPos yPos b" />
+ <gd name="yb" fmla="?: dz t8 b" />
+ <gd name="u1" fmla="*/ ss adj3 100000" />
+ <gd name="u2" fmla="+- r 0 u1" />
+ <gd name="v2" fmla="+- b 0 u1" />
+ <gd name="il" fmla="*/ u1 29289 100000" />
+ <gd name="ir" fmla="+- r 0 il" />
+ <gd name="ib" fmla="+- b 0 il" />
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647" gdRefY="adj2" minY="-2147483647" maxY="2147483647">
+ <pos x="xPos" y="yPos" />
+ </ahXY>
+ </ahLst>
+ <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <cxn ang="3cd4">
+ <pos x="hc" y="t" />
+ </cxn>
+ <cxn ang="cd2">
+ <pos x="l" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="hc" y="b" />
+ </cxn>
+ <cxn ang="0">
+ <pos x="r" y="vc" />
+ </cxn>
+ <cxn ang="cd4">
+ <pos x="xPos" y="yPos" />
+ </cxn>
+ </cxnLst>
+ <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="u1" />
+ </moveTo>
+ <arcTo wR="u1" hR="u1" stAng="cd2" swAng="cd4" />
+ <lnTo>
+ <pt x="x1" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="xt" y="yt" />
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="t" />
+ </lnTo>
+ <lnTo>
+ <pt x="u2" y="t" />
+ </lnTo>
+ <arcTo wR="u1" hR="u1" stAng="3cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="r" y="y1" />
+ </lnTo>
+ <lnTo>
+ <pt x="xr" y="yr" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="v2" />
+ </lnTo>
+ <arcTo wR="u1" hR="u1" stAng="0" swAng="cd4" />
+ <lnTo>
+ <pt x="x2" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="xb" y="yb" />
+ </lnTo>
+ <lnTo>
+ <pt x="x1" y="b" />
+ </lnTo>
+ <lnTo>
+ <pt x="u1" y="b" />
+ </lnTo>
+ <arcTo wR="u1" hR="u1" stAng="cd4" swAng="cd4" />
+ <lnTo>
+ <pt x="l" y="y2" />
+ </lnTo>
+ <lnTo>
+ <pt x="xl" y="yl" />
+ </lnTo>
+ <lnTo>
+ <pt x="l" y="y1" />
+ </lnTo>
+ <close />
+ </path>
+ </pathLst>
+ </wedgeRoundRectCallout>
+</presetShapeDefinitons>
diff --git a/oox/source/export/presetTextWarpDefinitions.xml b/oox/source/export/presetTextWarpDefinitions.xml
new file mode 100644
index 000000000000..c701c8f82b1c
--- /dev/null
+++ b/oox/source/export/presetTextWarpDefinitions.xml
@@ -0,0 +1,1885 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<presetTextWarpDefinitions>
+ <textArchDown>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 0"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adval" fmla="pin 0 adj 21599999"/>
+ <gd name="v1" fmla="+- 10800000 0 adval"/>
+ <gd name="v2" fmla="+- 32400000 0 adval"/>
+ <gd name="nv1" fmla="+- 0 0 v1"/>
+ <gd name="stAng" fmla="?: nv1 v2 v1"/>
+ <gd name="w1" fmla="+- 5400000 0 adval"/>
+ <gd name="w2" fmla="+- 16200000 0 adval"/>
+ <gd name="d1" fmla="+- adval 0 stAng"/>
+ <gd name="d2" fmla="+- d1 0 21600000"/>
+ <gd name="v3" fmla="+- 0 0 10800000"/>
+ <gd name="c2" fmla="?: w2 d1 d2"/>
+ <gd name="c1" fmla="?: v1 d2 c2"/>
+ <gd name="c0" fmla="?: w1 d1 c1"/>
+ <gd name="swAng" fmla="?: stAng c0 v3"/>
+ <gd name="wt1" fmla="sin wd2 adj"/>
+ <gd name="ht1" fmla="cos hd2 adj"/>
+ <gd name="dx1" fmla="cat2 wd2 ht1 wt1"/>
+ <gd name="dy1" fmla="sat2 hd2 ht1 wt1"/>
+ <gd name="x1" fmla="+- hc dx1 0"/>
+ <gd name="y1" fmla="+- vc dy1 0"/>
+ <gd name="wt2" fmla="sin wd2 stAng"/>
+ <gd name="ht2" fmla="cos hd2 stAng"/>
+ <gd name="dx2" fmla="cat2 wd2 ht2 wt2"/>
+ <gd name="dy2" fmla="sat2 hd2 ht2 wt2"/>
+ <gd name="x2" fmla="+- hc dx2 0"/>
+ <gd name="y2" fmla="+- vc dy2 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefAng="adj" minAng="0" maxAng="21599999">
+ <pos x="x1" y="y1"/>
+ </ahPolar>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x2" y="y2"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="stAng" swAng="swAng"/>
+ </path>
+ </pathLst>
+ </textArchDown>
+ <textArchDownPour>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 0"/>
+ <gd name="adj2" fmla="val 25000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adval" fmla="pin 0 adj1 21599999"/>
+ <gd name="v1" fmla="+- 10800000 0 adval"/>
+ <gd name="v2" fmla="+- 32400000 0 adval"/>
+ <gd name="nv1" fmla="+- 0 0 v1"/>
+ <gd name="stAng" fmla="?: nv1 v2 v1"/>
+ <gd name="w1" fmla="+- 5400000 0 adval"/>
+ <gd name="w2" fmla="+- 16200000 0 adval"/>
+ <gd name="d1" fmla="+- adval 0 stAng"/>
+ <gd name="d2" fmla="+- d1 0 21600000"/>
+ <gd name="v3" fmla="+- 0 0 10800000"/>
+ <gd name="c2" fmla="?: w2 d1 d2"/>
+ <gd name="c1" fmla="?: v1 d2 c2"/>
+ <gd name="c0" fmla="?: w1 d1 c1"/>
+ <gd name="swAng" fmla="?: stAng c0 v3"/>
+ <gd name="wt1" fmla="sin wd2 stAng"/>
+ <gd name="ht1" fmla="cos hd2 stAng"/>
+ <gd name="dx1" fmla="cat2 wd2 ht1 wt1"/>
+ <gd name="dy1" fmla="sat2 hd2 ht1 wt1"/>
+ <gd name="x1" fmla="+- hc dx1 0"/>
+ <gd name="y1" fmla="+- vc dy1 0"/>
+ <gd name="adval2" fmla="pin 0 adj2 99000"/>
+ <gd name="ratio" fmla="*/ adval2 1 100000"/>
+ <gd name="iwd2" fmla="*/ wd2 ratio 1"/>
+ <gd name="ihd2" fmla="*/ hd2 ratio 1"/>
+ <gd name="wt2" fmla="sin iwd2 adval"/>
+ <gd name="ht2" fmla="cos ihd2 adval"/>
+ <gd name="dx2" fmla="cat2 iwd2 ht2 wt2"/>
+ <gd name="dy2" fmla="sat2 ihd2 ht2 wt2"/>
+ <gd name="x2" fmla="+- hc dx2 0"/>
+ <gd name="y2" fmla="+- vc dy2 0"/>
+ <gd name="wt3" fmla="sin iwd2 stAng"/>
+ <gd name="ht3" fmla="cos ihd2 stAng"/>
+ <gd name="dx3" fmla="cat2 iwd2 ht3 wt3"/>
+ <gd name="dy3" fmla="sat2 ihd2 ht3 wt3"/>
+ <gd name="x3" fmla="+- hc dx3 0"/>
+ <gd name="y3" fmla="+- vc dy3 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefR="adj2" minR="0" maxR="100000" gdRefAng="adj1" minAng="0" maxAng="21599999">
+ <pos x="x2" y="y2"/>
+ </ahPolar>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x3" y="y3"/>
+ </moveTo>
+ <arcTo wR="iwd2" hR="ihd2" stAng="stAng" swAng="swAng"/>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="stAng" swAng="swAng"/>
+ </path>
+ </pathLst>
+ </textArchDownPour>
+ <textArchUp>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val cd2"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adval" fmla="pin 0 adj 21599999"/>
+ <gd name="v1" fmla="+- 10800000 0 adval"/>
+ <gd name="v2" fmla="+- 32400000 0 adval"/>
+ <gd name="end" fmla="?: v1 v1 v2"/>
+ <gd name="w1" fmla="+- 5400000 0 adval"/>
+ <gd name="w2" fmla="+- 16200000 0 adval"/>
+ <gd name="d1" fmla="+- end 0 adval"/>
+ <gd name="d2" fmla="+- 21600000 d1 0"/>
+ <gd name="c2" fmla="?: w2 d1 d2"/>
+ <gd name="c1" fmla="?: v1 d2 c2"/>
+ <gd name="swAng" fmla="?: w1 d1 c1"/>
+ <gd name="wt1" fmla="sin wd2 adj"/>
+ <gd name="ht1" fmla="cos hd2 adj"/>
+ <gd name="dx1" fmla="cat2 wd2 ht1 wt1"/>
+ <gd name="dy1" fmla="sat2 hd2 ht1 wt1"/>
+ <gd name="x1" fmla="+- hc dx1 0"/>
+ <gd name="y1" fmla="+- vc dy1 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefAng="adj" minAng="0" maxAng="21599999">
+ <pos x="x1" y="y1"/>
+ </ahPolar>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="adval" swAng="swAng"/>
+ </path>
+ </pathLst>
+ </textArchUp>
+ <textArchUpPour>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val cd2"/>
+ <gd name="adj2" fmla="val 50000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adval" fmla="pin 0 adj1 21599999"/>
+ <gd name="v1" fmla="+- 10800000 0 adval"/>
+ <gd name="v2" fmla="+- 32400000 0 adval"/>
+ <gd name="end" fmla="?: v1 v1 v2"/>
+ <gd name="w1" fmla="+- 5400000 0 adval"/>
+ <gd name="w2" fmla="+- 16200000 0 adval"/>
+ <gd name="d1" fmla="+- end 0 adval"/>
+ <gd name="d2" fmla="+- 21600000 d1 0"/>
+ <gd name="c2" fmla="?: w2 d1 d2"/>
+ <gd name="c1" fmla="?: v1 d2 c2"/>
+ <gd name="swAng" fmla="?: w1 d1 c1"/>
+ <gd name="wt1" fmla="sin wd2 adval"/>
+ <gd name="ht1" fmla="cos hd2 adval"/>
+ <gd name="dx1" fmla="cat2 wd2 ht1 wt1"/>
+ <gd name="dy1" fmla="sat2 hd2 ht1 wt1"/>
+ <gd name="x1" fmla="+- hc dx1 0"/>
+ <gd name="y1" fmla="+- vc dy1 0"/>
+ <gd name="adval2" fmla="pin 0 adj2 99000"/>
+ <gd name="ratio" fmla="*/ adval2 1 100000"/>
+ <gd name="iwd2" fmla="*/ wd2 ratio 1"/>
+ <gd name="ihd2" fmla="*/ hd2 ratio 1"/>
+ <gd name="wt2" fmla="sin iwd2 adval"/>
+ <gd name="ht2" fmla="cos ihd2 adval"/>
+ <gd name="dx2" fmla="cat2 iwd2 ht2 wt2"/>
+ <gd name="dy2" fmla="sat2 ihd2 ht2 wt2"/>
+ <gd name="x2" fmla="+- hc dx2 0"/>
+ <gd name="y2" fmla="+- vc dy2 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefR="adj2" minR="0" maxR="100000" gdRefAng="adj1" minAng="0" maxAng="21599999">
+ <pos x="x2" y="y2"/>
+ </ahPolar>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="adval" swAng="swAng"/>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x2" y="y2"/>
+ </moveTo>
+ <arcTo wR="iwd2" hR="ihd2" stAng="adval" swAng="swAng"/>
+ </path>
+ </pathLst>
+ </textArchUpPour>
+ <textButton>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 10800000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adval" fmla="pin 0 adj 21599999"/>
+ <gd name="bot" fmla="+- 5400000 0 adval"/>
+ <gd name="lef" fmla="+- 10800000 0 adval"/>
+ <gd name="top" fmla="+- 16200000 0 adval"/>
+ <gd name="rig" fmla="+- 21600000 0 adval"/>
+ <gd name="c3" fmla="?: top adval 0"/>
+ <gd name="c2" fmla="?: lef 10800000 c3"/>
+ <gd name="c1" fmla="?: bot rig c2"/>
+ <gd name="stAng" fmla="?: adval c1 0"/>
+ <gd name="w1" fmla="+- 21600000 0 stAng"/>
+ <gd name="stAngB" fmla="?: stAng w1 0"/>
+ <gd name="td1" fmla="*/ bot 2 1"/>
+ <gd name="td2" fmla="*/ top 2 1"/>
+ <gd name="ntd2" fmla="+- 0 0 td2"/>
+ <gd name="w2" fmla="+- 0 0 10800000"/>
+ <gd name="c6" fmla="?: top ntd2 w2"/>
+ <gd name="c5" fmla="?: lef 10800000 c6"/>
+ <gd name="c4" fmla="?: bot td1 c5"/>
+ <gd name="v1" fmla="?: adval c4 10800000"/>
+ <gd name="swAngT" fmla="+- 0 0 v1"/>
+ <gd name="stT" fmla="?: lef stAngB stAng"/>
+ <gd name="stB" fmla="?: lef stAng stAngB"/>
+ <gd name="swT" fmla="?: lef v1 swAngT"/>
+ <gd name="swB" fmla="?: lef swAngT v1"/>
+ <gd name="wt1" fmla="sin wd2 stT"/>
+ <gd name="ht1" fmla="cos hd2 stT"/>
+ <gd name="dx1" fmla="cat2 wd2 ht1 wt1"/>
+ <gd name="dy1" fmla="sat2 hd2 ht1 wt1"/>
+ <gd name="x1" fmla="+- hc dx1 0"/>
+ <gd name="y1" fmla="+- vc dy1 0"/>
+ <gd name="wt2" fmla="sin wd2 stB"/>
+ <gd name="ht2" fmla="cos hd2 stB"/>
+ <gd name="dx2" fmla="cat2 wd2 ht2 wt2"/>
+ <gd name="dy2" fmla="sat2 hd2 ht2 wt2"/>
+ <gd name="x2" fmla="+- hc dx2 0"/>
+ <gd name="y2" fmla="+- vc dy2 0"/>
+ <gd name="wt3" fmla="sin wd2 adj"/>
+ <gd name="ht3" fmla="cos hd2 adj"/>
+ <gd name="dx3" fmla="cat2 wd2 ht3 wt3"/>
+ <gd name="dy3" fmla="sat2 hd2 ht3 wt3"/>
+ <gd name="x3" fmla="+- hc dx3 0"/>
+ <gd name="y3" fmla="+- vc dy3 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefAng="adj" minAng="0" maxAng="21599999">
+ <pos x="x3" y="y3"/>
+ </ahPolar>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="stT" swAng="swT"/>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="vc"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="vc"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x2" y="y2"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="stB" swAng="swB"/>
+ </path>
+ </pathLst>
+ </textButton>
+ <textButtonPour>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val cd2"/>
+ <gd name="adj2" fmla="val 50000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adval" fmla="pin 0 adj1 21599999"/>
+ <gd name="bot" fmla="+- 5400000 0 adval"/>
+ <gd name="lef" fmla="+- 10800000 0 adval"/>
+ <gd name="top" fmla="+- 16200000 0 adval"/>
+ <gd name="rig" fmla="+- 21600000 0 adval"/>
+ <gd name="c3" fmla="?: top adval 0"/>
+ <gd name="c2" fmla="?: lef 10800000 c3"/>
+ <gd name="c1" fmla="?: bot rig c2"/>
+ <gd name="stAng" fmla="?: adval c1 0"/>
+ <gd name="w1" fmla="+- 21600000 0 stAng"/>
+ <gd name="stAngB" fmla="?: stAng w1 0"/>
+ <gd name="td1" fmla="*/ bot 2 1"/>
+ <gd name="td2" fmla="*/ top 2 1"/>
+ <gd name="ntd2" fmla="+- 0 0 td2"/>
+ <gd name="w2" fmla="+- 0 0 10800000"/>
+ <gd name="c6" fmla="?: top ntd2 w2"/>
+ <gd name="c5" fmla="?: lef 10800000 c6"/>
+ <gd name="c4" fmla="?: bot td1 c5"/>
+ <gd name="v1" fmla="?: adval c4 10800000"/>
+ <gd name="swAngT" fmla="+- 0 0 v1"/>
+ <gd name="stT" fmla="?: lef stAngB stAng"/>
+ <gd name="stB" fmla="?: lef stAng stAngB"/>
+ <gd name="swT" fmla="?: lef v1 swAngT"/>
+ <gd name="swB" fmla="?: lef swAngT v1"/>
+ <gd name="wt1" fmla="sin wd2 stT"/>
+ <gd name="ht1" fmla="cos hd2 stT"/>
+ <gd name="dx1" fmla="cat2 wd2 ht1 wt1"/>
+ <gd name="dy1" fmla="sat2 hd2 ht1 wt1"/>
+ <gd name="x1" fmla="+- hc dx1 0"/>
+ <gd name="y1" fmla="+- vc dy1 0"/>
+ <gd name="wt6" fmla="sin wd2 stB"/>
+ <gd name="ht6" fmla="cos hd2 stB"/>
+ <gd name="dx6" fmla="cat2 wd2 ht6 wt6"/>
+ <gd name="dy6" fmla="sat2 hd2 ht6 wt6"/>
+ <gd name="x6" fmla="+- hc dx6 0"/>
+ <gd name="y6" fmla="+- vc dy6 0"/>
+ <gd name="adval2" fmla="pin 40000 adj2 99000"/>
+ <gd name="ratio" fmla="*/ adval2 1 100000"/>
+ <gd name="iwd2" fmla="*/ wd2 ratio 1"/>
+ <gd name="ihd2" fmla="*/ hd2 ratio 1"/>
+ <gd name="wt2" fmla="sin iwd2 stT"/>
+ <gd name="ht2" fmla="cos ihd2 stT"/>
+ <gd name="dx2" fmla="cat2 iwd2 ht2 wt2"/>
+ <gd name="dy2" fmla="sat2 ihd2 ht2 wt2"/>
+ <gd name="x2" fmla="+- hc dx2 0"/>
+ <gd name="y2" fmla="+- vc dy2 0"/>
+ <gd name="wt5" fmla="sin iwd2 stB"/>
+ <gd name="ht5" fmla="cos ihd2 stB"/>
+ <gd name="dx5" fmla="cat2 iwd2 ht5 wt5"/>
+ <gd name="dy5" fmla="sat2 ihd2 ht5 wt5"/>
+ <gd name="x5" fmla="+- hc dx5 0"/>
+ <gd name="y5" fmla="+- vc dy5 0"/>
+ <gd name="d1" fmla="+- hd2 0 ihd2"/>
+ <gd name="d12" fmla="*/ d1 1 2"/>
+ <gd name="yu" fmla="+- vc 0 d12"/>
+ <gd name="yd" fmla="+- vc d12 0"/>
+ <gd name="v1" fmla="*/ d12 d12 1"/>
+ <gd name="v2" fmla="*/ ihd2 ihd2 1"/>
+ <gd name="v3" fmla="*/ v1 1 v2"/>
+ <gd name="v4" fmla="+- 1 0 v3"/>
+ <gd name="v5" fmla="*/ iwd2 iwd2 1"/>
+ <gd name="v6" fmla="*/ v4 v5 1"/>
+ <gd name="v7" fmla="sqrt v6"/>
+ <gd name="xl" fmla="+- hc 0 v7"/>
+ <gd name="xr" fmla="+- hc v7 0"/>
+ <gd name="wtadj" fmla="sin iwd2 adj1"/>
+ <gd name="htadj" fmla="cos ihd2 adj1"/>
+ <gd name="dxadj" fmla="cat2 iwd2 htadj wtadj"/>
+ <gd name="dyadj" fmla="sat2 ihd2 htadj wtadj"/>
+ <gd name="xadj" fmla="+- hc dxadj 0"/>
+ <gd name="yadj" fmla="+- vc dyadj 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefR="adj2" minR="0" maxR="100000" gdRefAng="adj1" minAng="0" maxAng="21599999">
+ <pos x="xadj" y="yadj"/>
+ </ahPolar>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="stT" swAng="swT"/>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x2" y="y2"/>
+ </moveTo>
+ <arcTo wR="iwd2" hR="ihd2" stAng="stT" swAng="swT"/>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="xl" y="yu"/>
+ </moveTo>
+ <lnTo>
+ <pt x="xr" y="yu"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="xl" y="yd"/>
+ </moveTo>
+ <lnTo>
+ <pt x="xr" y="yd"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x5" y="y5"/>
+ </moveTo>
+ <arcTo wR="iwd2" hR="ihd2" stAng="stB" swAng="swB"/>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x6" y="y6"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="stB" swAng="swB"/>
+ </path>
+ </pathLst>
+ </textButtonPour>
+ <textCanDown>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 14286"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 33333"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="y0" fmla="+- t dy 0"/>
+ <gd name="y1" fmla="+- b 0 dy"/>
+ <gd name="ncd2" fmla="*/ cd2 -1 1"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="33333">
+ <pos x="hc" y="y0"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="dy" stAng="cd2" swAng="ncd2"/>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y1"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="dy" stAng="cd2" swAng="ncd2"/>
+ </path>
+ </pathLst>
+ </textCanDown>
+ <textCanUp>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 85714"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 66667 adj 100000"/>
+ <gd name="dy1" fmla="*/ a h 100000"/>
+ <gd name="dy" fmla="+- h 0 dy1"/>
+ <gd name="y0" fmla="+- t dy1 0"/>
+ <gd name="y1" fmla="+- t dy 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="66667" maxY="100000">
+ <pos x="hc" y="y0"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y1"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="dy" stAng="cd2" swAng="cd2"/>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="b"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="dy" stAng="cd2" swAng="cd2"/>
+ </path>
+ </pathLst>
+ </textCanUp>
+ <textCascadeDown>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 44444"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 28570 adj 100000"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="y1" fmla="+- t dy 0"/>
+ <gd name="dy2" fmla="+- h 0 dy"/>
+ <gd name="dy3" fmla="*/ dy2 1 4"/>
+ <gd name="y2" fmla="+- t dy3 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="28570" maxY="100000">
+ <pos x="l" y="y1"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="y2"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y1"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="b"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textCascadeDown>
+ <textCascadeUp>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 44444"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 28570 adj 100000"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="y1" fmla="+- t dy 0"/>
+ <gd name="dy2" fmla="+- h 0 dy"/>
+ <gd name="dy3" fmla="*/ dy2 1 4"/>
+ <gd name="y2" fmla="+- t dy3 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="28570" maxY="100000">
+ <pos x="r" y="y1"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y2"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="b"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="y1"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textCascadeUp>
+ <textChevron>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 25000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000"/>
+ <gd name="y" fmla="*/ a h 100000"/>
+ <gd name="y1" fmla="+- t b y"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="50000">
+ <pos x="l" y="y"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y"/>
+ </moveTo>
+ <lnTo>
+ <pt x="hc" y="t"/>
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="b"/>
+ </moveTo>
+ <lnTo>
+ <pt x="hc" y="y1"/>
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="b"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textChevron>
+ <textChevronInverted>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 75000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 50000 adj 100000"/>
+ <gd name="y" fmla="*/ a h 100000"/>
+ <gd name="y1" fmla="+- b 0 y"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="50000" maxY="100000">
+ <pos x="l" y="y"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <lnTo>
+ <pt x="hc" y="y1"/>
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="t"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y"/>
+ </moveTo>
+ <lnTo>
+ <pt x="hc" y="b"/>
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textChevronInverted>
+ <textCircle>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 10800000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adval" fmla="pin 0 adj 21599999"/>
+ <gd name="d0" fmla="+- adval 0 10800000"/>
+ <gd name="d1" fmla="+- 10800000 0 adval"/>
+ <gd name="d2" fmla="+- 21600000 0 adval"/>
+ <gd name="d3" fmla="?: d1 d1 10799999"/>
+ <gd name="d4" fmla="?: d0 d2 d3"/>
+ <gd name="swAng" fmla="*/ d4 2 1"/>
+ <gd name="wt1" fmla="sin wd2 adj"/>
+ <gd name="ht1" fmla="cos hd2 adj"/>
+ <gd name="dx1" fmla="cat2 wd2 ht1 wt1"/>
+ <gd name="dy1" fmla="sat2 hd2 ht1 wt1"/>
+ <gd name="x1" fmla="+- hc dx1 0"/>
+ <gd name="y1" fmla="+- vc dy1 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefAng="adj" minAng="0" maxAng="21599999">
+ <pos x="x1" y="y1"/>
+ </ahPolar>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="adval" swAng="swAng"/>
+ </path>
+ </pathLst>
+ </textCircle>
+ <textCirclePour>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val cd2"/>
+ <gd name="adj2" fmla="val 50000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adval" fmla="pin 0 adj1 21599999"/>
+ <gd name="d0" fmla="+- adval 0 10800000"/>
+ <gd name="d1" fmla="+- 10800000 0 adval"/>
+ <gd name="d2" fmla="+- 21600000 0 adval"/>
+ <gd name="d3" fmla="?: d1 d1 10799999"/>
+ <gd name="d4" fmla="?: d0 d2 d3"/>
+ <gd name="swAng" fmla="*/ d4 2 1"/>
+ <gd name="wt1" fmla="sin wd2 adval"/>
+ <gd name="ht1" fmla="cos hd2 adval"/>
+ <gd name="dx1" fmla="cat2 wd2 ht1 wt1"/>
+ <gd name="dy1" fmla="sat2 hd2 ht1 wt1"/>
+ <gd name="x1" fmla="+- hc dx1 0"/>
+ <gd name="y1" fmla="+- vc dy1 0"/>
+ <gd name="adval2" fmla="pin 0 adj2 99000"/>
+ <gd name="ratio" fmla="*/ adval2 1 100000"/>
+ <gd name="iwd2" fmla="*/ wd2 ratio 1"/>
+ <gd name="ihd2" fmla="*/ hd2 ratio 1"/>
+ <gd name="wt2" fmla="sin iwd2 adval"/>
+ <gd name="ht2" fmla="cos ihd2 adval"/>
+ <gd name="dx2" fmla="cat2 iwd2 ht2 wt2"/>
+ <gd name="dy2" fmla="sat2 ihd2 ht2 wt2"/>
+ <gd name="x2" fmla="+- hc dx2 0"/>
+ <gd name="y2" fmla="+- vc dy2 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahPolar gdRefR="adj2" minR="0" maxR="100000" gdRefAng="adj1" minAng="0" maxAng="21599999">
+ <pos x="x2" y="y2"/>
+ </ahPolar>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="y1"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="hd2" stAng="adval" swAng="swAng"/>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x2" y="y2"/>
+ </moveTo>
+ <arcTo wR="iwd2" hR="ihd2" stAng="adval" swAng="swAng"/>
+ </path>
+ </pathLst>
+ </textCirclePour>
+ <textCurveDown>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 45977"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 56338"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="gd1" fmla="*/ dy 3 4"/>
+ <gd name="gd2" fmla="*/ dy 5 4"/>
+ <gd name="gd3" fmla="*/ dy 3 8"/>
+ <gd name="gd4" fmla="*/ dy 1 8"/>
+ <gd name="gd5" fmla="+- h 0 gd3"/>
+ <gd name="gd6" fmla="+- gd4 h 0"/>
+ <gd name="y0" fmla="+- t dy 0"/>
+ <gd name="y1" fmla="+- t gd1 0"/>
+ <gd name="y2" fmla="+- t gd2 0"/>
+ <gd name="y3" fmla="+- t gd3 0"/>
+ <gd name="y4" fmla="+- t gd4 0"/>
+ <gd name="y5" fmla="+- t gd5 0"/>
+ <gd name="y6" fmla="+- t gd6 0"/>
+ <gd name="x1" fmla="+- l wd3 0"/>
+ <gd name="x2" fmla="+- r 0 wd3"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="56338">
+ <pos x="r" y="y0"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x1" y="y1"/>
+ <pt x="x2" y="y2"/>
+ <pt x="r" y="y0"/>
+ </cubicBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y5"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x1" y="y6"/>
+ <pt x="x2" y="y6"/>
+ <pt x="r" y="y5"/>
+ </cubicBezTo>
+ </path>
+ </pathLst>
+ </textCurveDown>
+ <textCurveUp>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 45977"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 56338"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="gd1" fmla="*/ dy 3 4"/>
+ <gd name="gd2" fmla="*/ dy 5 4"/>
+ <gd name="gd3" fmla="*/ dy 3 8"/>
+ <gd name="gd4" fmla="*/ dy 1 8"/>
+ <gd name="gd5" fmla="+- h 0 gd3"/>
+ <gd name="gd6" fmla="+- gd4 h 0"/>
+ <gd name="y0" fmla="+- t dy 0"/>
+ <gd name="y1" fmla="+- t gd1 0"/>
+ <gd name="y2" fmla="+- t gd2 0"/>
+ <gd name="y3" fmla="+- t gd3 0"/>
+ <gd name="y4" fmla="+- t gd4 0"/>
+ <gd name="y5" fmla="+- t gd5 0"/>
+ <gd name="y6" fmla="+- t gd6 0"/>
+ <gd name="x1" fmla="+- l wd3 0"/>
+ <gd name="x2" fmla="+- r 0 wd3"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="56338">
+ <pos x="l" y="y0"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y0"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x1" y="y2"/>
+ <pt x="x2" y="y1"/>
+ <pt x="r" y="t"/>
+ </cubicBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y5"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x1" y="y6"/>
+ <pt x="x2" y="y6"/>
+ <pt x="r" y="y5"/>
+ </cubicBezTo>
+ </path>
+ </pathLst>
+ </textCurveUp>
+ <textDeflate>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 18750"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 37500"/>
+ <gd name="dy" fmla="*/ a ss 100000"/>
+ <gd name="gd0" fmla="*/ dy 4 3"/>
+ <gd name="gd1" fmla="+- h 0 gd0"/>
+ <gd name="adjY" fmla="+- t dy 0"/>
+ <gd name="y0" fmla="+- t gd0 0"/>
+ <gd name="y1" fmla="+- t gd1 0"/>
+ <gd name="x0" fmla="+- l wd3 0"/>
+ <gd name="x1" fmla="+- r 0 wd3"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="37500">
+ <pos x="hc" y="adjY"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x0" y="y0"/>
+ <pt x="x1" y="y0"/>
+ <pt x="r" y="t"/>
+ </cubicBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="b"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x0" y="y1"/>
+ <pt x="x1" y="y1"/>
+ <pt x="r" y="b"/>
+ </cubicBezTo>
+ </path>
+ </pathLst>
+ </textDeflate>
+ <textDeflateBottom>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 50000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 6250 adj 100000"/>
+ <gd name="dy" fmla="*/ a ss 100000"/>
+ <gd name="dy2" fmla="+- h 0 dy"/>
+ <gd name="y1" fmla="+- t dy 0"/>
+ <gd name="cp" fmla="+- y1 0 dy2"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="6250" maxY="100000">
+ <pos x="hc" y="y1"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="b"/>
+ </moveTo>
+ <quadBezTo>
+ <pt x="hc" y="cp"/>
+ <pt x="r" y="b"/>
+ </quadBezTo>
+ </path>
+ </pathLst>
+ </textDeflateBottom>
+ <textDeflateInflate>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 35000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 5000 adj 95000"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="del" fmla="*/ h 5 100"/>
+ <gd name="dh1" fmla="*/ h 45 100"/>
+ <gd name="dh2" fmla="*/ h 55 100"/>
+ <gd name="yh" fmla="+- dy 0 del"/>
+ <gd name="yl" fmla="+- dy del 0"/>
+ <gd name="y3" fmla="+- yh yh dh1"/>
+ <gd name="y4" fmla="+- yl yl dh2"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="5000" maxY="95000">
+ <pos x="hc" y="dy"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="dh1"/>
+ </moveTo>
+ <quadBezTo>
+ <pt x="hc" y="y3"/>
+ <pt x="r" y="dh1"/>
+ </quadBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="dh2"/>
+ </moveTo>
+ <quadBezTo>
+ <pt x="hc" y="y4"/>
+ <pt x="r" y="dh2"/>
+ </quadBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="b"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="b"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textDeflateInflate>
+ <textDeflateInflateDeflate>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 25000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 3000 adj 47000"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="del" fmla="*/ h 3 100"/>
+ <gd name="ey1" fmla="*/ h 30 100"/>
+ <gd name="ey2" fmla="*/ h 36 100"/>
+ <gd name="ey3" fmla="*/ h 63 100"/>
+ <gd name="ey4" fmla="*/ h 70 100"/>
+ <gd name="by" fmla="+- b 0 dy"/>
+ <gd name="yh1" fmla="+- dy 0 del"/>
+ <gd name="yl1" fmla="+- dy del 0"/>
+ <gd name="yh2" fmla="+- by 0 del"/>
+ <gd name="yl2" fmla="+- by del 0"/>
+ <gd name="y1" fmla="+- yh1 yh1 ey1"/>
+ <gd name="y2" fmla="+- yl1 yl1 ey2"/>
+ <gd name="y3" fmla="+- yh2 yh2 ey3"/>
+ <gd name="y4" fmla="+- yl2 yl2 ey4"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="3000" maxY="47000">
+ <pos x="hc" y="dy"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="ey1"/>
+ </moveTo>
+ <quadBezTo>
+ <pt x="hc" y="y1"/>
+ <pt x="r" y="ey1"/>
+ </quadBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="ey2"/>
+ </moveTo>
+ <quadBezTo>
+ <pt x="hc" y="y2"/>
+ <pt x="r" y="ey2"/>
+ </quadBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="ey3"/>
+ </moveTo>
+ <quadBezTo>
+ <pt x="hc" y="y3"/>
+ <pt x="r" y="ey3"/>
+ </quadBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="ey4"/>
+ </moveTo>
+ <quadBezTo>
+ <pt x="hc" y="y4"/>
+ <pt x="r" y="ey4"/>
+ </quadBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="b"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="b"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textDeflateInflateDeflate>
+ <textDeflateTop>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 50000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 93750"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="y1" fmla="+- t dy 0"/>
+ <gd name="cp" fmla="+- y1 dy 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="93750">
+ <pos x="hc" y="y1"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <quadBezTo>
+ <pt x="hc" y="cp"/>
+ <pt x="r" y="t"/>
+ </quadBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="b"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="b"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textDeflateTop>
+ <textDoubleWave1>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 6250"/>
+ <gd name="adj2" fmla="val 0"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 12500"/>
+ <gd name="a2" fmla="pin -10000 adj2 10000"/>
+ <gd name="y1" fmla="*/ h a1 100000"/>
+ <gd name="dy2" fmla="*/ y1 10 3"/>
+ <gd name="y2" fmla="+- y1 0 dy2"/>
+ <gd name="y3" fmla="+- y1 dy2 0"/>
+ <gd name="y4" fmla="+- b 0 y1"/>
+ <gd name="y5" fmla="+- y4 0 dy2"/>
+ <gd name="y6" fmla="+- y4 dy2 0"/>
+ <gd name="of" fmla="*/ w a2 100000"/>
+ <gd name="of2" fmla="*/ w a2 50000"/>
+ <gd name="x1" fmla="abs of"/>
+ <gd name="dx2" fmla="?: of2 0 of2"/>
+ <gd name="x2" fmla="+- l 0 dx2"/>
+ <gd name="dx8" fmla="?: of2 of2 0"/>
+ <gd name="x8" fmla="+- r 0 dx8"/>
+ <gd name="dx3" fmla="+/ dx2 x8 6"/>
+ <gd name="x3" fmla="+- x2 dx3 0"/>
+ <gd name="dx4" fmla="+/ dx2 x8 3"/>
+ <gd name="x4" fmla="+- x2 dx4 0"/>
+ <gd name="x5" fmla="+/ x2 x8 2"/>
+ <gd name="x6" fmla="+- x5 dx3 0"/>
+ <gd name="x7" fmla="+/ x6 x8 2"/>
+ <gd name="x9" fmla="+- l dx8 0"/>
+ <gd name="x15" fmla="+- r dx2 0"/>
+ <gd name="x10" fmla="+- x9 dx3 0"/>
+ <gd name="x11" fmla="+- x9 dx4 0"/>
+ <gd name="x12" fmla="+/ x9 x15 2"/>
+ <gd name="x13" fmla="+- x12 dx3 0"/>
+ <gd name="x14" fmla="+/ x13 x15 2"/>
+ <gd name="x16" fmla="+- r 0 x1"/>
+ <gd name="xAdj" fmla="+- hc of 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="12500">
+ <pos x="l" y="y1"/>
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="-10000" maxX="10000">
+ <pos x="xAdj" y="b"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x2" y="y1"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x3" y="y2"/>
+ <pt x="x4" y="y3"/>
+ <pt x="x5" y="y1"/>
+ </cubicBezTo>
+ <cubicBezTo>
+ <pt x="x6" y="y2"/>
+ <pt x="x7" y="y3"/>
+ <pt x="x8" y="y1"/>
+ </cubicBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x9" y="y4"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x10" y="y5"/>
+ <pt x="x11" y="y6"/>
+ <pt x="x12" y="y4"/>
+ </cubicBezTo>
+ <cubicBezTo>
+ <pt x="x13" y="y5"/>
+ <pt x="x14" y="y6"/>
+ <pt x="x15" y="y4"/>
+ </cubicBezTo>
+ </path>
+ </pathLst>
+ </textDoubleWave1>
+ <textFadeDown>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 33333"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 49999"/>
+ <gd name="dx" fmla="*/ a w 100000"/>
+ <gd name="x1" fmla="+- l dx 0"/>
+ <gd name="x2" fmla="+- r 0 dx"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="49999">
+ <pos x="x1" y="b"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x1" y="b"/>
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="b"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textFadeDown>
+ <textFadeLeft>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 33333"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 49999"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="y1" fmla="+- t dy 0"/>
+ <gd name="y2" fmla="+- b 0 dy"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="49999">
+ <pos x="l" y="y1"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y1"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y2"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="b"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textFadeLeft>
+ <textFadeRight>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 33333"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 49999"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="y1" fmla="+- t dy 0"/>
+ <gd name="y2" fmla="+- b 0 dy"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="49999">
+ <pos x="r" y="y1"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="y1"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="b"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="y2"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textFadeRight>
+ <textFadeUp>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 33333"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 49999"/>
+ <gd name="dx" fmla="*/ a w 100000"/>
+ <gd name="x1" fmla="+- l dx 0"/>
+ <gd name="x2" fmla="+- r 0 dx"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="0" maxX="49999">
+ <pos x="x1" y="t"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x1" y="t"/>
+ </moveTo>
+ <lnTo>
+ <pt x="x2" y="t"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="b"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="b"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textFadeUp>
+ <textInflate>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 18750"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 20000"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="gd" fmla="*/ dy 1 3"/>
+ <gd name="gd0" fmla="+- 0 0 gd"/>
+ <gd name="gd1" fmla="+- h 0 gd0"/>
+ <gd name="ty" fmla="+- t dy 0"/>
+ <gd name="by" fmla="+- b 0 dy"/>
+ <gd name="y0" fmla="+- t gd0 0"/>
+ <gd name="y1" fmla="+- t gd1 0"/>
+ <gd name="x0" fmla="+- l wd3 0"/>
+ <gd name="x1" fmla="+- r 0 wd3"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="20000">
+ <pos x="l" y="ty"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="ty"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x0" y="y0"/>
+ <pt x="x1" y="y0"/>
+ <pt x="r" y="ty"/>
+ </cubicBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="by"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x0" y="y1"/>
+ <pt x="x1" y="y1"/>
+ <pt x="r" y="by"/>
+ </cubicBezTo>
+ </path>
+ </pathLst>
+ </textInflate>
+ <textInflateBottom>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 60000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 60000 adj 100000"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="ty" fmla="+- t dy 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="60000" maxY="100000">
+ <pos x="l" y="ty"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="ty"/>
+ </moveTo>
+ <quadBezTo>
+ <pt x="hc" y="b"/>
+ <pt x="r" y="ty"/>
+ </quadBezTo>
+ </path>
+ </pathLst>
+ </textInflateBottom>
+ <textInflateTop>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 40000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 50000"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="ty" fmla="+- t dy 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="50000">
+ <pos x="l" y="ty"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="ty"/>
+ </moveTo>
+ <quadBezTo>
+ <pt x="hc" y="t"/>
+ <pt x="r" y="ty"/>
+ </quadBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="b"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="b"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textInflateTop>
+ <textPlain>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 50000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 30000 adj 70000"/>
+ <gd name="mid" fmla="*/ a w 100000"/>
+ <gd name="midDir" fmla="+- mid 0 hc"/>
+ <gd name="dl" fmla="+- mid 0 l"/>
+ <gd name="dr" fmla="+- r 0 mid"/>
+ <gd name="dl2" fmla="*/ dl 2 1"/>
+ <gd name="dr2" fmla="*/ dr 2 1"/>
+ <gd name="dx" fmla="?: midDir dr2 dl2"/>
+ <gd name="xr" fmla="+- l dx 0"/>
+ <gd name="xl" fmla="+- r 0 dx"/>
+ <gd name="tlx" fmla="?: midDir l xl"/>
+ <gd name="trx" fmla="?: midDir xr r"/>
+ <gd name="blx" fmla="?: midDir xl l"/>
+ <gd name="brx" fmla="?: midDir r xr"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefX="adj" minX="30000" maxX="70000">
+ <pos x="mid" y="b"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="tlx" y="t"/>
+ </moveTo>
+ <lnTo>
+ <pt x="trx" y="t"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="blx" y="b"/>
+ </moveTo>
+ <lnTo>
+ <pt x="brx" y="b"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textPlain>
+ <textRingInside>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 60000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 50000 adj 99000"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="y" fmla="+- t dy 0"/>
+ <gd name="r" fmla="*/ dy 1 2"/>
+ <gd name="y1" fmla="+- t r 0"/>
+ <gd name="y2" fmla="+- b 0 r"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="50000" maxY="99000">
+ <pos x="hc" y="y"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y1"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="r" stAng="10800000" swAng="21599999"/>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y2"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="r" stAng="10800000" swAng="21599999"/>
+ </path>
+ </pathLst>
+ </textRingInside>
+ <textRingOutside>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 60000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 50000 adj 99000"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="y" fmla="+- t dy 0"/>
+ <gd name="r" fmla="*/ dy 1 2"/>
+ <gd name="y1" fmla="+- t r 0"/>
+ <gd name="y2" fmla="+- b 0 r"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="50000" maxY="99000">
+ <pos x="hc" y="y"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y1"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="r" stAng="10800000" swAng="-21599999"/>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y2"/>
+ </moveTo>
+ <arcTo wR="wd2" hR="r" stAng="10800000" swAng="-21599999"/>
+ </path>
+ </pathLst>
+ </textRingOutside>
+ <textSlantDown>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 44445"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 28569 adj 100000"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="y1" fmla="+- t dy 0"/>
+ <gd name="y2" fmla="+- b 0 dy"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="28569" maxY="100000">
+ <pos x="l" y="y1"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="y2"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y1"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="b"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textSlantDown>
+ <textSlantUp>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 55555"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 71431"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="y1" fmla="+- t dy 0"/>
+ <gd name="y2" fmla="+- b 0 dy"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="71431">
+ <pos x="l" y="y1"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y1"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="b"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="y2"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textSlantUp>
+ <textStop>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 25000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 14286 adj 50000"/>
+ <gd name="dx" fmla="*/ w 1 3"/>
+ <gd name="dy" fmla="*/ a h 100000"/>
+ <gd name="x1" fmla="+- l dx 0"/>
+ <gd name="x2" fmla="+- r 0 dx"/>
+ <gd name="y1" fmla="+- t dy 0"/>
+ <gd name="y2" fmla="+- b 0 dy"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="14286" maxY="50000">
+ <pos x="l" y="dy"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y1"/>
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="t"/>
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="t"/>
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y1"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y2"/>
+ </moveTo>
+ <lnTo>
+ <pt x="x1" y="b"/>
+ </lnTo>
+ <lnTo>
+ <pt x="x2" y="b"/>
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y2"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textStop>
+ <textTriangle>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 50000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 100000"/>
+ <gd name="y" fmla="*/ a h 100000"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="100000">
+ <pos x="l" y="y"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="y"/>
+ </moveTo>
+ <lnTo>
+ <pt x="hc" y="t"/>
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="b"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="b"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textTriangle>
+ <textTriangleInverted>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj" fmla="val 50000"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a" fmla="pin 0 adj 100000"/>
+ <gd name="y" fmla="*/ a h 100000"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj" minY="0" maxY="100000">
+ <pos x="l" y="y"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="l" y="t"/>
+ </moveTo>
+ <lnTo>
+ <pt x="r" y="t"/>
+ </lnTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="l" y="y"/>
+ </moveTo>
+ <lnTo>
+ <pt x="hc" y="b"/>
+ </lnTo>
+ <lnTo>
+ <pt x="r" y="y"/>
+ </lnTo>
+ </path>
+ </pathLst>
+ </textTriangleInverted>
+ <textWave1>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 12500"/>
+ <gd name="adj2" fmla="val 0"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 20000"/>
+ <gd name="a2" fmla="pin -10000 adj2 10000"/>
+ <gd name="y1" fmla="*/ h a1 100000"/>
+ <gd name="dy2" fmla="*/ y1 10 3"/>
+ <gd name="y2" fmla="+- y1 0 dy2"/>
+ <gd name="y3" fmla="+- y1 dy2 0"/>
+ <gd name="y4" fmla="+- b 0 y1"/>
+ <gd name="y5" fmla="+- y4 0 dy2"/>
+ <gd name="y6" fmla="+- y4 dy2 0"/>
+ <gd name="of" fmla="*/ w a2 100000"/>
+ <gd name="of2" fmla="*/ w a2 50000"/>
+ <gd name="x1" fmla="abs of"/>
+ <gd name="dx2" fmla="?: of2 0 of2"/>
+ <gd name="x2" fmla="+- l 0 dx2"/>
+ <gd name="dx5" fmla="?: of2 of2 0"/>
+ <gd name="x5" fmla="+- r 0 dx5"/>
+ <gd name="dx3" fmla="+/ dx2 x5 3"/>
+ <gd name="x3" fmla="+- x2 dx3 0"/>
+ <gd name="x4" fmla="+/ x3 x5 2"/>
+ <gd name="x6" fmla="+- l dx5 0"/>
+ <gd name="x10" fmla="+- r dx2 0"/>
+ <gd name="x7" fmla="+- x6 dx3 0"/>
+ <gd name="x8" fmla="+/ x7 x10 2"/>
+ <gd name="x9" fmla="+- r 0 x1"/>
+ <gd name="xAdj" fmla="+- hc of 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="20000">
+ <pos x="l" y="y1"/>
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="-10000" maxX="10000">
+ <pos x="xAdj" y="b"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x2" y="y1"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x3" y="y2"/>
+ <pt x="x4" y="y3"/>
+ <pt x="x5" y="y1"/>
+ </cubicBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x6" y="y4"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x7" y="y5"/>
+ <pt x="x8" y="y6"/>
+ <pt x="x10" y="y4"/>
+ </cubicBezTo>
+ </path>
+ </pathLst>
+ </textWave1>
+ <textWave2>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 12500"/>
+ <gd name="adj2" fmla="val 0"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 20000"/>
+ <gd name="a2" fmla="pin -10000 adj2 10000"/>
+ <gd name="y1" fmla="*/ h a1 100000"/>
+ <gd name="dy2" fmla="*/ y1 10 3"/>
+ <gd name="y2" fmla="+- y1 0 dy2"/>
+ <gd name="y3" fmla="+- y1 dy2 0"/>
+ <gd name="y4" fmla="+- b 0 y1"/>
+ <gd name="y5" fmla="+- y4 0 dy2"/>
+ <gd name="y6" fmla="+- y4 dy2 0"/>
+ <gd name="of" fmla="*/ w a2 100000"/>
+ <gd name="of2" fmla="*/ w a2 50000"/>
+ <gd name="x1" fmla="abs of"/>
+ <gd name="dx2" fmla="?: of2 0 of2"/>
+ <gd name="x2" fmla="+- l 0 dx2"/>
+ <gd name="dx5" fmla="?: of2 of2 0"/>
+ <gd name="x5" fmla="+- r 0 dx5"/>
+ <gd name="dx3" fmla="+/ dx2 x5 3"/>
+ <gd name="x3" fmla="+- x2 dx3 0"/>
+ <gd name="x4" fmla="+/ x3 x5 2"/>
+ <gd name="x6" fmla="+- l dx5 0"/>
+ <gd name="x10" fmla="+- r dx2 0"/>
+ <gd name="x7" fmla="+- x6 dx3 0"/>
+ <gd name="x8" fmla="+/ x7 x10 2"/>
+ <gd name="x9" fmla="+- r 0 x1"/>
+ <gd name="xAdj" fmla="+- hc of 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="20000">
+ <pos x="l" y="y1"/>
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="-10000" maxX="10000">
+ <pos x="xAdj" y="b"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x2" y="y1"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x3" y="y3"/>
+ <pt x="x4" y="y2"/>
+ <pt x="x5" y="y1"/>
+ </cubicBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x6" y="y4"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x7" y="y6"/>
+ <pt x="x8" y="y5"/>
+ <pt x="x10" y="y4"/>
+ </cubicBezTo>
+ </path>
+ </pathLst>
+ </textWave2>
+ <textWave4>
+ <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="adj1" fmla="val 6250"/>
+ <gd name="adj2" fmla="val 0"/>
+ </avLst>
+ <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <gd name="a1" fmla="pin 0 adj1 12500"/>
+ <gd name="a2" fmla="pin -10000 adj2 10000"/>
+ <gd name="y1" fmla="*/ h a1 100000"/>
+ <gd name="dy2" fmla="*/ y1 10 3"/>
+ <gd name="y2" fmla="+- y1 0 dy2"/>
+ <gd name="y3" fmla="+- y1 dy2 0"/>
+ <gd name="y4" fmla="+- b 0 y1"/>
+ <gd name="y5" fmla="+- y4 0 dy2"/>
+ <gd name="y6" fmla="+- y4 dy2 0"/>
+ <gd name="of" fmla="*/ w a2 100000"/>
+ <gd name="of2" fmla="*/ w a2 50000"/>
+ <gd name="x1" fmla="abs of"/>
+ <gd name="dx2" fmla="?: of2 0 of2"/>
+ <gd name="x2" fmla="+- l 0 dx2"/>
+ <gd name="dx8" fmla="?: of2 of2 0"/>
+ <gd name="x8" fmla="+- r 0 dx8"/>
+ <gd name="dx3" fmla="+/ dx2 x8 6"/>
+ <gd name="x3" fmla="+- x2 dx3 0"/>
+ <gd name="dx4" fmla="+/ dx2 x8 3"/>
+ <gd name="x4" fmla="+- x2 dx4 0"/>
+ <gd name="x5" fmla="+/ x2 x8 2"/>
+ <gd name="x6" fmla="+- x5 dx3 0"/>
+ <gd name="x7" fmla="+/ x6 x8 2"/>
+ <gd name="x9" fmla="+- l dx8 0"/>
+ <gd name="x15" fmla="+- r dx2 0"/>
+ <gd name="x10" fmla="+- x9 dx3 0"/>
+ <gd name="x11" fmla="+- x9 dx4 0"/>
+ <gd name="x12" fmla="+/ x9 x15 2"/>
+ <gd name="x13" fmla="+- x12 dx3 0"/>
+ <gd name="x14" fmla="+/ x13 x15 2"/>
+ <gd name="x16" fmla="+- r 0 x1"/>
+ <gd name="xAdj" fmla="+- hc of 0"/>
+ </gdLst>
+ <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <ahXY gdRefY="adj1" minY="0" maxY="12500">
+ <pos x="l" y="y1"/>
+ </ahXY>
+ <ahXY gdRefX="adj2" minX="-10000" maxX="10000">
+ <pos x="xAdj" y="b"/>
+ </ahXY>
+ </ahLst>
+ <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">
+ <path>
+ <moveTo>
+ <pt x="x2" y="y1"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x3" y="y3"/>
+ <pt x="x4" y="y2"/>
+ <pt x="x5" y="y1"/>
+ </cubicBezTo>
+ <cubicBezTo>
+ <pt x="x6" y="y3"/>
+ <pt x="x7" y="y2"/>
+ <pt x="x8" y="y1"/>
+ </cubicBezTo>
+ </path>
+ <path>
+ <moveTo>
+ <pt x="x9" y="y4"/>
+ </moveTo>
+ <cubicBezTo>
+ <pt x="x10" y="y6"/>
+ <pt x="x11" y="y5"/>
+ <pt x="x12" y="y4"/>
+ </cubicBezTo>
+ <cubicBezTo>
+ <pt x="x13" y="y6"/>
+ <pt x="x14" y="y5"/>
+ <pt x="x15" y="y4"/>
+ </cubicBezTo>
+ </path>
+ </pathLst>
+ </textWave4>
+</presetTextWarpDefinitions>
diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx
new file mode 100644
index 000000000000..68c20cca6b9c
--- /dev/null
+++ b/oox/source/export/shapes.cxx
@@ -0,0 +1,998 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile$
+ * $Revision$
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "tokens.hxx"
+#include "oox/core/xmlfilterbase.hxx"
+#include "oox/export/shapes.hxx"
+#include "oox/export/utils.hxx"
+
+#include <cstdio>
+#include <com/sun/star/awt/CharSet.hpp>
+#include <com/sun/star/awt/FontDescriptor.hpp>
+#include <com/sun/star/awt/FontSlant.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
+#include <com/sun/star/awt/FontUnderline.hpp>
+#include <com/sun/star/awt/Gradient.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/beans/XPropertyState.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/drawing/BitmapMode.hpp>
+#include <com/sun/star/drawing/ConnectorType.hpp>
+#include <com/sun/star/drawing/LineDash.hpp>
+#include <com/sun/star/drawing/LineJoint.hpp>
+#include <com/sun/star/drawing/LineStyle.hpp>
+#include <com/sun/star/drawing/TextHorizontalAdjust.hpp>
+#include <com/sun/star/drawing/TextVerticalAdjust.hpp>
+#include <com/sun/star/i18n/ScriptType.hpp>
+#include <com/sun/star/io/XOutputStream.hpp>
+#include <com/sun/star/style/ParagraphAdjust.hpp>
+#include <com/sun/star/text/XSimpleText.hpp>
+#include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/text/XTextContent.hpp>
+#include <com/sun/star/text/XTextField.hpp>
+#include <com/sun/star/text/XTextRange.hpp>
+#include <tools/stream.hxx>
+#include <tools/string.hxx>
+#include <vcl/cvtgrf.hxx>
+#include <vcl/fontcvt.hxx>
+#include <vcl/graph.hxx>
+#include <vcl/outdev.hxx>
+#include <goodies/grfmgr.hxx>
+#include <rtl/strbuf.hxx>
+#include <sfx2/app.hxx>
+#include <svtools/languageoptions.hxx>
+#include <svx/escherex.hxx>
+#include <svx/svdoashp.hxx>
+#include <svx/svxenum.hxx>
+#include <svx/unoapi.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::i18n;
+using ::com::sun::star::beans::PropertyState;
+using ::com::sun::star::beans::PropertyValue;
+using ::com::sun::star::beans::XPropertySet;
+using ::com::sun::star::beans::XPropertyState;
+using ::com::sun::star::container::XEnumeration;
+using ::com::sun::star::container::XEnumerationAccess;
+using ::com::sun::star::container::XIndexAccess;
+using ::com::sun::star::drawing::FillStyle;
+using ::com::sun::star::io::XOutputStream;
+using ::com::sun::star::text::XSimpleText;
+using ::com::sun::star::text::XText;
+using ::com::sun::star::text::XTextContent;
+using ::com::sun::star::text::XTextField;
+using ::com::sun::star::text::XTextRange;
+using ::rtl::OString;
+using ::rtl::OStringBuffer;
+using ::rtl::OUString;
+using ::rtl::OUStringBuffer;
+using ::sax_fastparser::FSHelperPtr;
+
+DBG(extern void dump_pset(Reference< XPropertySet > rXPropSet));
+
+#define IDS(x) (OString(#x " ") + OString::valueOf( mnShapeIdMax++ )).getStr()
+
+struct CustomShapeTypeTranslationTable
+{
+ const char* sOOo;
+ const char* sMSO;
+};
+
+static const CustomShapeTypeTranslationTable pCustomShapeTypeTranslationTable[] =
+{
+ // { "non-primitive", mso_sptMin },
+ { "rectangle", "rect" },
+ { "round-rectangle", "roundRect" },
+ { "ellipse", "ellipse" },
+ { "diamond", "diamond" },
+ { "isosceles-triangle", "triangle" },
+ { "right-triangle", "rtTriangle" },
+ { "parallelogram", "parallelogram" },
+ { "trapezoid", "trapezoid" },
+ { "hexagon", "hexagon" },
+ { "octagon", "octagon" },
+ { "cross", "plus" },
+ { "star5", "star5" },
+ { "right-arrow", "rightArrow" },
+ // { "mso-spt14", mso_sptThickArrow },
+ { "pentagon-right", "homePlate" },
+ { "cube", "cube" },
+ // { "mso-spt17", mso_sptBalloon },
+ // { "mso-spt18", mso_sptSeal },
+ { "mso-spt19", "arc" },
+ { "mso-spt20", "line" },
+ { "mso-spt21", "plaque" },
+ { "can", "can" },
+ { "ring", "donut" },
+ { "mso-spt24", "textSimple" },
+ { "mso-spt25", "textOctagon" },
+ { "mso-spt26", "textHexagon" },
+ { "mso-spt27", "textCurve" },
+ { "mso-spt28", "textWave" },
+ { "mso-spt29", "textRing" },
+ { "mso-spt30", "textOnCurve" },
+ { "mso-spt31", "textOnRing" },
+ { "mso-spt32", "straightConnector1" },
+ { "mso-spt33", "bentConnector2" },
+ { "mso-spt34", "bentConnector3" },
+ { "mso-spt35", "bentConnector4" },
+ { "mso-spt36", "bentConnector5" },
+ { "mso-spt37", "curvedConnector2" },
+ { "mso-spt38", "curvedConnector3" },
+ { "mso-spt39", "curvedConnector4" },
+ { "mso-spt40", "curvedConnector5" },
+ { "mso-spt41", "callout1" },
+ { "mso-spt42", "callout2" },
+ { "mso-spt43", "callout3" },
+ { "mso-spt44", "accentCallout1" },
+ { "mso-spt45", "accentCallout2" },
+ { "mso-spt46", "accentCallout3" },
+ { "line-callout-1", "borderCallout1" },
+ { "line-callout-2", "borderCallout2" },
+ { "line-callout-3", "borderCallout3" },
+ { "mso-spt49", "accentBorderCallout90" },
+ { "mso-spt50", "accentBorderCallout1" },
+ { "mso-spt51", "accentBorderCallout2" },
+ { "mso-spt52", "accentBorderCallout3" },
+ { "mso-spt53", "ribbon" },
+ { "mso-spt54", "ribbon2" },
+ { "chevron", "chevron" },
+ { "pentagon", "pentagon" },
+ { "forbidden", "noSmoking" },
+ { "star8", "seal8" },
+ { "mso-spt59", "seal16" },
+ { "mso-spt60", "seal32" },
+ { "rectangular-callout", "wedgeRectCallout" },
+ { "round-rectangular-callout", "wedgeRoundRectCallout" },
+ { "round-callout", "wedgeEllipseCallout" },
+ { "mso-spt64", "wave" },
+ { "paper", "foldedCorner" },
+ { "left-arrow", "leftArrow" },
+ { "down-arrow", "downArrow" },
+ { "up-arrow", "upArrow" },
+ { "left-right-arrow", "leftRightArrow" },
+ { "up-down-arrow", "upDownArrow" },
+ { "mso-spt71", "irregularSeal1" },
+ { "bang", "irregularSeal2" },
+ { "lightning", "lightningBolt" },
+ { "heart", "heart" },
+ { "mso-spt75", "pictureFrame" },
+ { "quad-arrow", "quadArrow" },
+ { "left-arrow-callout", "leftArrowCallout" },
+ { "right-arrow-callout", "rightArrowCallout" },
+ { "up-arrow-callout", "upArrowCallout" },
+ { "down-arrow-callout", "downArrowCallout" },
+ { "left-right-arrow-callout", "leftRightArrowCallout" },
+ { "up-down-arrow-callout", "upDownArrowCallout" },
+ { "quad-arrow-callout", "quadArrowCallout" },
+ { "quad-bevel", "bevel" },
+ { "left-bracket", "leftBracket" },
+ { "right-bracket", "rightBracket" },
+ { "left-brace", "leftBrace" },
+ { "right-brace", "rightBrace" },
+ { "mso-spt89", "leftUpArrow" },
+ { "mso-spt90", "bentUpArrow" },
+ { "mso-spt91", "bentArrow" },
+ { "star24", "seal24" },
+ { "striped-right-arrow", "stripedRightArrow" },
+ { "notched-right-arrow", "notchedRightArrow" },
+ { "block-arc", "blockArc" },
+ { "smiley", "smileyFace" },
+ { "vertical-scroll", "verticalScroll" },
+ { "horizontal-scroll", "horizontalScroll" },
+ { "circular-arrow", "circularArrow" },
+ { "mso-spt100", "pie" }, // looks like MSO_SPT is wrong here
+ { "mso-spt101", "uturnArrow" },
+ { "mso-spt102", "curvedRightArrow" },
+ { "mso-spt103", "curvedLeftArrow" },
+ { "mso-spt104", "curvedUpArrow" },
+ { "mso-spt105", "curvedDownArrow" },
+ { "cloud-callout", "cloudCallout" },
+ { "mso-spt107", "ellipseRibbon" },
+ { "mso-spt108", "ellipseRibbon2" },
+ { "flowchart-process", "flowChartProcess" },
+ { "flowchart-decision", "flowChartDecision" },
+ { "flowchart-data", "flowChartInputOutput" },
+ { "flowchart-predefined-process", "flowChartPredefinedProcess" },
+ { "flowchart-internal-storage", "flowChartInternalStorage" },
+ { "flowchart-document", "flowChartDocument" },
+ { "flowchart-multidocument", "flowChartMultidocument" },
+ { "flowchart-terminator", "flowChartTerminator" },
+ { "flowchart-preparation", "flowChartPreparation" },
+ { "flowchart-manual-input", "flowChartManualInput" },
+ { "flowchart-manual-operation", "flowChartManualOperation" },
+ { "flowchart-connector", "flowChartConnector" },
+ { "flowchart-card", "flowChartPunchedCard" },
+ { "flowchart-punched-tape", "flowChartPunchedTape" },
+ { "flowchart-summing-junction", "flowChartSummingJunction" },
+ { "flowchart-or", "flowChartOr" },
+ { "flowchart-collate", "flowChartCollate" },
+ { "flowchart-sort", "flowChartSort" },
+ { "flowchart-extract", "flowChartExtract" },
+ { "flowchart-merge", "flowChartMerge" },
+ { "mso-spt129", "flowChartOfflineStorage" },
+ { "flowchart-stored-data", "flowChartOnlineStorage" },
+ { "flowchart-sequential-access", "flowChartMagneticTape" },
+ { "flowchart-magnetic-disk", "flowChartMagneticDisk" },
+ { "flowchart-direct-access-storage", "flowChartMagneticDrum" },
+ { "flowchart-display", "flowChartDisplay" },
+ { "flowchart-delay", "flowChartDelay" },
+ { "fontwork-plain-text", "textPlainText" },
+ { "fontwork-stop", "textStop" },
+ { "fontwork-triangle-up", "textTriangle" },
+ { "fontwork-triangle-down", "textTriangleInverted" },
+ { "fontwork-chevron-up", "textChevron" },
+ { "fontwork-chevron-down", "textChevronInverted" },
+ { "mso-spt142", "textRingInside" },
+ { "mso-spt143", "textRingOutside" },
+ { "fontwork-arch-up-curve", "textArchUpCurve" },
+ { "fontwork-arch-down-curve", "textArchDownCurve" },
+ { "fontwork-circle-curve", "textCircleCurve" },
+ { "fontwork-open-circle-curve", "textButtonCurve" },
+ { "fontwork-arch-up-pour", "textArchUpPour" },
+ { "fontwork-arch-down-pour", "textArchDownPour" },
+ { "fontwork-circle-pour", "textCirclePour" },
+ { "fontwork-open-circle-pour", "textButtonPour" },
+ { "fontwork-curve-up", "textCurveUp" },
+ { "fontwork-curve-down", "textCurveDown" },
+ { "fontwork-fade-up-and-right", "textCascadeUp" },
+ { "fontwork-fade-up-and-left", "textCascadeDown" },
+ { "fontwork-wave", "textWave1" },
+ { "mso-spt157", "textWave2" },
+ { "mso-spt158", "textWave3" },
+ { "mso-spt159", "textWave4" },
+ { "fontwork-inflate", "textInflate" },
+ { "mso-spt161", "textDeflate" },
+ { "mso-spt162", "textInflateBottom" },
+ { "mso-spt163", "textDeflateBottom" },
+ { "mso-spt164", "textInflateTop" },
+ { "mso-spt165", "textDeflateTop" },
+ { "mso-spt166", "textDeflateInflate" },
+ { "mso-spt167", "textDeflateInflateDeflate" },
+ { "fontwork-fade-right", "textFadeRight" },
+ { "fontwork-fade-left", "textFadeLeft" },
+ { "fontwork-fade-up", "textFadeUp" },
+ { "fontwork-fade-down", "textFadeDown" },
+ { "fontwork-slant-up", "textSlantUp" },
+ { "fontwork-slant-down", "textSlantDown" },
+ { "mso-spt174", "textCanUp" },
+ { "mso-spt175", "textCanDown" },
+ { "flowchart-alternate-process", "flowChartAlternateProcess" },
+ { "flowchart-off-page-connector", "flowChartOffpageConnector" },
+ { "mso-spt178", "callout90" },
+ { "mso-spt179", "accentCallout90" },
+ { "mso-spt180", "borderCallout90" },
+ { "mso-spt182", "leftRightUpArrow" },
+ { "sun", "sun" },
+ { "moon", "moon" },
+ { "bracket-pair", "bracketPair" },
+ { "brace-pair", "bracePair" },
+ { "star4", "seal4" },
+ { "mso-spt188", "doubleWave" },
+ { "mso-spt189", "actionButtonBlank" },
+ { "mso-spt190", "actionButtonHome" },
+ { "mso-spt191", "actionButtonHelp" },
+ { "mso-spt192", "actionButtonInformation" },
+ { "mso-spt193", "actionButtonForwardNext" },
+ { "mso-spt194", "actionButtonBackPrevious" },
+ { "mso-spt195", "actionButtonEnd" },
+ { "mso-spt196", "actionButtonBeginning" },
+ { "mso-spt197", "actionButtonReturn" },
+ { "mso-spt198", "actionButtonDocument" },
+ { "mso-spt199", "actionButtonSound" },
+ { "mso-spt200", "actionButtonMovie" },
+ { "mso-spt201", "hostControl" },
+ { "mso-spt202", "rect" }
+};
+
+struct StringCheck
+{
+ bool operator()( const char* s1, const char* s2 ) const
+ {
+ return strcmp( s1, s2 ) == 0;
+ }
+};
+
+typedef std::hash_map< const char*, const char*, std::hash<const char*>, StringCheck> CustomShapeTypeTranslationHashMap;
+static CustomShapeTypeTranslationHashMap* pCustomShapeTypeTranslationHashMap = NULL;
+
+static const char* lcl_GetPresetGeometry( const char* sShapeType )
+{
+ const char* sPresetGeo;
+
+ if( pCustomShapeTypeTranslationHashMap == NULL )
+ {
+ pCustomShapeTypeTranslationHashMap = new CustomShapeTypeTranslationHashMap ();
+ for( unsigned int i = 0; i < sizeof( pCustomShapeTypeTranslationTable )/sizeof( CustomShapeTypeTranslationTable ); i ++ )
+ {
+ (*pCustomShapeTypeTranslationHashMap)[ pCustomShapeTypeTranslationTable[ i ].sOOo ] = pCustomShapeTypeTranslationTable[ i ].sMSO;
+ //DBG(printf("type OOo: %s MSO: %s\n", pCustomShapeTypeTranslationTable[ i ].sOOo, pCustomShapeTypeTranslationTable[ i ].sMSO));
+ }
+ }
+
+ sPresetGeo = (*pCustomShapeTypeTranslationHashMap)[ sShapeType ];
+
+ if( sPresetGeo == NULL )
+ sPresetGeo = "rect";
+
+ return sPresetGeo;
+}
+
+namespace oox { namespace drawingml {
+
+#define GETA(propName) \
+ GetProperty( rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( #propName ) ) )
+
+#define GETAD(propName) \
+ ( GetPropertyAndState( rXPropSet, rXPropState, String( RTL_CONSTASCII_USTRINGPARAM( #propName ) ), eState ) && eState == beans::PropertyState_DIRECT_VALUE )
+
+#define GET(variable, propName) \
+ if ( GETA(propName) ) \
+ mAny >>= variable;
+
+ShapeExport::ShapeExport( sal_Int32 nXmlNamespace, FSHelperPtr pFS, ::oox::core::XmlFilterBase* pFB, DocumentType eDocumentType )
+ : DrawingML( pFS, pFB, eDocumentType )
+ , mnXmlNamespace( nXmlNamespace )
+ , mnShapeIdMax( 1 )
+ , mnPictureIdMax( 1 )
+ , maFraction( 1, 576 )
+ , maMapModeSrc( MAP_100TH_MM )
+ , maMapModeDest( MAP_INCH, Point(), maFraction, maFraction )
+{
+}
+
+sal_Int32 ShapeExport::GetXmlNamespace() const
+{
+ return mnXmlNamespace;
+}
+
+ShapeExport& ShapeExport::SetXmlNamespace( sal_Int32 nXmlNamespace )
+{
+ mnXmlNamespace = nXmlNamespace;
+ return *this;
+}
+
+awt::Size ShapeExport::MapSize( const awt::Size& rSize ) const
+{
+ Size aRetSize( OutputDevice::LogicToLogic( Size( rSize.Width, rSize.Height ), maMapModeSrc, maMapModeDest ) );
+
+ if ( !aRetSize.Width() )
+ aRetSize.Width()++;
+ if ( !aRetSize.Height() )
+ aRetSize.Height()++;
+ return awt::Size( aRetSize.Width(), aRetSize.Height() );
+}
+
+sal_Bool ShapeExport::NonEmptyText( Reference< XShape > xShape )
+{
+ Reference< XSimpleText > xText( xShape, UNO_QUERY );
+
+ return ( xText.is() && xText->getString().getLength() );
+}
+
+ShapeExport& ShapeExport::WriteBezierShape( Reference< XShape > xShape, sal_Bool bClosed )
+{
+ DBG(printf("write open bezier shape\n"));
+
+ FSHelperPtr pFS = GetFS();
+ pFS->startElementNS( mnXmlNamespace, XML_sp, FSEND );
+
+ PolyPolygon aPolyPolygon = EscherPropertyContainer::GetPolyPolygon( xShape );
+ Rectangle aRect( aPolyPolygon.GetBoundRect() );
+ awt::Size size = MapSize( awt::Size( aRect.GetWidth(), aRect.GetHeight() ) );
+
+ DBG(printf("poly count %d\nsize: %d x %d", aPolyPolygon.Count(), int( size.Width ), int( size.Height )));
+
+ // non visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_nvSpPr, FSEND );
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvPr,
+ XML_id, I32S( GetNewShapeID( xShape ) ),
+ XML_name, IDS( Freeform ),
+ FSEND );
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvSpPr, FSEND );
+ WriteNonVisualProperties( xShape );
+ pFS->endElementNS( mnXmlNamespace, XML_nvSpPr );
+
+ // visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_spPr, FSEND );
+ WriteTransformation( aRect );
+ WritePolyPolygon( aPolyPolygon );
+ Reference< XPropertySet > xProps( xShape, UNO_QUERY );
+ if( xProps.is() ) {
+ if( bClosed )
+ WriteFill( xProps );
+ WriteOutline( xProps );
+ }
+
+ pFS->endElementNS( mnXmlNamespace, XML_spPr );
+
+ // write text
+ WriteTextBox( xShape );
+
+ pFS->endElementNS( mnXmlNamespace, XML_sp );
+
+ return *this;
+}
+
+ShapeExport& ShapeExport::WriteClosedBezierShape( Reference< XShape > xShape )
+{
+ return WriteBezierShape( xShape, TRUE );
+}
+
+ShapeExport& ShapeExport::WriteOpenBezierShape( Reference< XShape > xShape )
+{
+ return WriteBezierShape( xShape, FALSE );
+}
+
+ShapeExport& ShapeExport::WriteCustomShape( Reference< XShape > xShape )
+{
+ DBG(printf("write custom shape\n"));
+
+ Reference< XPropertySet > rXPropSet( xShape, UNO_QUERY );
+ SdrObjCustomShape* pShape = (SdrObjCustomShape*) GetSdrObjectFromXShape( xShape );
+ sal_Bool bIsDefaultObject = EscherPropertyContainer::IsDefaultObject( pShape );
+ sal_Bool bPredefinedHandlesUsed = TRUE;
+ OUString sShapeType;
+ sal_uInt32 nMirrorFlags = 0;
+ MSO_SPT eShapeType = EscherPropertyContainer::GetCustomShapeType( xShape, nMirrorFlags, sShapeType );
+ const char* sPresetShape = lcl_GetPresetGeometry( USS( sShapeType ) );
+ DBG(printf("custom shape type: %s ==> %s\n", USS( sShapeType ), sPresetShape));
+ Sequence< PropertyValue > aGeometrySeq;
+ sal_Int32 nAdjustmentValuesIndex = -1;
+ sal_Int32 nAdjustmentsWhichNeedsToBeConverted = 0;
+
+ if( GETA( CustomShapeGeometry ) ) {
+ DBG(printf("got custom shape geometry\n"));
+ if( mAny >>= aGeometrySeq ) {
+
+ DBG(printf("got custom shape geometry sequence\n"));
+ for( int i = 0; i < aGeometrySeq.getLength(); i++ ) {
+ const PropertyValue& rProp = aGeometrySeq[ i ];
+ DBG(printf("geometry property: %s\n", USS( rProp.Name )));
+
+ if( rProp.Name.equalsAscii( "AdjustmentValues" ))
+ nAdjustmentValuesIndex = i;
+ else if( rProp.Name.equalsAscii( "Handles" )) {
+ if( !bIsDefaultObject )
+ bPredefinedHandlesUsed = FALSE;
+ // TODO: update nAdjustmentsWhichNeedsToBeConverted here
+ }
+ }
+ }
+ }
+
+ FSHelperPtr pFS = GetFS();
+ pFS->startElementNS( mnXmlNamespace, XML_sp, FSEND );
+
+ // non visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_nvSpPr, FSEND );
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvPr,
+ XML_id, I32S( GetNewShapeID( xShape ) ),
+ XML_name, IDS( CustomShape ),
+ FSEND );
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvSpPr, FSEND );
+ WriteNonVisualProperties( xShape );
+ pFS->endElementNS( mnXmlNamespace, XML_nvSpPr );
+
+ // visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_spPr, FSEND );
+ WriteShapeTransformation( xShape );
+ if( nAdjustmentValuesIndex != -1 )
+ WritePresetShape( sPresetShape, eShapeType, bPredefinedHandlesUsed, nAdjustmentsWhichNeedsToBeConverted, aGeometrySeq[ nAdjustmentValuesIndex ] );
+ else
+ WritePresetShape( sPresetShape );
+ if( rXPropSet.is() )
+ {
+ WriteFill( rXPropSet );
+ WriteOutline( rXPropSet );
+ }
+
+ pFS->endElementNS( mnXmlNamespace, XML_spPr );
+
+ // write text
+ WriteTextBox( xShape );
+
+ pFS->endElementNS( mnXmlNamespace, XML_sp );
+
+ return *this;
+}
+
+ShapeExport& ShapeExport::WriteEllipseShape( Reference< XShape > xShape )
+{
+ DBG(printf("write ellipse shape\n"));
+
+ FSHelperPtr pFS = GetFS();
+
+ pFS->startElementNS( mnXmlNamespace, XML_sp, FSEND );
+
+ // TODO: arc, section, cut, connector
+
+ // non visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_nvSpPr, FSEND );
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvPr,
+ XML_id, I32S( GetNewShapeID( xShape ) ),
+ XML_name, IDS( Ellipse ),
+ FSEND );
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvSpPr, FSEND );
+ WriteNonVisualProperties( xShape );
+ pFS->endElementNS( mnXmlNamespace, XML_nvSpPr );
+
+ // visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_spPr, FSEND );
+ WriteShapeTransformation( xShape );
+ WritePresetShape( "ellipse" );
+ Reference< XPropertySet > xProps( xShape, UNO_QUERY );
+ if( xProps.is() )
+ {
+ WriteFill( xProps );
+ WriteOutline( xProps );
+ }
+ pFS->endElementNS( mnXmlNamespace, XML_spPr );
+
+ // write text
+ WriteTextBox( xShape );
+
+ pFS->endElementNS( mnXmlNamespace, XML_sp );
+
+ return *this;
+}
+
+ShapeExport& ShapeExport::WriteFill( Reference< XPropertySet > xPropSet )
+{
+ FillStyle aFillStyle( FillStyle_NONE );
+ xPropSet->getPropertyValue( S( "FillStyle" ) ) >>= aFillStyle;
+
+ if( aFillStyle == FillStyle_BITMAP )
+ {
+ //DBG(printf ("FillStyle_BITMAP properties\n"));
+ //DBG(dump_pset(rXPropSet));
+ }
+
+ if( aFillStyle == FillStyle_NONE ||
+ aFillStyle == FillStyle_HATCH )
+ return *this;
+
+ switch( aFillStyle )
+ {
+ case ::com::sun::star::drawing::FillStyle_SOLID :
+ WriteSolidFill( xPropSet );
+ break;
+ case ::com::sun::star::drawing::FillStyle_GRADIENT :
+ WriteGradientFill( xPropSet );
+ break;
+ case ::com::sun::star::drawing::FillStyle_BITMAP :
+ WriteBlipFill( xPropSet, S( "FillBitmapURL" ) );
+ break;
+ default:
+ ;
+ }
+
+ return *this;
+}
+
+ShapeExport& ShapeExport::WriteGraphicObjectShape( Reference< XShape > xShape )
+{
+ DBG(printf("write graphic object shape\n"));
+
+ if( NonEmptyText( xShape ) )
+ {
+ WriteTextShape( xShape );
+
+ //DBG(dump_pset(mXPropSet));
+
+ return *this;
+ }
+
+ DBG(printf("graphicObject without text\n"));
+
+ OUString sGraphicURL;
+ Reference< XPropertySet > xShapeProps( xShape, UNO_QUERY );
+ if( !xShapeProps.is() || !( xShapeProps->getPropertyValue( S( "GraphicURL" ) ) >>= sGraphicURL ) )
+ {
+ DBG(printf("no graphic URL found\n"));
+ return *this;
+ }
+
+ FSHelperPtr pFS = GetFS();
+
+ pFS->startElementNS( mnXmlNamespace, XML_pic, FSEND );
+
+ pFS->startElementNS( mnXmlNamespace, XML_nvPicPr, FSEND );
+
+ OUString sName, sDescr;
+ bool bHaveName = xShapeProps->getPropertyValue( S( "Name" ) ) >>= sName;
+ bool bHaveDesc = xShapeProps->getPropertyValue( S( "Description" ) ) >>= sDescr;
+
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvPr,
+ XML_id, I32S( GetNewShapeID( xShape ) ),
+ XML_name, bHaveName ? USS( sName ) : (OString("Picture ") + OString::valueOf( mnPictureIdMax++ )).getStr(),
+ XML_descr, bHaveDesc ? USS( sDescr ) : NULL,
+ FSEND );
+ // OOXTODO: //cNvPr children: XML_extLst, XML_hlinkClick, XML_hlinkHover
+
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvPicPr,
+ // OOXTODO: XML_preferRelativeSize
+ FSEND );
+
+ WriteNonVisualProperties( xShape );
+
+ pFS->endElementNS( mnXmlNamespace, XML_nvPicPr );
+
+ pFS->startElementNS( mnXmlNamespace, XML_blipFill, FSEND );
+
+ WriteBlip( sGraphicURL );
+
+ bool bStretch = false;
+ if( ( xShapeProps->getPropertyValue( S( "FillBitmapStretch" ) ) >>= bStretch ) && bStretch )
+ {
+ WriteStretch();
+ }
+
+ pFS->endElementNS( mnXmlNamespace, XML_blipFill );
+
+ // visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_spPr, FSEND );
+ WriteShapeTransformation( xShape );
+ WritePresetShape( "rect" );
+ pFS->endElementNS( mnXmlNamespace, XML_spPr );
+
+ pFS->endElementNS( mnXmlNamespace, XML_pic );
+
+ return *this;
+}
+
+ShapeExport& ShapeExport::WriteConnectorShape( Reference< XShape > xShape )
+{
+ sal_Bool bFlipH = false;
+ sal_Bool bFlipV = false;
+
+ DBG(printf("write connector shape\n"));
+
+ FSHelperPtr pFS = GetFS();
+
+ const char* sGeometry = "line";
+ Reference< XPropertySet > rXPropSet( xShape, UNO_QUERY );
+ Reference< XPropertyState > rXPropState( xShape, UNO_QUERY );
+ awt::Point aStartPoint, aEndPoint;
+ Reference< XShape > rXShapeA;
+ Reference< XShape > rXShapeB;
+ PropertyState eState;
+ ConnectorType eConnectorType;
+ if( GETAD( EdgeKind ) ) {
+ mAny >>= eConnectorType;
+
+ switch( eConnectorType ) {
+ case ConnectorType_CURVE:
+ sGeometry = "curvedConnector3";
+ break;
+ case ConnectorType_STANDARD:
+ sGeometry = "bentConnector3";
+ break;
+ default:
+ case ConnectorType_LINE:
+ case ConnectorType_LINES:
+ sGeometry = "straightConnector1";
+ break;
+ }
+
+ if( GETAD( EdgeStartPoint ) ) {
+ mAny >>= aStartPoint;
+ if( GETAD( EdgeEndPoint ) ) {
+ mAny >>= aEndPoint;
+ }
+ }
+ GET( rXShapeA, EdgeStartConnection );
+ GET( rXShapeB, EdgeEndConnection );
+ }
+ EscherConnectorListEntry aConnectorEntry( xShape, aStartPoint, rXShapeA, aEndPoint, rXShapeB );
+
+ Rectangle aRect( Point( aStartPoint.X, aStartPoint.Y ), Point( aEndPoint.X, aEndPoint.Y ) );
+ if( aRect.getWidth() < 0 ) {
+ bFlipH = TRUE;
+ aRect.setX( aEndPoint.X );
+ aRect.setWidth( aStartPoint.X - aEndPoint.X );
+ }
+
+ if( aRect.getHeight() < 0 ) {
+ bFlipV = TRUE;
+ aRect.setY( aEndPoint.Y );
+ aRect.setHeight( aStartPoint.Y - aEndPoint.Y );
+ }
+
+ pFS->startElementNS( mnXmlNamespace, XML_cxnSp, FSEND );
+
+ // non visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_nvCxnSpPr, FSEND );
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvPr,
+ XML_id, I32S( GetNewShapeID( xShape ) ),
+ XML_name, IDS( Line ),
+ FSEND );
+ // non visual connector shape drawing properties
+ pFS->startElementNS( mnXmlNamespace, XML_cNvCxnSpPr, FSEND );
+ WriteConnectorConnections( aConnectorEntry, GetShapeID( rXShapeA ), GetShapeID( rXShapeB ) );
+ pFS->endElementNS( mnXmlNamespace, XML_cNvCxnSpPr );
+ pFS->singleElementNS( mnXmlNamespace, XML_nvPr, FSEND );
+ pFS->endElementNS( mnXmlNamespace, XML_nvCxnSpPr );
+
+ // visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_spPr, FSEND );
+ WriteTransformation( aRect, bFlipH, bFlipV );
+ // TODO: write adjustments (ppt export doesn't work well there either)
+ WritePresetShape( sGeometry );
+ Reference< XPropertySet > xShapeProps( xShape, UNO_QUERY );
+ if( xShapeProps.is() )
+ WriteOutline( xShapeProps );
+ pFS->endElementNS( mnXmlNamespace, XML_spPr );
+
+ // write text
+ WriteTextBox( xShape );
+
+ pFS->endElementNS( mnXmlNamespace, XML_cxnSp );
+
+ return *this;
+}
+
+ShapeExport& ShapeExport::WriteLineShape( Reference< XShape > xShape )
+{
+ sal_Bool bFlipH = false;
+ sal_Bool bFlipV = false;
+
+ DBG(printf("write line shape\n"));
+
+ FSHelperPtr pFS = GetFS();
+
+ pFS->startElementNS( mnXmlNamespace, XML_sp, FSEND );
+
+ PolyPolygon aPolyPolygon = EscherPropertyContainer::GetPolyPolygon( xShape );
+ if( aPolyPolygon.Count() == 1 && aPolyPolygon[ 0 ].GetSize() == 2)
+ {
+ const Polygon& rPoly = aPolyPolygon[ 0 ];
+
+ bFlipH = ( rPoly[ 0 ].X() > rPoly[ 1 ].X() );
+ bFlipV = ( rPoly[ 0 ].Y() > rPoly[ 1 ].Y() );
+ }
+
+ // non visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_nvSpPr, FSEND );
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvPr,
+ XML_id, I32S( GetNewShapeID( xShape ) ),
+ XML_name, IDS( Line ),
+ FSEND );
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvSpPr, FSEND );
+ WriteNonVisualProperties( xShape );
+ pFS->endElementNS( mnXmlNamespace, XML_nvSpPr );
+
+ // visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_spPr, FSEND );
+ WriteShapeTransformation( xShape, bFlipH, bFlipV );
+ WritePresetShape( "line" );
+ Reference< XPropertySet > xShapeProps( xShape, UNO_QUERY );
+ if( xShapeProps.is() )
+ WriteOutline( xShapeProps );
+ pFS->endElementNS( mnXmlNamespace, XML_spPr );
+
+ // write text
+ WriteTextBox( xShape );
+
+ pFS->endElementNS( mnXmlNamespace, XML_sp );
+
+ return *this;
+}
+
+ShapeExport& ShapeExport::WriteNonVisualDrawingProperties( Reference< XShape > xShape, const char* pName )
+{
+ GetFS()->singleElementNS( mnXmlNamespace, XML_cNvPr,
+ XML_id, I32S( GetNewShapeID( xShape ) ),
+ XML_name, pName,
+ FSEND );
+
+ return *this;
+}
+
+ShapeExport& ShapeExport::WriteNonVisualProperties( Reference< XShape > )
+{
+ // Override to generate //nvPr elements.
+ return *this;
+}
+
+ShapeExport& ShapeExport::WriteRectangleShape( Reference< XShape > xShape )
+{
+ DBG(printf("write rectangle shape\n"));
+
+ FSHelperPtr pFS = GetFS();
+
+ pFS->startElementNS( mnXmlNamespace, XML_sp, FSEND );
+
+ sal_Int32 nRadius = 0;
+
+ Reference< XPropertySet > xShapeProps( xShape, UNO_QUERY );
+ if( xShapeProps.is() )
+ {
+ xShapeProps->getPropertyValue( S( "CornerRadius" ) ) >>= nRadius;
+ }
+
+ if( nRadius )
+ {
+ nRadius = MapSize( awt::Size( nRadius, 0 ) ).Width;
+ }
+
+ // non visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_nvSpPr, FSEND );
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvPr,
+ XML_id, I32S( GetNewShapeID( xShape ) ),
+ XML_name, IDS( Rectangle ),
+ FSEND );
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvSpPr, FSEND );
+ WriteNonVisualProperties( xShape );
+ pFS->endElementNS( mnXmlNamespace, XML_nvSpPr );
+
+ // visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_spPr, FSEND );
+ WriteShapeTransformation( xShape );
+ WritePresetShape( "rect" );
+ Reference< XPropertySet > xProps( xShape, UNO_QUERY );
+ if( xProps.is() )
+ {
+ WriteFill( xProps );
+ WriteOutline( xProps );
+ }
+ pFS->endElementNS( mnXmlNamespace, XML_spPr );
+
+ // write text
+ WriteTextBox( xShape );
+
+ pFS->endElementNS( mnXmlNamespace, XML_sp );
+
+ return *this;
+}
+
+typedef ShapeExport& (ShapeExport::*ShapeConverter)( Reference< XShape > );
+typedef std::hash_map< const char*, ShapeConverter, std::hash<const char*>, StringCheck> NameToConvertMapType;
+
+static const NameToConvertMapType& lcl_GetConverters()
+{
+ static bool shape_map_inited = false;
+ static NameToConvertMapType shape_converters;
+ if( shape_map_inited )
+ {
+ return shape_converters;
+ }
+
+ shape_converters[ "com.sun.star.drawing.ClosedBezierShape" ] = &ShapeExport::WriteClosedBezierShape;
+ shape_converters[ "com.sun.star.drawing.ConnectorShape" ] = &ShapeExport::WriteConnectorShape;
+ shape_converters[ "com.sun.star.drawing.CustomShape" ] = &ShapeExport::WriteCustomShape;
+ shape_converters[ "com.sun.star.drawing.EllipseShape" ] = &ShapeExport::WriteEllipseShape;
+ shape_converters[ "com.sun.star.drawing.GraphicObjectShape" ] = &ShapeExport::WriteGraphicObjectShape;
+ shape_converters[ "com.sun.star.drawing.LineShape" ] = &ShapeExport::WriteLineShape;
+ shape_converters[ "com.sun.star.drawing.OpenBezierShape" ] = &ShapeExport::WriteOpenBezierShape;
+ shape_converters[ "com.sun.star.drawing.RectangleShape" ] = &ShapeExport::WriteRectangleShape;
+ shape_converters[ "com.sun.star.drawing.TextShape" ] = &ShapeExport::WriteTextShape;
+ shape_converters[ "com.sun.star.presentation.DateTimeShape" ] = &ShapeExport::WriteTextShape;
+ shape_converters[ "com.sun.star.presentation.FooterShape" ] = &ShapeExport::WriteTextShape;
+ shape_converters[ "com.sun.star.presentation.HeaderShape" ] = &ShapeExport::WriteTextShape;
+ shape_converters[ "com.sun.star.presentation.NotesShape" ] = &ShapeExport::WriteTextShape;
+ shape_converters[ "com.sun.star.presentation.OutlinerShape" ] = &ShapeExport::WriteTextShape;
+ shape_converters[ "com.sun.star.presentation.SlideNumberShape" ] = &ShapeExport::WriteTextShape;
+ shape_converters[ "com.sun.star.presentation.TitleTextShape" ] = &ShapeExport::WriteTextShape;
+ shape_map_inited = true;
+
+ return shape_converters;
+}
+
+ShapeExport& ShapeExport::WriteShape( Reference< XShape > xShape )
+{
+ OUString sShapeType = xShape->getShapeType();
+ DBG( printf( "write shape: %s\n", USS( sShapeType ) ) );
+ NameToConvertMapType::const_iterator aConverter = lcl_GetConverters().find( USS( sShapeType ) );
+ if( aConverter == lcl_GetConverters().end() )
+ {
+ DBG( printf( "unknown shape\n" ) );
+ return WriteUnknownShape( xShape );
+ }
+ (this->*(aConverter->second))( xShape );
+
+ return *this;
+}
+
+ShapeExport& ShapeExport::WriteTextBox( Reference< XShape > xShape )
+{
+ if( NonEmptyText( xShape ) )
+ {
+ FSHelperPtr pFS = GetFS();
+
+ pFS->startElementNS( mnXmlNamespace, XML_txBody, FSEND );
+ WriteText( xShape );
+ pFS->endElementNS( mnXmlNamespace, XML_txBody );
+ }
+
+ return *this;
+}
+
+ShapeExport& ShapeExport::WriteTextShape( Reference< XShape > xShape )
+{
+ FSHelperPtr pFS = GetFS();
+
+ pFS->startElementNS( mnXmlNamespace, XML_sp, FSEND );
+
+ // non visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_nvSpPr, FSEND );
+ WriteNonVisualDrawingProperties( xShape, IDS( TextShape ) );
+ pFS->singleElementNS( mnXmlNamespace, XML_cNvSpPr, XML_txBox, "1", FSEND );
+ WriteNonVisualProperties( xShape );
+ pFS->endElementNS( mnXmlNamespace, XML_nvSpPr );
+
+ // visual shape properties
+ pFS->startElementNS( mnXmlNamespace, XML_spPr, FSEND );
+ WriteShapeTransformation( xShape );
+ WritePresetShape( "rect" );
+ WriteBlipFill( Reference< XPropertySet >(xShape, UNO_QUERY ), S( "GraphicURL" ) );
+ pFS->endElementNS( mnXmlNamespace, XML_spPr );
+
+ WriteTextBox( xShape );
+
+ pFS->endElementNS( mnXmlNamespace, XML_sp );
+
+ return *this;
+}
+
+ShapeExport& ShapeExport::WriteUnknownShape( Reference< XShape > )
+{
+ // Override this method to do something useful.
+ return *this;
+}
+
+size_t ShapeExport::ShapeHash::operator()( const ::com::sun::star::uno::Reference < ::com::sun::star::drawing::XShape > rXShape ) const
+{
+ return maHashFunction( USS( rXShape->getShapeType() ) );
+}
+
+sal_Int32 ShapeExport::GetNewShapeID( const Reference< XShape > rXShape )
+{
+ sal_Int32 nID = GetFB()->GetUniqueId();
+
+ maShapeMap[ rXShape ] = nID;
+
+ return nID;
+}
+
+sal_Int32 ShapeExport::GetShapeID( const Reference< XShape > rXShape )
+{
+ ShapeHashMap::const_iterator aIter = maShapeMap.find( rXShape );
+
+ if( aIter == maShapeMap.end() )
+ return -1;
+
+ return aIter->second;
+}
+
+} }
diff --git a/oox/source/export/vmlexport.cxx b/oox/source/export/vmlexport.cxx
new file mode 100644
index 000000000000..ecc0b2a4cab2
--- /dev/null
+++ b/oox/source/export/vmlexport.cxx
@@ -0,0 +1,840 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile$
+ * $Revision$
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <oox/export/vmlexport.hxx>
+
+#include <tokens.hxx>
+
+#include <rtl/strbuf.hxx>
+#include <rtl/ustring.hxx>
+
+#include <tools/stream.hxx>
+
+#include <cstdio>
+
+using rtl::OString;
+using rtl::OStringBuffer;
+using rtl::OUString;
+using rtl::OUStringBuffer;
+
+using namespace sax_fastparser;
+using namespace oox::vml;
+
+/// Implementation of an empty stream that silently succeeds, but does nothing.
+///
+/// In fact, this is a hack. The right solution is to abstract EscherEx to be
+/// able to work without SvStream; but at the moment it is better to live with
+/// this I guess.
+class SvNullStream : public SvStream
+{
+protected:
+ virtual sal_Size GetData( void* pData, sal_Size nSize ) { memset( pData, 0, nSize ); return nSize; }
+ virtual sal_Size PutData( const void*, sal_Size nSize ) { return nSize; }
+ virtual sal_Size SeekPos( sal_Size nPos ) { return nPos; }
+ virtual void SetSize( sal_Size ) {}
+ virtual void FlushData() {}
+
+public:
+ SvNullStream() : SvStream() {}
+ virtual ~SvNullStream() {}
+};
+
+VMLExport::VMLExport( ::sax_fastparser::FSHelperPtr pSerializer )
+ : EscherEx( *( new SvNullStream ), 0 ),
+ m_pSerializer( pSerializer ),
+ m_pShapeAttrList( NULL ),
+ m_nShapeType( ESCHER_ShpInst_Nil ),
+ m_pShapeStyle( new OStringBuffer( 200 ) ),
+ m_pShapeTypeWritten( new bool[ ESCHER_ShpInst_COUNT ] )
+{
+ mnGroupLevel = 1;
+ memset( m_pShapeTypeWritten, 0, ESCHER_ShpInst_COUNT * sizeof( bool ) );
+}
+
+VMLExport::~VMLExport()
+{
+ delete mpOutStrm, mpOutStrm = NULL;
+ delete m_pShapeStyle, m_pShapeStyle = NULL;
+ delete[] m_pShapeTypeWritten, m_pShapeTypeWritten = NULL;
+}
+
+void VMLExport::OpenContainer( UINT16 nEscherContainer, int nRecInstance )
+{
+ EscherEx::OpenContainer( nEscherContainer, nRecInstance );
+
+ if ( nEscherContainer == ESCHER_SpContainer )
+ {
+ // opening a shape container
+#if OSL_DEBUG_LEVEL > 0
+ if ( m_nShapeType != ESCHER_ShpInst_Nil )
+ fprintf( stderr, "Warning! VMLExport::OpenContainer(): opening shape inside a shape.\n" );
+#endif
+ m_nShapeType = ESCHER_ShpInst_Nil;
+ m_pShapeAttrList = m_pSerializer->createAttrList();
+
+ if ( m_pShapeStyle->getLength() )
+ m_pShapeStyle->makeStringAndClear();
+
+ m_pShapeStyle->ensureCapacity( 200 );
+
+ // postpone the ouput so that we are able to write even the elements
+ // that we learn inside Commit()
+ m_pSerializer->mark();
+ }
+}
+
+void VMLExport::CloseContainer()
+{
+ if ( mRecTypes.back() == ESCHER_SpContainer )
+ {
+ // write the shape now when we have all the info
+ sal_Int32 nShapeElement = StartShape();
+
+ m_pSerializer->mergeTopMarks();
+
+ EndShape( nShapeElement );
+
+ // cleanup
+ m_nShapeType = ESCHER_ShpInst_Nil;
+ m_pShapeAttrList = NULL;
+ }
+
+ EscherEx::CloseContainer();
+}
+
+UINT32 VMLExport::EnterGroup( const String& rShapeName, const Rectangle* pRect )
+{
+ UINT32 nShapeId = GetShapeID();
+
+ OStringBuffer aStyle( 200 );
+ FastAttributeList *pAttrList = m_pSerializer->createAttrList();
+
+ pAttrList->add( XML_id, ShapeIdString( nShapeId ) );
+
+ if ( rShapeName.Len() )
+ pAttrList->add( XML_alt, OUStringToOString( OUString( rShapeName ), RTL_TEXTENCODING_UTF8 ) );
+
+ // style
+ if ( pRect )
+ AddRectangleDimensions( aStyle, *pRect );
+
+ if ( aStyle.getLength() )
+ pAttrList->add( XML_style, aStyle.makeStringAndClear() );
+
+ // coordorigin/coordsize
+ if ( pRect && ( mnGroupLevel == 1 ) )
+ {
+ pAttrList->add( XML_coordorigin,
+ OStringBuffer( 20 ).append( sal_Int32( pRect->Left() ) )
+ .append( "," ).append( sal_Int32( pRect->Top() ) )
+ .makeStringAndClear() );
+
+ pAttrList->add( XML_coordsize,
+ OStringBuffer( 20 ).append( sal_Int32( pRect->Right() ) - sal_Int32( pRect->Left() ) )
+ .append( "," ).append( sal_Int32( pRect->Bottom() ) - sal_Int32( pRect->Top() ) )
+ .makeStringAndClear() );
+ }
+
+ m_pSerializer->startElementNS( XML_v, XML_group, XFastAttributeListRef( pAttrList ) );
+
+ mnGroupLevel++;
+ return nShapeId;
+}
+
+void VMLExport::LeaveGroup()
+{
+ --mnGroupLevel;
+ m_pSerializer->endElementNS( XML_v, XML_group );
+}
+
+void VMLExport::AddShape( UINT32 nShapeType, UINT32 nShapeFlags, UINT32 nShapeId )
+{
+ m_nShapeType = nShapeType;
+ m_nShapeFlags = nShapeFlags;
+
+ m_pShapeAttrList->add( XML_id, ShapeIdString( nShapeId ) );
+}
+
+static void impl_AddArrowHead( sax_fastparser::FastAttributeList *pAttrList, sal_Int32 nElement, sal_uInt32 nValue )
+{
+ if ( !pAttrList )
+ return;
+
+ const char *pArrowHead = NULL;
+ switch ( nValue )
+ {
+ case ESCHER_LineNoEnd: pArrowHead = "none"; break;
+ case ESCHER_LineArrowEnd: pArrowHead = "block"; break;
+ case ESCHER_LineArrowStealthEnd: pArrowHead = "classic"; break;
+ case ESCHER_LineArrowDiamondEnd: pArrowHead = "diamond"; break;
+ case ESCHER_LineArrowOvalEnd: pArrowHead = "oval"; break;
+ case ESCHER_LineArrowOpenEnd: pArrowHead = "open"; break;
+ }
+
+ if ( pArrowHead )
+ pAttrList->add( nElement, pArrowHead );
+}
+
+static void impl_AddArrowLength( sax_fastparser::FastAttributeList *pAttrList, sal_Int32 nElement, sal_uInt32 nValue )
+{
+ if ( !pAttrList )
+ return;
+
+ const char *pArrowLength = NULL;
+ switch ( nValue )
+ {
+ case ESCHER_LineShortArrow: pArrowLength = "short"; break;
+ case ESCHER_LineMediumLenArrow: pArrowLength = "medium"; break;
+ case ESCHER_LineLongArrow: pArrowLength = "long"; break;
+ }
+
+ if ( pArrowLength )
+ pAttrList->add( nElement, pArrowLength );
+}
+
+static void impl_AddArrowWidth( sax_fastparser::FastAttributeList *pAttrList, sal_Int32 nElement, sal_uInt32 nValue )
+{
+ if ( !pAttrList )
+ return;
+
+ const char *pArrowWidth = NULL;
+ switch ( nValue )
+ {
+ case ESCHER_LineNarrowArrow: pArrowWidth = "narrow"; break;
+ case ESCHER_LineMediumWidthArrow: pArrowWidth = "medium"; break;
+ case ESCHER_LineWideArrow: pArrowWidth = "wide"; break;
+ }
+
+ if ( pArrowWidth )
+ pAttrList->add( nElement, pArrowWidth );
+}
+
+static void impl_AddBool( sax_fastparser::FastAttributeList *pAttrList, sal_Int32 nElement, bool bValue )
+{
+ if ( !pAttrList )
+ return;
+
+ pAttrList->add( nElement, bValue? "t": "f" );
+}
+
+static void impl_AddColor( sax_fastparser::FastAttributeList *pAttrList, sal_Int32 nElement, sal_uInt32 nColor )
+{
+#if OSL_DEBUG_LEVEL > 0
+ if ( nColor & 0xFF000000 )
+ fprintf( stderr, "TODO: this is not a RGB value!\n" );
+#endif
+
+ if ( !pAttrList || ( nColor & 0xFF000000 ) )
+ return;
+
+ nColor = ( ( nColor & 0xFF ) << 16 ) + ( nColor & 0xFF00 ) + ( ( nColor & 0xFF0000 ) >> 16 );
+
+ const char *pColor = NULL;
+ char pRgbColor[10];
+ switch ( nColor )
+ {
+ case 0x000000: pColor = "black"; break;
+ case 0xC0C0C0: pColor = "silver"; break;
+ case 0x808080: pColor = "gray"; break;
+ case 0xFFFFFF: pColor = "white"; break;
+ case 0x800000: pColor = "maroon"; break;
+ case 0xFF0000: pColor = "red"; break;
+ case 0x800080: pColor = "purple"; break;
+ case 0xFF00FF: pColor = "fuchsia"; break;
+ case 0x008000: pColor = "green"; break;
+ case 0x00FF00: pColor = "lime"; break;
+ case 0x808000: pColor = "olive"; break;
+ case 0xFFFF00: pColor = "yellow"; break;
+ case 0x000080: pColor = "navy"; break;
+ case 0x0000FF: pColor = "blue"; break;
+ case 0x008080: pColor = "teal"; break;
+ case 0x00FFFF: pColor = "aqua"; break;
+ default:
+ {
+ snprintf( pRgbColor, sizeof( pRgbColor ), "#%06x", static_cast< unsigned int >( nColor ) ); // not too handy to use OString::valueOf() here :-(
+ pColor = pRgbColor;
+ }
+ break;
+ }
+
+ pAttrList->add( nElement, pColor );
+}
+
+static void impl_AddInt( sax_fastparser::FastAttributeList *pAttrList, sal_Int32 nElement, sal_uInt32 nValue )
+{
+ if ( !pAttrList )
+ return;
+
+ pAttrList->add( nElement, OString::valueOf( static_cast< sal_Int32 >( nValue ) ).getStr() );
+}
+
+inline sal_uInt16 impl_GetUInt16( const sal_uInt8* &pVal )
+{
+ sal_uInt16 nRet = *pVal++;
+ nRet += ( *pVal++ ) << 8;
+ return nRet;
+}
+
+inline sal_Int32 impl_GetPointComponent( const sal_uInt8* &pVal, sal_uInt16 nPointSize )
+{
+ sal_Int32 nRet = 0;
+ if ( ( nPointSize == 0xfff0 ) || ( nPointSize == 4 ) )
+ {
+ sal_uInt16 nUnsigned = *pVal++;
+ nUnsigned += ( *pVal++ ) << 8;
+
+ nRet = sal_Int16( nUnsigned );
+ }
+ else if ( nPointSize == 8 )
+ {
+ sal_uInt32 nUnsigned = *pVal++;
+ nUnsigned += ( *pVal++ ) << 8;
+ nUnsigned += ( *pVal++ ) << 16;
+ nUnsigned += ( *pVal++ ) << 24;
+
+ nRet = nUnsigned;
+ }
+
+ return nRet;
+}
+
+void VMLExport::Commit( EscherPropertyContainer& rProps, const Rectangle& rRect )
+{
+ if ( m_nShapeType == ESCHER_ShpInst_Nil )
+ return;
+
+ // postpone the output of the embedded elements so that they are written
+ // inside the shapes
+ m_pSerializer->mark();
+
+ // dimensions
+ if ( m_nShapeType == ESCHER_ShpInst_Line )
+ AddLineDimensions( rRect );
+ else
+ AddRectangleDimensions( *m_pShapeStyle, rRect );
+
+ // properties
+ bool bAlreadyWritten[ 0xFFF ];
+ memset( bAlreadyWritten, 0, sizeof( bAlreadyWritten ) );
+ const EscherProperties &rOpts = rProps.GetOpts();
+ for ( EscherProperties::const_iterator it = rOpts.begin(); it != rOpts.end(); ++it )
+ {
+ sal_uInt16 nId = ( it->nPropId & 0x0FFF );
+
+ if ( bAlreadyWritten[ nId ] )
+ continue;
+
+ switch ( nId )
+ {
+ case ESCHER_Prop_WrapText: // 133
+ {
+ const char *pWrapType = NULL;
+ switch ( it->nPropValue )
+ {
+ case ESCHER_WrapSquare:
+ case ESCHER_WrapByPoints: pWrapType = "square"; break; // these two are equivalent according to the docu
+ case ESCHER_WrapNone: pWrapType = "none"; break;
+ case ESCHER_WrapTopBottom: pWrapType = "topAndBottom"; break;
+ case ESCHER_WrapThrough: pWrapType = "through"; break;
+ }
+ if ( pWrapType )
+ m_pSerializer->singleElementNS( XML_w10, XML_wrap,
+ FSNS( XML_w10, XML_type ), pWrapType,
+ FSEND );
+ }
+ bAlreadyWritten[ ESCHER_Prop_WrapText ] = true;
+ break;
+
+ // coordorigin
+ case ESCHER_Prop_geoLeft: // 320
+ case ESCHER_Prop_geoTop: // 321
+ {
+ sal_uInt32 nLeft = 0, nTop = 0;
+
+ if ( nId == ESCHER_Prop_geoLeft )
+ {
+ nLeft = it->nPropValue;
+ rProps.GetOpt( ESCHER_Prop_geoTop, nTop );
+ }
+ else
+ {
+ nTop = it->nPropValue;
+ rProps.GetOpt( ESCHER_Prop_geoLeft, nLeft );
+ }
+
+ m_pShapeAttrList->add( XML_coordorigin,
+ OStringBuffer( 20 ).append( sal_Int32( nLeft ) )
+ .append( "," ).append( sal_Int32( nTop ) )
+ .makeStringAndClear() );
+ }
+ bAlreadyWritten[ ESCHER_Prop_geoLeft ] = true;
+ bAlreadyWritten[ ESCHER_Prop_geoTop ] = true;
+ break;
+
+ // coordsize
+ case ESCHER_Prop_geoRight: // 322
+ case ESCHER_Prop_geoBottom: // 323
+ {
+ sal_uInt32 nLeft = 0, nRight = 0, nTop = 0, nBottom = 0;
+ rProps.GetOpt( ESCHER_Prop_geoLeft, nLeft );
+ rProps.GetOpt( ESCHER_Prop_geoTop, nTop );
+
+ if ( nId == ESCHER_Prop_geoRight )
+ {
+ nRight = it->nPropValue;
+ rProps.GetOpt( ESCHER_Prop_geoBottom, nBottom );
+ }
+ else
+ {
+ nBottom = it->nPropValue;
+ rProps.GetOpt( ESCHER_Prop_geoRight, nRight );
+ }
+
+ m_pShapeAttrList->add( XML_coordsize,
+ OStringBuffer( 20 ).append( sal_Int32( nRight ) - sal_Int32( nLeft ) )
+ .append( "," ).append( sal_Int32( nBottom ) - sal_Int32( nTop ) )
+ .makeStringAndClear() );
+ }
+ bAlreadyWritten[ ESCHER_Prop_geoRight ] = true;
+ bAlreadyWritten[ ESCHER_Prop_geoBottom ] = true;
+ break;
+
+ case ESCHER_Prop_pVertices: // 325
+ case ESCHER_Prop_pSegmentInfo: // 326
+ {
+ EscherPropSortStruct aVertices;
+ EscherPropSortStruct aSegments;
+
+ if ( rProps.GetOpt( ESCHER_Prop_pVertices, aVertices ) &&
+ rProps.GetOpt( ESCHER_Prop_pSegmentInfo, aSegments ) )
+ {
+ const sal_uInt8 *pVerticesIt = aVertices.pBuf + 6;
+ const sal_uInt8 *pSegmentIt = aSegments.pBuf;
+ OStringBuffer aPath( 512 );
+
+ sal_uInt16 nPointSize = aVertices.pBuf[4] + ( aVertices.pBuf[5] << 8 );
+
+ // number of segments
+ sal_uInt16 nSegments = impl_GetUInt16( pSegmentIt );
+ pSegmentIt += 4;
+
+ for ( ; nSegments; --nSegments )
+ {
+ sal_uInt16 nSeg = impl_GetUInt16( pSegmentIt );
+ switch ( nSeg )
+ {
+ case 0x4000: // moveto
+ {
+ sal_Int32 nX = impl_GetPointComponent( pVerticesIt, nPointSize );
+ sal_Int32 nY = impl_GetPointComponent( pVerticesIt, nPointSize );
+ aPath.append( "m" ).append( nX ).append( "," ).append( nY );
+ }
+ break;
+ case 0xb300:
+ case 0xac00:
+ break;
+ case 0x0001: // lineto
+ {
+ sal_Int32 nX = impl_GetPointComponent( pVerticesIt, nPointSize );
+ sal_Int32 nY = impl_GetPointComponent( pVerticesIt, nPointSize );
+ aPath.append( "l" ).append( nX ).append( "," ).append( nY );
+ }
+ break;
+ case 0x2001: // curveto
+ {
+ sal_Int32 nX1 = impl_GetPointComponent( pVerticesIt, nPointSize );
+ sal_Int32 nY1 = impl_GetPointComponent( pVerticesIt, nPointSize );
+ sal_Int32 nX2 = impl_GetPointComponent( pVerticesIt, nPointSize );
+ sal_Int32 nY2 = impl_GetPointComponent( pVerticesIt, nPointSize );
+ sal_Int32 nX3 = impl_GetPointComponent( pVerticesIt, nPointSize );
+ sal_Int32 nY3 = impl_GetPointComponent( pVerticesIt, nPointSize );
+ aPath.append( "c" ).append( nX1 ).append( "," ).append( nY1 ).append( "," )
+ .append( nX2 ).append( "," ).append( nY2 ).append( "," )
+ .append( nX3 ).append( "," ).append( nY3 );
+ }
+ break;
+ case 0xaa00: // nofill
+ aPath.append( "nf" );
+ break;
+ case 0xab00: // nostroke
+ aPath.append( "ns" );
+ break;
+ case 0x6001: // close
+ aPath.append( "x" );
+ break;
+ case 0x8000: // end
+ aPath.append( "e" );
+ break;
+ default:
+#if OSL_DEBUG_LEVEL > 0
+ fprintf( stderr, "TODO: unhandled segment '%x' in the path\n", nSeg );
+#endif
+ break;
+ }
+ }
+
+ if ( aPath.getLength() )
+ m_pShapeAttrList->add( XML_path, aPath.getStr() );
+ }
+#if OSL_DEBUG_LEVEL > 0
+ else
+ fprintf( stderr, "TODO: unhandled shape path, missing either pVertices or pSegmentInfo.\n" );
+#endif
+ }
+ bAlreadyWritten[ ESCHER_Prop_pVertices ] = true;
+ bAlreadyWritten[ ESCHER_Prop_pSegmentInfo ] = true;
+ break;
+
+ case ESCHER_Prop_fillType: // 384
+ case ESCHER_Prop_fillColor: // 385
+ case ESCHER_Prop_fillBackColor: // 387
+ case ESCHER_Prop_fNoFillHitTest: // 447
+ {
+ sal_uInt32 nValue;
+ sax_fastparser::FastAttributeList *pAttrList = m_pSerializer->createAttrList();
+
+ if ( rProps.GetOpt( ESCHER_Prop_fillType, nValue ) )
+ {
+ const char *pFillType = NULL;
+ switch ( nValue )
+ {
+ case ESCHER_FillSolid: pFillType = "solid"; break;
+ // TODO case ESCHER_FillPattern: pFillType = ""; break;
+ // TODO case ESCHER_FillTexture: pFillType = ""; break;
+ // TODO case ESCHER_FillPicture: pFillType = ""; break;
+ // TODO case ESCHER_FillShade: pFillType = ""; break;
+ // TODO case ESCHER_FillShadeCenter: pFillType = ""; break;
+ // TODO case ESCHER_FillShadeShape: pFillType = ""; break;
+ // TODO case ESCHER_FillShadeScale: pFillType = ""; break;
+ // TODO case ESCHER_FillShadeTitle: pFillType = ""; break;
+ // TODO case ESCHER_FillBackground: pFillType = ""; break;
+ default:
+#if OSL_DEBUG_LEVEL > 0
+ fprintf( stderr, "TODO: unhandled fill type\n" );
+#endif
+ break;
+ }
+ if ( pFillType )
+ pAttrList->add( XML_type, pFillType );
+ }
+
+ if ( rProps.GetOpt( ESCHER_Prop_fillColor, nValue ) )
+ impl_AddColor( pAttrList, XML_color, nValue );
+
+ if ( rProps.GetOpt( ESCHER_Prop_fillBackColor, nValue ) )
+ impl_AddColor( pAttrList, XML_color2, nValue );
+
+ if ( rProps.GetOpt( ESCHER_Prop_fNoFillHitTest, nValue ) )
+ impl_AddBool( pAttrList, XML_detectmouseclick, nValue );
+
+ m_pSerializer->singleElementNS( XML_v, XML_fill, XFastAttributeListRef( pAttrList ) );
+ }
+ bAlreadyWritten[ ESCHER_Prop_fillType ] = true;
+ bAlreadyWritten[ ESCHER_Prop_fillColor ] = true;
+ bAlreadyWritten[ ESCHER_Prop_fillBackColor ] = true;
+ bAlreadyWritten[ ESCHER_Prop_fNoFillHitTest ] = true;
+ break;
+
+ case ESCHER_Prop_lineColor: // 448
+ case ESCHER_Prop_lineWidth: // 459
+ case ESCHER_Prop_lineDashing: // 462
+ case ESCHER_Prop_lineStartArrowhead: // 464
+ case ESCHER_Prop_lineEndArrowhead: // 465
+ case ESCHER_Prop_lineStartArrowWidth: // 466
+ case ESCHER_Prop_lineStartArrowLength: // 467
+ case ESCHER_Prop_lineEndArrowWidth: // 468
+ case ESCHER_Prop_lineEndArrowLength: // 469
+ case ESCHER_Prop_lineJoinStyle: // 470
+ case ESCHER_Prop_lineEndCapStyle: // 471
+ {
+ sal_uInt32 nValue;
+ sax_fastparser::FastAttributeList *pAttrList = m_pSerializer->createAttrList();
+
+ if ( rProps.GetOpt( ESCHER_Prop_lineColor, nValue ) )
+ impl_AddColor( pAttrList, XML_color, nValue );
+
+ if ( rProps.GetOpt( ESCHER_Prop_lineWidth, nValue ) )
+ impl_AddInt( pAttrList, XML_weight, nValue );
+
+ if ( rProps.GetOpt( ESCHER_Prop_lineDashing, nValue ) )
+ {
+ const char *pDashStyle = NULL;
+ switch ( nValue )
+ {
+ case ESCHER_LineSolid: pDashStyle = "solid"; break;
+ case ESCHER_LineDashSys: pDashStyle = "shortdash"; break;
+ case ESCHER_LineDotSys: pDashStyle = "shortdot"; break;
+ case ESCHER_LineDashDotSys: pDashStyle = "shortdashdot"; break;
+ case ESCHER_LineDashDotDotSys: pDashStyle = "shortdashdotdot"; break;
+ case ESCHER_LineDotGEL: pDashStyle = "dot"; break;
+ case ESCHER_LineDashGEL: pDashStyle = "dash"; break;
+ case ESCHER_LineLongDashGEL: pDashStyle = "longdash"; break;
+ case ESCHER_LineDashDotGEL: pDashStyle = "dashdot"; break;
+ case ESCHER_LineLongDashDotGEL: pDashStyle = "longdashdot"; break;
+ case ESCHER_LineLongDashDotDotGEL: pDashStyle = "longdashdotdot"; break;
+ }
+ if ( pDashStyle )
+ pAttrList->add( XML_dashstyle, pDashStyle );
+ }
+
+ if ( rProps.GetOpt( ESCHER_Prop_lineStartArrowhead, nValue ) )
+ impl_AddArrowHead( pAttrList, XML_startarrow, nValue );
+
+ if ( rProps.GetOpt( ESCHER_Prop_lineEndArrowhead, nValue ) )
+ impl_AddArrowHead( pAttrList, XML_endarrow, nValue );
+
+ if ( rProps.GetOpt( ESCHER_Prop_lineStartArrowWidth, nValue ) )
+ impl_AddArrowWidth( pAttrList, XML_startarrowwidth, nValue );
+
+ if ( rProps.GetOpt( ESCHER_Prop_lineStartArrowLength, nValue ) )
+ impl_AddArrowLength( pAttrList, XML_startarrowlength, nValue );
+
+ if ( rProps.GetOpt( ESCHER_Prop_lineEndArrowWidth, nValue ) )
+ impl_AddArrowWidth( pAttrList, XML_endarrowwidth, nValue );
+
+ if ( rProps.GetOpt( ESCHER_Prop_lineEndArrowLength, nValue ) )
+ impl_AddArrowLength( pAttrList, XML_endarrowlength, nValue );
+
+ if ( rProps.GetOpt( ESCHER_Prop_lineJoinStyle, nValue ) )
+ {
+ const char *pJoinStyle = NULL;
+ switch ( nValue )
+ {
+ case ESCHER_LineJoinBevel: pJoinStyle = "bevel"; break;
+ case ESCHER_LineJoinMiter: pJoinStyle = "miter"; break;
+ case ESCHER_LineJoinRound: pJoinStyle = "round"; break;
+ }
+ if ( pJoinStyle )
+ pAttrList->add( XML_joinstyle, pJoinStyle );
+ }
+
+ if ( rProps.GetOpt( ESCHER_Prop_lineEndCapStyle, nValue ) )
+ {
+ const char *pEndCap = NULL;
+ switch ( nValue )
+ {
+ case ESCHER_LineEndCapRound: pEndCap = "round"; break;
+ case ESCHER_LineEndCapSquare: pEndCap = "square"; break;
+ case ESCHER_LineEndCapFlat: pEndCap = "flat"; break;
+ }
+ if ( pEndCap )
+ pAttrList->add( XML_endcap, pEndCap );
+ }
+
+ m_pSerializer->singleElementNS( XML_v, XML_stroke, XFastAttributeListRef( pAttrList ) );
+ }
+ bAlreadyWritten[ ESCHER_Prop_lineColor ] = true;
+ bAlreadyWritten[ ESCHER_Prop_lineWidth ] = true;
+ bAlreadyWritten[ ESCHER_Prop_lineDashing ] = true;
+ bAlreadyWritten[ ESCHER_Prop_lineStartArrowhead ] = true;
+ bAlreadyWritten[ ESCHER_Prop_lineEndArrowhead ] = true;
+ bAlreadyWritten[ ESCHER_Prop_lineStartArrowWidth ] = true;
+ bAlreadyWritten[ ESCHER_Prop_lineStartArrowLength ] = true;
+ bAlreadyWritten[ ESCHER_Prop_lineEndArrowWidth ] = true;
+ bAlreadyWritten[ ESCHER_Prop_lineEndArrowLength ] = true;
+ bAlreadyWritten[ ESCHER_Prop_lineJoinStyle ] = true;
+ bAlreadyWritten[ ESCHER_Prop_lineEndCapStyle ] = true;
+ break;
+
+ case ESCHER_Prop_fHidden:
+ m_pShapeStyle->append( ";visibility:hidden" );
+ break;
+ default:
+#if OSL_DEBUG_LEVEL > 0
+ fprintf( stderr, "TODO VMLExport::Commit(), unimplemented id: %d, value: %d, data: [%d, %p]\n",
+ it->nPropId, it->nPropValue, it->nPropSize, it->pBuf );
+ if ( it->nPropSize )
+ {
+ const sal_uInt8 *pIt = it->pBuf;
+ fprintf( stderr, " ( " );
+ for ( int nCount = it->nPropSize; nCount; --nCount )
+ {
+ fprintf( stderr, "%02x ", *pIt );
+ ++pIt;
+ }
+ fprintf( stderr, ")\n" );
+ }
+#endif
+ break;
+ }
+ }
+
+ m_pSerializer->mergeTopMarks( sax_fastparser::MERGE_MARKS_POSTPONE );
+}
+
+OString VMLExport::ShapeIdString( sal_uInt32 nId )
+{
+ return OStringBuffer( 20 ).append( "shape_" ).append( sal_Int64( nId ) ).makeStringAndClear();
+}
+
+void VMLExport::AddLineDimensions( const Rectangle& rRectangle )
+{
+ // style
+ if ( m_pShapeStyle->getLength() )
+ m_pShapeStyle->append( ";" );
+
+ m_pShapeStyle->append( "position:absolute" );
+
+ switch ( m_nShapeFlags & 0xC0 )
+ {
+ case 0x40: m_pShapeStyle->append( ";flip:y" ); break;
+ case 0x80: m_pShapeStyle->append( ";flip:x" ); break;
+ case 0xC0: m_pShapeStyle->append( ";flip:xy" ); break;
+ }
+
+ // the actual dimensions
+ OString aLeft, aTop, aRight, aBottom;
+
+ if ( mnGroupLevel == 1 )
+ {
+ const OString aPt( "pt" );
+ aLeft = OString::valueOf( double( rRectangle.Left() ) / 20 ) + aPt;
+ aTop = OString::valueOf( double( rRectangle.Top() ) / 20 ) + aPt;
+ aRight = OString::valueOf( double( rRectangle.Right() ) / 20 ) + aPt;
+ aBottom = OString::valueOf( double( rRectangle.Bottom() ) / 20 ) + aPt;
+ }
+ else
+ {
+ aLeft = OString::valueOf( rRectangle.Left() );
+ aTop = OString::valueOf( rRectangle.Top() );
+ aRight = OString::valueOf( rRectangle.Right() );
+ aBottom = OString::valueOf( rRectangle.Bottom() );
+ }
+
+ m_pShapeAttrList->add( XML_from,
+ OStringBuffer( 20 ).append( aLeft )
+ .append( "," ).append( aTop )
+ .makeStringAndClear() );
+
+ m_pShapeAttrList->add( XML_to,
+ OStringBuffer( 20 ).append( aRight )
+ .append( "," ).append( aBottom )
+ .makeStringAndClear() );
+}
+
+void VMLExport::AddRectangleDimensions( rtl::OStringBuffer& rBuffer, const Rectangle& rRectangle )
+{
+ if ( rBuffer.getLength() )
+ rBuffer.append( ";" );
+
+ rBuffer.append( "position:absolute;" );
+
+ if ( mnGroupLevel == 1 )
+ {
+ rBuffer.append( "margin-left:" ).append( double( rRectangle.Left() ) / 20 )
+ .append( "pt;margin-top:" ).append( double( rRectangle.Top() ) / 20 )
+ .append( "pt;width:" ).append( double( rRectangle.Right() - rRectangle.Left() ) / 20 )
+ .append( "pt;height:" ).append( double( rRectangle.Bottom() - rRectangle.Top() ) / 20 )
+ .append( "pt" );
+ }
+ else
+ {
+ rBuffer.append( "left:" ).append( rRectangle.Left() )
+ .append( ";top:" ).append( rRectangle.Top() )
+ .append( ";width:" ).append( rRectangle.Right() - rRectangle.Left() )
+ .append( ";height:" ).append( rRectangle.Bottom() - rRectangle.Top() );
+ }
+}
+
+void VMLExport::AddShapeAttribute( sal_Int32 nAttribute, const rtl::OString& rValue )
+{
+ m_pShapeAttrList->add( nAttribute, rValue );
+}
+
+extern const char* pShapeTypes[];
+
+sal_Int32 VMLExport::StartShape()
+{
+ if ( m_nShapeType == ESCHER_ShpInst_Nil )
+ return -1;
+
+ // some of the shapes have their own name ;-)
+ sal_Int32 nShapeElement = -1;
+ bool bReferToShapeType = false;
+ switch ( m_nShapeType )
+ {
+ case ESCHER_ShpInst_NotPrimitive: nShapeElement = XML_shape; break;
+ case ESCHER_ShpInst_Rectangle: nShapeElement = XML_rect; break;
+ case ESCHER_ShpInst_RoundRectangle: nShapeElement = XML_roundrect; break;
+ case ESCHER_ShpInst_Ellipse: nShapeElement = XML_oval; break;
+ case ESCHER_ShpInst_Arc: nShapeElement = XML_arc; break;
+ case ESCHER_ShpInst_Line: nShapeElement = XML_line; break;
+ default:
+ if ( m_nShapeType < ESCHER_ShpInst_COUNT )
+ {
+ nShapeElement = XML_shape;
+
+ // a predefined shape?
+ const char* pShapeType = pShapeTypes[ m_nShapeType ];
+ if ( pShapeType )
+ {
+ bReferToShapeType = true;
+ if ( !m_pShapeTypeWritten[ m_nShapeType ] )
+ {
+ m_pSerializer->write( pShapeType );
+ m_pShapeTypeWritten[ m_nShapeType ] = true;
+ }
+ }
+ else
+ {
+ // rectangle is probably the best fallback...
+ nShapeElement = XML_rect;
+ }
+ }
+ break;
+ }
+
+ // add style
+ m_pShapeAttrList->add( XML_style, m_pShapeStyle->makeStringAndClear() );
+
+ if ( nShapeElement >= 0 )
+ {
+ if ( bReferToShapeType )
+ {
+ m_pShapeAttrList->add( XML_type, OStringBuffer( 20 )
+ .append( "shapetype_" ).append( sal_Int32( m_nShapeType ) )
+ .makeStringAndClear() );
+ }
+
+ // start of the shape
+ m_pSerializer->startElementNS( XML_v, nShapeElement, XFastAttributeListRef( m_pShapeAttrList ) );
+ }
+
+ return nShapeElement;
+}
+
+void VMLExport::EndShape( sal_Int32 nShapeElement )
+{
+ if ( nShapeElement >= 0 )
+ {
+ // end of the shape
+ m_pSerializer->endElementNS( XML_v, nShapeElement );
+ }
+}
diff --git a/oox/source/helper/propertymap.cxx b/oox/source/helper/propertymap.cxx
index ccc5cfdd62b4..a40b4a737bd3 100644
--- a/oox/source/helper/propertymap.cxx
+++ b/oox/source/helper/propertymap.cxx
@@ -35,6 +35,7 @@
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/beans/XPropertySetInfo.hpp>
#include "properties.hxx"
+#include "oox/token/propertylist.hxx"
using ::rtl::OUString;
using ::com::sun::star::uno::Any;
@@ -59,7 +60,7 @@ namespace oox {
namespace {
/** Thread-save singleton of a vector of all supported property names. */
-struct PropertyNamesPool : public ::rtl::Static< PropertyNamesList, PropertyNamesPool > {};
+struct StaticPropertyList : public ::rtl::Static< PropertyList, StaticPropertyList > {};
// ----------------------------------------------------------------------------
@@ -103,7 +104,7 @@ GenericPropertySet::GenericPropertySet()
GenericPropertySet::GenericPropertySet( const PropertyMap& rPropMap )
{
- const PropertyNamesList& rPropNames = PropertyNamesPool::get();
+ const PropertyList& rPropNames = StaticPropertyList::get();
for( PropertyMap::const_iterator aIt = rPropMap.begin(), aEnd = rPropMap.end(); aIt != aEnd; ++aIt )
maPropMap[ rPropNames[ aIt->first ] ] = aIt->second;
}
@@ -170,10 +171,19 @@ sal_Bool SAL_CALL GenericPropertySet::hasPropertyByName( const OUString& rProper
// ============================================================================
-const OUString& PropertyMap::getPropertyName( sal_Int32 nPropId )
+PropertyMap::PropertyMap() :
+ mpPropNames( &StaticPropertyList::get() )
+{
+}
+
+PropertyMap::~PropertyMap()
+{
+}
+
+/*static*/ const OUString& PropertyMap::getPropertyName( sal_Int32 nPropId )
{
OSL_ENSURE( (0 <= nPropId) && (nPropId < PROP_COUNT), "PropertyMap::getPropertyName - invalid property identifier" );
- return PropertyNamesPool::get()[ nPropId ];
+ return StaticPropertyList::get()[ nPropId ];
}
const Any* PropertyMap::getProperty( sal_Int32 nPropId ) const
@@ -187,12 +197,11 @@ Sequence< PropertyValue > PropertyMap::makePropertyValueSequence() const
Sequence< PropertyValue > aSeq( static_cast< sal_Int32 >( size() ) );
if( !empty() )
{
- const PropertyNamesList& rPropNames = PropertyNamesPool::get();
PropertyValue* pValues = aSeq.getArray();
for( const_iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt, ++pValues )
{
OSL_ENSURE( (0 <= aIt->first) && (aIt->first < PROP_COUNT), "PropertyMap::makePropertyValueSequence - invalid property identifier" );
- pValues->Name = rPropNames[ aIt->first ];
+ pValues->Name = (*mpPropNames)[ aIt->first ];
pValues->Value = aIt->second;
pValues->State = ::com::sun::star::beans::PropertyState_DIRECT_VALUE;
}
@@ -206,13 +215,12 @@ void PropertyMap::fillSequences( Sequence< OUString >& rNames, Sequence< Any >&
rValues.realloc( static_cast< sal_Int32 >( size() ) );
if( !empty() )
{
- const PropertyNamesList& rPropNames = PropertyNamesPool::get();
OUString* pNames = rNames.getArray();
Any* pValues = rValues.getArray();
for( const_iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt, ++pNames, ++pValues )
{
OSL_ENSURE( (0 <= aIt->first) && (aIt->first < PROP_COUNT), "PropertyMap::fillSequences - invalid property identifier" );
- *pNames = rPropNames[ aIt->first ];
+ *pNames = (*mpPropNames)[ aIt->first ];
*pValues = aIt->second;
}
}
diff --git a/oox/source/helper/zipstorage.cxx b/oox/source/helper/zipstorage.cxx
index 7685b32e2b23..5dd3aa67109b 100644
--- a/oox/source/helper/zipstorage.cxx
+++ b/oox/source/helper/zipstorage.cxx
@@ -63,7 +63,13 @@ ZipStorage::ZipStorage(
// create base storage object
try
{
- mxStorage = ::comphelper::OStorageHelper::GetStorageFromInputStream( rxInStream, rxFactory );
+ /* #i105325# ::comphelper::OStorageHelper::GetStorageFromInputStream()
+ cannot be used here as it will open a storage with format type
+ 'PackageFormat' that will not work with OOXML packages.
+ TODO: #i105410# switch to 'OFOPXMLFormat' and use its
+ implementation of relations handling. */
+ mxStorage = ::comphelper::OStorageHelper::GetStorageOfFormatFromInputStream(
+ ZIP_STORAGE_FORMAT_STRING, rxInStream, rxFactory );
}
catch( Exception& )
{
@@ -79,11 +85,9 @@ ZipStorage::ZipStorage(
// create base storage object
try
{
- mxStorage = ::comphelper::OStorageHelper::GetStorageOfFormatFromStream( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OFOPXMLFormat" ) ),
- rxStream,
- com::sun::star::embed::ElementModes::READWRITE
- | com::sun::star::embed::ElementModes::TRUNCATE,
- rxFactory );
+ using namespace ::com::sun::star::embed::ElementModes;
+ mxStorage = ::comphelper::OStorageHelper::GetStorageOfFormatFromStream(
+ OFOPXML_STORAGE_FORMAT_STRING, rxStream, READWRITE | TRUNCATE, rxFactory );
}
catch( Exception& )
{
diff --git a/oox/source/ole/axcontrolhelper.cxx b/oox/source/ole/axcontrolhelper.cxx
index a1bd9bfd9ac7..cd8180728074 100644
--- a/oox/source/ole/axcontrolhelper.cxx
+++ b/oox/source/ole/axcontrolhelper.cxx
@@ -117,12 +117,12 @@ sal_Int32 AxControlHelper::convertColor( sal_uInt32 nAxColor ) const
switch( meColorMode )
{
case AX_DEFAULTCOLORMODE_BGR: return lclDecodeBgrColor( nAxColor );
- case AX_DEFAULTCOLORMODE_PALETTE: return getPaletteColor( static_cast< sal_uInt16 >( nAxColor & AX_PALETTECOLOR_MASK ) );
+ case AX_DEFAULTCOLORMODE_PALETTE: return mrFilter.getPaletteColor( nAxColor & AX_PALETTECOLOR_MASK );
}
break;
case AX_COLORTYPE_PALETTE:
- return getPaletteColor( static_cast< sal_uInt16 >( nAxColor & AX_PALETTECOLOR_MASK ) );
+ return mrFilter.getPaletteColor( nAxColor & AX_PALETTECOLOR_MASK );
case AX_COLORTYPE_BGR:
return lclDecodeBgrColor( nAxColor );
@@ -134,12 +134,6 @@ sal_Int32 AxControlHelper::convertColor( sal_uInt32 nAxColor ) const
return 0;
}
-sal_Int32 AxControlHelper::getPaletteColor( sal_uInt16 /*nPaletteIdx*/ ) const
-{
- OSL_ENSURE( false, "AxControlHelper::getPaletteColor - palette colors not implemented" );
- return 0;
-}
-
// ============================================================================
AxEmbeddedControlHelper::AxEmbeddedControlHelper( const FilterBase& rFilter,
diff --git a/oox/source/ppt/animvariantcontext.cxx b/oox/source/ppt/animvariantcontext.cxx
index e8f60d9df234..f3b9de2dbf7a 100644
--- a/oox/source/ppt/animvariantcontext.cxx
+++ b/oox/source/ppt/animvariantcontext.cxx
@@ -40,6 +40,7 @@
#include "oox/helper/attributelist.hxx"
#include "oox/core/namespaces.hxx"
#include "oox/core/fragmenthandler.hxx"
+#include "oox/core/xmlfilterbase.hxx"
#include "oox/drawingml/colorchoicecontext.hxx"
#include "pptfilterhelpers.hxx"
#include "tokens.hxx"
diff --git a/oox/source/ppt/pptimport.cxx b/oox/source/ppt/pptimport.cxx
index f772a9236785..0e463099e9c5 100644
--- a/oox/source/ppt/pptimport.cxx
+++ b/oox/source/ppt/pptimport.cxx
@@ -88,12 +88,7 @@ bool PowerPointImport::exportDocument() throw()
return false;
}
-const ::oox::drawingml::Theme* PowerPointImport::getCurrentTheme() const
-{
- return mpActualSlidePersist ? mpActualSlidePersist->getTheme().get() : 0;
-}
-
-sal_Int32 PowerPointImport::getSchemeClr( sal_Int32 nColorSchemeToken ) const
+sal_Int32 PowerPointImport::getSchemeColor( sal_Int32 nToken ) const
{
sal_Int32 nColor = 0;
if ( mpActualSlidePersist )
@@ -101,7 +96,7 @@ sal_Int32 PowerPointImport::getSchemeClr( sal_Int32 nColorSchemeToken ) const
sal_Bool bColorMapped = sal_False;
oox::drawingml::ClrMapPtr pClrMapPtr( mpActualSlidePersist->getClrMap() );
if ( pClrMapPtr )
- bColorMapped = pClrMapPtr->getColorMap( nColorSchemeToken );
+ bColorMapped = pClrMapPtr->getColorMap( nToken );
if ( !bColorMapped ) // try masterpage mapping
{
@@ -110,18 +105,18 @@ sal_Int32 PowerPointImport::getSchemeClr( sal_Int32 nColorSchemeToken ) const
{
pClrMapPtr = pMasterPersist->getClrMap();
if ( pClrMapPtr )
- bColorMapped = pClrMapPtr->getColorMap( nColorSchemeToken );
+ bColorMapped = pClrMapPtr->getColorMap( nToken );
}
}
oox::drawingml::ClrSchemePtr pClrSchemePtr( mpActualSlidePersist->getClrScheme() );
if ( pClrSchemePtr )
- pClrSchemePtr->getColor( nColorSchemeToken, nColor );
+ pClrSchemePtr->getColor( nToken, nColor );
else
{
::oox::drawingml::ThemePtr pTheme = mpActualSlidePersist->getTheme();
if( pTheme )
{
- pTheme->getClrScheme().getColor( nColorSchemeToken, nColor );
+ pTheme->getClrScheme().getColor( nToken, nColor );
}
else
{
@@ -132,6 +127,11 @@ sal_Int32 PowerPointImport::getSchemeClr( sal_Int32 nColorSchemeToken ) const
return nColor;
}
+const ::oox::drawingml::Theme* PowerPointImport::getCurrentTheme() const
+{
+ return mpActualSlidePersist ? mpActualSlidePersist->getTheme().get() : 0;
+}
+
::oox::vml::Drawing* PowerPointImport::getVmlDrawing()
{
return mpActualSlidePersist ? mpActualSlidePersist->getDrawing() : 0;
diff --git a/oox/source/ppt/slidepersist.cxx b/oox/source/ppt/slidepersist.cxx
index 47e5f8c84c5e..002938e2b513 100644
--- a/oox/source/ppt/slidepersist.cxx
+++ b/oox/source/ppt/slidepersist.cxx
@@ -180,9 +180,7 @@ void SlidePersist::createBackground( const XmlFilterBase& rFilterBase )
uno::Reference< beans::XPropertySet > xPagePropSet( mxPage, uno::UNO_QUERY_THROW );
uno::Reference< beans::XPropertySet > xPropertySet( aPropMap.makePropertySet() );
PropertySet aPropSet( xPropertySet );
- mpBackgroundPropertiesPtr->pushToPropSet(
- aPropSet, ::oox::drawingml::FillProperties::DEFAULT_IDS,
- rFilterBase, rFilterBase.getModelObjectHelper(), 0, -1 );
+ mpBackgroundPropertiesPtr->pushToPropSet( aPropSet, rFilterBase, rFilterBase.getModelObjectHelper() );
xPagePropSet->setPropertyValue( sBackground, Any( xPropertySet ) );
}
catch( Exception )
diff --git a/oox/source/ppt/timenodelistcontext.cxx b/oox/source/ppt/timenodelistcontext.cxx
index 70da57a52bd4..12fe9809ba5d 100644
--- a/oox/source/ppt/timenodelistcontext.cxx
+++ b/oox/source/ppt/timenodelistcontext.cxx
@@ -51,6 +51,7 @@
#include "oox/helper/attributelist.hxx"
#include "oox/core/namespaces.hxx"
+#include "oox/core/xmlfilterbase.hxx"
#include "oox/drawingml/drawingmltypes.hxx"
#include "oox/drawingml/colorchoicecontext.hxx"
#include "oox/ppt/slidetransition.hxx"
diff --git a/oox/source/shape/FastTokenHandlerService.hxx b/oox/source/shape/FastTokenHandlerService.hxx
index 64b79ab943ee..c41403539d11 100644
--- a/oox/source/shape/FastTokenHandlerService.hxx
+++ b/oox/source/shape/FastTokenHandlerService.hxx
@@ -27,17 +27,16 @@
* for a copy of the LGPLv3 License.
*
************************************************************************/
-#ifndef OOX_SHAPE_FAST_TOKEN_HANDLER_SERVICE_HXX
-#define OOX_SHAPE_FAST_TOKEN_HANDLER_SERVICE_HXX
-#include <oox/core/fasttokenhandler.hxx>
+#ifndef OOX_SHAPE_FASTTOKENHANDLERSERVICE_HXX
+#define OOX_SHAPE_FASTTOKENHANDLERSERVICE_HXX
-#include "sal/config.h"
-#include "cppuhelper/factory.hxx"
-#include "cppuhelper/implementationentry.hxx"
-#include "cppuhelper/implbase2.hxx"
-#include "com/sun/star/lang/XServiceInfo.hpp"
-#include "com/sun/star/xml/sax/XFastTokenHandler.hpp"
+#include <sal/config.h>
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/implementationentry.hxx>
+#include <cppuhelper/implbase2.hxx>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include "oox/core/fasttokenhandler.hxx"
namespace css = ::com::sun::star;
@@ -70,7 +69,7 @@ private:
virtual ~FastTokenHandlerService() {}
css::uno::Reference< css::uno::XComponentContext > m_xContext;
- FastTokenHandler mFastTokenHandler;
+ ::oox::core::FastTokenHandler mFastTokenHandler;
};
::rtl::OUString SAL_CALL FastTokenHandlerService_getImplementationName();
diff --git a/oox/source/shape/ShapeFilterBase.cxx b/oox/source/shape/ShapeFilterBase.cxx
index 0933af28ffd5..9105b6ca38eb 100644
--- a/oox/source/shape/ShapeFilterBase.cxx
+++ b/oox/source/shape/ShapeFilterBase.cxx
@@ -53,11 +53,6 @@ const ::oox::drawingml::Theme* ShapeFilterBase::getCurrentTheme() const
return 0;
}
-sal_Int32 ShapeFilterBase::getSchemeClr(sal_Int32 /*nColorSchemeToken*/ ) const
-{
- return 0;
-}
-
::oox::vml::Drawing* ShapeFilterBase::getVmlDrawing()
{
return 0;
diff --git a/oox/source/shape/ShapeFilterBase.hxx b/oox/source/shape/ShapeFilterBase.hxx
index d90904ed22cc..1a2edcb461f2 100644
--- a/oox/source/shape/ShapeFilterBase.hxx
+++ b/oox/source/shape/ShapeFilterBase.hxx
@@ -55,9 +55,6 @@ public:
/** Has to be implemented by each filter, returns the current theme. */
virtual const ::oox::drawingml::Theme* getCurrentTheme() const;
- /** Has to be implemented by each filter to resolve scheme colors. */
- virtual sal_Int32 getSchemeClr( sal_Int32 nColorSchemeToken ) const;
-
/** Has to be implemented by each filter to return the collection of VML shapes. */
virtual ::oox::vml::Drawing* getVmlDrawing();
diff --git a/oox/source/token/gentoken.pl b/oox/source/token/gentoken.pl
index 6c7c126bc4e2..196ac37ebb5c 100644
--- a/oox/source/token/gentoken.pl
+++ b/oox/source/token/gentoken.pl
@@ -3,7 +3,7 @@ $ARGV1 = shift @ARGV;
$ARGV2 = shift @ARGV;
$ARGV3 = shift @ARGV;
-open ( TOKENS, $ARGV0 ) || die "can't open token file: $!";
+open ( TOKENS, $ARGV0 ) || die "can't open $ARGV0 file: $!";
my %tokens;
while ( <TOKENS> )
@@ -17,15 +17,15 @@ while ( <TOKENS> )
}
close ( TOKENS );
-open ( HXX, ">$ARGV1" ) or die "can't open tokens.hxx file: $!";
-open ( WORDS, ">$ARGV2" ) or die "can't open tokenwords.inl file: $!";
-open ( GPERF, ">$ARGV3" ) or die "can't open tokens.gperf file: $!";
+open ( HXX, ">$ARGV1" ) or die "can't open $ARGV1 file: $!";
+open ( WORDS, ">$ARGV2" ) or die "can't open $ARGV2 file: $!";
+open ( GPERF, ">$ARGV3" ) or die "can't open $ARGV3 file: $!";
print ( HXX "#ifndef OOX_TOKENS_HXX\n" );
print ( HXX "#define OOX_TOKENS_HXX\n\n" );
-print ( HXX "#include <sal/types.h>\n" );
+print ( HXX "#include <com/sun/star/xml/sax/FastToken.hpp>\n" );
-print ( WORDS "static const sal_Char* tokentowordlist[] = {\n" );
+print ( WORDS "static const sal_Char* xmltokenwordlist[] = {\n" );
print ( GPERF "%language=C++\n" );
print ( GPERF "%global-table\n" );
@@ -47,7 +47,7 @@ foreach( sort( keys( %tokens ) ) )
}
print ( HXX "const sal_Int32 XML_TOKEN_COUNT = $i;\n" );
-print ( HXX "const sal_Int32 XML_TOKEN_INVALID = -1;\n\n" );
+print ( HXX "const sal_Int32 XML_TOKEN_INVALID = ::com::sun::star::xml::sax::FastToken::DONTKNOW;\n\n" );
print ( HXX "const sal_Int32 XML_ROOT_CONTEXT = SAL_MAX_INT32;\n\n" );
print ( HXX "#endif\n" );
diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt
index 958a9ac24e77..0ecd40ee6595 100644
--- a/oox/source/token/properties.txt
+++ b/oox/source/token/properties.txt
@@ -400,6 +400,7 @@ VisualEffect
Weight
WhiteDay
Width
+WriteProtectionPassword
WritingMode
ZoomType
ZoomValue
diff --git a/oox/source/token/propertylist.cxx b/oox/source/token/propertylist.cxx
index b6be034daabc..153b15f32461 100644
--- a/oox/source/token/propertylist.cxx
+++ b/oox/source/token/propertylist.cxx
@@ -28,23 +28,31 @@
*
************************************************************************/
-#include <rtl/ustring.hxx>
+#include "oox/token/propertylist.hxx"
#include "properties.hxx"
-#include "oox/helper/propertymap.hxx"
namespace oox {
+namespace {
+
+// include auto-generated property name lists
#include "propertywords.inc"
+} // namespace
+
// ============================================================================
-PropertyNamesList::PropertyNamesList()
+PropertyList::PropertyList()
{
reserve( static_cast< size_t >( PROP_COUNT ) );
for( sal_Int32 nIdx = 0; nIdx < PROP_COUNT; ++nIdx )
push_back( ::rtl::OUString::createFromAscii( propertywordlist[ nIdx ] ) );
}
+PropertyList::~PropertyList()
+{
+}
+
// ============================================================================
} // namespace oox
diff --git a/oox/source/token/tokenmap.cxx b/oox/source/token/tokenmap.cxx
index 93da78313a69..c01e3662a0d4 100644
--- a/oox/source/token/tokenmap.cxx
+++ b/oox/source/token/tokenmap.cxx
@@ -28,104 +28,85 @@
*
************************************************************************/
+#include "oox/token/tokenmap.hxx"
#include <string.h>
-#include <osl/mutex.hxx>
#include <rtl/strbuf.hxx>
-#include <com/sun/star/xml/sax/FastToken.hpp>
-#include "oox/core/fasttokenhandler.hxx"
+#include <rtl/string.hxx>
#include "tokens.hxx"
+#include "oox/helper/containerhelper.hxx"
using ::rtl::OString;
-using ::rtl::OStringBuffer;
using ::rtl::OUString;
-using ::rtl::OUStringToOString;
-using ::osl::Mutex;
-using ::osl::MutexGuard;
using ::com::sun::star::uno::Sequence;
-using ::com::sun::star::uno::RuntimeException;
-using ::com::sun::star::xml::sax::FastToken::DONTKNOW;
namespace oox {
-#include "tokens.inc"
-#include "tokenwords.inc"
-
// ============================================================================
namespace {
-Mutex& lclGetTokenMutex()
-{
- static Mutex aMutex;
- return aMutex;
-}
+// include auto-generated token lists
+#include "tokens.inc"
+#include "tokenwords.inc"
} // namespace
// ============================================================================
-FastTokenHandler::FastTokenHandler()
+TokenMap::TokenMap() :
+ maTokenNames( static_cast< size_t >( XML_TOKEN_COUNT ) )
{
+ const sal_Char* const* ppcTokenWord = xmltokenwordlist;
+ for( TokenNameVector::iterator aIt = maTokenNames.begin(), aEnd = maTokenNames.end(); aIt != aEnd; ++aIt, ++ppcTokenWord )
+ {
+ OString aUtf8Token( *ppcTokenWord );
+ aIt->maUniName = OStringToOUString( aUtf8Token, RTL_TEXTENCODING_UTF8 );
+ aIt->maUtf8Name = Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( aUtf8Token.getStr() ), aUtf8Token.getLength() );
+ }
+
#if OSL_DEBUG_LEVEL > 0
- MutexGuard aGuard( lclGetTokenMutex() );
+ // check that the perfect_hash is in sync with the token name list
bool bOk = true;
- for( sal_Int32 nIdx = 0; bOk && (nIdx < XML_TOKEN_COUNT); ++nIdx )
+ for( sal_Int32 nToken = 0; bOk && (nToken < XML_TOKEN_COUNT); ++nToken )
{
// check that the getIdentifier <-> getToken roundtrip works
- OUString aToken = getIdentifier( nIdx );
- bOk = getToken( aToken ) == nIdx;
- OSL_ENSURE( bOk, OStringBuffer( "FastTokenHandler::FastTokenHandler - token list broken, #" ).
- append( nIdx ).append( ", '" ).
- append( OUStringToOString( aToken, RTL_TEXTENCODING_ASCII_US ) ).append( '\'' ).getStr() );
+ OString aUtf8Name = OUStringToOString( maTokenNames[ nToken ].maUniName, RTL_TEXTENCODING_UTF8 );
+ struct xmltoken* pToken = Perfect_Hash::in_word_set( aUtf8Name.getStr(), aUtf8Name.getLength() );
+ bOk = pToken && (pToken->nToken == nToken);
+ OSL_ENSURE( bOk, ::rtl::OStringBuffer( "FastTokenHandler::FastTokenHandler - token list broken, #" ).
+ append( nToken ).append( ", '" ).append( aUtf8Name ).append( '\'' ).getStr() );
}
#endif
}
-FastTokenHandler::~FastTokenHandler()
+TokenMap::~TokenMap()
{
}
-sal_Int32 FastTokenHandler::getToken( const OUString& rIdentifier ) throw( RuntimeException )
+OUString TokenMap::getUnicodeTokenName( sal_Int32 nToken ) const
{
- MutexGuard aGuard( lclGetTokenMutex() );
-
- OString aUTF8 = OUStringToOString( rIdentifier, RTL_TEXTENCODING_UTF8 );
-
- struct xmltoken * t = Perfect_Hash::in_word_set( aUTF8.getStr(), aUTF8.getLength() );
- return t ? t->nToken : DONTKNOW;
+ const TokenName* pTokenName = ContainerHelper::getVectorElement( maTokenNames, nToken );
+ return pTokenName ? pTokenName->maUniName : OUString();
}
-OUString FastTokenHandler::getIdentifier( sal_Int32 nToken ) throw( RuntimeException )
+sal_Int32 TokenMap::getTokenFromUnicode( const OUString& rUnicodeName ) const
{
- MutexGuard aGuard( lclGetTokenMutex() );
-
- if( nToken >= XML_TOKEN_COUNT )
- return OUString();
-
- static OUString aTokens[XML_TOKEN_COUNT];
-
- if( aTokens[nToken].getLength() == 0 )
- aTokens[nToken] = OUString::createFromAscii( tokentowordlist[nToken] );
-
- return aTokens[nToken];
+ OString aUtf8Name = OUStringToOString( rUnicodeName, RTL_TEXTENCODING_UTF8 );
+ struct xmltoken* pToken = Perfect_Hash::in_word_set( aUtf8Name.getStr(), aUtf8Name.getLength() );
+ return pToken ? pToken->nToken : XML_TOKEN_INVALID;
}
-Sequence< sal_Int8 > FastTokenHandler::getUTF8Identifier( sal_Int32 nToken ) throw( RuntimeException )
+Sequence< sal_Int8 > TokenMap::getUtf8TokenName( sal_Int32 nToken ) const
{
- MutexGuard aGuard( lclGetTokenMutex() );
-
- if( nToken >= XML_TOKEN_COUNT )
- return Sequence< sal_Int8 >();
-
- return Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8 *>(tokentowordlist[nToken]), strlen(tokentowordlist[nToken]));
+ const TokenName* pTokenName = ContainerHelper::getVectorElement( maTokenNames, nToken );
+ return pTokenName ? pTokenName->maUtf8Name : Sequence< sal_Int8 >();
}
-sal_Int32 FastTokenHandler::getTokenFromUTF8( const Sequence< sal_Int8 >& rIdentifier ) throw( RuntimeException )
+sal_Int32 TokenMap::getTokenFromUtf8( const Sequence< sal_Int8 >& rUtf8Name ) const
{
- MutexGuard aGuard( lclGetTokenMutex() );
-
- struct xmltoken * t = Perfect_Hash::in_word_set( reinterpret_cast< const char* >( rIdentifier.getConstArray() ), rIdentifier.getLength());
- return t ? t->nToken : DONTKNOW;
+ struct xmltoken* pToken = Perfect_Hash::in_word_set(
+ reinterpret_cast< const char* >( rUtf8Name.getConstArray() ), rUtf8Name.getLength() );
+ return pToken ? pToken->nToken : XML_TOKEN_INVALID;
}
// ============================================================================
diff --git a/oox/source/token/tokens.txt b/oox/source/token/tokens.txt
index 8c345fc23352..4bf407747d95 100644
--- a/oox/source/token/tokens.txt
+++ b/oox/source/token/tokens.txt
@@ -1501,6 +1501,9 @@ cyan
cycle
cylinder
d
+dc
+dcmitype
+dcterms
dLbl
dLblPos
dLbls
@@ -1538,6 +1541,7 @@ dashLongHeavy
dashSmallGap
dashUpDiag
dashVert
+dashdot
dashed
dashedHeavy
dashedSmall
@@ -3060,6 +3064,9 @@ long
longCurve
longFileNames
longText
+longdash
+longdashdot
+longdashdotdot
loop
low
lowKashida
@@ -4445,6 +4452,10 @@ shininess
shorebirdTracks
short
shortcutKey
+shortdash
+shortdashdot
+shortdashdotdot
+shortdot
show
showAll
showAnimation
@@ -5467,7 +5478,9 @@ vol
volType
volTypes
vstream
+vt
w
+w10
wAfter
wArH
wBefore
@@ -5545,6 +5558,7 @@ workbookView
workbookViewId
worksheet
worksheetSource
+wp
wpJustification
wpSpaceWidth
wrap
@@ -5568,6 +5582,7 @@ xMode
xSplit
xVal
xWindow
+xdr
xf
xfDxf
xfId
@@ -5586,6 +5601,7 @@ xmlns
xpath
xrange
xscale
+xsi
xy
y
yAlign
diff --git a/oox/source/vml/makefile.mk b/oox/source/vml/makefile.mk
index 305353eb8f02..e4bc963cb1f6 100644
--- a/oox/source/vml/makefile.mk
+++ b/oox/source/vml/makefile.mk
@@ -47,6 +47,7 @@ ENABLE_EXCEPTIONS=TRUE
SLOFILES = \
$(SLO)$/vmldrawing.obj \
$(SLO)$/vmldrawingfragment.obj \
+ $(SLO)$/vmlformatting.obj \
$(SLO)$/vmlinputstream.obj \
$(SLO)$/vmlshape.obj \
$(SLO)$/vmlshapecontainer.obj \
diff --git a/oox/source/vml/vmldrawing.cxx b/oox/source/vml/vmldrawing.cxx
index 42529ea4a351..f7d9827851f9 100644
--- a/oox/source/vml/vmldrawing.cxx
+++ b/oox/source/vml/vmldrawing.cxx
@@ -147,6 +147,11 @@ const ControlInfo* Drawing::getControlInfo( const OUString& rShapeId ) const
return ContainerHelper::getMapElement( maControls, rShapeId );
}
+bool Drawing::isShapeSupported( const ShapeBase& /*rShape*/ ) const
+{
+ return true;
+}
+
bool Drawing::convertShapeClientAnchor( Rectangle& /*orShapeRect*/, const OUString& /*rShapeAnchor*/ ) const
{
return false;
diff --git a/oox/source/vml/vmldrawingfragment.cxx b/oox/source/vml/vmldrawingfragment.cxx
index b622df39941c..6eab7efdba0e 100644
--- a/oox/source/vml/vmldrawingfragment.cxx
+++ b/oox/source/vml/vmldrawingfragment.cxx
@@ -63,7 +63,7 @@ ContextHandlerRef DrawingFragment::onCreateContext( sal_Int32 nElement, const At
// DOCX filter handles plain shape elements with this fragment handler
case VMLDRAWING_WORD:
if( isRootElement() )
- return ShapeContextBase::createContext( *this, nElement, rAttribs, mrDrawing.getShapes() );
+ return ShapeContextBase::createShapeContext( *this, nElement, rAttribs, mrDrawing.getShapes() );
break;
// XLSX and PPTX filters load the entire VML fragment
@@ -75,7 +75,7 @@ ContextHandlerRef DrawingFragment::onCreateContext( sal_Int32 nElement, const At
if( nElement == XML_xml ) return this;
break;
case XML_xml:
- return ShapeContextBase::createContext( *this, nElement, rAttribs, mrDrawing.getShapes() );
+ return ShapeContextBase::createShapeContext( *this, nElement, rAttribs, mrDrawing.getShapes() );
}
break;
}
diff --git a/oox/source/vml/vmlformatting.cxx b/oox/source/vml/vmlformatting.cxx
new file mode 100644
index 000000000000..a45054a77b52
--- /dev/null
+++ b/oox/source/vml/vmlformatting.cxx
@@ -0,0 +1,585 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: vmlformatting.cxx,v $
+ * $Revision: 1.1 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "oox/vml/vmlformatting.hxx"
+#include <rtl/strbuf.hxx>
+#include "tokens.hxx"
+#include "oox/token/tokenmap.hxx"
+#include "oox/helper/propertymap.hxx"
+#include "oox/core/filterbase.hxx"
+#include "oox/drawingml/color.hxx"
+#include "oox/drawingml/drawingmltypes.hxx"
+#include "oox/drawingml/fillproperties.hxx"
+#include "oox/drawingml/lineproperties.hxx"
+
+using ::rtl::OStringBuffer;
+using ::rtl::OUString;
+using ::com::sun::star::geometry::IntegerRectangle2D;
+using ::oox::core::FilterBase;
+using ::oox::drawingml::Color;
+using ::oox::drawingml::FillProperties;
+using ::oox::drawingml::LineArrowProperties;
+using ::oox::drawingml::LineProperties;
+
+namespace oox {
+namespace vml {
+
+// ============================================================================
+
+namespace {
+
+bool lclExtractDouble( double& orfValue, sal_Int32& ornEndPos, const OUString& rValue )
+{
+ // extract the double value and find start position of unit characters
+ rtl_math_ConversionStatus eConvStatus = rtl_math_ConversionStatus_Ok;
+ orfValue = ::rtl::math::stringToDouble( rValue, '.', '\0', &eConvStatus, &ornEndPos );
+ return eConvStatus == rtl_math_ConversionStatus_Ok;
+}
+
+} // namespace
+
+// ----------------------------------------------------------------------------
+
+/*static*/ bool ConversionHelper::separatePair( OUString& orValue1, OUString& orValue2,
+ const OUString& rValue, sal_Unicode cSep )
+{
+ sal_Int32 nSepPos = rValue.indexOf( cSep );
+ if( nSepPos >= 0 )
+ {
+ orValue1 = rValue.copy( 0, nSepPos ).trim();
+ orValue2 = rValue.copy( nSepPos + 1 ).trim();
+ }
+ else
+ {
+ orValue1 = rValue.trim();
+ }
+ return (orValue1.getLength() > 0) && (orValue2.getLength() > 0);
+}
+
+/*static*/ bool ConversionHelper::decodeBool( const OUString& rValue )
+{
+ // anything else than 't' or 'true' is considered to be false, as specified
+ return ((rValue.getLength() == 1) && (rValue[ 0 ] == 't')) || (rValue == CREATE_OUSTRING( "true" ));
+}
+
+/*static*/ double ConversionHelper::decodePercent( const OUString& rValue, double fDefValue )
+{
+ if( rValue.getLength() == 0 )
+ return fDefValue;
+
+ double fValue = 0.0;
+ sal_Int32 nEndPos = 0;
+ if( !lclExtractDouble( fValue, nEndPos, rValue ) )
+ return fDefValue;
+
+ if( nEndPos == rValue.getLength() )
+ return fValue;
+
+ if( (nEndPos + 1 == rValue.getLength()) && (rValue[ nEndPos ] == '%') )
+ return fValue / 100.0;
+
+ OSL_ENSURE( false, "ConversionHelper::decodePercent - unknown measure unit" );
+ return fDefValue;
+}
+
+/*static*/ sal_Int32 ConversionHelper::decodeMeasureToEmu( const FilterBase& rFilter,
+ const OUString& rValue, sal_Int32 nRefValue, bool bPixelX, bool bDefaultAsPixel )
+{
+ // default for missing values is 0
+ if( rValue.getLength() == 0 )
+ return 0;
+
+ // TODO: according to spec, value may contain "auto"
+ if( rValue.equalsAscii( "auto" ) )
+ {
+ OSL_ENSURE( false, "ConversionHelper::decodeMeasureToEmu - special value 'auto' must be handled by caller" );
+ return nRefValue;
+ }
+
+ // extract the double value and find start position of unit characters
+ double fValue = 0.0;
+ sal_Int32 nEndPos = 0;
+ if( !lclExtractDouble( fValue, nEndPos, rValue ) || (fValue == 0.0) )
+ return 0;
+
+ // process trailing unit, convert to EMU
+ static const OUString saPx = CREATE_OUSTRING( "px" );
+ OUString aUnit;
+ if( (0 < nEndPos) && (nEndPos < rValue.getLength()) )
+ aUnit = rValue.copy( nEndPos );
+ else if( bDefaultAsPixel )
+ aUnit = saPx;
+ // else default is EMU
+
+ if( aUnit.getLength() == 2 )
+ {
+ sal_Unicode cChar1 = aUnit[ 0 ];
+ sal_Unicode cChar2 = aUnit[ 1 ];
+ if( (cChar1 == 'i') && (cChar2 == 'n') ) // 1 inch = 914,400 EMU
+ fValue *= 914400.0;
+ else if( (cChar1 == 'c') && (cChar2 == 'm') ) // 1 cm = 360,000 EMU
+ fValue *= 360000.0;
+ else if( (cChar1 == 'm') && (cChar2 == 'm') ) // 1 mm = 36,000 EMU
+ fValue *= 36000.0;
+ else if( (cChar1 == 'p') && (cChar2 == 't') ) // 1 point = 1/72 inch = 12,700 MEU
+ fValue *= 12700.0;
+ else if( (cChar1 == 'p') && (cChar2 == 'c') ) // 1 pica = 1/6 inch = 152,400 EMU
+ fValue *= 152400.0;
+ else if( (cChar1 == 'p') && (cChar2 == 'x') ) // 1 pixel, dependent on output device, factor 360 to convert 1/100mm to EMU
+ fValue = bPixelX ? rFilter.convertScreenPixelX( 360.0 * fValue ) : rFilter.convertScreenPixelY( 360.0 * fValue );
+ }
+ else if( (aUnit.getLength() == 1) && (aUnit[ 0 ] == '%') )
+ {
+ fValue *= nRefValue / 100.0;
+ }
+ else if( bDefaultAsPixel || (aUnit.getLength() > 0) ) // default as EMU and no unit -> do nothing
+ {
+ OSL_ENSURE( false, "ConversionHelper::decodeMeasureToEmu - unknown measure unit" );
+ fValue = nRefValue;
+ }
+ return static_cast< sal_Int32 >( fValue + 0.5 );
+}
+
+/*static*/ sal_Int32 ConversionHelper::decodeMeasureToHmm( const FilterBase& rFilter,
+ const OUString& rValue, sal_Int32 nRefValue, bool bPixelX, bool bDefaultAsPixel )
+{
+ return (decodeMeasureToEmu( rFilter, rValue, nRefValue, bPixelX, bDefaultAsPixel ) + 180) / 360;
+}
+
+// ============================================================================
+
+namespace {
+
+/** Converts a VML color attribute to a DrawingML color.
+
+ @param orDmlColor (out-parameter) The destination DrawingML color.
+
+ @param roVmlColor The VML string representation of the color. If existing,
+ this can be a 6-digit hexadecimal RGB value with leading '#' character,
+ a predefined color name (e.g. 'black', 'red', etc.), the index into an
+ application defined color palette in brackets with leading color name
+ (e.g. 'red [9]' or 'windowColor [64]'), or a color modifier used in
+ one-color gradients (e.g. 'fill darken(128)' or 'fill lighten(0)'.
+
+ @param roVmlOpacity The opacity of the color. If existing, this should be
+ a floating-point value in the range [0.0;1.0].
+
+ @param nDefaultRgb Deafult RGB color used if the parameter roVmlColor is
+ empty.
+
+ @param nPrimaryRgb If set to something else than API_RGB_TRANSPARENT,
+ specifies the color to be used to resolve the color modifiers used in
+ one-color gradients.
+ */
+void lclGetColor( Color& orDmlColor, const FilterBase& rFilter,
+ const OptValue< OUString >& roVmlColor, const OptValue< double >& roVmlOpacity,
+ sal_Int32 nDefaultRgb, sal_Int32 nPrimaryRgb = API_RGB_TRANSPARENT )
+{
+ // convert opacity
+ const sal_Int32 DML_FULL_OPAQUE = ::oox::drawingml::MAX_PERCENT;
+ double fOpacity = roVmlOpacity.get( 1.0 );
+ sal_Int32 nOpacity = getLimitedValue< sal_Int32, double >( fOpacity * DML_FULL_OPAQUE, 0, DML_FULL_OPAQUE );
+ if( nOpacity < DML_FULL_OPAQUE )
+ orDmlColor.addTransformation( XML_alpha, nOpacity );
+
+ // color attribute not present - set passed default color
+ if( !roVmlColor.has() )
+ {
+ orDmlColor.setSrgbClr( nDefaultRgb );
+ return;
+ }
+
+ // separate leading color name or RGB value from following palette index
+ OUString aColorName, aColorIndex;
+ ConversionHelper::separatePair( aColorName, aColorIndex, roVmlColor.get(), ' ' );
+
+ // RGB colors in the format '#RRGGBB'
+ if( (aColorName.getLength() == 7) && (aColorName[ 0 ] == '#') )
+ {
+ orDmlColor.setSrgbClr( aColorName.copy( 1 ).toInt32( 16 ) );
+ return;
+ }
+
+ // RGB colors in the format '#RGB'
+ if( (aColorName.getLength() == 4) && (aColorName[ 0 ] == '#') )
+ {
+ sal_Int32 nR = aColorName.copy( 1, 1 ).toInt32( 16 ) * 0x11;
+ sal_Int32 nG = aColorName.copy( 2, 1 ).toInt32( 16 ) * 0x11;
+ sal_Int32 nB = aColorName.copy( 3, 1 ).toInt32( 16 ) * 0x11;
+ orDmlColor.setSrgbClr( (nR << 16) | (nG << 8) | nB );
+ return;
+ }
+
+ /* Predefined color names or system color names (resolve to RGB to detect
+ valid color name). */
+ sal_Int32 nColorToken = StaticTokenMap::get().getTokenFromUnicode( aColorName );
+ sal_Int32 nRgbValue = Color::getVmlPresetColor( nColorToken, API_RGB_TRANSPARENT );
+ if( nRgbValue == API_RGB_TRANSPARENT )
+ nRgbValue = rFilter.getSystemColor( nColorToken, API_RGB_TRANSPARENT );
+ if( nRgbValue != API_RGB_TRANSPARENT )
+ {
+ orDmlColor.setSrgbClr( nRgbValue );
+ return;
+ }
+
+ // try palette colors enclosed in brackets
+ if( (aColorIndex.getLength() >= 3) && (aColorIndex[ 0 ] == '[') && (aColorIndex[ aColorIndex.getLength() - 1 ] == ']') )
+ {
+ orDmlColor.setPaletteClr( aColorIndex.copy( 1, aColorIndex.getLength() - 2 ).toInt32() );
+ return;
+ }
+
+ // try fill gradient modificator 'fill <modifier>(<amount>)'
+ if( (nPrimaryRgb != API_RGB_TRANSPARENT) && (nColorToken == XML_fill) )
+ {
+ sal_Int32 nOpenParen = aColorIndex.indexOf( '(' );
+ sal_Int32 nCloseParen = aColorIndex.indexOf( ')' );
+ if( (2 <= nOpenParen) && (nOpenParen + 1 < nCloseParen) && (nCloseParen + 1 == aColorIndex.getLength()) )
+ {
+ sal_Int32 nModToken = XML_TOKEN_INVALID;
+ switch( StaticTokenMap::get().getTokenFromUnicode( aColorIndex.copy( 0, nOpenParen ) ) )
+ {
+ case XML_darken: nModToken = XML_shade;
+ case XML_lighten: nModToken = XML_tint;
+ }
+ sal_Int32 nValue = aColorIndex.copy( nOpenParen + 1, nCloseParen - nOpenParen - 1 ).toInt32();
+ if( (nModToken != XML_TOKEN_INVALID) && (0 <= nValue) && (nValue < 255) )
+ {
+ /* Simulate this modifier color by a color with related transformation.
+ The modifier amount has to be converted from the range [0;255] to
+ percentage [0;100000] used by DrawingML. */
+ orDmlColor.setSrgbClr( nPrimaryRgb );
+ orDmlColor.addTransformation( nModToken, static_cast< sal_Int32 >( nValue * ::oox::drawingml::MAX_PERCENT / 255 ) );
+ return;
+ }
+ }
+ }
+
+ OSL_ENSURE( false, OStringBuffer( "lclGetColor - invalid VML color name '" ).
+ append( OUStringToOString( roVmlColor.get(), RTL_TEXTENCODING_ASCII_US ) ).append( '\'' ).getStr() );
+ orDmlColor.setSrgbClr( nDefaultRgb );
+}
+
+sal_Int32 lclGetEmu( const FilterBase& rFilter, const OptValue< OUString >& roValue, sal_Int32 nDefValue )
+{
+ return roValue.has() ? ConversionHelper::decodeMeasureToEmu( rFilter, roValue.get(), 0, false, false ) : nDefValue;
+}
+
+void lclGetDmlLineDash( OptValue< sal_Int32 >& oroPresetDash, LineProperties::DashStopVector& orCustomDash, const OptValue< OUString >& roDashStyle )
+{
+ if( roDashStyle.has() )
+ {
+ const OUString& rDashStyle = roDashStyle.get();
+ switch( StaticTokenMap::get().getTokenFromUnicode( rDashStyle ) )
+ {
+ case XML_solid: oroPresetDash = XML_solid; return;
+ case XML_shortdot: oroPresetDash = XML_sysDot; return;
+ case XML_shortdash: oroPresetDash = XML_sysDash; return;
+ case XML_shortdashdot: oroPresetDash = XML_sysDashDot; return;
+ case XML_shortdashdotdot: oroPresetDash = XML_sysDashDotDot; return;
+ case XML_dot: oroPresetDash = XML_dot; return;
+ case XML_dash: oroPresetDash = XML_dash; return;
+ case XML_dashdot: oroPresetDash = XML_dashDot; return;
+ case XML_longdash: oroPresetDash = XML_lgDash; return;
+ case XML_longdashdot: oroPresetDash = XML_lgDashDot; return;
+ case XML_longdashdotdot: oroPresetDash = XML_lgDashDotDot; return;
+
+ // try to convert user-defined dash style
+ default:
+ {
+ ::std::vector< sal_Int32 > aValues;
+ sal_Int32 nIndex = 0;
+ while( nIndex >= 0 )
+ aValues.push_back( rDashStyle.getToken( 0, ' ', nIndex ).toInt32() );
+ size_t nPairs = aValues.size() / 2; // ignore last value if size is odd
+ for( size_t nPairIdx = 0; nPairIdx < nPairs; ++nPairIdx )
+ orCustomDash.push_back( LineProperties::DashStop( aValues[ 2 * nPairIdx ], aValues[ 2 * nPairIdx + 1 ] ) );
+ }
+ }
+ }
+}
+
+sal_Int32 lclGetDmlArrowType( const OptValue< sal_Int32 >& roArrowType )
+{
+ if( roArrowType.has() ) switch( roArrowType.get() )
+ {
+ case XML_none: return XML_none;
+ case XML_block: return XML_triangle;
+ case XML_classic: return XML_stealth;
+ case XML_diamond: return XML_diamond;
+ case XML_oval: return XML_oval;
+ case XML_open: return XML_arrow;
+ }
+ return XML_none;
+}
+
+sal_Int32 lclGetDmlArrowWidth( const OptValue< sal_Int32 >& roArrowWidth )
+{
+ if( roArrowWidth.has() ) switch( roArrowWidth.get() )
+ {
+ case XML_narrow: return XML_sm;
+ case XML_medium: return XML_med;
+ case XML_wide: return XML_lg;
+ }
+ return XML_med;
+}
+
+sal_Int32 lclGetDmlArrowLength( const OptValue< sal_Int32 >& roArrowLength )
+{
+ if( roArrowLength.has() ) switch( roArrowLength.get() )
+ {
+ case XML_short: return XML_sm;
+ case XML_medium: return XML_med;
+ case XML_long: return XML_lg;
+ }
+ return XML_med;
+}
+
+void lclConvertArrow( LineArrowProperties& orArrowProp, const StrokeArrowModel& rStrokeArrow )
+{
+ orArrowProp.moArrowType = lclGetDmlArrowType( rStrokeArrow.moArrowType );
+ orArrowProp.moArrowWidth = lclGetDmlArrowWidth( rStrokeArrow.moArrowWidth );
+ orArrowProp.moArrowLength = lclGetDmlArrowLength( rStrokeArrow.moArrowLength );
+}
+
+sal_Int32 lclGetDmlLineCompound( const OptValue< sal_Int32 >& roLineStyle )
+{
+ if( roLineStyle.has() ) switch( roLineStyle.get() )
+ {
+ case XML_single: return XML_sng;
+ case XML_thinThin: return XML_dbl;
+ case XML_thinThick: return XML_thinThick;
+ case XML_thickThin: return XML_thickThin;
+ case XML_thickBetweenThin: return XML_tri;
+ }
+ return XML_sng;
+}
+
+sal_Int32 lclGetDmlLineCap( const OptValue< sal_Int32 >& roEndCap )
+{
+ if( roEndCap.has() ) switch( roEndCap.get() )
+ {
+ case XML_flat: return XML_flat;
+ case XML_square: return XML_sq;
+ case XML_round: return XML_rnd;
+ }
+ return XML_flat; // different defaults in VML (flat) and DrawingML (square)
+}
+
+sal_Int32 lclGetDmlLineJoint( const OptValue< sal_Int32 >& roJoinStyle )
+{
+ if( roJoinStyle.has() ) switch( roJoinStyle.get() )
+ {
+ case XML_round: return XML_round;
+ case XML_bevel: return XML_bevel;
+ case XML_miter: return XML_miter;
+ }
+ return XML_round;
+}
+
+} // namespace
+
+// ============================================================================
+
+void StrokeArrowModel::assignUsed( const StrokeArrowModel& rSource )
+{
+ moArrowType.assignIfUsed( rSource.moArrowType );
+ moArrowWidth.assignIfUsed( rSource.moArrowWidth );
+ moArrowLength.assignIfUsed( rSource.moArrowLength );
+}
+
+// ============================================================================
+
+void StrokeModel::assignUsed( const StrokeModel& rSource )
+{
+ moStroked.assignIfUsed( rSource.moStroked );
+ maStartArrow.assignUsed( rSource.maStartArrow );
+ maEndArrow.assignUsed( rSource.maEndArrow );
+ moColor.assignIfUsed( rSource.moColor );
+ moOpacity.assignIfUsed( rSource.moOpacity );
+ moWeight.assignIfUsed( rSource.moWeight );
+ moDashStyle.assignIfUsed( rSource.moDashStyle );
+ moLineStyle.assignIfUsed( rSource.moLineStyle );
+ moEndCap.assignIfUsed( rSource.moEndCap );
+ moJoinStyle.assignIfUsed( rSource.moJoinStyle );
+}
+
+void StrokeModel::pushToPropMap( PropertyMap& rPropMap, const FilterBase& rFilter ) const
+{
+ /* Convert VML line formatting to DrawingML line formatting and let the
+ DrawingML code do the hard work. */
+ LineProperties aLineProps;
+
+ if( moStroked.get( true ) )
+ {
+ aLineProps.maLineFill.moFillType = XML_solidFill;
+ lclConvertArrow( aLineProps.maStartArrow, maStartArrow );
+ lclConvertArrow( aLineProps.maEndArrow, maEndArrow );
+ lclGetColor( aLineProps.maLineFill.maFillColor, rFilter, moColor, moOpacity, API_RGB_BLACK );
+ aLineProps.moLineWidth = lclGetEmu( rFilter, moWeight, 1 );
+ lclGetDmlLineDash( aLineProps.moPresetDash, aLineProps.maCustomDash, moDashStyle );
+ aLineProps.moLineCompound = lclGetDmlLineCompound( moLineStyle );
+ aLineProps.moLineCap = lclGetDmlLineCap( moEndCap );
+ aLineProps.moLineJoint = lclGetDmlLineJoint( moJoinStyle );
+ }
+ else
+ {
+ aLineProps.maLineFill.moFillType = XML_noFill;
+ }
+
+ aLineProps.pushToPropMap( rPropMap, rFilter, rFilter.getModelObjectHelper() );
+}
+
+// ============================================================================
+
+void FillModel::assignUsed( const FillModel& rSource )
+{
+ moFilled.assignIfUsed( rSource.moFilled );
+ moColor.assignIfUsed( rSource.moColor );
+ moOpacity.assignIfUsed( rSource.moOpacity );
+ moColor2.assignIfUsed( rSource.moColor2 );
+ moOpacity2.assignIfUsed( rSource.moOpacity2 );
+ moType.assignIfUsed( rSource.moType );
+ moAngle.assignIfUsed( rSource.moAngle );
+ moFocus.assignIfUsed( rSource.moFocus );
+ moFocusPos.assignIfUsed( rSource.moFocusPos );
+ moFocusSize.assignIfUsed( rSource.moFocusSize );
+ moRotate.assignIfUsed( rSource.moRotate );
+}
+
+void FillModel::pushToPropMap( PropertyMap& rPropMap, const FilterBase& rFilter ) const
+{
+ /* Convert VML fill formatting to DrawingML fill formatting and let the
+ DrawingML code do the hard work. */
+ FillProperties aFillProps;
+
+ if( moFilled.get( true ) )
+ {
+ sal_Int32 nFillType = moType.get( XML_solid );
+ switch( nFillType )
+ {
+ case XML_gradient:
+ case XML_gradientRadial:
+ {
+ aFillProps.moFillType = XML_gradFill;
+ aFillProps.maGradientProps.moRotateWithShape = moRotate.get( false );
+ double fFocus = moFocus.get( 0.0 );
+
+ // prepare colors
+ Color aColor1, aColor2;
+ lclGetColor( aColor1, rFilter, moColor, moOpacity, API_RGB_WHITE );
+ lclGetColor( aColor2, rFilter, moColor2, moOpacity2, API_RGB_WHITE, aColor1.getColor( rFilter ) );
+
+ // type XML_gradient is linear or axial gradient
+ if( nFillType == XML_gradient )
+ {
+ // normalize angle to range [0;360) degrees
+ sal_Int32 nVmlAngle = getIntervalValue< sal_Int32, sal_Int32 >( moAngle.get( 0 ), 0, 360 );
+
+ // focus of -50% or 50% is axial gradient
+ if( ((-0.75 <= fFocus) && (fFocus <= -0.25)) || ((0.25 <= fFocus) && (fFocus <= 0.75)) )
+ {
+ /* According to spec, focus of 50% is outer-to-inner,
+ and -50% is inner-to-outer (color to color2).
+ BUT: For angles >= 180 deg., the behaviour is
+ reversed... that's not spec'ed of course. So,
+ [0;180) deg. and 50%, or [180;360) deg. and -50% is
+ outer-to-inner in fact. */
+ bool bOuterToInner = (fFocus > 0.0) == (nVmlAngle < 180);
+ // simulate axial gradient by 3-step DrawingML gradient
+ const Color& rOuterColor = bOuterToInner ? aColor1 : aColor2;
+ const Color& rInnerColor = bOuterToInner ? aColor2 : aColor1;
+ aFillProps.maGradientProps.maGradientStops[ 0.0 ] = aFillProps.maGradientProps.maGradientStops[ 1.0 ] = rOuterColor;
+ aFillProps.maGradientProps.maGradientStops[ 0.5 ] = rInnerColor;
+ }
+ else // focus of -100%, 0%, and 100% is linear gradient
+ {
+ /* According to spec, focus of -100% or 100% swaps the
+ start and stop colors, effectively reversing the
+ gradient. BUT: For angles >= 180 deg., the
+ behaviour is reversed. This means that in this case
+ a focus of 0% swaps the gradient. */
+ if( ((fFocus < -0.75) || (fFocus > 0.75)) == (nVmlAngle < 180) )
+ (nVmlAngle += 180) %= 360;
+ // set the start and stop colors
+ aFillProps.maGradientProps.maGradientStops[ 0.0 ] = aColor1;
+ aFillProps.maGradientProps.maGradientStops[ 1.0 ] = aColor2;
+ }
+
+ // VML counts counterclockwise from bottom, DrawingML clockwise from left
+ sal_Int32 nDmlAngle = (630 - nVmlAngle) % 360;
+ aFillProps.maGradientProps.moShadeAngle = nDmlAngle * ::oox::drawingml::PER_DEGREE;
+ }
+ else // XML_gradientRadial is rectangular gradient
+ {
+ aFillProps.maGradientProps.moGradientPath = XML_rect;
+ // convert VML focus position and size to DrawingML fill-to-rect
+ DoublePair aFocusPos = moFocusPos.get( DoublePair( 0.0, 0.0 ) );
+ DoublePair aFocusSize = moFocusSize.get( DoublePair( 0.0, 0.0 ) );
+ double fLeft = getLimitedValue< double, double >( aFocusPos.first, 0.0, 1.0 );
+ double fTop = getLimitedValue< double, double >( aFocusPos.second, 0.0, 1.0 );
+ double fRight = getLimitedValue< double, double >( fLeft + aFocusSize.first, fLeft, 1.0 );
+ double fBottom = getLimitedValue< double, double >( fTop + aFocusSize.second, fTop, 1.0 );
+ aFillProps.maGradientProps.moFillToRect = IntegerRectangle2D(
+ static_cast< sal_Int32 >( fLeft * ::oox::drawingml::MAX_PERCENT ),
+ static_cast< sal_Int32 >( fTop * ::oox::drawingml::MAX_PERCENT ),
+ static_cast< sal_Int32 >( (1.0 - fRight) * ::oox::drawingml::MAX_PERCENT ),
+ static_cast< sal_Int32 >( (1.0 - fBottom) * ::oox::drawingml::MAX_PERCENT ) );
+
+ // set the start and stop colors (focus of 0% means outer-to-inner)
+ bool bOuterToInner = (-0.5 <= fFocus) && (fFocus <= 0.5);
+ aFillProps.maGradientProps.maGradientStops[ 0.0 ] = bOuterToInner ? aColor2 : aColor1;
+ aFillProps.maGradientProps.maGradientStops[ 1.0 ] = bOuterToInner ? aColor1 : aColor2;
+ }
+ }
+ break;
+
+ case XML_solid:
+ default:
+ {
+ aFillProps.moFillType = XML_solidFill;
+ // fill color (default is white)
+ lclGetColor( aFillProps.maFillColor, rFilter, moColor, moOpacity, API_RGB_WHITE );
+ }
+ }
+ }
+ else
+ {
+ aFillProps.moFillType = XML_noFill;
+ }
+
+ aFillProps.pushToPropMap( rPropMap, rFilter, rFilter.getModelObjectHelper() );
+}
+
+// ============================================================================
+
+} // namespace vml
+} // namespace oox
+
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index e583248adcfa..fe07172599a9 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -33,7 +33,6 @@
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/beans/PropertyValues.hpp>
#include <com/sun/star/awt/XControlModel.hpp>
-#include <com/sun/star/drawing/FillStyle.hpp>
#include <com/sun/star/drawing/PointSequenceSequence.hpp>
#include <com/sun/star/drawing/XControlShape.hpp>
#include <com/sun/star/drawing/XEnhancedCustomShapeDefaulter.hpp>
@@ -75,57 +74,6 @@ namespace vml {
namespace {
-sal_Int32 lclGetMeasure( const XmlFilterBase& /*rFilter*/, const OUString& rValue, sal_Int32 nRefValue )
-{
- // default for missing values is 0
- if( rValue.getLength() == 0 )
- return 0;
-
- // TODO: according to spec, value may contain "auto"
- if( rValue.equalsAscii( "auto" ) )
- return nRefValue;
-
- // extract the double value and find start position of unit characters
- rtl_math_ConversionStatus eConvStatus = rtl_math_ConversionStatus_Ok;
- sal_Int32 nEndPos = 0;
- double fValue = ::rtl::math::stringToDouble( rValue, '.', '\0', &eConvStatus, &nEndPos );
- if( (eConvStatus != rtl_math_ConversionStatus_Ok) || (fValue == 0.0) )
- return 0;
-
- // process trailing unit, convert to 1/100 mm
- static const OUString saPx = CREATE_OUSTRING( "px" );
- OUString aUnit = ((0 < nEndPos) && (nEndPos < rValue.getLength())) ? rValue.copy( nEndPos ) : saPx;
- if( aUnit.getLength() == 2 )
- {
- sal_Unicode cChar1 = aUnit[ 0 ];
- sal_Unicode cChar2 = aUnit[ 1 ];
- if( (cChar1 == 'i') && (cChar2 == 'n') ) // 1 inch = 2540 1/100mm
- fValue *= 2540.0;
- else if( (cChar1 == 'c') && (cChar2 == 'm') ) // 1 cm = 1000 1/100mm
- fValue *= 1000.0;
- else if( (cChar1 == 'm') && (cChar2 == 'm') ) // 1 mm = 100 1/100mm
- fValue *= 100.0;
- else if( (cChar1 == 'p') && (cChar2 == 't') ) // 1 point = 1/72 inch
- fValue *= 2540.0 / 72.0;
- else if( (cChar1 == 'p') && (cChar2 == 'c') ) // 1 pica = 1/6 inch
- fValue *= 2540.0 / 6.0;
- else if( (cChar1 == 'e') && (cChar2 == 'm') ) // relative to refvalue
- fValue *= nRefValue;
- else if( (cChar1 == 'p') && (cChar2 == 'x') ) // 1 pixel, dependent on output device
- fValue *= 1.0;
- }
- else if( (aUnit.getLength() == 1) && (aUnit[ 0 ] == '%') )
- {
- fValue *= nRefValue / 100.0;
- }
- else
- {
- OSL_ENSURE( false, "lclGetMeasure - unknown measure unit" );
- fValue = nRefValue;
- }
- return static_cast< sal_Int32 >( fValue + 0.5 );
-}
-
Point lclGetAbsPoint( const Point& rRelPoint, const Rectangle& rShapeRect, const Rectangle& rCoordSys )
{
double fWidthRatio = static_cast< double >( rShapeRect.Width ) / rCoordSys.Width;
@@ -164,7 +112,7 @@ Reference< XShape > lclCreateXShape( const XmlFilterBase& rFilter, const OUStrin
return xShape;
}
-void lclInsertXShape( const Reference< XShapes >& rxShapes, const Reference< XShape >& rxShape, const Rectangle& rShapeRect )
+void lclInsertXShape( const Reference< XShapes >& rxShapes, const Reference< XShape >& rxShape )
{
OSL_ENSURE( rxShapes.is(), "lclInsertXShape - missing XShapes container" );
OSL_ENSURE( rxShape.is(), "lclInsertXShape - missing XShape" );
@@ -172,20 +120,28 @@ void lclInsertXShape( const Reference< XShapes >& rxShapes, const Reference< XSh
{
// insert shape into passed shape collection (maybe drawpage or group shape)
rxShapes->add( rxShape );
- // set position/size
- rxShape->setPosition( Point( rShapeRect.X, rShapeRect.Y ) );
- rxShape->setSize( Size( rShapeRect.Width, rShapeRect.Height ) );
}
catch( Exception& )
{
}
}
+void lclSetXShapeRect( const Reference< XShape >& rxShape, const Rectangle& rShapeRect )
+{
+ OSL_ENSURE( rxShape.is(), "lclSetXShapeRect - missing XShape" );
+ if( rxShape.is() )
+ {
+ rxShape->setPosition( Point( rShapeRect.X, rShapeRect.Y ) );
+ rxShape->setSize( Size( rShapeRect.Width, rShapeRect.Height ) );
+ }
+}
+
Reference< XShape > lclCreateAndInsertXShape( const XmlFilterBase& rFilter,
const Reference< XShapes >& rxShapes, const OUString& rService, const Rectangle& rShapeRect )
{
Reference< XShape > xShape = lclCreateXShape( rFilter, rService );
- lclInsertXShape( rxShapes, xShape, rShapeRect );
+ lclInsertXShape( rxShapes, xShape );
+ lclSetXShapeRect( xShape, rShapeRect );
return xShape;
}
@@ -199,17 +155,13 @@ ShapeTypeModel::ShapeTypeModel()
void ShapeTypeModel::assignUsed( const ShapeTypeModel& rSource )
{
- monShapeType.assignIfUsed( rSource.monShapeType );
- monCoordLeft.assignIfUsed( rSource.monCoordLeft );
- monCoordTop.assignIfUsed( rSource.monCoordTop );
- monCoordWidth.assignIfUsed( rSource.monCoordWidth );
- monCoordHeight.assignIfUsed( rSource.monCoordHeight );
+ moShapeType.assignIfUsed( rSource.moShapeType );
+ moCoordPos.assignIfUsed( rSource.moCoordPos );
+ moCoordSize.assignIfUsed( rSource.moCoordSize );
/* The style properties position, left, top, width, height, margin-left,
margin-top are not derived from shape template to shape. */
- mobStroked.assignIfUsed( rSource.mobStroked );
- moStrokeColor.assignIfUsed( rSource.moStrokeColor );
- mobFilled.assignIfUsed( rSource.mobFilled );
- moFillColor.assignIfUsed( rSource.moFillColor );
+ maStrokeModel.assignUsed( rSource.maStrokeModel );
+ maFillModel.assignUsed( rSource.maFillModel );
moGraphicPath.assignIfUsed( rSource.moGraphicPath );
moGraphicTitle.assignIfUsed( rSource.moGraphicTitle );
}
@@ -232,11 +184,9 @@ OUString ShapeType::getGraphicPath() const
Rectangle ShapeType::getCoordSystem() const
{
- return Rectangle(
- maTypeModel.monCoordLeft.get( 0 ),
- maTypeModel.monCoordTop.get( 0 ),
- maTypeModel.monCoordWidth.get( 1000 ),
- maTypeModel.monCoordHeight.get( 1000 ) );
+ Int32Pair aCoordPos = maTypeModel.moCoordPos.get( Int32Pair( 0, 0 ) );
+ Int32Pair aCoordSize = maTypeModel.moCoordSize.get( Int32Pair( 1000, 1000 ) );
+ return Rectangle( aCoordPos.first, aCoordPos.second, aCoordSize.first, aCoordSize.second );
}
Rectangle ShapeType::getRectangle( const ShapeParentAnchor* pParentAnchor ) const
@@ -250,10 +200,10 @@ Rectangle ShapeType::getAbsRectangle() const
{
const XmlFilterBase& rFilter = mrDrawing.getFilter();
return Rectangle(
- lclGetMeasure( rFilter, maTypeModel.maLeft, 0 ) + lclGetMeasure( rFilter, maTypeModel.maMarginLeft, 0 ),
- lclGetMeasure( rFilter, maTypeModel.maTop, 0 ) + lclGetMeasure( rFilter, maTypeModel.maMarginTop, 0 ),
- lclGetMeasure( rFilter, maTypeModel.maWidth, 0 ),
- lclGetMeasure( rFilter, maTypeModel.maHeight, 0 ) );
+ ConversionHelper::decodeMeasureToHmm( rFilter, maTypeModel.maLeft, 0, true, true ) + ConversionHelper::decodeMeasureToHmm( rFilter, maTypeModel.maMarginLeft, 0, true, true ),
+ ConversionHelper::decodeMeasureToHmm( rFilter, maTypeModel.maTop, 0, false, true ) + ConversionHelper::decodeMeasureToHmm( rFilter, maTypeModel.maMarginTop, 0, false, true ),
+ ConversionHelper::decodeMeasureToHmm( rFilter, maTypeModel.maWidth, 0, true, true ),
+ ConversionHelper::decodeMeasureToHmm( rFilter, maTypeModel.maHeight, 0, false, true ) );
}
Rectangle ShapeType::getRelRectangle() const
@@ -269,7 +219,10 @@ Rectangle ShapeType::getRelRectangle() const
ShapeClientData::ShapeClientData() :
mnObjType( XML_TOKEN_INVALID ),
- mbPrintObject( true )
+ mnCol( -1 ),
+ mnRow( -1 ),
+ mbPrintObject( true ),
+ mbVisible( false )
{
}
@@ -313,27 +266,55 @@ const ShapeBase* ShapeBase::getChildById( const OUString& ) const
Reference< XShape > ShapeBase::convertAndInsert( const Reference< XShapes >& rxShapes, const ShapeParentAnchor* pParentAnchor ) const
{
Reference< XShape > xShape;
+ if( mrDrawing.isShapeSupported( *this ) )
+ {
+ /* Calculate shape rectangle. Applications may do something special
+ according to some imported shape client data (e.g. Excel cell anchor). */
+ Rectangle aShapeRect = calcShapeRectangle( pParentAnchor );
+ // convert the shape, if the calculated rectangle is not empty
+ if( ((aShapeRect.Width > 0) || (aShapeRect.Height > 0)) && rxShapes.is() )
+ xShape = implConvertAndInsert( rxShapes, aShapeRect );
+ }
+ return xShape;
+}
+
+void ShapeBase::convertFormatting( const Reference< XShape >& rxShape, const ShapeParentAnchor* pParentAnchor ) const
+{
+ if( rxShape.is() )
+ {
+ /* Calculate shape rectangle. Applications may do something special
+ according to some imported shape client data (e.g. Excel cell anchor). */
+ Rectangle aShapeRect = calcShapeRectangle( pParentAnchor );
+ // convert the shape, if the calculated rectangle is not empty
+ if( (aShapeRect.Width > 0) || (aShapeRect.Height > 0) )
+ {
+ lclSetXShapeRect( rxShape, aShapeRect );
+ convertShapeProperties( rxShape );
+ }
+ }
+}
+
+// protected ------------------------------------------------------------------
+
+Rectangle ShapeBase::calcShapeRectangle( const ShapeParentAnchor* pParentAnchor ) const
+{
/* Calculate shape rectangle. Applications may do something special
according to some imported shape client data (e.g. Excel cell anchor). */
Rectangle aShapeRect;
if( !maShapeModel.mxClientData.get() || !mrDrawing.convertShapeClientAnchor( aShapeRect, maShapeModel.mxClientData->maAnchor ) )
aShapeRect = getRectangle( pParentAnchor );
- // convert the shape, if the calculated rectangle is not empty
- if( (aShapeRect.Width > 0) || (aShapeRect.Height > 0) && rxShapes.is() )
- xShape = implConvertAndInsert( rxShapes, aShapeRect );
- return xShape;
+ return aShapeRect;
}
-// protected ------------------------------------------------------------------
-
void ShapeBase::convertShapeProperties( const Reference< XShape >& rxShape ) const
{
- // shape properties
- PropertySet aPropSet( rxShape );
+ PropertyMap aPropMap;
+
+ maTypeModel.maStrokeModel.pushToPropMap( aPropMap, mrDrawing.getFilter() );
+ maTypeModel.maFillModel.pushToPropMap( aPropMap, mrDrawing.getFilter() );
- // fill style
- bool bFilled = maTypeModel.mobFilled.get( true );
- aPropSet.setProperty( PROP_FillStyle, bFilled ? ::com::sun::star::drawing::FillStyle_SOLID : ::com::sun::star::drawing::FillStyle_NONE );
+ PropertySet aPropSet( rxShape );
+ aPropSet.setProperties( aPropMap );
}
// ============================================================================
@@ -405,7 +386,7 @@ Reference< XShape > CustomShape::implConvertAndInsert( const Reference< XShapes
{
// create the custom shape geometry
Reference< XEnhancedCustomShapeDefaulter > xDefaulter( xShape, UNO_QUERY_THROW );
- xDefaulter->createCustomShapeDefaults( OUString::valueOf( maTypeModel.monShapeType.get( 0 ) ) );
+ xDefaulter->createCustomShapeDefaults( OUString::valueOf( maTypeModel.moShapeType.get( 0 ) ) );
// convert common properties
convertShapeProperties( xShape );
}
@@ -537,21 +518,27 @@ const ShapeBase* GroupShape::getChildById( const OUString& rShapeId ) const
Reference< XShape > GroupShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
{
- Reference< XShape > xShape;
+ Reference< XShape > xGroupShape;
// check that this shape contains children and a valid coordinate system
ShapeParentAnchor aParentAnchor;
aParentAnchor.maShapeRect = rShapeRect;
aParentAnchor.maCoordSys = getCoordSystem();
if( !mxChildren->empty() && (aParentAnchor.maCoordSys.Width > 0) && (aParentAnchor.maCoordSys.Height > 0) ) try
{
- xShape = lclCreateAndInsertXShape( mrDrawing.getFilter(), rxShapes, CREATE_OUSTRING( "com.sun.star.drawing.GroupShape" ), rShapeRect );
- Reference< XShapes > xShapes( xShape, UNO_QUERY_THROW );
- mxChildren->convertAndInsert( xShapes, &aParentAnchor );
+ xGroupShape = lclCreateAndInsertXShape( mrDrawing.getFilter(), rxShapes, CREATE_OUSTRING( "com.sun.star.drawing.GroupShape" ), rShapeRect );
+ Reference< XShapes > xChildShapes( xGroupShape, UNO_QUERY_THROW );
+ mxChildren->convertAndInsert( xChildShapes, &aParentAnchor );
+ // no child shape has been created - delete the group shape
+ if( !xChildShapes->hasElements() )
+ {
+ rxShapes->remove( xGroupShape );
+ xGroupShape.clear();
+ }
}
catch( Exception& )
{
}
- return xShape;
+ return xGroupShape;
}
// ============================================================================
diff --git a/oox/source/vml/vmlshapecontext.cxx b/oox/source/vml/vmlshapecontext.cxx
index dcf842a67a8f..725af97777c3 100644
--- a/oox/source/vml/vmlshapecontext.cxx
+++ b/oox/source/vml/vmlshapecontext.cxx
@@ -45,19 +45,62 @@ namespace vml {
namespace {
-bool lclSeparateValue( OUString& orName, OUString& orValue, const OUString& rAttrib, sal_Unicode cSep = ':' )
+/** Returns the boolean value from the specified VML attribute (if present).
+ */
+OptValue< bool > lclDecodeBool( const AttributeList& rAttribs, sal_Int32 nElement )
+{
+ OptValue< OUString > oValue = rAttribs.getString( nElement );
+ if( oValue.has() ) return OptValue< bool >( ConversionHelper::decodeBool( oValue.get() ) );
+ return OptValue< bool >();
+}
+
+/** Returns the percentage value from the specified VML attribute (if present).
+ The value will be normalized (1.0 is returned for 100%).
+ */
+OptValue< double > lclDecodePercent( const AttributeList& rAttribs, sal_Int32 nElement, double fDefValue )
+{
+ OptValue< OUString > oValue = rAttribs.getString( nElement );
+ if( oValue.has() ) return OptValue< double >( ConversionHelper::decodePercent( oValue.get(), fDefValue ) );
+ return OptValue< double >();
+}
+
+/** Returns the integer value pair from the specified VML attribute (if present).
+ */
+OptValue< Int32Pair > lclDecodeInt32Pair( const AttributeList& rAttribs, sal_Int32 nElement )
+{
+ OptValue< OUString > oValue = rAttribs.getString( nElement );
+ OptValue< Int32Pair > oRetValue;
+ if( oValue.has() )
+ {
+ OUString aValue1, aValue2;
+ ConversionHelper::separatePair( aValue1, aValue2, oValue.get(), ',' );
+ oRetValue = Int32Pair( aValue1.toInt32(), aValue2.toInt32() );
+ }
+ return oRetValue;
+}
+
+/** Returns the percentage pair from the specified VML attribute (if present).
+ */
+OptValue< DoublePair > lclDecodePercentPair( const AttributeList& rAttribs, sal_Int32 nElement )
{
- sal_Int32 nSepPos = rAttrib.indexOf( cSep );
- if( nSepPos <= 0 ) return false;
- orName = rAttrib.copy( 0, nSepPos ).trim();
- orValue = rAttrib.copy( nSepPos + 1 ).trim();
- return (orName.getLength() > 0) && (orValue.getLength() > 0);
+ OptValue< OUString > oValue = rAttribs.getString( nElement );
+ OptValue< DoublePair > oRetValue;
+ if( oValue.has() )
+ {
+ OUString aValue1, aValue2;
+ ConversionHelper::separatePair( aValue1, aValue2, oValue.get(), ',' );
+ oRetValue = DoublePair(
+ ConversionHelper::decodePercent( aValue1, 0.0 ),
+ ConversionHelper::decodePercent( aValue2, 0.0 ) );
+ }
+ return oRetValue;
}
-/** Returns the boolean value from the passed string (supported: f, t, False, True).
+/** Returns the boolean value from the passed string of an attribute in the x:
+ namespace (VML for spreadsheets). Supported values: f, t, False, True.
@param bDefaultForEmpty Default value for the empty string.
*/
-bool lclDecodeBool( const OUString& rValue, bool bDefaultForEmpty )
+bool lclDecodeVmlxBool( const OUString& rValue, bool bDefaultForEmpty )
{
if( rValue.getLength() == 0 ) return bDefaultForEmpty;
// anything else than 't' or 'True' is considered to be false, as specified
@@ -85,11 +128,14 @@ void ShapeClientDataContext::onEndElement( const OUString& rChars )
{
switch( getCurrentElement() )
{
- case VMLX_TOKEN( Anchor ): mrClientData.maAnchor = rChars; break;
- case VMLX_TOKEN( FmlaLink ): mrClientData.maLinkedCell = rChars; break;
- case VMLX_TOKEN( FmlaPict ): mrClientData.maPictureLink = rChars; break;
- case VMLX_TOKEN( FmlaRange ): mrClientData.maSourceRange = rChars; break;
- case VMLX_TOKEN( PrintObject ): mrClientData.mbPrintObject = lclDecodeBool( rChars, true ); break;
+ case VMLX_TOKEN( Anchor ): mrClientData.maAnchor = rChars; break;
+ case VMLX_TOKEN( FmlaPict ): mrClientData.maPictureLink = rChars; break;
+ case VMLX_TOKEN( FmlaLink ): mrClientData.maLinkedCell = rChars; break;
+ case VMLX_TOKEN( FmlaRange ): mrClientData.maSourceRange = rChars; break;
+ case VMLX_TOKEN( Column ): mrClientData.mnCol = rChars.toInt32(); break;
+ case VMLX_TOKEN( Row ): mrClientData.mnRow = rChars.toInt32(); break;
+ case VMLX_TOKEN( PrintObject ): mrClientData.mbPrintObject = lclDecodeVmlxBool( rChars, true ); break;
+ case VMLX_TOKEN( Visible ): mrClientData.mbVisible = true; break;
}
}
@@ -100,7 +146,7 @@ ShapeContextBase::ShapeContextBase( ContextHandler2Helper& rParent ) :
{
}
-/*static*/ ContextHandlerRef ShapeContextBase::createContext( ContextHandler2Helper& rParent,
+/*static*/ ContextHandlerRef ShapeContextBase::createShapeContext( ContextHandler2Helper& rParent,
sal_Int32 nElement, const AttributeList& rAttribs, ShapeContainer& rShapes )
{
switch( nElement )
@@ -144,24 +190,56 @@ ShapeTypeContext::ShapeTypeContext( ContextHandler2Helper& rParent, const Attrib
if( bHasOspid )
mrTypeModel.maName = rAttribs.getXString( XML_id, OUString() );
// builtin shape type identifier
- mrTypeModel.monShapeType = rAttribs.getInteger( O_TOKEN( spt ) );
- // coordinate system position/size
- setCoordOrigin( rAttribs.getString( XML_coordorigin, OUString() ) );
- setCoordSize( rAttribs.getString( XML_coordsize, OUString() ) );
- // CSS style
+ mrTypeModel.moShapeType = rAttribs.getInteger( O_TOKEN( spt ) );
+
+ // coordinate system position/size, CSS style
+ mrTypeModel.moCoordPos = lclDecodeInt32Pair( rAttribs, XML_coordorigin );
+ mrTypeModel.moCoordSize = lclDecodeInt32Pair( rAttribs, XML_coordsize );
setStyle( rAttribs.getString( XML_style, OUString() ) );
- // border line
- mrTypeModel.mobStroked = rAttribs.getBool( XML_stroked );
- mrTypeModel.moStrokeColor = rAttribs.getString( XML_strokecolor );
- // shape fill
- mrTypeModel.mobFilled = rAttribs.getBool( XML_filled );
- mrTypeModel.moFillColor = rAttribs.getString( XML_fillcolor );
+
+ // stroke settings (may be overridden by v:stroke element later)
+ mrTypeModel.maStrokeModel.moStroked = lclDecodeBool( rAttribs, XML_stroked );
+ mrTypeModel.maStrokeModel.moColor = rAttribs.getString( XML_strokecolor );
+ mrTypeModel.maStrokeModel.moWeight = rAttribs.getString( XML_strokeweight );
+
+ // fill settings (may be overridden by v:fill element later)
+ mrTypeModel.maFillModel.moFilled = lclDecodeBool( rAttribs, XML_filled );
+ mrTypeModel.maFillModel.moColor = rAttribs.getString( XML_fillcolor );
}
ContextHandlerRef ShapeTypeContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
{
if( isRootElement() ) switch( nElement )
{
+ case VML_TOKEN( stroke ):
+ mrTypeModel.maStrokeModel.moStroked.assignIfUsed( lclDecodeBool( rAttribs, XML_on ) );
+ mrTypeModel.maStrokeModel.maStartArrow.moArrowType = rAttribs.getToken( XML_startarrow );
+ mrTypeModel.maStrokeModel.maStartArrow.moArrowWidth = rAttribs.getToken( XML_startarrowwidth );
+ mrTypeModel.maStrokeModel.maStartArrow.moArrowLength = rAttribs.getToken( XML_startarrowlength );
+ mrTypeModel.maStrokeModel.maEndArrow.moArrowType = rAttribs.getToken( XML_endarrow );
+ mrTypeModel.maStrokeModel.maEndArrow.moArrowWidth = rAttribs.getToken( XML_endarrowwidth );
+ mrTypeModel.maStrokeModel.maEndArrow.moArrowLength = rAttribs.getToken( XML_endarrowlength );
+ mrTypeModel.maStrokeModel.moColor.assignIfUsed( rAttribs.getString( XML_color ) );
+ mrTypeModel.maStrokeModel.moOpacity = lclDecodePercent( rAttribs, XML_opacity, 1.0 );
+ mrTypeModel.maStrokeModel.moWeight.assignIfUsed( rAttribs.getString( XML_weight ) );
+ mrTypeModel.maStrokeModel.moDashStyle = rAttribs.getString( XML_dashstyle );
+ mrTypeModel.maStrokeModel.moLineStyle = rAttribs.getToken( XML_linestyle );
+ mrTypeModel.maStrokeModel.moEndCap = rAttribs.getToken( XML_endcap );
+ mrTypeModel.maStrokeModel.moJoinStyle = rAttribs.getToken( XML_joinstyle );
+ break;
+ case VML_TOKEN( fill ):
+ mrTypeModel.maFillModel.moFilled.assignIfUsed( lclDecodeBool( rAttribs, XML_on ) );
+ mrTypeModel.maFillModel.moColor.assignIfUsed( rAttribs.getString( XML_color ) );
+ mrTypeModel.maFillModel.moOpacity = lclDecodePercent( rAttribs, XML_opacity, 1.0 );
+ mrTypeModel.maFillModel.moColor2 = rAttribs.getString( XML_color2 );
+ mrTypeModel.maFillModel.moOpacity2 = lclDecodePercent( rAttribs, XML_opacity2, 1.0 );
+ mrTypeModel.maFillModel.moType = rAttribs.getToken( XML_type );
+ mrTypeModel.maFillModel.moAngle = rAttribs.getInteger( XML_angle );
+ mrTypeModel.maFillModel.moFocus = lclDecodePercent( rAttribs, XML_focus, 0.0 );
+ mrTypeModel.maFillModel.moFocusPos = lclDecodePercentPair( rAttribs, XML_focusposition );
+ mrTypeModel.maFillModel.moFocusSize = lclDecodePercentPair( rAttribs, XML_focussize );
+ mrTypeModel.maFillModel.moRotate = lclDecodeBool( rAttribs, XML_rotate );
+ break;
case VML_TOKEN( imagedata ):
OptValue< OUString > oGraphicRelId = rAttribs.getString( O_TOKEN( relid ) );
if( oGraphicRelId.has() )
@@ -172,33 +250,13 @@ ContextHandlerRef ShapeTypeContext::onCreateContext( sal_Int32 nElement, const A
return 0;
}
-void ShapeTypeContext::setCoordOrigin( const OUString& rCoordOrigin )
-{
- OUString aCoordL, aCoordT;
- if( lclSeparateValue( aCoordL, aCoordT, rCoordOrigin, ',' ) )
- {
- mrTypeModel.monCoordLeft = aCoordL.toInt32();
- mrTypeModel.monCoordTop = aCoordT.toInt32();
- }
-}
-
-void ShapeTypeContext::setCoordSize( const OUString& rCoordSize )
-{
- OUString aCoordW, aCoordH;
- if( lclSeparateValue( aCoordW, aCoordH, rCoordSize, ',' ) )
- {
- mrTypeModel.monCoordWidth = aCoordW.toInt32();
- mrTypeModel.monCoordHeight = aCoordH.toInt32();
- }
-}
-
void ShapeTypeContext::setStyle( const OUString& rStyle )
{
sal_Int32 nIndex = 0;
while( nIndex >= 0 )
{
OUString aName, aValue;
- if( lclSeparateValue( aName, aValue, rStyle.getToken( 0, ';', nIndex ) ) )
+ if( ConversionHelper::separatePair( aName, aValue, rStyle.getToken( 0, ';', nIndex ), ':' ) )
{
if( aName.equalsAscii( "position" ) ) mrTypeModel.maPosition = aValue;
else if( aName.equalsAscii( "left" ) ) mrTypeModel.maLeft = aValue;
@@ -255,7 +313,7 @@ GroupShapeContext::GroupShapeContext( ContextHandler2Helper& rParent, const Attr
ContextHandlerRef GroupShapeContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
{
// try to create a context of an embedded shape
- ContextHandlerRef xContext = ShapeContextBase::createContext( *this, nElement, rAttribs, mrShapes );
+ ContextHandlerRef xContext = createShapeContext( *this, nElement, rAttribs, mrShapes );
// handle remaining stuff of this shape in base class
return xContext.get() ? xContext : ShapeContext::onCreateContext( nElement, rAttribs );
}
diff --git a/oox/source/xls/biffcodec.cxx b/oox/source/xls/biffcodec.cxx
index b76f51ad0e7e..a589b1b3218f 100644
--- a/oox/source/xls/biffcodec.cxx
+++ b/oox/source/xls/biffcodec.cxx
@@ -31,95 +31,89 @@
#include "oox/xls/biffcodec.hxx"
#include <osl/thread.h>
#include <string.h>
+#include "oox/core/filterbase.hxx"
#include "oox/xls/biffinputstream.hxx"
using ::rtl::OString;
using ::rtl::OUString;
using ::rtl::OStringToOUString;
+using ::oox::core::FilterBase;
namespace oox {
namespace xls {
// ============================================================================
-BiffDecoderBase::BiffDecoderBase( const WorkbookHelper& rHelper ) :
- WorkbookHelper( rHelper ),
- mnError( CODEC_ERROR_UNSUPP_CRYPT )
+BiffDecoderBase::BiffDecoderBase() :
+ mbValid( false )
{
}
-BiffDecoderBase::BiffDecoderBase( const BiffDecoderBase& rDecoder ) :
- WorkbookHelper( rDecoder ),
- mnError( rDecoder.mnError )
+BiffDecoderBase::~BiffDecoderBase()
{
}
-BiffDecoderBase::~BiffDecoderBase()
+::comphelper::DocPasswordVerifierResult BiffDecoderBase::verifyPassword( const OUString& rPassword )
{
+ mbValid = implVerify( rPassword );
+ return mbValid ? ::comphelper::DocPasswordVerifierResult_OK : ::comphelper::DocPasswordVerifierResult_WRONG_PASSWORD;
}
void BiffDecoderBase::decode( sal_uInt8* pnDestData, const sal_uInt8* pnSrcData, sal_Int64 nStreamPos, sal_uInt16 nBytes )
{
if( pnDestData && pnSrcData && (nBytes > 0) )
{
- if( isValid() )
+ if( mbValid )
implDecode( pnDestData, pnSrcData, nStreamPos, nBytes );
else
memcpy( pnDestData, pnSrcData, nBytes );
}
}
-void BiffDecoderBase::setHasValidPassword( bool bValid )
-{
- mnError = bValid ? CODEC_OK : CODEC_ERROR_WRONG_PASS;
-}
-
// ============================================================================
-BiffDecoder_XOR::BiffDecoder_XOR( const WorkbookHelper& rHelper, sal_uInt16 nKey, sal_uInt16 nHash ) :
- BiffDecoderBase( rHelper ),
+BiffDecoder_XOR::BiffDecoder_XOR( sal_uInt16 nKey, sal_uInt16 nHash ) :
maCodec( ::oox::core::BinaryCodec_XOR::CODEC_EXCEL ),
+ maPassword( 16 ),
mnKey( nKey ),
mnHash( nHash )
{
- init( BiffCodecHelper::getBiff5WbProtPassword() );
- if( !isValid() )
- init( OUStringToOString( getCodecHelper().queryPassword(), osl_getThreadTextEncoding() ) );
}
BiffDecoder_XOR::BiffDecoder_XOR( const BiffDecoder_XOR& rDecoder ) :
- BiffDecoderBase( rDecoder ),
+ BiffDecoderBase(), // must be called to prevent compiler warning
maCodec( ::oox::core::BinaryCodec_XOR::CODEC_EXCEL ),
+ maPassword( rDecoder.maPassword ),
mnKey( rDecoder.mnKey ),
mnHash( rDecoder.mnHash )
{
- init( rDecoder.maPass );
+ if( isValid() )
+ maCodec.initKey( &maPassword.front() );
}
-void BiffDecoder_XOR::init( const OString& rPass )
+BiffDecoder_XOR* BiffDecoder_XOR::implClone()
{
- maPass = rPass;
- sal_Int32 nLen = maPass.getLength();
- bool bValid = (0 < nLen) && (nLen < 16);
+ return new BiffDecoder_XOR( *this );
+}
- if( bValid )
+bool BiffDecoder_XOR::implVerify( const OUString& rPassword )
+{
+ /* Convert password to a byte string. TODO: this needs some finetuning
+ according to the spec... */
+ OString aBytePassword = OUStringToOString( rPassword, osl_getThreadTextEncoding() );
+ sal_Int32 nLen = aBytePassword.getLength();
+ if( (0 < nLen) && (nLen < 16) )
{
// copy byte string to sal_uInt8 array
- sal_uInt8 pnPassw[ 16 ];
- memset( pnPassw, 0, sizeof( pnPassw ) );
- memcpy( pnPassw, maPass.getStr(), static_cast< size_t >( nLen ) );
+ maPassword.clear();
+ maPassword.resize( 16, 0 );
+ memcpy( &maPassword.front(), aBytePassword.getStr(), static_cast< size_t >( nLen ) );
// init codec
- maCodec.initKey( pnPassw );
- bValid = maCodec.verifyKey( mnKey, mnHash );
+ maCodec.initKey( &maPassword.front() );
+ return maCodec.verifyKey( mnKey, mnHash );
}
-
- setHasValidPassword( bValid );
-}
-
-BiffDecoder_XOR* BiffDecoder_XOR::implClone()
-{
- return new BiffDecoder_XOR( *this );
+ return false;
}
void BiffDecoder_XOR::implDecode( sal_uInt8* pnDestData, const sal_uInt8* pnSrcData, sal_Int64 nStreamPos, sal_uInt16 nBytes )
@@ -149,55 +143,49 @@ sal_Int32 lclGetRcfOffset( sal_Int64 nStreamPos )
// ----------------------------------------------------------------------------
-BiffDecoder_RCF::BiffDecoder_RCF( const WorkbookHelper& rHelper,
- sal_uInt8 pnDocId[ 16 ], sal_uInt8 pnSaltData[ 16 ], sal_uInt8 pnSaltHash[ 16 ] ) :
- BiffDecoderBase( rHelper ),
- maDocId( pnDocId, pnDocId + 16 ),
- maSaltData( pnSaltData, pnSaltData + 16 ),
- maSaltHash( pnSaltHash, pnSaltHash + 16 )
+BiffDecoder_RCF::BiffDecoder_RCF( sal_uInt8 pnSalt[ 16 ], sal_uInt8 pnVerifier[ 16 ], sal_uInt8 pnVerifierHash[ 16 ] ) :
+ maPassword( 16, 0 ),
+ maSalt( pnSalt, pnSalt + 16 ),
+ maVerifier( pnVerifier, pnVerifier + 16 ),
+ maVerifierHash( pnVerifierHash, pnVerifierHash + 16 )
{
- init( BiffCodecHelper::getBiff8WbProtPassword() );
- if( !isValid() )
- init( getCodecHelper().queryPassword() );
}
BiffDecoder_RCF::BiffDecoder_RCF( const BiffDecoder_RCF& rDecoder ) :
- BiffDecoderBase( rDecoder ),
- maDocId( rDecoder.maDocId ),
- maSaltData( rDecoder.maSaltData ),
- maSaltHash( rDecoder.maSaltHash )
+ BiffDecoderBase(), // must be called to prevent compiler warning
+ maPassword( rDecoder.maPassword ),
+ maSalt( rDecoder.maSalt ),
+ maVerifier( rDecoder.maVerifier ),
+ maVerifierHash( rDecoder.maVerifierHash )
{
- init( rDecoder.maPass );
+ if( isValid() )
+ maCodec.initKey( &maPassword.front(), &maSalt.front() );
}
-void BiffDecoder_RCF::init( const OUString& rPass )
+BiffDecoder_RCF* BiffDecoder_RCF::implClone()
{
- maPass = rPass;
- sal_Int32 nLen = maPass.getLength();
- bool bValid = (0 < nLen) && (nLen < 16);
+ return new BiffDecoder_RCF( *this );
+}
- if( bValid )
+bool BiffDecoder_RCF::implVerify( const OUString& rPassword )
+{
+ sal_Int32 nLen = rPassword.getLength();
+ if( (0 < nLen) && (nLen < 16) )
{
// copy string to sal_uInt16 array
- sal_uInt16 pnPassw[ 16 ];
- memset( pnPassw, 0, sizeof( pnPassw ) );
- const sal_Unicode* pcChar = maPass.getStr();
+ maPassword.clear();
+ maPassword.resize( 16, 0 );
+ const sal_Unicode* pcChar = rPassword.getStr();
const sal_Unicode* pcCharEnd = pcChar + nLen;
- sal_uInt16* pnCurrPass = pnPassw;
- for( ; pcChar < pcCharEnd; ++pcChar, ++pnCurrPass )
- *pnCurrPass = static_cast< sal_uInt16 >( *pcChar );
+ ::std::vector< sal_uInt16 >::iterator aIt = maPassword.begin();
+ for( ; pcChar < pcCharEnd; ++pcChar, ++aIt )
+ *aIt = static_cast< sal_uInt16 >( *pcChar );
// init codec
- maCodec.initKey( pnPassw, &maDocId.front() );
- bValid = maCodec.verifyKey( &maSaltData.front(), &maSaltHash.front() );
+ maCodec.initKey( &maPassword.front(), &maSalt.front() );
+ return maCodec.verifyKey( &maVerifier.front(), &maVerifierHash.front() );
}
-
- setHasValidPassword( bValid );
-}
-
-BiffDecoder_RCF* BiffDecoder_RCF::implClone()
-{
- return new BiffDecoder_RCF( *this );
+ return false;
}
void BiffDecoder_RCF::implDecode( sal_uInt8* pnDestData, const sal_uInt8* pnSrcData, sal_Int64 nStreamPos, sal_uInt16 nBytes )
@@ -229,130 +217,117 @@ void BiffDecoder_RCF::implDecode( sal_uInt8* pnDestData, const sal_uInt8* pnSrcD
namespace {
-const sal_uInt16 BIFF_FILEPASS_BIFF2 = 0x0000;
-const sal_uInt16 BIFF_FILEPASS_BIFF8 = 0x0001;
-const sal_uInt16 BIFF_FILEPASS_BIFF8_RCF = 0x0001;
-const sal_uInt16 BIFF_FILEPASS_BIFF8_STRONG = 0x0002;
+const sal_uInt16 BIFF_FILEPASS_XOR = 0;
+const sal_uInt16 BIFF_FILEPASS_RCF = 1;
-} // namespace
+const sal_uInt16 BIFF_FILEPASS_BIFF8_RCF = 1;
+const sal_uInt16 BIFF_FILEPASS_BIFF8_CRYPTOAPI_2003 = 2;
+const sal_uInt16 BIFF_FILEPASS_BIFF8_CRYPTOAPI_2007 = 3;
// ----------------------------------------------------------------------------
-BiffCodecHelper::BiffCodecHelper( const WorkbookHelper& rHelper ) :
- WorkbookHelper( rHelper ),
- mbHasPassword( false )
-{
-}
-
-const OString& BiffCodecHelper::getBiff5WbProtPassword()
-{
- static const OString saPass( "VelvetSweatshop" );
- return saPass;
-}
-
-const OUString& BiffCodecHelper::getBiff8WbProtPassword()
+BiffDecoderRef lclReadFilePass_XOR( BiffInputStream& rStrm )
{
- static const OUString saPass = OStringToOUString( getBiff5WbProtPassword(), RTL_TEXTENCODING_ASCII_US );
- return saPass;
-}
-
-OUString BiffCodecHelper::queryPassword()
-{
- if( !mbHasPassword )
- {
- //! TODO
- maPassword = OUString();
- // set to true, even if dialog has been cancelled (never ask twice)
- mbHasPassword = true;
- }
- return maPassword;
-}
-
-bool BiffCodecHelper::importFilePass( BiffInputStream& rStrm )
-{
- OSL_ENSURE( !mxDecoder, "BiffCodecHelper::importFilePass - multiple FILEPASS records" );
- rStrm.enableDecoder( false );
- mxDecoder.reset();
- if( getBiff() == BIFF8 ) importFilePass8( rStrm ); else importFilePass2( rStrm );
-
- // set decoder at import stream
- rStrm.setDecoder( mxDecoder );
- //! TODO remember encryption state for export
-// mrStrm.GetRoot().GetExtDocOptions().GetDocSettings().mbEncrypted = true;
-
- return mxDecoder.get() && mxDecoder->isValid();
-}
-
-void BiffCodecHelper::cloneDecoder( BiffInputStream& rStrm )
-{
- if( mxDecoder.get() )
- rStrm.setDecoder( BiffDecoderRef( mxDecoder->clone() ) );
-}
-
-// private --------------------------------------------------------------------
-
-void BiffCodecHelper::importFilePass_XOR( BiffInputStream& rStrm )
-{
- OSL_ENSURE( rStrm.getRemaining() == 4, "BiffCodecHelper::importFilePass_XOR - wrong record size" );
+ BiffDecoderRef xDecoder;
+ OSL_ENSURE( rStrm.getRemaining() == 4, "lclReadFilePass_XOR - wrong record size" );
if( rStrm.getRemaining() == 4 )
{
sal_uInt16 nBaseKey, nHash;
rStrm >> nBaseKey >> nHash;
- mxDecoder.reset( new BiffDecoder_XOR( *this, nBaseKey, nHash ) );
+ xDecoder.reset( new BiffDecoder_XOR( nBaseKey, nHash ) );
}
+ return xDecoder;
}
-void BiffCodecHelper::importFilePass_RCF( BiffInputStream& rStrm )
+BiffDecoderRef lclReadFilePass_RCF( BiffInputStream& rStrm )
{
- OSL_ENSURE( rStrm.getRemaining() == 48, "BiffCodecHelper::importFilePass_RCF - wrong record size" );
+ BiffDecoderRef xDecoder;
+ OSL_ENSURE( rStrm.getRemaining() == 48, "lclReadFilePass_RCF - wrong record size" );
if( rStrm.getRemaining() == 48 )
{
- sal_uInt8 pnDocId[ 16 ];
- sal_uInt8 pnSaltData[ 16 ];
- sal_uInt8 pnSaltHash[ 16 ];
- rStrm.readMemory( pnDocId, 16 );
- rStrm.readMemory( pnSaltData, 16 );
- rStrm.readMemory( pnSaltHash, 16 );
- mxDecoder.reset( new BiffDecoder_RCF( *this, pnDocId, pnSaltData, pnSaltHash ) );
+ sal_uInt8 pnSalt[ 16 ];
+ sal_uInt8 pnVerifier[ 16 ];
+ sal_uInt8 pnVerifierHash[ 16 ];
+ rStrm.readMemory( pnSalt, 16 );
+ rStrm.readMemory( pnVerifier, 16 );
+ rStrm.readMemory( pnVerifierHash, 16 );
+ xDecoder.reset( new BiffDecoder_RCF( pnSalt, pnVerifier, pnVerifierHash ) );
}
+ return xDecoder;
}
-void BiffCodecHelper::importFilePass_Strong( BiffInputStream& /*rStrm*/ )
+BiffDecoderRef lclReadFilePass_CryptoApi( BiffInputStream& /*rStrm*/ )
{
// not supported
+ return BiffDecoderRef();
}
-void BiffCodecHelper::importFilePass2( BiffInputStream& rStrm )
-{
- importFilePass_XOR( rStrm );
-}
-
-void BiffCodecHelper::importFilePass8( BiffInputStream& rStrm )
+BiffDecoderRef lclReadFilePassBiff8( BiffInputStream& rStrm )
{
+ BiffDecoderRef xDecoder;
switch( rStrm.readuInt16() )
{
- case BIFF_FILEPASS_BIFF2:
- importFilePass_XOR( rStrm );
+ case BIFF_FILEPASS_XOR:
+ xDecoder = lclReadFilePass_XOR( rStrm );
break;
- case BIFF_FILEPASS_BIFF8:
+ case BIFF_FILEPASS_RCF:
+ {
+ sal_uInt16 nMajor = rStrm.readuInt16();
rStrm.skip( 2 );
- switch( rStrm.readuInt16() )
+ switch( nMajor )
{
case BIFF_FILEPASS_BIFF8_RCF:
- importFilePass_RCF( rStrm );
+ xDecoder = lclReadFilePass_RCF( rStrm );
break;
- case BIFF_FILEPASS_BIFF8_STRONG:
- importFilePass_Strong( rStrm );
+ case BIFF_FILEPASS_BIFF8_CRYPTOAPI_2003:
+ case BIFF_FILEPASS_BIFF8_CRYPTOAPI_2007:
+ xDecoder = lclReadFilePass_CryptoApi( rStrm );
break;
default:
- OSL_ENSURE( false, "BiffCodecHelper::importFilePass8 - unknown BIFF8 encryption sub mode" );
+ OSL_ENSURE( false, "lclReadFilePassBiff8 - unknown BIFF8 encryption sub mode" );
}
+ }
break;
default:
- OSL_ENSURE( false, "BiffCodecHelper::importFilePass8 - unknown encryption mode" );
+ OSL_ENSURE( false, "lclReadFilePassBiff8 - unknown encryption mode" );
}
+ return xDecoder;
+}
+
+} // namespace
+
+// ----------------------------------------------------------------------------
+
+BiffCodecHelper::BiffCodecHelper( const WorkbookHelper& rHelper ) :
+ WorkbookHelper( rHelper )
+{
+}
+
+/*static*/ BiffDecoderRef BiffCodecHelper::implReadFilePass( BiffInputStream& rStrm, BiffType eBiff )
+{
+ rStrm.enableDecoder( false );
+ BiffDecoderRef xDecoder = (eBiff == BIFF8) ? lclReadFilePassBiff8( rStrm ) : lclReadFilePass_XOR( rStrm );
+ rStrm.setDecoder( xDecoder );
+ return xDecoder;
+}
+
+bool BiffCodecHelper::importFilePass( BiffInputStream& rStrm )
+{
+ OSL_ENSURE( !mxDecoder, "BiffCodecHelper::importFilePass - multiple FILEPASS records" );
+ mxDecoder = implReadFilePass( rStrm, getBiff() );
+ // request and verify a password (decoder implements IDocPasswordVerifier)
+ if( mxDecoder.get() )
+ getBaseFilter().requestPassword( *mxDecoder );
+ // correct password is indicated by isValid() function of decoder
+ return mxDecoder.get() && mxDecoder->isValid();
+}
+
+void BiffCodecHelper::cloneDecoder( BiffInputStream& rStrm )
+{
+ if( mxDecoder.get() )
+ rStrm.setDecoder( BiffDecoderRef( mxDecoder->clone() ) );
}
// ============================================================================
diff --git a/oox/source/xls/chartsheetfragment.cxx b/oox/source/xls/chartsheetfragment.cxx
index 3df5ff9c3e2a..7e5b9198c1da 100644
--- a/oox/source/xls/chartsheetfragment.cxx
+++ b/oox/source/xls/chartsheetfragment.cxx
@@ -47,7 +47,7 @@ namespace xls {
// ============================================================================
OoxChartsheetFragment::OoxChartsheetFragment( const WorkbookHelper& rHelper,
- const OUString& rFragmentPath, ISegmentProgressBarRef xProgressBar, sal_Int32 nSheet ) :
+ const OUString& rFragmentPath, ISegmentProgressBarRef xProgressBar, sal_Int16 nSheet ) :
OoxWorksheetFragmentBase( rHelper, rFragmentPath, xProgressBar, SHEETTYPE_CHARTSHEET, nSheet )
{
}
@@ -185,7 +185,7 @@ void OoxChartsheetFragment::importDrawing( RecordInputStream& rStrm )
// ============================================================================
BiffChartsheetFragment::BiffChartsheetFragment( const BiffWorkbookFragmentBase& rParent,
- ISegmentProgressBarRef xProgressBar, sal_Int32 nSheet ) :
+ ISegmentProgressBarRef xProgressBar, sal_Int16 nSheet ) :
BiffWorksheetFragmentBase( rParent, xProgressBar, SHEETTYPE_CHARTSHEET, nSheet )
{
}
diff --git a/oox/source/xls/commentsbuffer.cxx b/oox/source/xls/commentsbuffer.cxx
index 1f725bfd7fbc..c8f11d55154e 100644
--- a/oox/source/xls/commentsbuffer.cxx
+++ b/oox/source/xls/commentsbuffer.cxx
@@ -33,22 +33,24 @@
#include <com/sun/star/sheet/XSheetAnnotationShapeSupplier.hpp>
#include <com/sun/star/sheet/XSheetAnnotations.hpp>
#include <com/sun/star/sheet/XSheetAnnotationsSupplier.hpp>
-#include <com/sun/star/text/XText.hpp>
#include "oox/helper/attributelist.hxx"
#include "oox/helper/recordinputstream.hxx"
+#include "oox/vml/vmlshape.hxx"
#include "oox/xls/addressconverter.hxx"
+#include "oox/xls/drawingfragment.hxx"
using ::rtl::OUString;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::Exception;
using ::com::sun::star::uno::UNO_QUERY_THROW;
using ::com::sun::star::uno::UNO_SET_THROW;
+using ::com::sun::star::drawing::XShape;
using ::com::sun::star::table::CellAddress;
+using ::com::sun::star::sheet::XSheetAnnotation;
using ::com::sun::star::sheet::XSheetAnnotationAnchor;
using ::com::sun::star::sheet::XSheetAnnotationShapeSupplier;
using ::com::sun::star::sheet::XSheetAnnotations;
using ::com::sun::star::sheet::XSheetAnnotationsSupplier;
-using ::com::sun::star::text::XText;
namespace oox {
namespace xls {
@@ -98,16 +100,29 @@ void Comment::finalizeImport()
if( getAddressConverter().checkCellAddress( aNotePos, true ) && maModel.mxText.get() ) try
{
maModel.mxText->finalizeImport();
- Reference< XSheetAnnotationsSupplier > xAnnosSupp( getSheet(), UNO_QUERY_THROW );
- Reference< XSheetAnnotations > xAnnos( xAnnosSupp->getAnnotations(), UNO_SET_THROW );
- // create note with dummy non-empty string (required by implementation)
- xAnnos->insertNew( aNotePos, OUString( sal_Unicode( ' ' ) ) );
- // receive craeted note from cell (insertNew does not return the note)
-// Reference< XSheetAnnotationAnchor > xAnnoAnchor( getCell( aNotePos ), UNO_QUERY_THROW );
-// Reference< XSheetAnnotationShapeSupplier > xAnnoShapeSupp( xAnnoAnchor->getAnnotation(), UNO_QUERY_THROW );
-// Reference< XText > xNoteText( xAnnoShapeSupp->getAnnotationShape(), UNO_QUERY_THROW );
-// xNoteText->setString( OUString() );
-// maModel.mxText->convert( xNoteText, -1 );
+ OUString aNoteText = maModel.mxText->getPlainText();
+ // non-empty string required by note implementation
+ if( aNoteText.getLength() > 0 )
+ {
+ Reference< XSheetAnnotationsSupplier > xAnnosSupp( getSheet(), UNO_QUERY_THROW );
+ Reference< XSheetAnnotations > xAnnos( xAnnosSupp->getAnnotations(), UNO_SET_THROW );
+ xAnnos->insertNew( aNotePos, aNoteText );
+ // receive craeted note from cell (insertNew does not return the note)
+ Reference< XSheetAnnotationAnchor > xAnnoAnchor( getCell( aNotePos ), UNO_QUERY_THROW );
+ Reference< XSheetAnnotation > xAnno( xAnnoAnchor->getAnnotation(), UNO_SET_THROW );
+ Reference< XSheetAnnotationShapeSupplier > xAnnoShapeSupp( xAnno, UNO_QUERY_THROW );
+ Reference< XShape > xAnnoShape( xAnnoShapeSupp->getAnnotationShape(), UNO_SET_THROW );
+ // convert shape formatting
+ if( const ::oox::vml::ShapeBase* pNoteShape = getVmlDrawing().getNoteShape( aNotePos ) )
+ {
+ // position and formatting
+ pNoteShape->convertFormatting( xAnnoShape );
+ // visibility
+ const ::oox::vml::ShapeModel::ShapeClientDataPtr& rxClientData = pNoteShape->getShapeModel().mxClientData;
+ bool bVisible = rxClientData.get() && rxClientData->mbVisible;
+ xAnno->setIsVisible( bVisible );
+ }
+ }
}
catch( Exception& )
{
diff --git a/oox/source/xls/defnamesbuffer.cxx b/oox/source/xls/defnamesbuffer.cxx
index 786d0cd41334..b2c724b6728d 100644
--- a/oox/source/xls/defnamesbuffer.cxx
+++ b/oox/source/xls/defnamesbuffer.cxx
@@ -31,6 +31,7 @@
#include "oox/xls/defnamesbuffer.hxx"
#include <rtl/ustrbuf.hxx>
#include <com/sun/star/sheet/ComplexReference.hpp>
+#include <com/sun/star/sheet/ExternalReference.hpp>
#include <com/sun/star/sheet/NamedRangeFlag.hpp>
#include <com/sun/star/sheet/ReferenceFlags.hpp>
#include <com/sun/star/sheet/SingleReference.hpp>
@@ -43,6 +44,7 @@
#include "oox/xls/biffinputstream.hxx"
#include "oox/xls/externallinkbuffer.hxx"
#include "oox/xls/formulaparser.hxx"
+#include "oox/xls/worksheetbuffer.hxx"
using ::rtl::OUString;
using ::rtl::OUStringBuffer;
@@ -52,10 +54,10 @@ using ::com::sun::star::uno::UNO_QUERY;
using ::com::sun::star::table::CellAddress;
using ::com::sun::star::table::CellRangeAddress;
using ::com::sun::star::sheet::ComplexReference;
+using ::com::sun::star::sheet::ExternalReference;
using ::com::sun::star::sheet::SingleReference;
using ::com::sun::star::sheet::XFormulaTokens;
using ::com::sun::star::sheet::XPrintAreas;
-using namespace ::com::sun::star::sheet::ReferenceFlags;
namespace oox {
namespace xls {
@@ -205,6 +207,7 @@ void lclConvertRefFlags( sal_Int32& ornFlags, sal_Int32& ornAbsPos, sal_Int32& o
void lclConvertSingleRefFlags( SingleReference& orApiRef, const CellAddress& rBaseAddress, bool bColRel, bool bRowRel )
{
+ using namespace ::com::sun::star::sheet::ReferenceFlags;
lclConvertRefFlags(
orApiRef.Flags, orApiRef.Column, orApiRef.RelativeColumn,
rBaseAddress.Column, COLUMN_RELATIVE, bColRel );
@@ -213,14 +216,33 @@ void lclConvertSingleRefFlags( SingleReference& orApiRef, const CellAddress& rBa
rBaseAddress.Row, ROW_RELATIVE, bRowRel );
}
+Any lclConvertReference( const Any& rRefAny, const CellAddress& rBaseAddress, sal_uInt16 nRelFlags )
+{
+ if( rRefAny.has< SingleReference >() && !getFlag( nRelFlags, BIFF_REFFLAG_COL2REL ) && !getFlag( nRelFlags, BIFF_REFFLAG_ROW2REL ) )
+ {
+ SingleReference aApiRef;
+ rRefAny >>= aApiRef;
+ lclConvertSingleRefFlags( aApiRef, rBaseAddress, getFlag( nRelFlags, BIFF_REFFLAG_COL1REL ), getFlag( nRelFlags, BIFF_REFFLAG_ROW1REL ) );
+ return Any( aApiRef );
+ }
+ if( rRefAny.has< ComplexReference >() )
+ {
+ ComplexReference aApiRef;
+ rRefAny >>= aApiRef;
+ lclConvertSingleRefFlags( aApiRef.Reference1, rBaseAddress, getFlag( nRelFlags, BIFF_REFFLAG_COL1REL ), getFlag( nRelFlags, BIFF_REFFLAG_ROW1REL ) );
+ lclConvertSingleRefFlags( aApiRef.Reference2, rBaseAddress, getFlag( nRelFlags, BIFF_REFFLAG_COL2REL ), getFlag( nRelFlags, BIFF_REFFLAG_ROW2REL ) );
+ return Any( aApiRef );
+ }
+ return Any();
+}
+
} // namespace
// ----------------------------------------------------------------------------
-DefinedNameBase::DefinedNameBase( const WorkbookHelper& rHelper, sal_Int32 nLocalSheet ) :
+DefinedNameBase::DefinedNameBase( const WorkbookHelper& rHelper ) :
WorkbookHelper( rHelper )
{
- maModel.mnSheet = nLocalSheet;
}
const OUString& DefinedNameBase::getUpcaseModelName() const
@@ -237,62 +259,63 @@ Any DefinedNameBase::getReference( const CellAddress& rBaseAddress ) const
sal_Unicode cFlagsChar = getUpcaseModelName()[ 1 ];
if( ('A' <= cFlagsChar) && (cFlagsChar <= 'P') )
{
- sal_uInt16 nFlags = static_cast< sal_uInt16 >( cFlagsChar - 'A' );
- if( maRefAny.has< SingleReference >() && (cFlagsChar <= 'D') )
+ sal_uInt16 nRelFlags = static_cast< sal_uInt16 >( cFlagsChar - 'A' );
+ if( maRefAny.has< ExternalReference >() )
{
- SingleReference aApiRef;
- maRefAny >>= aApiRef;
- lclConvertSingleRefFlags( aApiRef, rBaseAddress, getFlag( nFlags, BIFF_REFFLAG_COL1REL ), getFlag( nFlags, BIFF_REFFLAG_ROW1REL ) );
- return Any( aApiRef );
+ ExternalReference aApiExtRef;
+ maRefAny >>= aApiExtRef;
+ Any aRefAny = lclConvertReference( aApiExtRef.Reference, rBaseAddress, nRelFlags );
+ if( aRefAny.hasValue() )
+ {
+ aApiExtRef.Reference <<= aRefAny;
+ return Any( aApiExtRef );
+ }
}
- if( maRefAny.has< ComplexReference >() )
+ else
{
- ComplexReference aApiRef;
- maRefAny >>= aApiRef;
- lclConvertSingleRefFlags( aApiRef.Reference1, rBaseAddress, getFlag( nFlags, BIFF_REFFLAG_COL1REL ), getFlag( nFlags, BIFF_REFFLAG_ROW1REL ) );
- lclConvertSingleRefFlags( aApiRef.Reference2, rBaseAddress, getFlag( nFlags, BIFF_REFFLAG_COL2REL ), getFlag( nFlags, BIFF_REFFLAG_ROW2REL ) );
- return Any( aApiRef );
+ return lclConvertReference( maRefAny, rBaseAddress, nRelFlags );
}
}
}
return Any();
}
-void DefinedNameBase::importOoxFormula( FormulaContext& rContext )
+void DefinedNameBase::importOoxFormula( FormulaContext& rContext, sal_Int16 nBaseSheet )
{
if( maModel.maFormula.getLength() > 0 )
{
- rContext.setBaseAddress( CellAddress( static_cast< sal_Int16 >( maModel.mnSheet ), 0, 0 ) );
+ rContext.setBaseAddress( CellAddress( nBaseSheet, 0, 0 ) );
getFormulaParser().importFormula( rContext, maModel.maFormula );
}
else
getFormulaParser().convertErrorToFormula( rContext, BIFF_ERR_NAME );
}
-void DefinedNameBase::importOobFormula( FormulaContext& rContext, RecordInputStream& rStrm )
+void DefinedNameBase::importOobFormula( FormulaContext& rContext, sal_Int16 nBaseSheet, RecordInputStream& rStrm )
{
- rContext.setBaseAddress( CellAddress( static_cast< sal_Int16 >( maModel.mnSheet ), 0, 0 ) );
+ rContext.setBaseAddress( CellAddress( nBaseSheet, 0, 0 ) );
getFormulaParser().importFormula( rContext, rStrm );
}
-void DefinedNameBase::importBiffFormula( FormulaContext& rContext, BiffInputStream& rStrm, const sal_uInt16* pnFmlaSize )
+void DefinedNameBase::importBiffFormula( FormulaContext& rContext, sal_Int16 nBaseSheet, BiffInputStream& rStrm, const sal_uInt16* pnFmlaSize )
{
- rContext.setBaseAddress( CellAddress( static_cast< sal_Int16 >( maModel.mnSheet ), 0, 0 ) );
+ rContext.setBaseAddress( CellAddress( nBaseSheet, 0, 0 ) );
if( !pnFmlaSize || (*pnFmlaSize > 0) )
getFormulaParser().importFormula( rContext, rStrm, pnFmlaSize );
else
getFormulaParser().convertErrorToFormula( rContext, BIFF_ERR_NAME );
}
-void DefinedNameBase::setReference( const ApiTokenSequence& rTokens )
+void DefinedNameBase::extractReference( const ApiTokenSequence& rTokens )
{
+ OSL_ENSURE( (getFilterType() == FILTER_BIFF) && (getBiff() <= BIFF4), "DefinedNameBase::extractReference - unexpected call" );
maRefAny = getFormulaParser().extractReference( rTokens );
}
// ============================================================================
-DefinedName::DefinedName( const WorkbookHelper& rHelper, sal_Int32 nLocalSheet ) :
- DefinedNameBase( rHelper, nLocalSheet ),
+DefinedName::DefinedName( const WorkbookHelper& rHelper ) :
+ DefinedNameBase( rHelper ),
mnTokenIndex( -1 ),
mcBuiltinId( OOX_DEFNAME_UNKNOWN ),
mnFmlaSize( 0 )
@@ -309,6 +332,7 @@ void DefinedName::importDefinedName( const AttributeList& rAttribs )
maModel.mbVBName = rAttribs.getBool( XML_vbProcedure, false );
maModel.mbHidden = rAttribs.getBool( XML_hidden, false );
mcBuiltinId = lclGetBuiltinIdFromOox( maModel.maName );
+ mnCalcSheet = (maModel.mnSheet >= 0) ? getWorksheets().getCalcSheetIndex( maModel.mnSheet ) : -1;
}
void DefinedName::setFormula( const OUString& rFormula )
@@ -322,6 +346,7 @@ void DefinedName::importDefinedName( RecordInputStream& rStrm )
rStrm >> nFlags;
rStrm.skip( 1 ); // keyboard shortcut
rStrm >> maModel.mnSheet >> maModel.maName;
+ mnCalcSheet = (maModel.mnSheet >= 0) ? getWorksheets().getCalcSheetIndex( maModel.mnSheet ) : -1;
// macro function/command, hidden flag
maModel.mnFuncGroupId = extractValue< sal_Int32 >( nFlags, 6, 9 );
@@ -351,7 +376,7 @@ void DefinedName::importDefinedName( RecordInputStream& rStrm )
}
}
-void DefinedName::importDefinedName( BiffInputStream& rStrm )
+void DefinedName::importDefinedName( BiffInputStream& rStrm, sal_Int16 nCalcSheet )
{
BiffType eBiff = getBiff();
sal_uInt16 nFlags = 0;
@@ -421,26 +446,45 @@ void DefinedName::importDefinedName( BiffInputStream& rStrm )
case BIFF2:
case BIFF3:
case BIFF4:
+ // BIFF2-BIFF4: all defined names are sheet-local
+ mnCalcSheet = nCalcSheet;
break;
case BIFF5:
// #i44019# nTabId may be invalid, resolve nRefId to sheet index
if( nRefId != BIFF_DEFNAME_GLOBAL )
if( const ExternalLink* pExtLink = getExternalLinks().getExternalLink( nRefId ).get() )
if( pExtLink->getLinkType() == LINKTYPE_INTERNAL )
- maModel.mnSheet = pExtLink->getSheetIndex();
+ mnCalcSheet = pExtLink->getCalcSheetIndex();
break;
case BIFF8:
- // convert one-based sheet index to zero-based
+ // convert one-based worksheet index to zero-based Calc sheet index
OSL_ENSURE( nTabId >= 0, "DefinedName::importDefinedName - invalid local sheet index" );
if( nTabId != BIFF_DEFNAME_GLOBAL )
- maModel.mnSheet = nTabId - 1;
+ mnCalcSheet = getWorksheets().getCalcSheetIndex( nTabId - 1 );
break;
case BIFF_UNKNOWN:
break;
}
- // store record position to be able to import token array later
- mxBiffStrm.reset( new BiffInputStreamPos( rStrm ) );
+ if( (getBiff() <= BIFF4) && maModel.mbHidden && (maModel.maName.getLength() > 1) && (maModel.maName[ 0 ] == '\x01') )
+ {
+ /* Read the token array of special internal names containing addresses
+ for BIFF3-BIFF4 3D references immediately. It is expected that
+ these names contain a simple cell reference or range reference.
+ Other regular defined names and external names rely on existence of
+ this reference. */
+ TokensFormulaContext aContext( true, true );
+ importBiffFormula( aContext, mnCalcSheet, rStrm, &mnFmlaSize );
+ extractReference( aContext.getTokens() );
+ }
+ else
+ {
+ /* Store record position of other defined names to be able to import
+ token array later. This is needed to correctly resolve references
+ to names that are stored later in the defined names list following
+ this name. */
+ mxBiffStrm.reset( new BiffInputStreamPos( rStrm ) );
+ }
}
void DefinedName::createNameObject()
@@ -459,7 +503,8 @@ void DefinedName::createNameObject()
// append sheet index for local names in multi-sheet documents
if( isWorkbookFile() && !isGlobalName() )
- maCalcName = OUStringBuffer( maCalcName ).append( sal_Unicode( '_' ) ).append( maModel.mnSheet + 1 ).makeStringAndClear();
+ maCalcName = OUStringBuffer( maCalcName ).append( sal_Unicode( '_' ) ).
+ append( static_cast< sal_Int32 >( mnCalcSheet + 1 ) ).makeStringAndClear();
// special flags for this name
sal_Int32 nNameFlags = 0;
@@ -506,18 +551,18 @@ void DefinedName::convertFormula()
{
case OOX_DEFNAME_PRINTAREA:
{
- Reference< XPrintAreas > xPrintAreas( getSheetFromDoc( maModel.mnSheet ), UNO_QUERY );
+ Reference< XPrintAreas > xPrintAreas( getSheetFromDoc( mnCalcSheet ), UNO_QUERY );
ApiCellRangeList aPrintRanges;
- getFormulaParser().extractCellRangeList( aPrintRanges, xTokens->getTokens(), false, maModel.mnSheet );
+ getFormulaParser().extractCellRangeList( aPrintRanges, xTokens->getTokens(), false, mnCalcSheet );
if( xPrintAreas.is() && !aPrintRanges.empty() )
xPrintAreas->setPrintAreas( ContainerHelper::vectorToSequence( aPrintRanges ) );
}
break;
case OOX_DEFNAME_PRINTTITLES:
{
- Reference< XPrintAreas > xPrintAreas( getSheetFromDoc( maModel.mnSheet ), UNO_QUERY );
+ Reference< XPrintAreas > xPrintAreas( getSheetFromDoc( mnCalcSheet ), UNO_QUERY );
ApiCellRangeList aTitleRanges;
- getFormulaParser().extractCellRangeList( aTitleRanges, xTokens->getTokens(), false, maModel.mnSheet );
+ getFormulaParser().extractCellRangeList( aTitleRanges, xTokens->getTokens(), false, mnCalcSheet );
if( xPrintAreas.is() && !aTitleRanges.empty() )
{
bool bHasRowTitles = false;
@@ -545,13 +590,6 @@ void DefinedName::convertFormula()
break;
}
}
- else if( mxBiffStrm.get() && maModel.mbHidden && (maModel.maName.getLength() > 0) && (maModel.maName[ 0 ] == '\x01') )
- {
- // import BIFF2-BIFF4 external references
- TokensFormulaContext aContext( true, true );
- implImportBiffFormula( aContext );
- setReference( aContext.getTokens() );
- }
}
bool DefinedName::getAbsoluteRange( CellRangeAddress& orRange ) const
@@ -567,32 +605,34 @@ void DefinedName::implImportOoxFormula( FormulaContext& rContext )
if( mxFormula.get() )
{
RecordInputStream aStrm( *mxFormula );
- importOobFormula( rContext, aStrm );
+ importOobFormula( rContext, mnCalcSheet, aStrm );
}
else
- importOoxFormula( rContext );
+ importOoxFormula( rContext, mnCalcSheet );
}
void DefinedName::implImportBiffFormula( FormulaContext& rContext )
{
- OSL_ENSURE( mxBiffStrm.get(), "DefinedName::importBiffFormula - missing BIFF stream" );
+ OSL_ENSURE( mxBiffStrm.get(), "DefinedName::implImportBiffFormula - missing BIFF stream" );
BiffInputStream& rStrm = mxBiffStrm->getStream();
BiffInputStreamPosGuard aStrmGuard( rStrm );
if( mxBiffStrm->restorePosition() )
- importBiffFormula( rContext, rStrm, &mnFmlaSize );
+ importBiffFormula( rContext, mnCalcSheet, rStrm, &mnFmlaSize );
}
// ============================================================================
DefinedNamesBuffer::DefinedNamesBuffer( const WorkbookHelper& rHelper ) :
WorkbookHelper( rHelper ),
- mnLocalSheet( -1 )
+ mnCalcSheet( -1 )
{
}
-void DefinedNamesBuffer::setLocalSheetIndex( sal_Int32 nLocalSheet )
+void DefinedNamesBuffer::setLocalCalcSheet( sal_Int16 nCalcSheet )
{
- mnLocalSheet = nLocalSheet;
+ OSL_ENSURE( (getFilterType() == FILTER_BIFF) && (getBiff() <= BIFF4),
+ "DefinedNamesBuffer::setLocalCalcSheet - invalid call" );
+ mnCalcSheet = nCalcSheet;
}
DefinedNameRef DefinedNamesBuffer::importDefinedName( const AttributeList& rAttribs )
@@ -609,7 +649,7 @@ void DefinedNamesBuffer::importDefinedName( RecordInputStream& rStrm )
void DefinedNamesBuffer::importDefinedName( BiffInputStream& rStrm )
{
- createDefinedName()->importDefinedName( rStrm );
+ createDefinedName()->importDefinedName( rStrm, mnCalcSheet );
}
void DefinedNamesBuffer::finalizeImport()
@@ -639,7 +679,7 @@ DefinedNameRef DefinedNamesBuffer::getByTokenIndex( sal_Int32 nIndex ) const
return maDefNameMap.get( nIndex );
}
-DefinedNameRef DefinedNamesBuffer::getByModelName( const OUString& rModelName, sal_Int32 nSheet ) const
+DefinedNameRef DefinedNamesBuffer::getByModelName( const OUString& rModelName, sal_Int16 nCalcSheet ) const
{
DefinedNameRef xGlobalName; // a found global name
DefinedNameRef xLocalName; // a found local name
@@ -648,7 +688,7 @@ DefinedNameRef DefinedNamesBuffer::getByModelName( const OUString& rModelName, s
DefinedNameRef xCurrName = *aIt;
if( xCurrName->getModelName() == rModelName )
{
- if( xCurrName->getSheetIndex() == nSheet )
+ if( xCurrName->getLocalCalcSheet() == nCalcSheet )
xLocalName = xCurrName;
else if( xCurrName->isGlobalName() )
xGlobalName = xCurrName;
@@ -659,7 +699,7 @@ DefinedNameRef DefinedNamesBuffer::getByModelName( const OUString& rModelName, s
DefinedNameRef DefinedNamesBuffer::createDefinedName()
{
- DefinedNameRef xDefName( new DefinedName( *this, mnLocalSheet ) );
+ DefinedNameRef xDefName( new DefinedName( *this ) );
maDefNames.push_back( xDefName );
return xDefName;
}
diff --git a/oox/source/xls/drawingfragment.cxx b/oox/source/xls/drawingfragment.cxx
index 14973af544df..9ecc6e5b7a69 100644
--- a/oox/source/xls/drawingfragment.cxx
+++ b/oox/source/xls/drawingfragment.cxx
@@ -43,7 +43,9 @@
#include "oox/drawingml/shapecontext.hxx"
#include "oox/drawingml/shapegroupcontext.hxx"
#include "oox/vml/vmlshape.hxx"
+#include "oox/vml/vmlshapecontainer.hxx"
#include "oox/xls/formulaparser.hxx"
+#include "oox/xls/stylesbuffer.hxx"
#include "oox/xls/themebuffer.hxx"
#include "oox/xls/unitconverter.hxx"
@@ -521,12 +523,52 @@ void OoxDrawingFragment::onEndElement( const OUString& rChars )
// ============================================================================
+namespace {
+
+class VmlFindNoteFunc
+{
+public:
+ explicit VmlFindNoteFunc( const CellAddress& rPos );
+ bool operator()( const ::oox::vml::ShapeBase& rShape ) const;
+
+private:
+ sal_Int32 mnCol;
+ sal_Int32 mnRow;
+};
+
+VmlFindNoteFunc::VmlFindNoteFunc( const CellAddress& rPos ) :
+ mnCol( rPos.Column ),
+ mnRow( rPos.Row )
+{
+}
+
+bool VmlFindNoteFunc::operator()( const ::oox::vml::ShapeBase& rShape ) const
+{
+ const ::oox::vml::ShapeModel::ShapeClientDataPtr& rxClientData = rShape.getShapeModel().mxClientData;
+ return rxClientData.get() && (rxClientData->mnCol == mnCol) && (rxClientData->mnRow == mnRow);
+}
+
+} // namespace
+
+// ----------------------------------------------------------------------------
+
VmlDrawing::VmlDrawing( const WorksheetHelper& rHelper ) :
::oox::vml::Drawing( rHelper.getOoxFilter(), rHelper.getDrawPage(), ::oox::vml::VMLDRAWING_EXCEL ),
WorksheetHelper( rHelper )
{
}
+const ::oox::vml::ShapeBase* VmlDrawing::getNoteShape( const CellAddress& rPos ) const
+{
+ return getShapes().findShape( VmlFindNoteFunc( rPos ) );
+}
+
+bool VmlDrawing::isShapeSupported( const ::oox::vml::ShapeBase& rShape ) const
+{
+ const ::oox::vml::ShapeModel::ShapeClientDataPtr& rxClientData = rShape.getShapeModel().mxClientData;
+ return !rxClientData.get() || (rxClientData->mnObjType != XML_Note);
+}
+
bool VmlDrawing::convertShapeClientAnchor( Rectangle& orShapeRect, const OUString& rShapeAnchor ) const
{
if( rShapeAnchor.getLength() == 0 )
diff --git a/oox/source/xls/excelfilter.cxx b/oox/source/xls/excelfilter.cxx
index f460f3e8fdcb..a5bfe5e3d1d9 100644
--- a/oox/source/xls/excelfilter.cxx
+++ b/oox/source/xls/excelfilter.cxx
@@ -58,6 +58,34 @@ namespace xls {
// ============================================================================
+ExcelFilterBase::ExcelFilterBase() :
+ mpHelper( 0 )
+{
+}
+
+ExcelFilterBase::~ExcelFilterBase()
+{
+ OSL_ENSURE( !mpHelper, "ExcelFilterBase::~ExcelFilterBase - workbook helper not cleared" );
+}
+
+void ExcelFilterBase::setWorkbookHelper( WorkbookHelper& rHelper )
+{
+ mpHelper = &rHelper;
+}
+
+WorkbookHelper& ExcelFilterBase::getWorkbookHelper() const
+{
+ OSL_ENSURE( mpHelper, "ExcelFilterBase::getWorkbookHelper - missing workbook helper" );
+ return *mpHelper;
+}
+
+void ExcelFilterBase::clearWorkbookHelper()
+{
+ mpHelper = 0;
+}
+
+// ============================================================================
+
OUString SAL_CALL ExcelFilter_getImplementationName() throw()
{
return CREATE_OUSTRING( "com.sun.star.comp.oox.ExcelFilter" );
@@ -79,8 +107,7 @@ Reference< XInterface > SAL_CALL ExcelFilter_createInstance(
// ----------------------------------------------------------------------------
ExcelFilter::ExcelFilter( const Reference< XMultiServiceFactory >& rxGlobalFactory ) :
- XmlFilterBase( rxGlobalFactory ),
- mpHelper( 0 )
+ XmlFilterBase( rxGlobalFactory )
{
}
@@ -102,9 +129,9 @@ bool ExcelFilter::importDocument() throw()
WorkbookHelperRoot aHelper( *this );
if( aHelper.isValid() )
{
- mpHelper = &aHelper; // needed for callbacks
+ setWorkbookHelper( aHelper ); // needed for callbacks
bRet = importFragment( new OoxWorkbookFragment( aHelper, aWorkbookPath ) );
- mpHelper = 0;
+ clearWorkbookHelper();
}
}
return bRet;
@@ -115,15 +142,19 @@ bool ExcelFilter::exportDocument() throw()
return false;
}
-const ::oox::drawingml::Theme* ExcelFilter::getCurrentTheme() const
+sal_Int32 ExcelFilter::getSchemeColor( sal_Int32 nToken ) const
{
- return &mpHelper->getTheme();
+ return getWorkbookHelper().getTheme().getColorByToken( nToken );
}
-sal_Int32 ExcelFilter::getSchemeClr( sal_Int32 nColorSchemeToken ) const
+sal_Int32 ExcelFilter::getPaletteColor( sal_Int32 nPaletteIdx ) const
{
- OSL_ENSURE( mpHelper, "ExcelFilter::getSchemeClr - no workbook helper" );
- return mpHelper->getTheme().getColorByToken( nColorSchemeToken );
+ return getWorkbookHelper().getStyles().getPaletteColor( nPaletteIdx );
+}
+
+const ::oox::drawingml::Theme* ExcelFilter::getCurrentTheme() const
+{
+ return &getWorkbookHelper().getTheme();
}
::oox::vml::Drawing* ExcelFilter::getVmlDrawing()
@@ -138,8 +169,7 @@ const TableStyleListPtr ExcelFilter::getTableStyles()
::oox::drawingml::chart::ChartConverter& ExcelFilter::getChartConverter()
{
- OSL_ENSURE( mpHelper, "ExcelFilter::getChartConverter - no workbook helper" );
- return mpHelper->getChartConverter();
+ return getWorkbookHelper().getChartConverter();
}
OUString ExcelFilter::implGetImplementationName() const
@@ -202,7 +232,12 @@ bool ExcelBiffFilter::importDocument() throw()
if( eBiff != BIFF_UNKNOWN )
{
WorkbookHelperRoot aHelper( *this, eBiff );
- bRet = aHelper.isValid() && BiffWorkbookFragment( aHelper, aWorkbookName ).importFragment();
+ if( aHelper.isValid() )
+ {
+ setWorkbookHelper( aHelper ); // needed for callbacks
+ bRet = BiffWorkbookFragment( aHelper, aWorkbookName ).importFragment();
+ clearWorkbookHelper();
+ }
}
return bRet;
}
@@ -212,6 +247,11 @@ bool ExcelBiffFilter::exportDocument() throw()
return false;
}
+sal_Int32 ExcelBiffFilter::getPaletteColor( sal_Int32 nPaletteIdx ) const
+{
+ return getWorkbookHelper().getStyles().getPaletteColor( nPaletteIdx );
+}
+
OUString ExcelBiffFilter::implGetImplementationName() const
{
return ExcelBiffFilter_getImplementationName();
diff --git a/oox/source/xls/excelhandlers.cxx b/oox/source/xls/excelhandlers.cxx
index 3941bb306177..fa72d9602fed 100644
--- a/oox/source/xls/excelhandlers.cxx
+++ b/oox/source/xls/excelhandlers.cxx
@@ -52,7 +52,7 @@ OoxWorkbookFragmentBase::OoxWorkbookFragmentBase(
// ============================================================================
OoxWorksheetFragmentBase::OoxWorksheetFragmentBase( const WorkbookHelper& rHelper,
- const OUString& rFragmentPath, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int32 nSheet ) :
+ const OUString& rFragmentPath, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) :
FragmentHandler2( rHelper.getOoxFilter(), rFragmentPath ),
WorksheetHelperRoot( rHelper, xProgressBar, eSheetType, nSheet )
{
@@ -143,68 +143,12 @@ BiffFragmentHandler::BiffFragmentHandler( const BiffFragmentHandler& rHandler )
BiffFragmentType BiffFragmentHandler::startFragment( BiffType eBiff )
{
- BiffFragmentType eFragment = BIFF_FRAGMENT_UNKNOWN;
- if( mrStrm.startNextRecord() )
- {
- /* #i23425# Don't rely on BOF record ID to read BOF contents, but on
- the detected BIFF version. */
- if( isBofRecord() )
- {
- // BOF is always written unencrypted
- mrStrm.enableDecoder( false );
- mrStrm.skip( 2 );
- sal_uInt16 nType = mrStrm.readuInt16();
+ return mrStrm.startNextRecord() ? implStartFragment( eBiff ) : BIFF_FRAGMENT_UNKNOWN;
+}
- // decide which fragment types are valid for current BIFF version
- switch( eBiff )
- {
- case BIFF2: switch( nType )
- {
- case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break;
- case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break;
- // #i51490# Excel interprets invalid types as worksheet
- default: eFragment = BIFF_FRAGMENT_WORKSHEET;
- }
- break;
-
- case BIFF3: switch( nType )
- {
- case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break;
- case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break;
- case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_UNKNOWN; break;
- // #i51490# Excel interprets invalid types as worksheet
- default: eFragment = BIFF_FRAGMENT_WORKSHEET;
- };
- break;
-
- case BIFF4: switch( nType )
- {
- case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break;
- case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break;
- case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_WORKSPACE; break;
- // #i51490# Excel interprets invalid types as worksheet
- default: eFragment = BIFF_FRAGMENT_WORKSHEET;
- };
- break;
-
- case BIFF5:
- case BIFF8: switch( nType )
- {
- case BIFF_BOF_GLOBALS: eFragment = BIFF_FRAGMENT_GLOBALS; break;
- case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_CHARTSHEET; break;
- case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break;
- case BIFF_BOF_MODULE: eFragment = BIFF_FRAGMENT_MODULESHEET; break;
- case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_UNKNOWN; break;
- // #i51490# Excel interprets invalid types as worksheet
- default: eFragment = BIFF_FRAGMENT_WORKSHEET;
- };
- break;
-
- case BIFF_UNKNOWN: break;
- }
- }
- }
- return eFragment;
+BiffFragmentType BiffFragmentHandler::startFragment( BiffType eBiff, sal_Int64 nRecHandle )
+{
+ return mrStrm.startRecordByHandle( nRecHandle ) ? implStartFragment( eBiff ) : BIFF_FRAGMENT_UNKNOWN;
}
bool BiffFragmentHandler::skipFragment()
@@ -215,6 +159,69 @@ bool BiffFragmentHandler::skipFragment()
return !mrStrm.isEof() && (mrStrm.getRecId() == BIFF_ID_EOF);
}
+BiffFragmentType BiffFragmentHandler::implStartFragment( BiffType eBiff )
+{
+ BiffFragmentType eFragment = BIFF_FRAGMENT_UNKNOWN;
+ /* #i23425# Don't rely on BOF record ID to read BOF contents, but on
+ the detected BIFF version. */
+ if( isBofRecord() )
+ {
+ // BOF is always written unencrypted
+ mrStrm.enableDecoder( false );
+ mrStrm.skip( 2 );
+ sal_uInt16 nType = mrStrm.readuInt16();
+
+ // decide which fragment types are valid for current BIFF version
+ switch( eBiff )
+ {
+ case BIFF2: switch( nType )
+ {
+ case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break;
+ case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break;
+ // #i51490# Excel interprets invalid types as worksheet
+ default: eFragment = BIFF_FRAGMENT_WORKSHEET;
+ }
+ break;
+
+ case BIFF3: switch( nType )
+ {
+ case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break;
+ case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break;
+ case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_UNKNOWN; break;
+ // #i51490# Excel interprets invalid types as worksheet
+ default: eFragment = BIFF_FRAGMENT_WORKSHEET;
+ };
+ break;
+
+ case BIFF4: switch( nType )
+ {
+ case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break;
+ case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break;
+ case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_WORKSPACE; break;
+ // #i51490# Excel interprets invalid types as worksheet
+ default: eFragment = BIFF_FRAGMENT_WORKSHEET;
+ };
+ break;
+
+ case BIFF5:
+ case BIFF8: switch( nType )
+ {
+ case BIFF_BOF_GLOBALS: eFragment = BIFF_FRAGMENT_GLOBALS; break;
+ case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_CHARTSHEET; break;
+ case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break;
+ case BIFF_BOF_MODULE: eFragment = BIFF_FRAGMENT_MODULESHEET; break;
+ case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_UNKNOWN; break;
+ // #i51490# Excel interprets invalid types as worksheet
+ default: eFragment = BIFF_FRAGMENT_WORKSHEET;
+ };
+ break;
+
+ case BIFF_UNKNOWN: break;
+ }
+ }
+ return eFragment;
+}
+
// ============================================================================
BiffWorkbookFragmentBase::BiffWorkbookFragmentBase( const WorkbookHelper& rHelper, const OUString& rStrmName, bool bCloneDecoder ) :
@@ -228,7 +235,7 @@ BiffWorkbookFragmentBase::BiffWorkbookFragmentBase( const WorkbookHelper& rHelpe
// ============================================================================
BiffWorksheetFragmentBase::BiffWorksheetFragmentBase( const BiffWorkbookFragmentBase& rParent,
- ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int32 nSheet ) :
+ ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) :
BiffFragmentHandler( rParent ),
WorksheetHelperRoot( rParent, xProgressBar, eSheetType, nSheet )
{
@@ -237,7 +244,7 @@ BiffWorksheetFragmentBase::BiffWorksheetFragmentBase( const BiffWorkbookFragment
// ============================================================================
BiffSkipWorksheetFragment::BiffSkipWorksheetFragment(
- const BiffWorkbookFragmentBase& rParent, ISegmentProgressBarRef xProgressBar, sal_Int32 nSheet ) :
+ const BiffWorkbookFragmentBase& rParent, ISegmentProgressBarRef xProgressBar, sal_Int16 nSheet ) :
BiffWorksheetFragmentBase( rParent, xProgressBar, SHEETTYPE_EMPTYSHEET, nSheet )
{
}
diff --git a/oox/source/xls/externallinkbuffer.cxx b/oox/source/xls/externallinkbuffer.cxx
index 564775228d2a..c75625216142 100644
--- a/oox/source/xls/externallinkbuffer.cxx
+++ b/oox/source/xls/externallinkbuffer.cxx
@@ -30,8 +30,12 @@
#include "oox/xls/externallinkbuffer.hxx"
#include <rtl/strbuf.hxx>
+#include <com/sun/star/sheet/ComplexReference.hpp>
#include <com/sun/star/sheet/DDELinkInfo.hpp>
#include <com/sun/star/sheet/ExternalLinkType.hpp>
+#include <com/sun/star/sheet/ExternalReference.hpp>
+#include <com/sun/star/sheet/ReferenceFlags.hpp>
+#include <com/sun/star/sheet/SingleReference.hpp>
#include <com/sun/star/sheet/XDDELinks.hpp>
#include <com/sun/star/sheet/XDDELink.hpp>
#include <com/sun/star/sheet/XDDELinkResults.hpp>
@@ -55,9 +59,12 @@ using ::com::sun::star::uno::Sequence;
using ::com::sun::star::uno::Exception;
using ::com::sun::star::uno::UNO_QUERY_THROW;
using ::com::sun::star::table::CellAddress;
+using ::com::sun::star::sheet::ComplexReference;
using ::com::sun::star::sheet::DDEItemInfo;
using ::com::sun::star::sheet::DDELinkInfo;
using ::com::sun::star::sheet::ExternalLinkInfo;
+using ::com::sun::star::sheet::ExternalReference;
+using ::com::sun::star::sheet::SingleReference;
using ::com::sun::star::sheet::XDDELinks;
using ::com::sun::star::sheet::XDDELinkResults;
using ::com::sun::star::sheet::XExternalDocLinks;
@@ -105,8 +112,8 @@ ExternalNameModel::ExternalNameModel() :
// ============================================================================
-ExternalName::ExternalName( const ExternalLink& rParentLink, sal_Int32 nLocalSheet ) :
- DefinedNameBase( rParentLink, nLocalSheet ),
+ExternalName::ExternalName( const ExternalLink& rParentLink ) :
+ DefinedNameBase( rParentLink ),
mrParentLink( rParentLink ),
mnStorageId( 0 ),
mbDdeLinkCreated( false )
@@ -239,16 +246,27 @@ void ExternalName::importExternalName( BiffInputStream& rStrm )
rStrm.readByteStringUC( false, getTextEncoding() );
OSL_ENSURE( maModel.maName.getLength() > 0, "ExternalName::importExternalName - empty name" );
+ // load cell references that are stored in hidden external names (seen in BIFF3-BIFF4)
+ bool bHiddenRef = (getBiff() <= BIFF4) && (maModel.maName.getLength() > 1) && (maModel.maName[ 0 ] == '\x01') && (rStrm.getRemaining() > 2);
switch( mrParentLink.getLinkType() )
{
case LINKTYPE_INTERNAL:
+ // cell references to other internal sheets are stored in hidden external names
+ if( bHiddenRef && (getBiff() == BIFF4) && isWorkbookFile() )
+ {
+ TokensFormulaContext aContext( true, true );
+ importBiffFormula( aContext, mrParentLink.getCalcSheetIndex(), rStrm );
+ extractReference( aContext.getTokens() );
+ }
+ break;
+
case LINKTYPE_EXTERNAL:
- // cell references that are stored in hidden external names (seen in BIFF3-BIFF4)
- if( (getBiff() <= BIFF4) && (maModel.maName.getLength() > 0) && (maModel.maName[ 0 ] == '\x01') && (rStrm.getRemaining() > 2) )
+ // cell references to other documents are stored in hidden external names
+ if( bHiddenRef )
{
TokensFormulaContext aContext( true, true );
- importBiffFormula( aContext, rStrm );
- setReference( aContext.getTokens() );
+ importBiffFormula( aContext, 0, rStrm );
+ extractExternalReference( aContext.getTokens() );
}
break;
@@ -300,6 +318,7 @@ void ExternalName::importExternalName( BiffInputStream& rStrm )
}
}
+#if 0
sal_Int32 ExternalName::getSheetCacheIndex() const
{
OSL_ENSURE( mrParentLink.getLinkType() == LINKTYPE_DDE, "ExternalName::getSheetCacheIndex - unexpected link type" );
@@ -337,6 +356,7 @@ sal_Int32 ExternalName::getSheetCacheIndex() const
}
return nCacheIdx;
}
+#endif
bool ExternalName::getDdeItemInfo( DDEItemInfo& orItemInfo ) const
{
@@ -381,6 +401,51 @@ bool ExternalName::getDdeLinkData( OUString& orDdeServer, OUString& orDdeTopic,
return false;
}
+// private --------------------------------------------------------------------
+
+namespace {
+
+void lclSetSheetCacheIndex( SingleReference& orApiRef, sal_Int32 nCacheIdx )
+{
+ using namespace ::com::sun::star::sheet::ReferenceFlags;
+ setFlag( orApiRef.Flags, SHEET_RELATIVE, false );
+ setFlag( orApiRef.Flags, SHEET_3D, true );
+ orApiRef.Sheet = nCacheIdx;
+}
+
+} // namespace
+
+void ExternalName::extractExternalReference( const ApiTokenSequence& rTokens )
+{
+ OSL_ENSURE( (getFilterType() == FILTER_BIFF) && (getBiff() <= BIFF4), "ExternalName::setExternalReference - unexpected call" );
+ sal_Int32 nDocLinkIdx = mrParentLink.getDocumentLinkIndex();
+ sal_Int32 nCacheIdx = mrParentLink.getSheetCacheIndex();
+ if( (nDocLinkIdx >= 0) && (nCacheIdx >= 0) )
+ {
+ ExternalReference aExtApiRef;
+ aExtApiRef.Index = nDocLinkIdx;
+
+ Any aRefAny = getFormulaParser().extractReference( rTokens );
+ if( aRefAny.has< SingleReference >() )
+ {
+ SingleReference aApiRef;
+ aRefAny >>= aApiRef;
+ lclSetSheetCacheIndex( aApiRef, nCacheIdx );
+ aExtApiRef.Reference <<= aApiRef;
+ maRefAny <<= aExtApiRef;
+ }
+ else if( aRefAny.has< ComplexReference >() )
+ {
+ ComplexReference aApiRef;
+ aRefAny >>= aApiRef;
+ lclSetSheetCacheIndex( aApiRef.Reference1, nCacheIdx );
+ lclSetSheetCacheIndex( aApiRef.Reference2, nCacheIdx );
+ aExtApiRef.Reference <<= aApiRef;
+ maRefAny <<= aExtApiRef;
+ }
+ }
+}
+
void ExternalName::setResultSize( sal_Int32 nColumns, sal_Int32 nRows )
{
OSL_ENSURE( (mrParentLink.getLinkType() == LINKTYPE_DDE) || (mrParentLink.getLinkType() == LINKTYPE_OLE) ||
@@ -564,10 +629,10 @@ void ExternalLink::importExternSheet( BiffInputStream& rStrm )
switch( meLinkType )
{
case LINKTYPE_INTERNAL:
- maIndexes.push_back( getWorksheets().getCalcSheetIndex( aSheetName ) );
+ maCalcSheets.push_back( getWorksheets().getCalcSheetIndex( aSheetName ) );
break;
case LINKTYPE_EXTERNAL:
- insertExternalSheet( aSheetName );
+ insertExternalSheet( (aSheetName.getLength() > 0) ? aSheetName : WorksheetBuffer::getBaseFileName( maTargetUrl ) );
break;
default:;
}
@@ -659,11 +724,41 @@ FunctionLibraryType ExternalLink::getFuncLibraryType() const
return (meLinkType == LINKTYPE_LIBRARY) ? meFuncLibType : FUNCLIB_UNKNOWN;
}
-sal_Int32 ExternalLink::getSheetIndex( sal_Int32 nTabId ) const
+sal_Int16 ExternalLink::getCalcSheetIndex( sal_Int32 nTabId ) const
+{
+ OSL_ENSURE( meLinkType == LINKTYPE_INTERNAL, "ExternalLink::getCalcSheetIndex - invalid link type" );
+ OSL_ENSURE( (nTabId == 0) || (getFilterType() == FILTER_OOX) || (getBiff() == BIFF8),
+ "ExternalLink::getCalcSheetIndex - invalid sheet index" );
+ return ContainerHelper::getVectorElement< sal_Int16 >( maCalcSheets, nTabId, -1 );
+}
+
+sal_Int32 ExternalLink::getDocumentLinkIndex() const
{
+ OSL_ENSURE( meLinkType == LINKTYPE_EXTERNAL, "ExternalLink::getDocumentLinkIndex - invalid link type" );
+ return mxDocLink.is() ? mxDocLink->getTokenIndex() : -1;
+}
+
+sal_Int32 ExternalLink::getSheetCacheIndex( sal_Int32 nTabId ) const
+{
+ OSL_ENSURE( meLinkType == LINKTYPE_EXTERNAL, "ExternalLink::getSheetCacheIndex - invalid link type" );
OSL_ENSURE( (nTabId == 0) || (getFilterType() == FILTER_OOX) || (getBiff() == BIFF8),
- "ExternalLink::getSheetIndex - invalid sheet index" );
- return ContainerHelper::getVectorElement< sal_Int32 >( maIndexes, nTabId, -1 );
+ "ExternalLink::getSheetCacheIndex - invalid sheet index" );
+ return ContainerHelper::getVectorElement< sal_Int32 >( maSheetCaches, nTabId, -1 );
+}
+
+Reference< XExternalSheetCache > ExternalLink::getSheetCache( sal_Int32 nTabId ) const
+{
+ sal_Int32 nCacheIdx = getSheetCacheIndex( nTabId );
+ if( mxDocLink.is() && (nCacheIdx >= 0) ) try
+ {
+ // existing mxDocLink implies that this is an external link
+ Reference< XExternalSheetCache > xSheetCache( mxDocLink->getByIndex( nCacheIdx ), UNO_QUERY_THROW );
+ return xSheetCache;
+ }
+ catch( Exception& )
+ {
+ }
+ return 0;
}
void ExternalLink::getSheetRange( LinkSheetRange& orSheetRange, sal_Int32 nTabId1, sal_Int32 nTabId2 ) const
@@ -681,12 +776,12 @@ void ExternalLink::getSheetRange( LinkSheetRange& orSheetRange, sal_Int32 nTabId
case LINKTYPE_EXTERNAL:
{
- sal_Int32 nDocLinkIndex = mxDocLink.is() ? mxDocLink->getTokenIndex() : -1;
+ sal_Int32 nDocLinkIdx = getDocumentLinkIndex();
switch( getFilterType() )
{
case FILTER_OOX:
// OOBIN: passed indexes point into sheet list of EXTSHEETLIST
- orSheetRange.setExternalRange( nDocLinkIndex, getSheetIndex( nTabId1 ), getSheetIndex( nTabId2 ) );
+ orSheetRange.setExternalRange( nDocLinkIdx, getSheetCacheIndex( nTabId1 ), getSheetCacheIndex( nTabId2 ) );
break;
case FILTER_BIFF:
switch( getBiff() )
@@ -694,17 +789,17 @@ void ExternalLink::getSheetRange( LinkSheetRange& orSheetRange, sal_Int32 nTabId
case BIFF2:
case BIFF3:
case BIFF4:
- orSheetRange.setExternalRange( nDocLinkIndex, getSheetIndex( nTabId1 ), getSheetIndex( nTabId2 ) );
+ orSheetRange.setExternalRange( nDocLinkIdx, getSheetCacheIndex( nTabId1 ), getSheetCacheIndex( nTabId2 ) );
break;
case BIFF5:
// BIFF5: first sheet from this external link, last sheet is passed in nTabId2
if( const ExternalLink* pExtLink2 = getExternalLinks().getExternalLink( nTabId2 ).get() )
if( (pExtLink2->getLinkType() == LINKTYPE_EXTERNAL) && (maTargetUrl == pExtLink2->getTargetUrl()) )
- orSheetRange.setExternalRange( nDocLinkIndex, getSheetIndex(), pExtLink2->getSheetIndex() );
+ orSheetRange.setExternalRange( nDocLinkIdx, getSheetCacheIndex(), pExtLink2->getSheetCacheIndex() );
break;
case BIFF8:
// BIFF8: passed indexes point into sheet list of EXTERNALBOOK
- orSheetRange.setExternalRange( nDocLinkIndex, getSheetIndex( nTabId1 ), getSheetIndex( nTabId2 ) );
+ orSheetRange.setExternalRange( nDocLinkIdx, getSheetCacheIndex( nTabId1 ), getSheetCacheIndex( nTabId2 ) );
break;
case BIFF_UNKNOWN: break;
}
@@ -720,21 +815,6 @@ void ExternalLink::getSheetRange( LinkSheetRange& orSheetRange, sal_Int32 nTabId
}
}
-Reference< XExternalSheetCache > ExternalLink::getExternalSheetCache( sal_Int32 nTabId )
-{
- const sal_Int32* pnCacheId = ContainerHelper::getVectorElement( maIndexes, nTabId );
- if( mxDocLink.is() && pnCacheId ) try
- {
- // existing mxDocLink implies that this is an external link
- Reference< XExternalSheetCache > xSheetCache( mxDocLink->getByIndex( *pnCacheId ), UNO_QUERY_THROW );
- return xSheetCache;
- }
- catch( Exception& )
- {
- }
- return 0;
-}
-
ExternalNameRef ExternalLink::getNameByIndex( sal_Int32 nIndex ) const
{
return maExtNames.get( nIndex );
@@ -790,21 +870,21 @@ OUString ExternalLink::parseBiffTargetUrl( const OUString& rBiffTargetUrl )
OUString aClassName, aTargetUrl, aSheetName;
switch( getAddressConverter().parseBiffTargetUrl( aClassName, aTargetUrl, aSheetName, rBiffTargetUrl ) )
- {
+ {
case BIFF_TARGETTYPE_URL:
if( aTargetUrl.getLength() == 0 )
- {
+ {
meLinkType = (aSheetName.getLength() > 0) ? LINKTYPE_INTERNAL : LINKTYPE_SELF;
- }
- else if( (aTargetUrl.getLength() == 1) && (aTargetUrl[ 0 ] == ':') )
- {
- if( getBiff() >= BIFF4 )
- meLinkType = LINKTYPE_ANALYSIS;
- }
+ }
+ else if( (aTargetUrl.getLength() == 1) && (aTargetUrl[ 0 ] == ':') )
+ {
+ if( getBiff() >= BIFF4 )
+ meLinkType = LINKTYPE_ANALYSIS;
+ }
else if( (aTargetUrl.getLength() > 1) || (aTargetUrl[ 0 ] != ' ') )
- {
+ {
setExternalTargetUrl( aTargetUrl, OOX_TARGETTYPE_EXTLINK );
- }
+ }
break;
case BIFF_TARGETTYPE_SAMESHEET:
@@ -834,13 +914,13 @@ void ExternalLink::insertExternalSheet( const OUString& rSheetName )
{
Reference< XExternalSheetCache > xSheetCache = mxDocLink->addSheetCache( rSheetName );
sal_Int32 nCacheIdx = xSheetCache.is() ? xSheetCache->getTokenIndex() : -1;
- maIndexes.push_back( nCacheIdx );
+ maSheetCaches.push_back( nCacheIdx );
}
}
ExternalNameRef ExternalLink::createExternalName()
{
- ExternalNameRef xExtName( new ExternalName( *this, getSheetIndex() ) );
+ ExternalNameRef xExtName( new ExternalName( *this ) );
maExtNames.push_back( xExtName );
return xExtName;
}
@@ -950,18 +1030,20 @@ void ExternalLinkBuffer::importExternalName( BiffInputStream& rStrm )
void ExternalLinkBuffer::importExternSheet8( BiffInputStream& rStrm )
{
- OSL_ENSURE( getBiff() == BIFF8, "ExternalLinkBuffer::importExternSheet - wrong BIFF version" );
- OSL_ENSURE( maRefSheets.empty(), "ExternalLinkBuffer::importExternSheet - multiple EXTERNSHEET records" );
- maRefSheets.clear();
+ OSL_ENSURE( getBiff() == BIFF8, "ExternalLinkBuffer::importExternSheet8 - wrong BIFF version" );
+
sal_uInt16 nRefCount;
rStrm >> nRefCount;
- maRefSheets.reserve( nRefCount );
- for( sal_uInt16 nRefId = 0; !rStrm.isEof() && (nRefId < nRefCount); ++nRefId )
- {
- RefSheetsModel aRefSheets;
- aRefSheets.readBiff8Data( rStrm );
- maRefSheets.push_back( aRefSheets );
- }
+ OSL_ENSURE( static_cast< sal_Int64 >( nRefCount * 6 ) == rStrm.getRemaining(), "ExternalLinkBuffer::importExternSheet8 - invalid count" );
+ nRefCount = static_cast< sal_uInt16 >( ::std::min< sal_Int64 >( nRefCount, rStrm.getRemaining() / 6 ) );
+
+ /* #i104057# A weird external XLS generator writes multiple EXTERNSHEET
+ records instead of only one as expected. Surprisingly, Excel seems to
+ insert the entries of the second record before the entries of the first
+ record. */
+ maRefSheets.insert( maRefSheets.begin(), nRefCount, RefSheetsModel() );
+ for( RefSheetsModelVec::iterator aIt = maRefSheets.begin(); !rStrm.isEof() && (nRefCount > 0); --nRefCount )
+ aIt->readBiff8Data( rStrm );
}
Sequence< ExternalLinkInfo > ExternalLinkBuffer::getLinkInfos() const
diff --git a/oox/source/xls/externallinkfragment.cxx b/oox/source/xls/externallinkfragment.cxx
index 0245c44eb13c..39686ae7cb64 100644
--- a/oox/source/xls/externallinkfragment.cxx
+++ b/oox/source/xls/externallinkfragment.cxx
@@ -338,7 +338,7 @@ ContextHandlerRef OoxExternalLinkFragment::onCreateRecordContext( sal_Int32 nRec
ContextHandlerRef OoxExternalLinkFragment::createSheetDataContext( sal_Int32 nSheetId )
{
- return new OoxExternalSheetDataContext( *this, mrExtLink.getExternalSheetCache( nSheetId ) );
+ return new OoxExternalSheetDataContext( *this, mrExtLink.getSheetCache( nSheetId ) );
}
// oox.core.FragmentHandler2 interface ----------------------------------------
@@ -475,11 +475,11 @@ void BiffExternalLinkFragment::importXct()
case BIFF3:
case BIFF4:
case BIFF5:
- mxSheetCache = mxExtLink->getExternalSheetCache( 0 );
+ mxSheetCache = mxExtLink->getSheetCache( 0 );
break;
case BIFF8:
mrStrm.skip( 2 );
- mxSheetCache = mxExtLink->getExternalSheetCache( mrStrm.readInt16() );
+ mxSheetCache = mxExtLink->getSheetCache( mrStrm.readInt16() );
break;
case BIFF_UNKNOWN: break;
}
diff --git a/oox/source/xls/formulabase.cxx b/oox/source/xls/formulabase.cxx
index 7ba8af38324b..5240960f7a88 100644
--- a/oox/source/xls/formulabase.cxx
+++ b/oox/source/xls/formulabase.cxx
@@ -227,7 +227,7 @@ void ApiTokenIterator::skipSpaces()
namespace {
-const size_t FUNCINFO_CLASSCOUNT = 5; /// Number of token class entries.
+const size_t FUNCINFO_PARAMINFOCOUNT = 5; /// Number of parameter type entries.
const sal_uInt16 FUNCFLAG_VOLATILE = 0x0001; /// Result is volatile (e.g. NOW() function).
const sal_uInt16 FUNCFLAG_IMPORTONLY = 0x0002; /// Only used in import filter.
@@ -237,6 +237,7 @@ const sal_uInt16 FUNCFLAG_EXTERNAL = 0x0010; /// Function is external
const sal_uInt16 FUNCFLAG_MACROFUNC = 0x0020; /// Function is a macro-sheet function.
const sal_uInt16 FUNCFLAG_MACROCMD = 0x0040; /// Function is a macro-sheet command.
const sal_uInt16 FUNCFLAG_ALWAYSVAR = 0x0080; /// Function is always represented by a tFuncVar token.
+const sal_uInt16 FUNCFLAG_PARAMPAIRS = 0x0100; /// Optional parameters are expected to appear in pairs.
const sal_uInt16 FUNCFLAG_FUNCLIBMASK = 0xF000; /// Mask for function library bits.
const sal_uInt16 FUNCFLAG_EUROTOOL = 0x1000; /// Function is part of the EuroTool add-in.
@@ -252,7 +253,7 @@ struct FunctionData
sal_uInt8 mnMinParamCount; /// Minimum number of parameters.
sal_uInt8 mnMaxParamCount; /// Maximum number of parameters.
sal_uInt8 mnRetClass; /// BIFF token class of the return value.
- sal_uInt8 mpnParamClass[ FUNCINFO_CLASSCOUNT ]; /// Expected BIFF token classes of parameters.
+ FunctionParamInfo mpParamInfos[ FUNCINFO_PARAMINFOCOUNT ]; /// Information about all parameters.
sal_uInt16 mnFlags; /// Additional flags.
inline bool isSupported( bool bImportFilter ) const;
@@ -265,165 +266,179 @@ inline bool FunctionData::isSupported( bool bImportFilter ) const
return !getFlag( mnFlags, bImportFilter ? FUNCFLAG_EXPORTONLY : FUNCFLAG_IMPORTONLY );
}
-const sal_uInt8 R = BIFF_TOKCLASS_REF;
-const sal_uInt8 V = BIFF_TOKCLASS_VAL;
-const sal_uInt8 A = BIFF_TOKCLASS_ARR;
-const sal_uInt8 ER = FUNCINFO_PARAM_EXCELONLY | BIFF_TOKCLASS_REF;
-const sal_uInt8 EV = FUNCINFO_PARAM_EXCELONLY | BIFF_TOKCLASS_VAL;
-const sal_uInt8 EA = FUNCINFO_PARAM_EXCELONLY | BIFF_TOKCLASS_ARR;
-const sal_uInt8 C = FUNCINFO_PARAM_CALCONLY;
-const sal_uInt8 I = FUNCINFO_PARAM_INVALID;
-const sal_uInt16 NOID = SAL_MAX_UINT16;
-const sal_uInt8 MX = SAL_MAX_UINT8;
+const sal_uInt16 NOID = SAL_MAX_UINT16; /// No BIFF/OOBIN function identifier available.
+const sal_uInt8 MX = SAL_MAX_UINT8; /// Maximum parameter count.
+
+// abbreviations for function return token class
+const sal_uInt8 R = BIFF_TOKCLASS_REF;
+const sal_uInt8 V = BIFF_TOKCLASS_VAL;
+const sal_uInt8 A = BIFF_TOKCLASS_ARR;
+
+// abbreviations for parameter infos
+#define RO { FUNC_PARAM_REGULAR, FUNC_PARAMCONV_ORG, false }
+#define RV { FUNC_PARAM_REGULAR, FUNC_PARAMCONV_VAL, false }
+#define RA { FUNC_PARAM_REGULAR, FUNC_PARAMCONV_ARR, false }
+#define RR { FUNC_PARAM_REGULAR, FUNC_PARAMCONV_RPT, false }
+#define RX { FUNC_PARAM_REGULAR, FUNC_PARAMCONV_RPX, false }
+#define VO { FUNC_PARAM_REGULAR, FUNC_PARAMCONV_ORG, true }
+#define VV { FUNC_PARAM_REGULAR, FUNC_PARAMCONV_VAL, true }
+#define VA { FUNC_PARAM_REGULAR, FUNC_PARAMCONV_ARR, true }
+#define VR { FUNC_PARAM_REGULAR, FUNC_PARAMCONV_RPT, true }
+#define VX { FUNC_PARAM_REGULAR, FUNC_PARAMCONV_RPX, true }
+#define RO_E { FUNC_PARAM_EXCELONLY, FUNC_PARAMCONV_ORG, false }
+#define VR_E { FUNC_PARAM_EXCELONLY, FUNC_PARAMCONV_RPT, true }
+#define C { FUNC_PARAM_CALCONLY, FUNC_PARAMCONV_ORG, false }
+
+// Note: parameter types of all macro sheet functions (FUNCFLAG_MACROFUNC/FUNCFLAG_MACROCMD) untested!
/** Functions new in BIFF2. */
static const FunctionData saFuncTableBiff2[] =
{
- { "COUNT", "COUNT", 0, 0, 0, MX, V, { R }, 0 },
- { "IF", "IF", 1, 1, 2, 3, R, { V, R }, 0 },
- { "ISNA", "ISNA", 2, 2, 1, 1, V, { V }, 0 },
- { "ISERROR", "ISERROR", 3, 3, 1, 1, V, { V }, 0 },
- { "SUM", "SUM", 4, 4, 0, MX, V, { R }, 0 },
- { "AVERAGE", "AVERAGE", 5, 5, 1, MX, V, { R }, 0 },
- { "MIN", "MIN", 6, 6, 1, MX, V, { R }, 0 },
- { "MAX", "MAX", 7, 7, 1, MX, V, { R }, 0 },
- { "ROW", "ROW", 8, 8, 0, 1, V, { R }, 0 },
- { "COLUMN", "COLUMN", 9, 9, 0, 1, V, { R }, 0 },
+ { "COUNT", "COUNT", 0, 0, 0, MX, V, { RX }, 0 },
+ { "IF", "IF", 1, 1, 2, 3, R, { VO, RO }, 0 },
+ { "ISNA", "ISNA", 2, 2, 1, 1, V, { VR }, 0 },
+ { "ISERROR", "ISERROR", 3, 3, 1, 1, V, { VR }, 0 },
+ { "SUM", "SUM", 4, 4, 0, MX, V, { RX }, 0 },
+ { "AVERAGE", "AVERAGE", 5, 5, 1, MX, V, { RX }, 0 },
+ { "MIN", "MIN", 6, 6, 1, MX, V, { RX }, 0 },
+ { "MAX", "MAX", 7, 7, 1, MX, V, { RX }, 0 },
+ { "ROW", "ROW", 8, 8, 0, 1, V, { RO }, 0 },
+ { "COLUMN", "COLUMN", 9, 9, 0, 1, V, { RO }, 0 },
{ "NA", "NA", 10, 10, 0, 0, V, {}, 0 },
- { "NPV", "NPV", 11, 11, 2, MX, V, { V, R }, 0 },
- { "STDEV", "STDEV", 12, 12, 1, MX, V, { R }, 0 },
- { "DOLLAR", "DOLLAR", 13, 13, 1, 2, V, { V }, 0 },
- { "FIXED", "FIXED", 14, 14, 1, 2, V, { V, V, C, I }, 0 },
- { "SIN", "SIN", 15, 15, 1, 1, V, { V }, 0 },
- { "COS", "COS", 16, 16, 1, 1, V, { V }, 0 },
- { "TAN", "TAN", 17, 17, 1, 1, V, { V }, 0 },
- { "COT", 0, 17, 17, 1, 1, V, { V }, FUNCFLAG_EXPORTONLY },
- { "ATAN", "ATAN", 18, 18, 1, 1, V, { V }, 0 },
- { "ACOT", 0, 18, 18, 1, 1, V, { V }, FUNCFLAG_EXPORTONLY },
+ { "NPV", "NPV", 11, 11, 2, MX, V, { VR, RX }, 0 },
+ { "STDEV", "STDEV", 12, 12, 1, MX, V, { RX }, 0 },
+ { "DOLLAR", "DOLLAR", 13, 13, 1, 2, V, { VR }, 0 },
+ { "FIXED", "FIXED", 14, 14, 1, 2, V, { VR, VR, C }, 0 },
+ { "SIN", "SIN", 15, 15, 1, 1, V, { VR }, 0 },
+ { "COS", "COS", 16, 16, 1, 1, V, { VR }, 0 },
+ { "TAN", "TAN", 17, 17, 1, 1, V, { VR }, 0 },
+ { "COT", "TAN", 17, 17, 1, 1, V, { VR }, FUNCFLAG_EXPORTONLY },
+ { "ATAN", "ATAN", 18, 18, 1, 1, V, { VR }, 0 },
+ { "ACOT", "ATAN", 18, 18, 1, 1, V, { VR }, FUNCFLAG_EXPORTONLY },
{ "PI", "PI", 19, 19, 0, 0, V, {}, 0 },
- { "SQRT", "SQRT", 20, 20, 1, 1, V, { V }, 0 },
- { "EXP", "EXP", 21, 21, 1, 1, V, { V }, 0 },
- { "LN", "LN", 22, 22, 1, 1, V, { V }, 0 },
- { "LOG10", "LOG10", 23, 23, 1, 1, V, { V }, 0 },
- { "ABS", "ABS", 24, 24, 1, 1, V, { V }, 0 },
- { "INT", "INT", 25, 25, 1, 1, V, { V }, 0 },
- { "SIGN", "SIGN", 26, 26, 1, 1, V, { V }, 0 },
- { "ROUND", "ROUND", 27, 27, 2, 2, V, { V }, 0 },
- { "LOOKUP", "LOOKUP", 28, 28, 2, 3, V, { V, R }, 0 },
- { "INDEX", "INDEX", 29, 29, 2, 4, R, { R, V }, 0 },
- { "REPT", "REPT", 30, 30, 2, 2, V, { V }, 0 },
- { "MID", "MID", 31, 31, 3, 3, V, { V }, 0 },
- { "LEN", "LEN", 32, 32, 1, 1, V, { V }, 0 },
- { "VALUE", "VALUE", 33, 33, 1, 1, V, { V }, 0 },
+ { "SQRT", "SQRT", 20, 20, 1, 1, V, { VR }, 0 },
+ { "EXP", "EXP", 21, 21, 1, 1, V, { VR }, 0 },
+ { "LN", "LN", 22, 22, 1, 1, V, { VR }, 0 },
+ { "LOG10", "LOG10", 23, 23, 1, 1, V, { VR }, 0 },
+ { "ABS", "ABS", 24, 24, 1, 1, V, { VR }, 0 },
+ { "INT", "INT", 25, 25, 1, 1, V, { VR }, 0 },
+ { "SIGN", "SIGN", 26, 26, 1, 1, V, { VR }, 0 },
+ { "ROUND", "ROUND", 27, 27, 2, 2, V, { VR }, 0 },
+ { "LOOKUP", "LOOKUP", 28, 28, 2, 3, V, { VR, RA }, 0 },
+ { "INDEX", "INDEX", 29, 29, 2, 4, R, { RA, VV }, 0 },
+ { "REPT", "REPT", 30, 30, 2, 2, V, { VR }, 0 },
+ { "MID", "MID", 31, 31, 3, 3, V, { VR }, 0 },
+ { "LEN", "LEN", 32, 32, 1, 1, V, { VR }, 0 },
+ { "VALUE", "VALUE", 33, 33, 1, 1, V, { VR }, 0 },
{ "TRUE", "TRUE", 34, 34, 0, 0, V, {}, 0 },
{ "FALSE", "FALSE", 35, 35, 0, 0, V, {}, 0 },
- { "AND", "AND", 36, 36, 1, MX, V, { R }, 0 },
- { "OR", "OR", 37, 37, 1, MX, V, { R }, 0 },
- { "NOT", "NOT", 38, 38, 1, 1, V, { V }, 0 },
- { "MOD", "MOD", 39, 39, 2, 2, V, { V }, 0 },
- { "DCOUNT", "DCOUNT", 40, 40, 3, 3, V, { R }, 0 },
- { "DSUM", "DSUM", 41, 41, 3, 3, V, { R }, 0 },
- { "DAVERAGE", "DAVERAGE", 42, 42, 3, 3, V, { R }, 0 },
- { "DMIN", "DMIN", 43, 43, 3, 3, V, { R }, 0 },
- { "DMAX", "DMAX", 44, 44, 3, 3, V, { R }, 0 },
- { "DSTDEV", "DSTDEV", 45, 45, 3, 3, V, { R }, 0 },
- { "VAR", "VAR", 46, 46, 1, MX, V, { R }, 0 },
- { "DVAR", "DVAR", 47, 47, 3, 3, V, { R }, 0 },
- { "TEXT", "TEXT", 48, 48, 2, 2, V, { V }, 0 },
- { "LINEST", "LINEST", 49, 49, 1, 2, A, { R, R, C, C, I }, 0 },
- { "TREND", "TREND", 50, 50, 1, 3, A, { R, R, R, C, I }, 0 },
- { "LOGEST", "LOGEST", 51, 51, 1, 2, A, { R, R, C, C, I }, 0 },
- { "GROWTH", "GROWTH", 52, 52, 1, 3, A, { R, R, R, C, I }, 0 },
- { 0, "RETURN", 55, 55, 0, 1, R, { R }, FUNCFLAG_MACROFUNC },
- { "PV", "PV", 56, 56, 3, 5, V, { V }, 0 },
- { "FV", "FV", 57, 57, 3, 5, V, { V }, 0 },
- { "NPER", "NPER", 58, 58, 3, 5, V, { V }, 0 },
- { "PMT", "PMT", 59, 59, 3, 5, V, { V }, 0 },
- { "RATE", "RATE", 60, 60, 3, 6, V, { V }, 0 },
- { "MIRR", "MIRR", 61, 61, 3, 3, V, { R, V }, 0 },
- { "IRR", "IRR", 62, 62, 1, 2, V, { R, V }, 0 },
+ { "AND", "AND", 36, 36, 1, MX, V, { RX }, 0 },
+ { "OR", "OR", 37, 37, 1, MX, V, { RX }, 0 },
+ { "NOT", "NOT", 38, 38, 1, 1, V, { VR }, 0 },
+ { "MOD", "MOD", 39, 39, 2, 2, V, { VR }, 0 },
+ { "DCOUNT", "DCOUNT", 40, 40, 3, 3, V, { RO, RR }, 0 },
+ { "DSUM", "DSUM", 41, 41, 3, 3, V, { RO, RR }, 0 },
+ { "DAVERAGE", "DAVERAGE", 42, 42, 3, 3, V, { RO, RR }, 0 },
+ { "DMIN", "DMIN", 43, 43, 3, 3, V, { RO, RR }, 0 },
+ { "DMAX", "DMAX", 44, 44, 3, 3, V, { RO, RR }, 0 },
+ { "DSTDEV", "DSTDEV", 45, 45, 3, 3, V, { RO, RR }, 0 },
+ { "VAR", "VAR", 46, 46, 1, MX, V, { RX }, 0 },
+ { "DVAR", "DVAR", 47, 47, 3, 3, V, { RO, RR }, 0 },
+ { "TEXT", "TEXT", 48, 48, 2, 2, V, { VR }, 0 },
+ { "LINEST", "LINEST", 49, 49, 1, 2, A, { RA, RA, C, C }, 0 },
+ { "TREND", "TREND", 50, 50, 1, 3, A, { RA, RA, RA, C }, 0 },
+ { "LOGEST", "LOGEST", 51, 51, 1, 2, A, { RA, RA, C, C }, 0 },
+ { "GROWTH", "GROWTH", 52, 52, 1, 3, A, { RA, RA, RA, C }, 0 },
+ { 0, "RETURN", 55, 55, 0, 1, R, { RO }, FUNCFLAG_MACROFUNC },
+ { "PV", "PV", 56, 56, 3, 5, V, { VR }, 0 },
+ { "FV", "FV", 57, 57, 3, 5, V, { VR }, 0 },
+ { "NPER", "NPER", 58, 58, 3, 5, V, { VR }, 0 },
+ { "PMT", "PMT", 59, 59, 3, 5, V, { VR }, 0 },
+ { "RATE", "RATE", 60, 60, 3, 6, V, { VR }, 0 },
+ { "MIRR", "MIRR", 61, 61, 3, 3, V, { RA, VR }, 0 },
+ { "IRR", "IRR", 62, 62, 1, 2, V, { RA, VR }, 0 },
{ "RAND", "RAND", 63, 63, 0, 0, V, {}, FUNCFLAG_VOLATILE },
- { "MATCH", "MATCH", 64, 64, 2, 3, V, { V, R }, 0 },
- { "DATE", "DATE", 65, 65, 3, 3, V, { V }, 0 },
- { "TIME", "TIME", 66, 66, 3, 3, V, { V }, 0 },
- { "DAY", "DAY", 67, 67, 1, 1, V, { V }, 0 },
- { "MONTH", "MONTH", 68, 68, 1, 1, V, { V }, 0 },
- { "YEAR", "YEAR", 69, 69, 1, 1, V, { V }, 0 },
- { "WEEKDAY", "WEEKDAY", 70, 70, 1, 1, V, { V, C, I }, 0 },
- { "HOUR", "HOUR", 71, 71, 1, 1, V, { V }, 0 },
- { "MINUTE", "MINUTE", 72, 72, 1, 1, V, { V }, 0 },
- { "SECOND", "SECOND", 73, 73, 1, 1, V, { V }, 0 },
+ { "MATCH", "MATCH", 64, 64, 2, 3, V, { VR, RX, RR }, 0 },
+ { "DATE", "DATE", 65, 65, 3, 3, V, { VR }, 0 },
+ { "TIME", "TIME", 66, 66, 3, 3, V, { VR }, 0 },
+ { "DAY", "DAY", 67, 67, 1, 1, V, { VR }, 0 },
+ { "MONTH", "MONTH", 68, 68, 1, 1, V, { VR }, 0 },
+ { "YEAR", "YEAR", 69, 69, 1, 1, V, { VR }, 0 },
+ { "WEEKDAY", "WEEKDAY", 70, 70, 1, 1, V, { VR, C }, 0 },
+ { "HOUR", "HOUR", 71, 71, 1, 1, V, { VR }, 0 },
+ { "MINUTE", "MINUTE", 72, 72, 1, 1, V, { VR }, 0 },
+ { "SECOND", "SECOND", 73, 73, 1, 1, V, { VR }, 0 },
{ "NOW", "NOW", 74, 74, 0, 0, V, {}, FUNCFLAG_VOLATILE },
- { "AREAS", "AREAS", 75, 75, 1, 1, V, { R }, 0 },
- { "ROWS", "ROWS", 76, 76, 1, 1, V, { R }, 0 },
- { "COLUMNS", "COLUMNS", 77, 77, 1, 1, V, { R }, 0 },
- { "OFFSET", "OFFSET", 78, 78, 3, 5, R, { R, V }, FUNCFLAG_VOLATILE },
- { 0, "ABSREF", 79, 79, 2, 2, R, { V, R }, FUNCFLAG_MACROFUNC },
- { "SEARCH", "SEARCH", 82, 82, 2, 3, V, { V }, 0 },
- { "TRANSPOSE", "TRANSPOSE", 83, 83, 1, 1, A, { A }, 0 },
- { "TYPE", "TYPE", 86, 86, 1, 1, V, { V }, 0 },
+ { "AREAS", "AREAS", 75, 75, 1, 1, V, { RO }, 0 },
+ { "ROWS", "ROWS", 76, 76, 1, 1, V, { RO }, 0 },
+ { "COLUMNS", "COLUMNS", 77, 77, 1, 1, V, { RO }, 0 },
+ { "OFFSET", "OFFSET", 78, 78, 3, 5, R, { RO, VR }, FUNCFLAG_VOLATILE },
+ { 0, "ABSREF", 79, 79, 2, 2, R, { VR, RO }, FUNCFLAG_MACROFUNC },
+ { "SEARCH", "SEARCH", 82, 82, 2, 3, V, { VR }, 0 },
+ { "TRANSPOSE", "TRANSPOSE", 83, 83, 1, 1, A, { VO }, 0 },
+ { "TYPE", "TYPE", 86, 86, 1, 1, V, { VX }, 0 },
{ 0, "ACTIVE.CELL", 94, 94, 0, 0, R, {}, FUNCFLAG_MACROFUNC },
- { "ATAN2", "ATAN2", 97, 97, 2, 2, V, { V }, 0 },
- { "ASIN", "ASIN", 98, 98, 1, 1, V, { V }, 0 },
- { "ACOS", "ACOS", 99, 99, 1, 1, V, { V }, 0 },
- { "CHOOSE", "CHOOSE", 100, 100, 2, MX, R, { V, R }, 0 },
- { "HLOOKUP", "HLOOKUP", 101, 101, 3, 3, V, { V, R, R, C, I }, 0 },
- { "VLOOKUP", "VLOOKUP", 102, 102, 3, 3, V, { V, R, R, C, I }, 0 },
- { "ISREF", "ISREF", 105, 105, 1, 1, V, { R }, 0 },
- { "LOG", "LOG", 109, 109, 1, 2, V, { V }, 0 },
- { "CHAR", "CHAR", 111, 111, 1, 1, V, { V }, 0 },
- { "LOWER", "LOWER", 112, 112, 1, 1, V, { V }, 0 },
- { "UPPER", "UPPER", 113, 113, 1, 1, V, { V }, 0 },
- { "PROPER", "PROPER", 114, 114, 1, 1, V, { V }, 0 },
- { "LEFT", "LEFT", 115, 115, 1, 2, V, { V }, 0 },
- { "RIGHT", "RIGHT", 116, 116, 1, 2, V, { V }, 0 },
- { "EXACT", "EXACT", 117, 117, 2, 2, V, { V }, 0 },
- { "TRIM", "TRIM", 118, 118, 1, 1, V, { V }, 0 },
- { "REPLACE", "REPLACE", 119, 119, 4, 4, V, { V }, 0 },
- { "SUBSTITUTE", "SUBSTITUTE", 120, 120, 3, 4, V, { V }, 0 },
- { "CODE", "CODE", 121, 121, 1, 1, V, { V }, 0 },
- { "FIND", "FIND", 124, 124, 2, 3, V, { V }, 0 },
- { "CELL", "CELL", 125, 125, 1, 2, V, { V, R }, FUNCFLAG_VOLATILE },
- { "ISERR", "ISERR", 126, 126, 1, 1, V, { V }, 0 },
- { "ISTEXT", "ISTEXT", 127, 127, 1, 1, V, { V }, 0 },
- { "ISNUMBER", "ISNUMBER", 128, 128, 1, 1, V, { V }, 0 },
- { "ISBLANK", "ISBLANK", 129, 129, 1, 1, V, { V }, 0 },
- { "T", "T", 130, 130, 1, 1, V, { R }, 0 },
- { "N", "N", 131, 131, 1, 1, V, { R }, 0 },
- { "DATEVALUE", "DATEVALUE", 140, 140, 1, 1, V, { V }, 0 },
- { "TIMEVALUE", "TIMEVALUE", 141, 141, 1, 1, V, { V }, 0 },
- { "SLN", "SLN", 142, 142, 3, 3, V, { V }, 0 },
- { "SYD", "SYD", 143, 143, 4, 4, V, { V }, 0 },
- { "DDB", "DDB", 144, 144, 4, 5, V, { V }, 0 },
- { "INDIRECT", "INDIRECT", 148, 148, 1, 2, R, { V }, FUNCFLAG_VOLATILE },
+ { "ATAN2", "ATAN2", 97, 97, 2, 2, V, { VR }, 0 },
+ { "ASIN", "ASIN", 98, 98, 1, 1, V, { VR }, 0 },
+ { "ACOS", "ACOS", 99, 99, 1, 1, V, { VR }, 0 },
+ { "CHOOSE", "CHOOSE", 100, 100, 2, MX, R, { VO, RO }, 0 },
+ { "HLOOKUP", "HLOOKUP", 101, 101, 3, 3, V, { VV, RO, RO, C }, 0 },
+ { "VLOOKUP", "VLOOKUP", 102, 102, 3, 3, V, { VV, RO, RO, C }, 0 },
+ { "ISREF", "ISREF", 105, 105, 1, 1, V, { RX }, 0 },
+ { "LOG", "LOG", 109, 109, 1, 2, V, { VR }, 0 },
+ { "CHAR", "CHAR", 111, 111, 1, 1, V, { VR }, 0 },
+ { "LOWER", "LOWER", 112, 112, 1, 1, V, { VR }, 0 },
+ { "UPPER", "UPPER", 113, 113, 1, 1, V, { VR }, 0 },
+ { "PROPER", "PROPER", 114, 114, 1, 1, V, { VR }, 0 },
+ { "LEFT", "LEFT", 115, 115, 1, 2, V, { VR }, 0 },
+ { "RIGHT", "RIGHT", 116, 116, 1, 2, V, { VR }, 0 },
+ { "EXACT", "EXACT", 117, 117, 2, 2, V, { VR }, 0 },
+ { "TRIM", "TRIM", 118, 118, 1, 1, V, { VR }, 0 },
+ { "REPLACE", "REPLACE", 119, 119, 4, 4, V, { VR }, 0 },
+ { "SUBSTITUTE", "SUBSTITUTE", 120, 120, 3, 4, V, { VR }, 0 },
+ { "CODE", "CODE", 121, 121, 1, 1, V, { VR }, 0 },
+ { "FIND", "FIND", 124, 124, 2, 3, V, { VR }, 0 },
+ { "CELL", "CELL", 125, 125, 1, 2, V, { VV, RO }, FUNCFLAG_VOLATILE },
+ { "ISERR", "ISERR", 126, 126, 1, 1, V, { VR }, 0 },
+ { "ISTEXT", "ISTEXT", 127, 127, 1, 1, V, { VR }, 0 },
+ { "ISNUMBER", "ISNUMBER", 128, 128, 1, 1, V, { VR }, 0 },
+ { "ISBLANK", "ISBLANK", 129, 129, 1, 1, V, { VR }, 0 },
+ { "T", "T", 130, 130, 1, 1, V, { RO }, 0 },
+ { "N", "N", 131, 131, 1, 1, V, { RO }, 0 },
+ { "DATEVALUE", "DATEVALUE", 140, 140, 1, 1, V, { VR }, 0 },
+ { "TIMEVALUE", "TIMEVALUE", 141, 141, 1, 1, V, { VR }, 0 },
+ { "SLN", "SLN", 142, 142, 3, 3, V, { VR }, 0 },
+ { "SYD", "SYD", 143, 143, 4, 4, V, { VR }, 0 },
+ { "DDB", "DDB", 144, 144, 4, 5, V, { VR }, 0 },
+ { "INDIRECT", "INDIRECT", 148, 148, 1, 2, R, { VR }, FUNCFLAG_VOLATILE },
{ 0, "ADD.BAR", 151, 151, 0, 0, V, {}, FUNCFLAG_MACROFUNC | FUNCFLAG_ALWAYSVAR },
- { 0, "ADD.MENU", 152, 152, 2, 2, V, { V, R }, FUNCFLAG_MACROFUNC | FUNCFLAG_ALWAYSVAR },
- { 0, "ADD.COMMAND", 153, 153, 3, 3, V, { V, R }, FUNCFLAG_MACROFUNC | FUNCFLAG_ALWAYSVAR },
- { "CLEAN", "CLEAN", 162, 162, 1, 1, V, { V }, 0 },
- { "MDETERM", "MDETERM", 163, 163, 1, 1, V, { A }, 0 },
- { "MINVERSE", "MINVERSE", 164, 164, 1, 1, A, { A }, 0 },
- { "MMULT", "MMULT", 165, 165, 2, 2, A, { A }, 0 },
- { "IPMT", "IPMT", 167, 167, 4, 6, V, { V }, 0 },
- { "PPMT", "PPMT", 168, 168, 4, 6, V, { V }, 0 },
- { "COUNTA", "COUNTA", 169, 169, 0, MX, V, { R }, 0 },
- { "PRODUCT", "PRODUCT", 183, 183, 0, MX, V, { R }, 0 },
- { "FACT", "FACT", 184, 184, 1, 1, V, { V }, 0 },
- { "DPRODUCT", "DPRODUCT", 189, 189, 3, 3, V, { R }, 0 },
- { "ISNONTEXT", "ISNONTEXT", 190, 190, 1, 1, V, { V }, 0 },
- { "STDEVP", "STDEVP", 193, 193, 1, MX, V, { R }, 0 },
- { "VARP", "VARP", 194, 194, 1, MX, V, { R }, 0 },
- { "DSTDEVP", "DSTDEVP", 195, 195, 3, 3, V, { R }, 0 },
- { "DVARP", "DVARP", 196, 196, 3, 3, V, { R }, 0 },
- { "TRUNC", "TRUNC", 197, 197, 1, 1, V, { V, C, I }, 0 },
- { "ISLOGICAL", "ISLOGICAL", 198, 198, 1, 1, V, { V }, 0 },
- { "DCOUNTA", "DCOUNTA", 199, 199, 3, 3, V, { R }, 0 },
- { 0, "EXTERN.CALL", 255, 255, 1, MX, R, { ER, R }, FUNCFLAG_IMPORTONLY },
+ { 0, "ADD.MENU", 152, 152, 2, 2, V, { VR, RO }, FUNCFLAG_MACROFUNC | FUNCFLAG_ALWAYSVAR },
+ { 0, "ADD.COMMAND", 153, 153, 3, 3, V, { VR, RO }, FUNCFLAG_MACROFUNC | FUNCFLAG_ALWAYSVAR },
+ { "CLEAN", "CLEAN", 162, 162, 1, 1, V, { VR }, 0 },
+ { "MDETERM", "MDETERM", 163, 163, 1, 1, V, { VA }, 0 },
+ { "MINVERSE", "MINVERSE", 164, 164, 1, 1, A, { VA }, 0 },
+ { "MMULT", "MMULT", 165, 165, 2, 2, A, { VA }, 0 },
+ { "IPMT", "IPMT", 167, 167, 4, 6, V, { VR }, 0 },
+ { "PPMT", "PPMT", 168, 168, 4, 6, V, { VR }, 0 },
+ { "COUNTA", "COUNTA", 169, 169, 0, MX, V, { RX }, 0 },
+ { "PRODUCT", "PRODUCT", 183, 183, 0, MX, V, { RX }, 0 },
+ { "FACT", "FACT", 184, 184, 1, 1, V, { VR }, 0 },
+ { "DPRODUCT", "DPRODUCT", 189, 189, 3, 3, V, { RO, RR }, 0 },
+ { "ISNONTEXT", "ISNONTEXT", 190, 190, 1, 1, V, { VR }, 0 },
+ { "STDEVP", "STDEVP", 193, 193, 1, MX, V, { RX }, 0 },
+ { "VARP", "VARP", 194, 194, 1, MX, V, { RX }, 0 },
+ { "DSTDEVP", "DSTDEVP", 195, 195, 3, 3, V, { RO, RR }, 0 },
+ { "DVARP", "DVARP", 196, 196, 3, 3, V, { RO, RR }, 0 },
+ { "TRUNC", "TRUNC", 197, 197, 1, 1, V, { VR, C }, 0 },
+ { "ISLOGICAL", "ISLOGICAL", 198, 198, 1, 1, V, { VR }, 0 },
+ { "DCOUNTA", "DCOUNTA", 199, 199, 3, 3, V, { RO, RR }, 0 },
+ { 0, "EXTERN.CALL", 255, 255, 1, MX, R, { RO_E, RO }, FUNCFLAG_IMPORTONLY },
// *** macro sheet commands ***
- { 0, "A1.R1C1", 30, 30, 0, 1, V, { V }, FUNCFLAG_MACROCMD },
+ { 0, "A1.R1C1", 30, 30, 0, 1, V, { VR }, FUNCFLAG_MACROCMD },
{ 0, "ADD.ARROW", 81, 81, 0, 0, V, {}, FUNCFLAG_MACROCMD },
- { 0, "ACTIVATE", 103, 103, 0, 2, V, { V }, FUNCFLAG_MACROCMD },
+ { 0, "ACTIVATE", 103, 103, 0, 2, V, { VR }, FUNCFLAG_MACROCMD },
{ 0, "ACTIVATE.NEXT", 104, 104, 0, 0, V, {}, FUNCFLAG_MACROCMD },
{ 0, "ACTIVATE.PREV", 105, 105, 0, 0, V, {}, FUNCFLAG_MACROCMD }
};
@@ -431,336 +446,336 @@ static const FunctionData saFuncTableBiff2[] =
/** Functions new in BIFF3. */
static const FunctionData saFuncTableBiff3[] =
{
- { "LINEST", "LINEST", 49, 49, 1, 4, A, { R, R, V, V }, 0 }, // BIFF2: 1-2, BIFF3: 1-4
- { "TREND", "TREND", 50, 50, 1, 4, A, { R, R, R, V }, 0 }, // BIFF2: 1-3, BIFF3: 1-4
- { "LOGEST", "LOGEST", 51, 51, 1, 4, A, { R, R, V, V }, 0 }, // BIFF2: 1-2, BIFF3: 1-4
- { "GROWTH", "GROWTH", 52, 52, 1, 4, A, { R, R, R, V }, 0 }, // BIFF2: 1-3, BIFF3: 1-4
- { 0, "ADD.BAR", 151, 151, 0, 1, V, { V }, FUNCFLAG_MACROFUNC }, // BIFF2: 0, BIFF3: 0-1
- { 0, "ADD.MENU", 152, 152, 2, 3, V, { V, R }, FUNCFLAG_MACROFUNC }, // BIFF2: 2, BIFF3: 2-3
- { 0, "ADD.COMMAND", 153, 153, 3, 4, V, { V, R }, FUNCFLAG_MACROFUNC }, // BIFF2: 3, BIFF3: 3-4
- { "TRUNC", "TRUNC", 197, 197, 1, 2, V, { V }, 0 }, // BIFF2: 1, BIFF3: 1-2
- { "DOLLAR", "USDOLLAR", 204, 204, 1, 2, V, { V }, FUNCFLAG_IMPORTONLY },
- { 0/*"FIND"*/, "FINDB", 205, 205, 2, 3, V, { V }, 0 },
- { 0/*"SEARCH"*/, "SEARCHB", 206, 206, 2, 3, V, { V }, 0 },
- { 0/*"REPLACE"*/, "REPLACEB", 207, 207, 4, 4, V, { V }, 0 },
- { 0/*"LEFT"*/, "LEFTB", 208, 208, 1, 2, V, { V }, 0 },
- { 0/*"RIGHT"*/, "RIGHTB", 209, 209, 1, 2, V, { V }, 0 },
- { 0/*"MID"*/, "MIDB", 210, 210, 3, 3, V, { V }, 0 },
- { 0/*"LEN"*/, "LENB", 211, 211, 1, 1, V, { V }, 0 },
- { "ROUNDUP", "ROUNDUP", 212, 212, 2, 2, V, { V }, 0 },
- { "ROUNDDOWN", "ROUNDDOWN", 213, 213, 2, 2, V, { V }, 0 },
- { "ASC", "ASC", 214, 214, 1, 1, V, { V }, 0 },
- { "JIS", "DBCS", 215, 215, 1, 1, V, { V }, 0 },
- { "ADDRESS", "ADDRESS", 219, 219, 2, 5, V, { V }, 0 },
- { "DAYS360", "DAYS360", 220, 220, 2, 2, V, { V, V, C, I }, 0 },
+ { "LINEST", "LINEST", 49, 49, 1, 4, A, { RA, RA, VV }, 0 }, // BIFF2: 1-2, BIFF3: 1-4
+ { "TREND", "TREND", 50, 50, 1, 4, A, { RA, RA, RA, VV }, 0 }, // BIFF2: 1-3, BIFF3: 1-4
+ { "LOGEST", "LOGEST", 51, 51, 1, 4, A, { RA, RA, VV }, 0 }, // BIFF2: 1-2, BIFF3: 1-4
+ { "GROWTH", "GROWTH", 52, 52, 1, 4, A, { RA, RA, RA, VV }, 0 }, // BIFF2: 1-3, BIFF3: 1-4
+ { 0, "ADD.BAR", 151, 151, 0, 1, V, { VR }, FUNCFLAG_MACROFUNC }, // BIFF2: 0, BIFF3: 0-1
+ { 0, "ADD.MENU", 152, 152, 2, 3, V, { VR, RO }, FUNCFLAG_MACROFUNC }, // BIFF2: 2, BIFF3: 2-3
+ { 0, "ADD.COMMAND", 153, 153, 3, 4, V, { VR, RO }, FUNCFLAG_MACROFUNC }, // BIFF2: 3, BIFF3: 3-4
+ { "TRUNC", "TRUNC", 197, 197, 1, 2, V, { VR }, 0 }, // BIFF2: 1, BIFF3: 1-2
+ { "DOLLAR", "USDOLLAR", 204, 204, 1, 2, V, { VR }, FUNCFLAG_IMPORTONLY },
+ { 0/*"FIND"*/, "FINDB", 205, 205, 2, 3, V, { VR }, 0 },
+ { 0/*"SEARCH"*/, "SEARCHB", 206, 206, 2, 3, V, { VR }, 0 },
+ { 0/*"REPLACE"*/, "REPLACEB", 207, 207, 4, 4, V, { VR }, 0 },
+ { 0/*"LEFT"*/, "LEFTB", 208, 208, 1, 2, V, { VR }, 0 },
+ { 0/*"RIGHT"*/, "RIGHTB", 209, 209, 1, 2, V, { VR }, 0 },
+ { 0/*"MID"*/, "MIDB", 210, 210, 3, 3, V, { VR }, 0 },
+ { 0/*"LEN"*/, "LENB", 211, 211, 1, 1, V, { VR }, 0 },
+ { "ROUNDUP", "ROUNDUP", 212, 212, 2, 2, V, { VR }, 0 },
+ { "ROUNDDOWN", "ROUNDDOWN", 213, 213, 2, 2, V, { VR }, 0 },
+ { "ASC", "ASC", 214, 214, 1, 1, V, { VR }, 0 },
+ { "JIS", "DBCS", 215, 215, 1, 1, V, { VR }, 0 },
+ { "ADDRESS", "ADDRESS", 219, 219, 2, 5, V, { VR }, 0 },
+ { "DAYS360", "DAYS360", 220, 220, 2, 2, V, { VR, VR, C }, 0 },
{ "TODAY", "TODAY", 221, 221, 0, 0, V, {}, FUNCFLAG_VOLATILE },
- { "VDB", "VDB", 222, 222, 5, 7, V, { V }, 0 },
- { "MEDIAN", "MEDIAN", 227, 227, 1, MX, V, { R }, 0 },
- { "SUMPRODUCT", "SUMPRODUCT", 228, 228, 1, MX, V, { A }, 0 },
- { "SINH", "SINH", 229, 229, 1, 1, V, { V }, 0 },
- { "COSH", "COSH", 230, 230, 1, 1, V, { V }, 0 },
- { "TANH", "TANH", 231, 231, 1, 1, V, { V }, 0 },
- { "COTH", 0, 231, 231, 1, 1, V, { V }, FUNCFLAG_EXPORTONLY },
- { "ASINH", "ASINH", 232, 232, 1, 1, V, { V }, 0 },
- { "ACOSH", "ACOSH", 233, 233, 1, 1, V, { V }, 0 },
- { "ATANH", "ATANH", 234, 234, 1, 1, V, { V }, 0 },
- { "ACOTH", 0, 234, 234, 1, 1, V, { V }, FUNCFLAG_EXPORTONLY },
- { "DGET", "DGET", 235, 235, 3, 3, V, { R }, 0 },
- { "INFO", "INFO", 244, 244, 1, 1, V, { V }, FUNCFLAG_VOLATILE }
+ { "VDB", "VDB", 222, 222, 5, 7, V, { VR }, 0 },
+ { "MEDIAN", "MEDIAN", 227, 227, 1, MX, V, { RX }, 0 },
+ { "SUMPRODUCT", "SUMPRODUCT", 228, 228, 1, MX, V, { VA }, 0 },
+ { "SINH", "SINH", 229, 229, 1, 1, V, { VR }, 0 },
+ { "COSH", "COSH", 230, 230, 1, 1, V, { VR }, 0 },
+ { "TANH", "TANH", 231, 231, 1, 1, V, { VR }, 0 },
+ { "COTH", "TANH", 231, 231, 1, 1, V, { VR }, FUNCFLAG_EXPORTONLY },
+ { "ASINH", "ASINH", 232, 232, 1, 1, V, { VR }, 0 },
+ { "ACOSH", "ACOSH", 233, 233, 1, 1, V, { VR }, 0 },
+ { "ATANH", "ATANH", 234, 234, 1, 1, V, { VR }, 0 },
+ { "ACOTH", "ATANH", 234, 234, 1, 1, V, { VR }, FUNCFLAG_EXPORTONLY },
+ { "DGET", "DGET", 235, 235, 3, 3, V, { RO, RR }, 0 },
+ { "INFO", "INFO", 244, 244, 1, 1, V, { VR }, FUNCFLAG_VOLATILE }
};
/** Functions new in BIFF4. */
static const FunctionData saFuncTableBiff4[] =
{
- { "FIXED", "FIXED", 14, 14, 1, 3, V, { V }, 0 }, // BIFF2-3: 1-2, BIFF4: 1-3
- { "RANK", "RANK", 216, 216, 2, 3, V, { V, R, V }, 0 },
- { "DB", "DB", 247, 247, 4, 5, V, { V }, 0 },
- { "FREQUENCY", "FREQUENCY", 252, 252, 2, 2, A, { R }, 0 },
- { "ORG.OPENOFFICE.ERRORTYPE","ERROR.TYPE", 261, 261, 1, 1, V, { V }, 0 },
- { "AVEDEV", "AVEDEV", 269, 269, 1, MX, V, { R }, 0 },
- { "BETADIST", "BETADIST", 270, 270, 3, 5, V, { V }, 0 },
- { "GAMMALN", "GAMMALN", 271, 271, 1, 1, V, { V }, 0 },
- { "BETAINV", "BETAINV", 272, 272, 3, 5, V, { V }, 0 },
- { "BINOMDIST", "BINOMDIST", 273, 273, 4, 4, V, { V }, 0 },
- { "LEGACY.CHIDIST", "CHIDIST", 274, 274, 2, 2, V, { V }, 0 },
- { "LEGACY.CHIINV", "CHIINV", 275, 275, 2, 2, V, { V }, 0 },
- { "COMBIN", "COMBIN", 276, 276, 2, 2, V, { V }, 0 },
- { "CONFIDENCE", "CONFIDENCE", 277, 277, 3, 3, V, { V }, 0 },
- { "CRITBINOM", "CRITBINOM", 278, 278, 3, 3, V, { V }, 0 },
- { "EVEN", "EVEN", 279, 279, 1, 1, V, { V }, 0 },
- { "EXPONDIST", "EXPONDIST", 280, 280, 3, 3, V, { V }, 0 },
- { "LEGACY.FDIST", "FDIST", 281, 281, 3, 3, V, { V }, 0 },
- { "LEGACY.FINV", "FINV", 282, 282, 3, 3, V, { V }, 0 },
- { "FISHER", "FISHER", 283, 283, 1, 1, V, { V }, 0 },
- { "FISHERINV", "FISHERINV", 284, 284, 1, 1, V, { V }, 0 },
- { "FLOOR", "FLOOR", 285, 285, 2, 2, V, { V, V, C, I }, 0 },
- { "GAMMADIST", "GAMMADIST", 286, 286, 4, 4, V, { V }, 0 },
- { "GAMMAINV", "GAMMAINV", 287, 287, 3, 3, V, { V }, 0 },
- { "CEILING", "CEILING", 288, 288, 2, 2, V, { V, V, C, I }, 0 },
- { "HYPGEOMDIST", "HYPGEOMDIST", 289, 289, 4, 4, V, { V }, 0 },
- { "LOGNORMDIST", "LOGNORMDIST", 290, 290, 3, 3, V, { V }, 0 },
- { "LOGINV", "LOGINV", 291, 291, 3, 3, V, { V }, 0 },
- { "NEGBINOMDIST", "NEGBINOMDIST", 292, 292, 3, 3, V, { V }, 0 },
- { "NORMDIST", "NORMDIST", 293, 293, 4, 4, V, { V }, 0 },
- { "LEGACY.NORMSDIST", "NORMSDIST", 294, 294, 1, 1, V, { V }, 0 },
- { "NORMINV", "NORMINV", 295, 295, 3, 3, V, { V }, 0 },
- { "LEGACY.NORMSINV", "NORMSINV", 296, 296, 1, 1, V, { V }, 0 },
- { "STANDARDIZE", "STANDARDIZE", 297, 297, 3, 3, V, { V }, 0 },
- { "ODD", "ODD", 298, 298, 1, 1, V, { V }, 0 },
- { "PERMUT", "PERMUT", 299, 299, 2, 2, V, { V }, 0 },
- { "POISSON", "POISSON", 300, 300, 3, 3, V, { V }, 0 },
- { "TDIST", "TDIST", 301, 301, 3, 3, V, { V }, 0 },
- { "WEIBULL", "WEIBULL", 302, 302, 4, 4, V, { V }, 0 },
- { "SUMXMY2", "SUMXMY2", 303, 303, 2, 2, V, { A }, 0 },
- { "SUMX2MY2", "SUMX2MY2", 304, 304, 2, 2, V, { A }, 0 },
- { "SUMX2PY2", "SUMX2PY2", 305, 305, 2, 2, V, { A }, 0 },
- { "LEGACY.CHITEST", "CHITEST", 306, 306, 2, 2, V, { A }, 0 },
- { "CORREL", "CORREL", 307, 307, 2, 2, V, { A }, 0 },
- { "COVAR", "COVAR", 308, 308, 2, 2, V, { A }, 0 },
- { "FORECAST", "FORECAST", 309, 309, 3, 3, V, { V, A }, 0 },
- { "FTEST", "FTEST", 310, 310, 2, 2, V, { A }, 0 },
- { "INTERCEPT", "INTERCEPT", 311, 311, 2, 2, V, { A }, 0 },
- { "PEARSON", "PEARSON", 312, 312, 2, 2, V, { A }, 0 },
- { "RSQ", "RSQ", 313, 313, 2, 2, V, { A }, 0 },
- { "STEYX", "STEYX", 314, 314, 2, 2, V, { A }, 0 },
- { "SLOPE", "SLOPE", 315, 315, 2, 2, V, { A }, 0 },
- { "TTEST", "TTEST", 316, 316, 4, 4, V, { A, A, V }, 0 },
- { "PROB", "PROB", 317, 317, 3, 4, V, { A, A, V }, 0 },
- { "DEVSQ", "DEVSQ", 318, 318, 1, MX, V, { R }, 0 },
- { "GEOMEAN", "GEOMEAN", 319, 319, 1, MX, V, { R }, 0 },
- { "HARMEAN", "HARMEAN", 320, 320, 1, MX, V, { R }, 0 },
- { "SUMSQ", "SUMSQ", 321, 321, 0, MX, V, { R }, 0 },
- { "KURT", "KURT", 322, 322, 1, MX, V, { R }, 0 },
- { "SKEW", "SKEW", 323, 323, 1, MX, V, { R }, 0 },
- { "ZTEST", "ZTEST", 324, 324, 2, 3, V, { R, V }, 0 },
- { "LARGE", "LARGE", 325, 325, 2, 2, V, { R, V }, 0 },
- { "SMALL", "SMALL", 326, 326, 2, 2, V, { R, V }, 0 },
- { "QUARTILE", "QUARTILE", 327, 327, 2, 2, V, { R, V }, 0 },
- { "PERCENTILE", "PERCENTILE", 328, 328, 2, 2, V, { R, V }, 0 },
- { "PERCENTRANK", "PERCENTRANK", 329, 329, 2, 3, V, { R, V, EV, I }, 0 },
- { "MODE", "MODE", 330, 330, 1, MX, V, { A }, 0 },
- { "TRIMMEAN", "TRIMMEAN", 331, 331, 2, 2, V, { R, V }, 0 },
- { "TINV", "TINV", 332, 332, 2, 2, V, { V }, 0 },
+ { "FIXED", "FIXED", 14, 14, 1, 3, V, { VR }, 0 }, // BIFF2-3: 1-2, BIFF4: 1-3
+ { "RANK", "RANK", 216, 216, 2, 3, V, { VR, RO, VR }, 0 },
+ { "DB", "DB", 247, 247, 4, 5, V, { VR }, 0 },
+ { "FREQUENCY", "FREQUENCY", 252, 252, 2, 2, A, { RA }, 0 },
+ { "ORG.OPENOFFICE.ERRORTYPE","ERROR.TYPE", 261, 261, 1, 1, V, { VR }, 0 },
+ { "AVEDEV", "AVEDEV", 269, 269, 1, MX, V, { RX }, 0 },
+ { "BETADIST", "BETADIST", 270, 270, 3, 5, V, { VR }, 0 },
+ { "GAMMALN", "GAMMALN", 271, 271, 1, 1, V, { VR }, 0 },
+ { "BETAINV", "BETAINV", 272, 272, 3, 5, V, { VR }, 0 },
+ { "BINOMDIST", "BINOMDIST", 273, 273, 4, 4, V, { VR }, 0 },
+ { "LEGACY.CHIDIST", "CHIDIST", 274, 274, 2, 2, V, { VR }, 0 },
+ { "LEGACY.CHIINV", "CHIINV", 275, 275, 2, 2, V, { VR }, 0 },
+ { "COMBIN", "COMBIN", 276, 276, 2, 2, V, { VR }, 0 },
+ { "CONFIDENCE", "CONFIDENCE", 277, 277, 3, 3, V, { VR }, 0 },
+ { "CRITBINOM", "CRITBINOM", 278, 278, 3, 3, V, { VR }, 0 },
+ { "EVEN", "EVEN", 279, 279, 1, 1, V, { VR }, 0 },
+ { "EXPONDIST", "EXPONDIST", 280, 280, 3, 3, V, { VR }, 0 },
+ { "LEGACY.FDIST", "FDIST", 281, 281, 3, 3, V, { VR }, 0 },
+ { "LEGACY.FINV", "FINV", 282, 282, 3, 3, V, { VR }, 0 },
+ { "FISHER", "FISHER", 283, 283, 1, 1, V, { VR }, 0 },
+ { "FISHERINV", "FISHERINV", 284, 284, 1, 1, V, { VR }, 0 },
+ { "FLOOR", "FLOOR", 285, 285, 2, 2, V, { VR, VR, C }, 0 },
+ { "GAMMADIST", "GAMMADIST", 286, 286, 4, 4, V, { VR }, 0 },
+ { "GAMMAINV", "GAMMAINV", 287, 287, 3, 3, V, { VR }, 0 },
+ { "CEILING", "CEILING", 288, 288, 2, 2, V, { VR, VR, C }, 0 },
+ { "HYPGEOMDIST", "HYPGEOMDIST", 289, 289, 4, 4, V, { VR }, 0 },
+ { "LOGNORMDIST", "LOGNORMDIST", 290, 290, 3, 3, V, { VR }, 0 },
+ { "LOGINV", "LOGINV", 291, 291, 3, 3, V, { VR }, 0 },
+ { "NEGBINOMDIST", "NEGBINOMDIST", 292, 292, 3, 3, V, { VR }, 0 },
+ { "NORMDIST", "NORMDIST", 293, 293, 4, 4, V, { VR }, 0 },
+ { "LEGACY.NORMSDIST", "NORMSDIST", 294, 294, 1, 1, V, { VR }, 0 },
+ { "NORMINV", "NORMINV", 295, 295, 3, 3, V, { VR }, 0 },
+ { "LEGACY.NORMSINV", "NORMSINV", 296, 296, 1, 1, V, { VR }, 0 },
+ { "STANDARDIZE", "STANDARDIZE", 297, 297, 3, 3, V, { VR }, 0 },
+ { "ODD", "ODD", 298, 298, 1, 1, V, { VR }, 0 },
+ { "PERMUT", "PERMUT", 299, 299, 2, 2, V, { VR }, 0 },
+ { "POISSON", "POISSON", 300, 300, 3, 3, V, { VR }, 0 },
+ { "TDIST", "TDIST", 301, 301, 3, 3, V, { VR }, 0 },
+ { "WEIBULL", "WEIBULL", 302, 302, 4, 4, V, { VR }, 0 },
+ { "SUMXMY2", "SUMXMY2", 303, 303, 2, 2, V, { VA }, 0 },
+ { "SUMX2MY2", "SUMX2MY2", 304, 304, 2, 2, V, { VA }, 0 },
+ { "SUMX2PY2", "SUMX2PY2", 305, 305, 2, 2, V, { VA }, 0 },
+ { "LEGACY.CHITEST", "CHITEST", 306, 306, 2, 2, V, { VA }, 0 },
+ { "CORREL", "CORREL", 307, 307, 2, 2, V, { VA }, 0 },
+ { "COVAR", "COVAR", 308, 308, 2, 2, V, { VA }, 0 },
+ { "FORECAST", "FORECAST", 309, 309, 3, 3, V, { VR, VA }, 0 },
+ { "FTEST", "FTEST", 310, 310, 2, 2, V, { VA }, 0 },
+ { "INTERCEPT", "INTERCEPT", 311, 311, 2, 2, V, { VA }, 0 },
+ { "PEARSON", "PEARSON", 312, 312, 2, 2, V, { VA }, 0 },
+ { "RSQ", "RSQ", 313, 313, 2, 2, V, { VA }, 0 },
+ { "STEYX", "STEYX", 314, 314, 2, 2, V, { VA }, 0 },
+ { "SLOPE", "SLOPE", 315, 315, 2, 2, V, { VA }, 0 },
+ { "TTEST", "TTEST", 316, 316, 4, 4, V, { VA, VA, VR }, 0 },
+ { "PROB", "PROB", 317, 317, 3, 4, V, { VA, VA, VR }, 0 },
+ { "DEVSQ", "DEVSQ", 318, 318, 1, MX, V, { RX }, 0 },
+ { "GEOMEAN", "GEOMEAN", 319, 319, 1, MX, V, { RX }, 0 },
+ { "HARMEAN", "HARMEAN", 320, 320, 1, MX, V, { RX }, 0 },
+ { "SUMSQ", "SUMSQ", 321, 321, 0, MX, V, { RX }, 0 },
+ { "KURT", "KURT", 322, 322, 1, MX, V, { RX }, 0 },
+ { "SKEW", "SKEW", 323, 323, 1, MX, V, { RX }, 0 },
+ { "ZTEST", "ZTEST", 324, 324, 2, 3, V, { RX, VR }, 0 },
+ { "LARGE", "LARGE", 325, 325, 2, 2, V, { RX, VR }, 0 },
+ { "SMALL", "SMALL", 326, 326, 2, 2, V, { RX, VR }, 0 },
+ { "QUARTILE", "QUARTILE", 327, 327, 2, 2, V, { RX, VR }, 0 },
+ { "PERCENTILE", "PERCENTILE", 328, 328, 2, 2, V, { RX, VR }, 0 },
+ { "PERCENTRANK", "PERCENTRANK", 329, 329, 2, 3, V, { RX, VR, VR_E }, 0 },
+ { "MODE", "MODE", 330, 330, 1, MX, V, { VA }, 0 },
+ { "TRIMMEAN", "TRIMMEAN", 331, 331, 2, 2, V, { RX, VR }, 0 },
+ { "TINV", "TINV", 332, 332, 2, 2, V, { VR }, 0 },
// *** Analysis add-in ***
- { "HEX2BIN", "HEX2BIN", 384, NOID, 1, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "HEX2DEC", "HEX2DEC", 385, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "HEX2OCT", "HEX2OCT", 386, NOID, 1, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "DEC2BIN", "DEC2BIN", 387, NOID, 1, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "DEC2HEX", "DEC2HEX", 388, NOID, 1, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "DEC2OCT", "DEC2OCT", 389, NOID, 1, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "OCT2BIN", "OCT2BIN", 390, NOID, 1, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "OCT2HEX", "OCT2HEX", 391, NOID, 1, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "OCT2DEC", "OCT2DEC", 392, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "BIN2DEC", "BIN2DEC", 393, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "BIN2OCT", "BIN2OCT", 394, NOID, 1, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "BIN2HEX", "BIN2HEX", 395, NOID, 1, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMSUB", "IMSUB", 396, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMDIV", "IMDIV", 397, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMPOWER", "IMPOWER", 398, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMABS", "IMABS", 399, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMSQRT", "IMSQRT", 400, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMLN", "IMLN", 401, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMLOG2", "IMLOG2", 402, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMLOG10", "IMLOG10", 403, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMSIN", "IMSIN", 404, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMCOS", "IMCOS", 405, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMEXP", "IMEXP", 406, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMARGUMENT", "IMARGUMENT", 407, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMCONJUGATE", "IMCONJUGATE", 408, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMAGINARY", "IMAGINARY", 409, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMREAL", "IMREAL", 410, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "COMPLEX", "COMPLEX", 411, NOID, 2, 3, V, { V }, FUNCFLAG_EXTERNAL },
- { "IMSUM", "IMSUM", 412, NOID, 1, MX, V, { R }, FUNCFLAG_EXTERNAL },
- { "IMPRODUCT", "IMPRODUCT", 413, NOID, 1, MX, V, { R }, FUNCFLAG_EXTERNAL },
- { "SERIESSUM", "SERIESSUM", 414, NOID, 4, 4, V, { V, V, V, R }, FUNCFLAG_EXTERNAL },
- { "FACTDOUBLE", "FACTDOUBLE", 415, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "SQRTPI", "SQRTPI", 416, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "QUOTIENT", "QUOTIENT", 417, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "DELTA", "DELTA", 418, NOID, 1, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "GESTEP", "GESTEP", 419, NOID, 1, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "ISEVEN", "ISEVEN", 420, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
- { "ISODD", "ISODD", 421, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
- { "MROUND", "MROUND", 422, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "ERF", "ERF", 423, NOID, 1, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "ERFC", "ERFC", 424, NOID, 1, 1, V, { V }, FUNCFLAG_EXTERNAL },
- { "BESSELJ", "BESSELJ", 425, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "BESSELK", "BESSELK", 426, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "BESSELY", "BESSELY", 427, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "BESSELI", "BESSELI", 428, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "XIRR", "XIRR", 429, NOID, 2, 3, V, { A, R, V }, FUNCFLAG_EXTERNAL },
- { "XNPV", "XNPV", 430, NOID, 3, 3, V, { V, A, R }, FUNCFLAG_EXTERNAL },
- { "PRICEMAT", "PRICEMAT", 431, NOID, 5, 6, V, { V }, FUNCFLAG_EXTERNAL },
- { "YIELDMAT", "YIELDMAT", 432, NOID, 5, 6, V, { V }, FUNCFLAG_EXTERNAL },
- { "INTRATE", "INTRATE", 433, NOID, 4, 5, V, { V }, FUNCFLAG_EXTERNAL },
- { "RECEIVED", "RECEIVED", 434, NOID, 4, 5, V, { V }, FUNCFLAG_EXTERNAL },
- { "DISC", "DISC", 435, NOID, 4, 5, V, { V }, FUNCFLAG_EXTERNAL },
- { "PRICEDISC", "PRICEDISC", 436, NOID, 4, 5, V, { V }, FUNCFLAG_EXTERNAL },
- { "YIELDDISC", "YIELDDISC", 437, NOID, 4, 5, V, { V }, FUNCFLAG_EXTERNAL },
- { "TBILLEQ", "TBILLEQ", 438, NOID, 3, 3, V, { V }, FUNCFLAG_EXTERNAL },
- { "TBILLPRICE", "TBILLPRICE", 439, NOID, 3, 3, V, { V }, FUNCFLAG_EXTERNAL },
- { "TBILLYIELD", "TBILLYIELD", 440, NOID, 3, 3, V, { V }, FUNCFLAG_EXTERNAL },
- { "PRICE", "PRICE", 441, NOID, 6, 7, V, { V }, FUNCFLAG_EXTERNAL },
- { "YIELD", "YIELD", 442, NOID, 6, 7, V, { V }, FUNCFLAG_EXTERNAL },
- { "DOLLARDE", "DOLLARDE", 443, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "DOLLARFR", "DOLLARFR", 444, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "NOMINAL", "NOMINAL", 445, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
- { "EFFECT", "EFFECT", 446, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
- { "CUMPRINC", "CUMPRINC", 447, NOID, 6, 6, V, { V }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
- { "CUMIPMT", "CUMIPMT", 448, NOID, 6, 6, V, { V }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
- { "EDATE", "EDATE", 449, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "EOMONTH", "EOMONTH", 450, NOID, 2, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "YEARFRAC", "YEARFRAC", 451, NOID, 2, 3, V, { V }, FUNCFLAG_EXTERNAL },
- { "COUPDAYBS", "COUPDAYBS", 452, NOID, 3, 4, V, { V }, FUNCFLAG_EXTERNAL },
- { "COUPDAYS", "COUPDAYS", 453, NOID, 3, 4, V, { V }, FUNCFLAG_EXTERNAL },
- { "COUPDAYSNC", "COUPDAYSNC", 454, NOID, 3, 4, V, { V }, FUNCFLAG_EXTERNAL },
- { "COUPNCD", "COUPNCD", 455, NOID, 3, 4, V, { V }, FUNCFLAG_EXTERNAL },
- { "COUPNUM", "COUPNUM", 456, NOID, 3, 4, V, { V }, FUNCFLAG_EXTERNAL },
- { "COUPPCD", "COUPPCD", 457, NOID, 3, 4, V, { V }, FUNCFLAG_EXTERNAL },
- { "DURATION", "DURATION", 458, NOID, 5, 6, V, { V }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
- { "MDURATION", "MDURATION", 459, NOID, 5, 6, V, { V }, FUNCFLAG_EXTERNAL },
- { "ODDLPRICE", "ODDLPRICE", 460, NOID, 7, 8, V, { V }, FUNCFLAG_EXTERNAL },
- { "ODDLYIELD", "ODDLYIELD", 461, NOID, 8, 9, V, { V }, FUNCFLAG_EXTERNAL },
- { "ODDFPRICE", "ODDFPRICE", 462, NOID, 8, 9, V, { V }, FUNCFLAG_EXTERNAL },
- { "ODDFYIELD", "ODDFYIELD", 463, NOID, 8, 9, V, { V }, FUNCFLAG_EXTERNAL },
- { "RANDBETWEEN", "RANDBETWEEN", 464, NOID, 2, 2, V, {}, FUNCFLAG_VOLATILE | FUNCFLAG_EXTERNAL },
- { "WEEKNUM", "WEEKNUM", 465, NOID, 1, 2, V, { V }, FUNCFLAG_EXTERNAL },
- { "AMORDEGRC", "AMORDEGRC", 466, NOID, 6, 7, V, { V }, FUNCFLAG_EXTERNAL },
- { "AMORLINC", "AMORLINC", 467, NOID, 6, 7, V, { V }, FUNCFLAG_EXTERNAL },
- { "CONVERT", "CONVERT", 468, NOID, 3, 3, V, { V }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
- { "ACCRINT", "ACCRINT", 469, NOID, 6, 7, V, { V }, FUNCFLAG_EXTERNAL },
- { "ACCRINTM", "ACCRINTM", 470, NOID, 4, 5, V, { V }, FUNCFLAG_EXTERNAL },
- { "WORKDAY", "WORKDAY", 471, NOID, 2, 3, V, { V, V, A, C, I }, FUNCFLAG_EXTERNAL },
- { "NETWORKDAYS", "NETWORKDAYS", 472, NOID, 2, 3, V, { V, V, A, C, I }, FUNCFLAG_EXTERNAL },
- { "GCD", "GCD", 473, NOID, 1, MX, V, { R }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
- { "MULTINOMIAL", "MULTINOMIAL", 474, NOID, 1, MX, V, { R }, FUNCFLAG_EXTERNAL },
- { "LCM", "LCM", 475, NOID, 1, MX, V, { R }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
- { "FVSCHEDULE", "FVSCHEDULE", 476, NOID, 2, 2, V, { V, A }, FUNCFLAG_EXTERNAL },
+ { "HEX2BIN", "HEX2BIN", 384, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "HEX2DEC", "HEX2DEC", 385, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "HEX2OCT", "HEX2OCT", 386, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "DEC2BIN", "DEC2BIN", 387, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "DEC2HEX", "DEC2HEX", 388, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "DEC2OCT", "DEC2OCT", 389, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "OCT2BIN", "OCT2BIN", 390, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "OCT2HEX", "OCT2HEX", 391, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "OCT2DEC", "OCT2DEC", 392, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "BIN2DEC", "BIN2DEC", 393, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "BIN2OCT", "BIN2OCT", 394, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "BIN2HEX", "BIN2HEX", 395, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMSUB", "IMSUB", 396, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMDIV", "IMDIV", 397, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMPOWER", "IMPOWER", 398, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMABS", "IMABS", 399, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMSQRT", "IMSQRT", 400, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMLN", "IMLN", 401, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMLOG2", "IMLOG2", 402, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMLOG10", "IMLOG10", 403, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMSIN", "IMSIN", 404, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMCOS", "IMCOS", 405, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMEXP", "IMEXP", 406, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMARGUMENT", "IMARGUMENT", 407, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMCONJUGATE", "IMCONJUGATE", 408, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMAGINARY", "IMAGINARY", 409, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMREAL", "IMREAL", 410, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "COMPLEX", "COMPLEX", 411, NOID, 2, 3, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "IMSUM", "IMSUM", 412, NOID, 1, MX, V, { RX }, FUNCFLAG_EXTERNAL },
+ { "IMPRODUCT", "IMPRODUCT", 413, NOID, 1, MX, V, { RX }, FUNCFLAG_EXTERNAL },
+ { "SERIESSUM", "SERIESSUM", 414, NOID, 4, 4, V, { RR, RR, RR, RX }, FUNCFLAG_EXTERNAL },
+ { "FACTDOUBLE", "FACTDOUBLE", 415, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "SQRTPI", "SQRTPI", 416, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "QUOTIENT", "QUOTIENT", 417, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "DELTA", "DELTA", 418, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "GESTEP", "GESTEP", 419, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "ISEVEN", "ISEVEN", 420, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
+ { "ISODD", "ISODD", 421, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
+ { "MROUND", "MROUND", 422, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "ERF", "ERF", 423, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "ERFC", "ERFC", 424, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "BESSELJ", "BESSELJ", 425, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "BESSELK", "BESSELK", 426, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "BESSELY", "BESSELY", 427, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "BESSELI", "BESSELI", 428, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "XIRR", "XIRR", 429, NOID, 2, 3, V, { RX, RX, RR }, FUNCFLAG_EXTERNAL },
+ { "XNPV", "XNPV", 430, NOID, 3, 3, V, { RR, RX, RX }, FUNCFLAG_EXTERNAL },
+ { "PRICEMAT", "PRICEMAT", 431, NOID, 5, 6, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "YIELDMAT", "YIELDMAT", 432, NOID, 5, 6, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "INTRATE", "INTRATE", 433, NOID, 4, 5, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "RECEIVED", "RECEIVED", 434, NOID, 4, 5, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "DISC", "DISC", 435, NOID, 4, 5, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "PRICEDISC", "PRICEDISC", 436, NOID, 4, 5, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "YIELDDISC", "YIELDDISC", 437, NOID, 4, 5, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "TBILLEQ", "TBILLEQ", 438, NOID, 3, 3, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "TBILLPRICE", "TBILLPRICE", 439, NOID, 3, 3, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "TBILLYIELD", "TBILLYIELD", 440, NOID, 3, 3, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "PRICE", "PRICE", 441, NOID, 6, 7, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "YIELD", "YIELD", 442, NOID, 6, 7, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "DOLLARDE", "DOLLARDE", 443, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "DOLLARFR", "DOLLARFR", 444, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "NOMINAL", "NOMINAL", 445, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
+ { "EFFECT", "EFFECT", 446, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
+ { "CUMPRINC", "CUMPRINC", 447, NOID, 6, 6, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
+ { "CUMIPMT", "CUMIPMT", 448, NOID, 6, 6, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
+ { "EDATE", "EDATE", 449, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "EOMONTH", "EOMONTH", 450, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "YEARFRAC", "YEARFRAC", 451, NOID, 2, 3, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "COUPDAYBS", "COUPDAYBS", 452, NOID, 3, 4, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "COUPDAYS", "COUPDAYS", 453, NOID, 3, 4, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "COUPDAYSNC", "COUPDAYSNC", 454, NOID, 3, 4, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "COUPNCD", "COUPNCD", 455, NOID, 3, 4, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "COUPNUM", "COUPNUM", 456, NOID, 3, 4, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "COUPPCD", "COUPPCD", 457, NOID, 3, 4, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "DURATION", "DURATION", 458, NOID, 5, 6, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
+ { "MDURATION", "MDURATION", 459, NOID, 5, 6, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "ODDLPRICE", "ODDLPRICE", 460, NOID, 7, 8, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "ODDLYIELD", "ODDLYIELD", 461, NOID, 8, 9, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "ODDFPRICE", "ODDFPRICE", 462, NOID, 8, 9, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "ODDFYIELD", "ODDFYIELD", 463, NOID, 8, 9, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "RANDBETWEEN", "RANDBETWEEN", 464, NOID, 2, 2, V, { RR }, FUNCFLAG_VOLATILE | FUNCFLAG_EXTERNAL },
+ { "WEEKNUM", "WEEKNUM", 465, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "AMORDEGRC", "AMORDEGRC", 466, NOID, 6, 7, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "AMORLINC", "AMORLINC", 467, NOID, 6, 7, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "CONVERT", "CONVERT", 468, NOID, 3, 3, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
+ { "ACCRINT", "ACCRINT", 469, NOID, 6, 7, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "ACCRINTM", "ACCRINTM", 470, NOID, 4, 5, V, { RR }, FUNCFLAG_EXTERNAL },
+ { "WORKDAY", "WORKDAY", 471, NOID, 2, 3, V, { RR, RR, RX, C }, FUNCFLAG_EXTERNAL },
+ { "NETWORKDAYS", "NETWORKDAYS", 472, NOID, 2, 3, V, { RR, RR, RX, C }, FUNCFLAG_EXTERNAL },
+ { "GCD", "GCD", 473, NOID, 1, MX, V, { RX }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
+ { "MULTINOMIAL", "MULTINOMIAL", 474, NOID, 1, MX, V, { RX }, FUNCFLAG_EXTERNAL },
+ { "LCM", "LCM", 475, NOID, 1, MX, V, { RX }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in
+ { "FVSCHEDULE", "FVSCHEDULE", 476, NOID, 2, 2, V, { RR, RX }, FUNCFLAG_EXTERNAL },
// *** macro sheet commands ***
- { 0, "ACTIVATE.NEXT", 104, 104, 0, 1, V, { V }, FUNCFLAG_MACROCMD }, // BIFF2-3: 0, BIFF4: 0-1
- { 0, "ACTIVATE.PREV", 105, 105, 0, 1, V, { V }, FUNCFLAG_MACROCMD } // BIFF2-3: 0, BIFF4: 0-1
+ { 0, "ACTIVATE.NEXT", 104, 104, 0, 1, V, { VR }, FUNCFLAG_MACROCMD }, // BIFF2-3: 0, BIFF4: 0-1
+ { 0, "ACTIVATE.PREV", 105, 105, 0, 1, V, { VR }, FUNCFLAG_MACROCMD } // BIFF2-3: 0, BIFF4: 0-1
};
/** Functions new in BIFF5/BIFF7. */
static const FunctionData saFuncTableBiff5[] =
{
- { "WEEKDAY", "WEEKDAY", 70, 70, 1, 2, V, { V }, 0 }, // BIFF2-4: 1, BIFF5: 1-2
- { "HLOOKUP", "HLOOKUP", 101, 101, 3, 4, V, { V, R, R, V }, 0 }, // BIFF2-4: 3, BIFF5: 3-4
- { "VLOOKUP", "VLOOKUP", 102, 102, 3, 4, V, { V, R, R, V }, 0 }, // BIFF2-4: 3, BIFF5: 3-4
- { 0, "ADD.MENU", 152, 152, 2, 4, V, { V, R, R, V }, FUNCFLAG_MACROFUNC }, // BIFF3-4: 2-3, BIFF5: 2-4
- { 0, "ADD.COMMAND", 153, 153, 3, 5, V, { V, R, R, R, V }, FUNCFLAG_MACROFUNC }, // BIFF3-4: 3-4, BIFF5: 3-5
- { "DAYS360", "DAYS360", 220, 220, 2, 3, V, { V }, 0 }, // BIFF3-4: 2, BIFF5: 2-3
- { 0, "EXTERN.CALL", 255, 255, 1, MX, R, { ER, R }, FUNCFLAG_EXPORTONLY }, // MACRO or EXTERNAL
- { "CONCATENATE", "CONCATENATE", 336, 336, 0, MX, V, { V }, 0 },
- { "POWER", "POWER", 337, 337, 2, 2, V, { V }, 0 },
- { "RADIANS", "RADIANS", 342, 342, 1, 1, V, { V }, 0 },
- { "DEGREES", "DEGREES", 343, 343, 1, 1, V, { V }, 0 },
- { "SUBTOTAL", "SUBTOTAL", 344, 344, 2, MX, V, { V, R }, 0 },
- { "SUMIF", "SUMIF", 345, 345, 2, 3, V, { R, V, R }, 0 },
- { "COUNTIF", "COUNTIF", 346, 346, 2, 2, V, { R, V }, 0 },
- { "COUNTBLANK", "COUNTBLANK", 347, 347, 1, 1, V, { R }, 0 },
- { "ISPMT", "ISPMT", 350, 350, 4, 4, V, { V }, 0 },
- { 0, "DATEDIF", 351, 351, 3, 3, V, { V }, FUNCFLAG_IMPORTONLY }, // not supported in Calc
- { 0, "DATESTRING", 352, 352, 1, 1, V, { V }, FUNCFLAG_IMPORTONLY }, // not supported in Calc, missing in OOX spec
- { 0, "NUMBERSTRING", 353, 353, 2, 2, V, { V }, FUNCFLAG_IMPORTONLY }, // not supported in Calc, missing in OOX spec
- { "ROMAN", "ROMAN", 354, 354, 1, 2, V, { V }, 0 },
+ { "WEEKDAY", "WEEKDAY", 70, 70, 1, 2, V, { VR }, 0 }, // BIFF2-4: 1, BIFF5: 1-2
+ { "HLOOKUP", "HLOOKUP", 101, 101, 3, 4, V, { VV, RO, RO, VV }, 0 }, // BIFF2-4: 3, BIFF5: 3-4
+ { "VLOOKUP", "VLOOKUP", 102, 102, 3, 4, V, { VV, RO, RO, VV }, 0 }, // BIFF2-4: 3, BIFF5: 3-4
+ { 0, "ADD.MENU", 152, 152, 2, 4, V, { VR, RO, RO, VR }, FUNCFLAG_MACROFUNC }, // BIFF3-4: 2-3, BIFF5: 2-4
+ { 0, "ADD.COMMAND", 153, 153, 3, 5, V, { VR, RO, RO, RO, VR }, FUNCFLAG_MACROFUNC }, // BIFF3-4: 3-4, BIFF5: 3-5
+ { "DAYS360", "DAYS360", 220, 220, 2, 3, V, { VR }, 0 }, // BIFF3-4: 2, BIFF5: 2-3
+ { 0, "EXTERN.CALL", 255, 255, 1, MX, R, { RO_E, RO }, FUNCFLAG_EXPORTONLY }, // MACRO or EXTERNAL
+ { "CONCATENATE", "CONCATENATE", 336, 336, 0, MX, V, { VR }, 0 },
+ { "POWER", "POWER", 337, 337, 2, 2, V, { VR }, 0 },
+ { "RADIANS", "RADIANS", 342, 342, 1, 1, V, { VR }, 0 },
+ { "DEGREES", "DEGREES", 343, 343, 1, 1, V, { VR }, 0 },
+ { "SUBTOTAL", "SUBTOTAL", 344, 344, 2, MX, V, { VR, RO }, 0 },
+ { "SUMIF", "SUMIF", 345, 345, 2, 3, V, { RO, VR, RO }, 0 },
+ { "COUNTIF", "COUNTIF", 346, 346, 2, 2, V, { RO, VR }, 0 },
+ { "COUNTBLANK", "COUNTBLANK", 347, 347, 1, 1, V, { RO }, 0 },
+ { "ISPMT", "ISPMT", 350, 350, 4, 4, V, { VR }, 0 },
+ { 0, "DATEDIF", 351, 351, 3, 3, V, { VR }, FUNCFLAG_IMPORTONLY }, // not supported in Calc
+ { 0, "DATESTRING", 352, 352, 1, 1, V, { VR }, FUNCFLAG_IMPORTONLY }, // not supported in Calc, missing in OOX spec
+ { 0, "NUMBERSTRING", 353, 353, 2, 2, V, { VR }, FUNCFLAG_IMPORTONLY }, // not supported in Calc, missing in OOX spec
+ { "ROMAN", "ROMAN", 354, 354, 1, 2, V, { VR }, 0 },
// *** EuroTool add-in ***
- { "EUROCONVERT", "EUROCONVERT", NOID, NOID, 3, 5, V, { V }, FUNCFLAG_EUROTOOL },
+ { "EUROCONVERT", "EUROCONVERT", NOID, NOID, 3, 5, V, { VR }, FUNCFLAG_EUROTOOL },
// *** macro sheet commands ***
- { 0, "ADD.CHART.AUTOFORMAT", 390, 390, 0, 2, V, { V }, FUNCFLAG_MACROCMD },
- { 0, "ADD.LIST.ITEM", 451, 451, 0, 2, V, { V }, FUNCFLAG_MACROCMD },
- { 0, "ACTIVE.CELL.FONT", 476, 476, 0, 14, V, { V }, FUNCFLAG_MACROCMD }
+ { 0, "ADD.CHART.AUTOFORMAT", 390, 390, 0, 2, V, { VR }, FUNCFLAG_MACROCMD },
+ { 0, "ADD.LIST.ITEM", 451, 451, 0, 2, V, { VR }, FUNCFLAG_MACROCMD },
+ { 0, "ACTIVE.CELL.FONT", 476, 476, 0, 14, V, { VR }, FUNCFLAG_MACROCMD }
};
/** Functions new in BIFF8. */
static const FunctionData saFuncTableBiff8[] =
{
- { "GETPIVOTDATA", "GETPIVOTDATA", 358, 358, 2, MX, V, { V, R, V }, FUNCFLAG_IMPORTONLY },
- { "HYPERLINK", "HYPERLINK", 359, 359, 1, 2, V, { V }, 0 },
- { 0, "PHONETIC", 360, 360, 1, 1, V, { R }, FUNCFLAG_IMPORTONLY },
- { "AVERAGEA", "AVERAGEA", 361, 361, 1, MX, V, { R }, 0 },
- { "MAXA", "MAXA", 362, 362, 1, MX, V, { R }, 0 },
- { "MINA", "MINA", 363, 363, 1, MX, V, { R }, 0 },
- { "STDEVPA", "STDEVPA", 364, 364, 1, MX, V, { R }, 0 },
- { "VARPA", "VARPA", 365, 365, 1, MX, V, { R }, 0 },
- { "STDEVA", "STDEVA", 366, 366, 1, MX, V, { R }, 0 },
- { "VARA", "VARA", 367, 367, 1, MX, V, { R }, 0 },
- { "COM.MICROSOFT.BAHTTEXT", "BAHTTEXT", 368, 368, 1, 1, V, { V }, FUNCFLAG_MACROCALL },
- { 0, "THAIDAYOFWEEK", 369, 369, 1, 1, V, { V }, FUNCFLAG_MACROCALL },
- { 0, "THAIDIGIT", 370, 370, 1, 1, V, { V }, FUNCFLAG_MACROCALL },
- { 0, "THAIMONTHOFYEAR", 371, 371, 1, 1, V, { V }, FUNCFLAG_MACROCALL },
- { 0, "THAINUMSOUND", 372, 372, 1, 1, V, { V }, FUNCFLAG_MACROCALL },
- { 0, "THAINUMSTRING", 373, 373, 1, 1, V, { V }, FUNCFLAG_MACROCALL },
- { 0, "THAISTRINGLENGTH", 374, 374, 1, 1, V, { V }, FUNCFLAG_MACROCALL },
- { 0, "ISTHAIDIGIT", 375, 375, 1, 1, V, { V }, FUNCFLAG_MACROCALL },
- { 0, "ROUNDBAHTDOWN", 376, 376, 1, 1, V, { V }, FUNCFLAG_MACROCALL },
- { 0, "ROUNDBAHTUP", 377, 377, 1, 1, V, { V }, FUNCFLAG_MACROCALL },
- { 0, "THAIYEAR", 378, 378, 1, 1, V, { V }, FUNCFLAG_MACROCALL },
- { 0, "RTD", 379, 379, 3, 3, A, { V, V, R }, 0 }
+ { "GETPIVOTDATA", "GETPIVOTDATA", 358, 358, 2, MX, V, { RR, RR, VR, VR }, FUNCFLAG_IMPORTONLY | FUNCFLAG_PARAMPAIRS },
+ { "HYPERLINK", "HYPERLINK", 359, 359, 1, 2, V, { VV, VO }, 0 },
+ { 0, "PHONETIC", 360, 360, 1, 1, V, { RO }, FUNCFLAG_IMPORTONLY },
+ { "AVERAGEA", "AVERAGEA", 361, 361, 1, MX, V, { RX }, 0 },
+ { "MAXA", "MAXA", 362, 362, 1, MX, V, { RX }, 0 },
+ { "MINA", "MINA", 363, 363, 1, MX, V, { RX }, 0 },
+ { "STDEVPA", "STDEVPA", 364, 364, 1, MX, V, { RX }, 0 },
+ { "VARPA", "VARPA", 365, 365, 1, MX, V, { RX }, 0 },
+ { "STDEVA", "STDEVA", 366, 366, 1, MX, V, { RX }, 0 },
+ { "VARA", "VARA", 367, 367, 1, MX, V, { RX }, 0 },
+ { "COM.MICROSOFT.BAHTTEXT", "BAHTTEXT", 368, 368, 1, 1, V, { VR }, FUNCFLAG_MACROCALL },
+ { 0, "THAIDAYOFWEEK", 369, 369, 1, 1, V, { VR }, FUNCFLAG_MACROCALL },
+ { 0, "THAIDIGIT", 370, 370, 1, 1, V, { VR }, FUNCFLAG_MACROCALL },
+ { 0, "THAIMONTHOFYEAR", 371, 371, 1, 1, V, { VR }, FUNCFLAG_MACROCALL },
+ { 0, "THAINUMSOUND", 372, 372, 1, 1, V, { VR }, FUNCFLAG_MACROCALL },
+ { 0, "THAINUMSTRING", 373, 373, 1, 1, V, { VR }, FUNCFLAG_MACROCALL },
+ { 0, "THAISTRINGLENGTH", 374, 374, 1, 1, V, { VR }, FUNCFLAG_MACROCALL },
+ { 0, "ISTHAIDIGIT", 375, 375, 1, 1, V, { VR }, FUNCFLAG_MACROCALL },
+ { 0, "ROUNDBAHTDOWN", 376, 376, 1, 1, V, { VR }, FUNCFLAG_MACROCALL },
+ { 0, "ROUNDBAHTUP", 377, 377, 1, 1, V, { VR }, FUNCFLAG_MACROCALL },
+ { 0, "THAIYEAR", 378, 378, 1, 1, V, { VR }, FUNCFLAG_MACROCALL },
+ { 0, "RTD", 379, 379, 3, 3, A, { VR, VR, RO }, 0 }
};
/** Functions new in OOX. */
static const FunctionData saFuncTableOox[] =
{
- { 0, "IFERROR", 480, NOID, 2, 2, V, { V, R }, 0 },
- { 0, "COUNTIFS", 481, NOID, 3, MX, V, { R, V }, 0 },
- { 0, "SUMIFS", 482, NOID, 3, MX, V, { R, V }, 0 },
- { 0, "AVERAGEIF", 483, NOID, 2, 3, V, { R, V, R }, 0 },
- { 0, "AVERAGEIFS", 484, NOID, 3, MX, V, { R, V }, 0 },
- { 0, "CUBEKPIMEMBER", NOID, NOID, 3, 4, V, { V }, 0 },
- { 0, "CUBEMEMBER", NOID, NOID, 2, 3, V, { V, A, V }, 0 },
- { 0, "CUBEMEMBERPROPERTY", NOID, NOID, 3, 3, V, { V }, 0 },
- { 0, "CUBERANKEDMEMBER", NOID, NOID, 3, 4, V, { V }, 0 },
- { 0, "CUBESET", NOID, NOID, 2, 5, V, { V, R, V }, 0 },
- { 0, "CUBESETCOUNT", NOID, NOID, 1, 1, V, { V }, 0 },
- { 0, "CUBEVALUE", NOID, NOID, 2, 2, V, { V, R }, 0 }
+ { 0, "CUBEVALUE", 380, NOID, 1, MX, V, { VR, RX }, 0 },
+ { 0, "CUBEMEMBER", 381, NOID, 2, 3, V, { VR, RX, VR }, 0 },
+ { 0, "CUBEMEMBERPROPERTY", 382, NOID, 3, 3, V, { VR }, 0 },
+ { 0, "CUBERANKEDMEMBER", 383, NOID, 3, 4, V, { VR }, 0 },
+ { 0, "CUBEKPIMEMBER", 477, NOID, 3, 4, V, { VR }, 0 },
+ { 0, "CUBESET", 478, NOID, 2, 5, V, { VR, RX, VR }, 0 },
+ { 0, "CUBESETCOUNT", 479, NOID, 1, 1, V, { VR }, 0 },
+ { 0, "IFERROR", 480, NOID, 2, 2, V, { VO, RO }, 0 },
+ { 0, "COUNTIFS", 481, NOID, 2, MX, V, { RO, VR }, FUNCFLAG_PARAMPAIRS },
+ { 0, "SUMIFS", 482, NOID, 3, MX, V, { RO, RO, VR }, FUNCFLAG_PARAMPAIRS },
+ { 0, "AVERAGEIF", 483, NOID, 2, 3, V, { RO, VR, RO }, 0 },
+ { 0, "AVERAGEIFS", 484, NOID, 3, MX, V, { RO, RO, VR }, 0 }
};
/** Functions defined by OpenFormula, but not supported by Calc or by Excel. */
static const FunctionData saFuncTableOdf[] =
{
- { "ARABIC", 0, NOID, NOID, 1, 1, V, { V }, 0 },
- { "B", 0, NOID, NOID, 3, 4, V, { V }, 0 },
- { "BASE", 0, NOID, NOID, 2, 3, V, { V }, 0 },
- { "BITAND", 0, NOID, NOID, 2, 2, V, { V }, 0 },
- { "BITLSHIFT", 0, NOID, NOID, 2, 2, V, { V }, 0 },
- { "BITOR", 0, NOID, NOID, 2, 2, V, { V }, 0 },
- { "BITRSHIFT", 0, NOID, NOID, 2, 2, V, { V }, 0 },
- { "BITXOR", 0, NOID, NOID, 2, 2, V, { V }, 0 },
- { "CHISQDIST", 0, NOID, NOID, 2, 3, V, { V }, 0 },
- { "CHISQINV", 0, NOID, NOID, 2, 2, V, { V }, 0 },
- { "COMBINA", 0, NOID, NOID, 2, 2, V, { V }, 0 },
- { "DAYS", 0, NOID, NOID, 2, 2, V, { V }, 0 },
- { "DDE", 0, NOID, NOID, 3, 4, V, { V }, 0 },
- { "DECIMAL", 0, NOID, NOID, 2, 2, V, { V }, 0 },
- { "FDIST", 0, NOID, NOID, 3, 4, V, { V }, 0 },
- { "FINV", 0, NOID, NOID, 3, 3, V, { V }, 0 },
- { "FORMULA", 0, NOID, NOID, 1, 1, V, { R }, 0 },
- { "GAMMA", 0, NOID, NOID, 1, 1, V, { V }, 0 },
- { "GAUSS", 0, NOID, NOID, 1, 1, V, { V }, 0 },
- { "IFNA", 0, NOID, NOID, 2, 2, V, { V, R }, 0 },
- { "ISFORMULA", 0, NOID, NOID, 1, 1, V, { R }, 0 },
- { "ISOWEEKNUM", 0, NOID, NOID, 1, 2, V, { V }, 0 },
- { "MULTIPLE.OPERATIONS", 0, NOID, NOID, 3, 5, V, { R }, 0 },
- { "MUNIT", 0, NOID, NOID, 1, 1, A, { V }, 0 },
- { "NUMBERVALUE", 0, NOID, NOID, 2, 2, V, { V }, 0 },
- { "PDURATION", 0, NOID, NOID, 3, 3, V, { V }, 0 },
- { "PERMUTATIONA", 0, NOID, NOID, 2, 2, V, { V }, 0 },
- { "PHI", 0, NOID, NOID, 1, 1, V, { V }, 0 },
- { "RRI", 0, NOID, NOID, 3, 3, V, { V }, 0 },
- { "SHEET", 0, NOID, NOID, 1, 1, V, { R }, 0 },
- { "SHEETS", 0, NOID, NOID, 0, 1, V, { R }, 0 },
- { "SKEWP", 0, NOID, NOID, 1, MX, V, { R }, 0 },
- { "UNICHAR", 0, NOID, NOID, 1, 1, V, { V }, 0 },
- { "UNICODE", 0, NOID, NOID, 1, 1, V, { V }, 0 },
- { "XOR", 0, NOID, NOID, 1, MX, V, { R }, 0 }
+ { "ARABIC", 0, NOID, NOID, 1, 1, V, { VR }, 0 },
+ { "B", 0, NOID, NOID, 3, 4, V, { VR }, 0 },
+ { "BASE", 0, NOID, NOID, 2, 3, V, { VR }, 0 },
+ { "BITAND", 0, NOID, NOID, 2, 2, V, { VR }, 0 },
+ { "BITLSHIFT", 0, NOID, NOID, 2, 2, V, { VR }, 0 },
+ { "BITOR", 0, NOID, NOID, 2, 2, V, { VR }, 0 },
+ { "BITRSHIFT", 0, NOID, NOID, 2, 2, V, { VR }, 0 },
+ { "BITXOR", 0, NOID, NOID, 2, 2, V, { VR }, 0 },
+ { "CHISQDIST", 0, NOID, NOID, 2, 3, V, { VR }, 0 },
+ { "CHISQINV", 0, NOID, NOID, 2, 2, V, { VR }, 0 },
+ { "COMBINA", 0, NOID, NOID, 2, 2, V, { VR }, 0 },
+ { "DAYS", 0, NOID, NOID, 2, 2, V, { VR }, 0 },
+ { "DDE", 0, NOID, NOID, 3, 4, V, { VR }, 0 },
+ { "DECIMAL", 0, NOID, NOID, 2, 2, V, { VR }, 0 },
+ { "FDIST", 0, NOID, NOID, 3, 4, V, { VR }, 0 },
+ { "FINV", 0, NOID, NOID, 3, 3, V, { VR }, 0 },
+ { "FORMULA", 0, NOID, NOID, 1, 1, V, { RO }, 0 },
+ { "GAMMA", 0, NOID, NOID, 1, 1, V, { VR }, 0 },
+ { "GAUSS", 0, NOID, NOID, 1, 1, V, { VR }, 0 },
+ { "IFNA", 0, NOID, NOID, 2, 2, V, { VR, RO }, 0 },
+ { "ISFORMULA", 0, NOID, NOID, 1, 1, V, { RO }, 0 },
+ { "ISOWEEKNUM", 0, NOID, NOID, 1, 2, V, { VR }, 0 },
+ { "MULTIPLE.OPERATIONS", 0, NOID, NOID, 3, 5, V, { RO }, 0 },
+ { "MUNIT", 0, NOID, NOID, 1, 1, A, { VR }, 0 },
+ { "NUMBERVALUE", 0, NOID, NOID, 2, 2, V, { VR }, 0 },
+ { "PDURATION", 0, NOID, NOID, 3, 3, V, { VR }, 0 },
+ { "PERMUTATIONA", 0, NOID, NOID, 2, 2, V, { VR }, 0 },
+ { "PHI", 0, NOID, NOID, 1, 1, V, { VR }, 0 },
+ { "RRI", 0, NOID, NOID, 3, 3, V, { VR }, 0 },
+ { "SHEET", 0, NOID, NOID, 1, 1, V, { RO }, 0 },
+ { "SHEETS", 0, NOID, NOID, 0, 1, V, { RO }, 0 },
+ { "SKEWP", 0, NOID, NOID, 1, MX, V, { RX }, 0 },
+ { "UNICHAR", 0, NOID, NOID, 1, 1, V, { VR }, 0 },
+ { "UNICODE", 0, NOID, NOID, 1, 1, V, { VR }, 0 },
+ { "XOR", 0, NOID, NOID, 1, MX, V, { RX }, 0 }
};
// ----------------------------------------------------------------------------
@@ -778,16 +793,46 @@ const sal_Unicode API_TOKEN_ARRAY_COLSEP = ';';
// function info parameter class iterator =====================================
-FuncInfoParamClassIterator::FuncInfoParamClassIterator( const FunctionInfo& rFuncInfo ) :
- mpnParamClass( rFuncInfo.mpnParamClass ),
- mpnParamClassEnd( rFuncInfo.mpnParamClass + FUNCINFO_CLASSCOUNT )
+FunctionParamInfoIterator::FunctionParamInfoIterator( const FunctionInfo& rFuncInfo ) :
+ mpParamInfo( rFuncInfo.mpParamInfos ),
+ mpParamInfoEnd( rFuncInfo.mpParamInfos + FUNCINFO_PARAMINFOCOUNT ),
+ mbParamPairs( rFuncInfo.mbParamPairs )
+{
+ OSL_ENSURE( !mbParamPairs || (mpParamInfo + 1 < mpParamInfoEnd),
+ "FunctionParamInfoIterator::FunctionParamInfoIterator - expecting at least 2 infos for paired parameters" );
+}
+
+const FunctionParamInfo& FunctionParamInfoIterator::getParamInfo() const
+{
+ static const FunctionParamInfo saInvalidInfo = { FUNC_PARAM_NONE, FUNC_PARAMCONV_ORG, false };
+ return mpParamInfo ? *mpParamInfo : saInvalidInfo;
+}
+
+bool FunctionParamInfoIterator::isCalcOnlyParam() const
{
+ return mpParamInfo && (mpParamInfo->meValid == FUNC_PARAM_CALCONLY);
}
-FuncInfoParamClassIterator& FuncInfoParamClassIterator::operator++()
+bool FunctionParamInfoIterator::isExcelOnlyParam() const
{
- if( (mpnParamClass + 1 < mpnParamClassEnd) && (mpnParamClass[ 1 ] != 0) )
- ++mpnParamClass;
+ return mpParamInfo && (mpParamInfo->meValid == FUNC_PARAM_EXCELONLY);
+}
+
+FunctionParamInfoIterator& FunctionParamInfoIterator::operator++()
+{
+ if( mpParamInfo )
+ {
+ // move pointer to next entry, if something explicit follows
+ if( (mpParamInfo + 1 < mpParamInfoEnd) && (mpParamInfo[ 1 ].meValid != FUNC_PARAM_NONE) )
+ ++mpParamInfo;
+ // points to last info, but parameter pairs expected, move to previous info
+ else if( mbParamPairs )
+ --mpParamInfo;
+ // if last parameter type is 'Excel-only' or 'Calc-only', do not repeat it
+ else if( isExcelOnlyParam() || isCalcOnlyParam() )
+ mpParamInfo = 0;
+ // otherwise: repeat last parameter class
+ }
return *this;
}
@@ -876,7 +921,8 @@ void FunctionProviderImpl::initFunc( const FunctionData& rFuncData, sal_uInt8 nM
xFuncInfo->mnMinParamCount = rFuncData.mnMinParamCount;
xFuncInfo->mnMaxParamCount = (rFuncData.mnMaxParamCount == MX) ? nMaxParam : rFuncData.mnMaxParamCount;
xFuncInfo->mnRetClass = rFuncData.mnRetClass;
- xFuncInfo->mpnParamClass = rFuncData.mpnParamClass;
+ xFuncInfo->mpParamInfos = rFuncData.mpParamInfos;
+ xFuncInfo->mbParamPairs = getFlag( rFuncData.mnFlags, FUNCFLAG_PARAMPAIRS );
xFuncInfo->mbVolatile = getFlag( rFuncData.mnFlags, FUNCFLAG_VOLATILE );
xFuncInfo->mbExternal = getFlag( rFuncData.mnFlags, FUNCFLAG_EXTERNAL );
bool bMacroCmd = getFlag( rFuncData.mnFlags, FUNCFLAG_MACROCMD );
diff --git a/oox/source/xls/formulaparser.cxx b/oox/source/xls/formulaparser.cxx
index d2818ff9cb1a..f0ff482e5828 100644
--- a/oox/source/xls/formulaparser.cxx
+++ b/oox/source/xls/formulaparser.cxx
@@ -233,23 +233,23 @@ const ApiToken* FormulaFinalizer::processParameters(
}
// process all parameters
- FuncInfoParamClassIterator aClassIt( *pRealFuncInfo );
+ FunctionParamInfoIterator aParamInfoIt( *pRealFuncInfo );
size_t nLastValidSize = maTokens.size();
size_t nLastValidCount = 0;
- for( size_t nParam = 0; nParam < nParamCount; ++nParam, ++aPosIt, ++aClassIt )
+ for( size_t nParam = 0; nParam < nParamCount; ++nParam, ++aPosIt, ++aParamInfoIt )
{
// add embedded Calc-only parameters
- if( aClassIt.isCalcOnlyParam() )
+ if( aParamInfoIt.isCalcOnlyParam() )
{
appendCalcOnlyParameter( *pRealFuncInfo, nParam );
- while( aClassIt.isCalcOnlyParam() ) ++aClassIt;
+ while( aParamInfoIt.isCalcOnlyParam() ) ++aParamInfoIt;
}
const ApiToken* pParamBegin = *aPosIt + 1;
const ApiToken* pParamEnd = *(aPosIt + 1);
bool bIsEmpty = isEmptyParameter( pParamBegin, pParamEnd );
- if( !aClassIt.isExcelOnlyParam() )
+ if( !aParamInfoIt.isExcelOnlyParam() )
{
// replace empty second and third parameter in IF function with zeros
if( (pRealFuncInfo->mnOobFuncId == OOBIN_FUNC_IF) && ((nParam == 1) || (nParam == 2)) && bIsEmpty )
@@ -279,7 +279,7 @@ const ApiToken* FormulaFinalizer::processParameters(
maTokens.resize( nLastValidSize );
// add trailing Calc-only parameters
- if( aClassIt.isCalcOnlyParam() )
+ if( aParamInfoIt.isCalcOnlyParam() )
appendCalcOnlyParameter( *pRealFuncInfo, nLastValidCount );
// add optional parameters that are required in Calc
@@ -1420,6 +1420,7 @@ bool OoxFormulaParserImpl::importAttrToken( RecordInputStream& rStrm )
// equal flags in BIFF and OOBIN
switch( nType )
{
+ case 0: // sometimes, tAttrSkip tokens miss the type flag
case OOBIN_TOK_ATTR_VOLATILE:
case OOBIN_TOK_ATTR_IF:
case OOBIN_TOK_ATTR_SKIP:
@@ -2199,6 +2200,7 @@ bool BiffFormulaParserImpl::importAttrToken( BiffInputStream& rStrm )
rStrm >> nType;
switch( nType )
{
+ case 0: // sometimes, tAttrSkip tokens miss the type flag
case BIFF_TOK_ATTR_VOLATILE:
case BIFF_TOK_ATTR_IF:
case BIFF_TOK_ATTR_SKIP:
diff --git a/oox/source/xls/pivotcachebuffer.cxx b/oox/source/xls/pivotcachebuffer.cxx
index 33465d81d466..7b503142a89e 100644
--- a/oox/source/xls/pivotcachebuffer.cxx
+++ b/oox/source/xls/pivotcachebuffer.cxx
@@ -1369,7 +1369,7 @@ void PivotCache::importDConUrl( BiffInputStream& rStrm )
void PivotCache::finalizeInternalSheetSource()
{
// resolve sheet name to sheet index
- sal_Int32 nSheet = getWorksheets().getCalcSheetIndex( maSheetSrcModel.maSheet );
+ sal_Int16 nSheet = getWorksheets().getCalcSheetIndex( maSheetSrcModel.maSheet );
// if cache is based on a defined name or table, try to resolve to cell range
if( maSheetSrcModel.maDefName.getLength() > 0 )
@@ -1393,7 +1393,7 @@ void PivotCache::finalizeInternalSheetSource()
else if( nSheet >= 0 )
{
// insert sheet index into the range, range address will be checked below
- maSheetSrcModel.maRange.Sheet = static_cast< sal_Int16 >( nSheet );
+ maSheetSrcModel.maRange.Sheet = nSheet;
mbValidSource = true;
}
// else sheet has been deleted, generate the source data from cache
diff --git a/oox/source/xls/pivottablebuffer.cxx b/oox/source/xls/pivottablebuffer.cxx
index 73404d29612f..361a3c00131b 100644
--- a/oox/source/xls/pivottablebuffer.cxx
+++ b/oox/source/xls/pivottablebuffer.cxx
@@ -221,7 +221,7 @@ OUString lclReadPivotString( const WorkbookHelper& rHelper, BiffInputStream& rSt
{
if( nLen == BIFF_PT_NOSTRING )
return OUString();
- return (rHelper.getBiff() == BIFF8) ? rStrm.readUniString( nLen ) : rStrm.readCharArrayUC( nLen, rHelper.getTextEncoding() );
+ return (rHelper.getBiff() == BIFF8) ? rStrm.readUniStringBody( nLen ) : rStrm.readCharArrayUC( nLen, rHelper.getTextEncoding() );
}
} // namespace
diff --git a/oox/source/xls/richstring.cxx b/oox/source/xls/richstring.cxx
index d4e93f4bf47a..a4f8f1379654 100644
--- a/oox/source/xls/richstring.cxx
+++ b/oox/source/xls/richstring.cxx
@@ -29,6 +29,7 @@
************************************************************************/
#include "oox/xls/richstring.hxx"
+#include <rtl/ustrbuf.hxx>
#include <com/sun/star/text/XText.hpp>
#include "oox/helper/attributelist.hxx"
#include "oox/helper/propertyset.hxx"
@@ -37,6 +38,7 @@
using ::rtl::OString;
using ::rtl::OUString;
+using ::rtl::OUStringBuffer;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::text::XText;
using ::com::sun::star::text::XTextRange;
@@ -490,12 +492,20 @@ void RichString::finalizeImport()
maFontPortions.forEachMem( &RichStringPortion::finalizeImport );
}
+OUString RichString::getPlainText() const
+{
+ OUStringBuffer aBuffer;
+ for( PortionVec::const_iterator aIt = maFontPortions.begin(), aEnd = maFontPortions.end(); aIt != aEnd; ++aIt )
+ aBuffer.append( (*aIt)->getText() );
+ return aBuffer.makeStringAndClear();
+}
+
void RichString::convert( const Reference< XText >& rxText, sal_Int32 nXfId ) const
{
for( PortionVec::const_iterator aIt = maFontPortions.begin(), aEnd = maFontPortions.end(); aIt != aEnd; ++aIt )
{
(*aIt)->convert( rxText, nXfId );
- nXfId = -1;
+ nXfId = -1; // use passed XF identifier for first portion only
}
}
diff --git a/oox/source/xls/stylesbuffer.cxx b/oox/source/xls/stylesbuffer.cxx
index 64d660f5c559..3e69266592c7 100644
--- a/oox/source/xls/stylesbuffer.cxx
+++ b/oox/source/xls/stylesbuffer.cxx
@@ -1,3 +1,4 @@
+
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -29,7 +30,8 @@
************************************************************************/
#include "oox/xls/stylesbuffer.hxx"
-#include <com/sun/star/text/WritingMode2.hpp>
+#include <com/sun/star/container/XIndexAccess.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/awt/FontDescriptor.hpp>
#include <com/sun/star/awt/FontFamily.hpp>
#include <com/sun/star/awt/FontPitch.hpp>
@@ -59,14 +61,21 @@
using ::rtl::OUString;
using ::rtl::OUStringBuffer;
+using ::com::sun::star::uno::Exception;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::UNO_QUERY;
+using ::com::sun::star::uno::UNO_QUERY_THROW;
+using ::com::sun::star::uno::UNO_SET_THROW;
+using ::com::sun::star::container::XIndexAccess;
+using ::com::sun::star::container::XNameAccess;
+using ::com::sun::star::container::XNamed;
using ::com::sun::star::awt::FontDescriptor;
using ::com::sun::star::awt::XDevice;
using ::com::sun::star::awt::XFont2;
using ::com::sun::star::table::BorderLine;
using ::com::sun::star::text::XText;
using ::com::sun::star::style::XStyle;
+using ::oox::core::FilterBase;
namespace oox {
namespace xls {
@@ -257,6 +266,11 @@ const sal_uInt32 BIFF_XF_DIAG_BLTR = 0x80000000; /// Bottom-left to t
const sal_uInt16 BIFF_STYLE_BUILTIN = 0x8000;
const sal_uInt16 BIFF_STYLE_XFMASK = 0x0FFF;
+// BIFF STYLEEXT flags
+const sal_uInt8 BIFF_STYLEEXT_BUILTIN = 0x01;
+const sal_uInt8 BIFF_STYLEEXT_HIDDEN = 0x02;
+const sal_uInt8 BIFF_STYLEEXT_CUSTOM = 0x04;
+
// BIFF conditional formatting
const sal_uInt32 BIFF_CFRULE_BORDER_LEFT = 0x00000400;
const sal_uInt32 BIFF_CFRULE_BORDER_RIGHT = 0x00000800;
@@ -280,8 +294,7 @@ const sal_uInt32 BIFF_CFRULE_FONT_ESCAPEM = 0x00000001; /// Font escapement
// ----------------------------------------------------------------------------
-template< typename StreamType >
-sal_Int32 lclReadRgbColor( StreamType& rStrm )
+sal_Int32 lclReadRgbColor( BinaryInputStream& rStrm )
{
sal_uInt8 nR, nG, nB, nA;
rStrm >> nR >> nG >> nB >> nA;
@@ -299,39 +312,34 @@ sal_Int32 lclReadRgbColor( StreamType& rStrm )
// ----------------------------------------------------------------------------
-Color::Color() :
- meMode( COLOR_AUTO ),
- mnValue( 0 ),
- mfTint( 0.0 )
-{
-}
-
void Color::setAuto()
{
- meMode = COLOR_AUTO;
- mnValue = 0;
- mfTint = 0.0;
+ clearTransformations();
+ setSchemeClr( XML_phClr );
}
void Color::setRgb( sal_Int32 nRgbValue, double fTint )
{
- meMode = COLOR_RGB;
- mnValue = nRgbValue;
- mfTint = fTint;
+ clearTransformations();
+ setSrgbClr( nRgbValue & 0xFFFFFF );
+ if( fTint != 0.0 ) addExcelTintTransformation( fTint );
}
void Color::setTheme( sal_Int32 nThemeIdx, double fTint )
{
- meMode = COLOR_THEME;
- mnValue = nThemeIdx;
- mfTint = fTint;
+ clearTransformations();
+ static const sal_Int32 spnColorTokens[] = {
+ XML_lt1, XML_dk1, XML_lt2, XML_dk2, XML_accent1, XML_accent2,
+ XML_accent3, XML_accent4, XML_accent5, XML_accent6, XML_hlink, XML_folHlink };
+ setSchemeClr( STATIC_ARRAY_SELECT( spnColorTokens, nThemeIdx, XML_TOKEN_INVALID ) );
+ if( fTint != 0.0 ) addExcelTintTransformation( fTint );
}
void Color::setIndexed( sal_Int32 nPaletteIdx, double fTint )
{
- meMode = COLOR_INDEXED;
- mnValue = nPaletteIdx;
- mfTint = fTint;
+ clearTransformations();
+ setPaletteClr( nPaletteIdx );
+ if( fTint != 0.0 ) addExcelTintTransformation( fTint );
}
void Color::importColor( const AttributeList& rAttribs )
@@ -408,38 +416,6 @@ void Color::importColorRgb( BiffInputStream& rStrm )
setRgb( lclReadRgbColor( rStrm ) );
}
-bool Color::isAuto() const
-{
- return meMode == COLOR_AUTO;
-}
-
-sal_Int32 Color::getColor( const WorkbookHelper& rHelper, sal_Int32 nAuto ) const
-{
- switch( meMode )
- {
- case COLOR_AUTO: return nAuto;
- case COLOR_FINAL: return mnValue;
-
- case COLOR_RGB: mnValue &= 0xFFFFFF; break;
- case COLOR_THEME: mnValue = rHelper.getTheme().getColorByIndex( mnValue ); break;
- case COLOR_INDEXED: mnValue = rHelper.getStyles().getPaletteColor( mnValue ); break;
- }
-
- // color tint
- OSL_ENSURE( (rHelper.getFilterType() == FILTER_OOX) || (mfTint == 0.0),
- "Color::getColor - color tint only supported in OOX filter" );
- if( (mnValue >= 0) && (rHelper.getFilterType() == FILTER_OOX) && (mfTint != 0.0) )
- {
- ::oox::drawingml::Color aTransformColor;
- aTransformColor.setSrgbClr( mnValue );
- aTransformColor.addExcelTintTransformation( mfTint );
- mnValue = aTransformColor.getColor( rHelper.getOoxFilter() );
- }
-
- meMode = COLOR_FINAL;
- return mnValue;
-}
-
RecordInputStream& operator>>( RecordInputStream& rStrm, Color& orColor )
{
orColor.importColor( rStrm );
@@ -532,14 +508,13 @@ ColorPalette::ColorPalette( const WorkbookHelper& rHelper ) :
void ColorPalette::importPaletteColor( const AttributeList& rAttribs )
{
- appendColor( rAttribs.getIntegerHex( XML_rgb, API_RGB_TRANSPARENT ) );
+ appendColor( rAttribs.getIntegerHex( XML_rgb, API_RGB_WHITE ) );
}
void ColorPalette::importPaletteColor( RecordInputStream& rStrm )
{
- Color aColor;
- aColor.importColorRgb( rStrm );
- appendColor( aColor.getColor( *this ) );
+ sal_Int32 nRgb = lclReadRgbColor( rStrm );
+ appendColor( nRgb & 0xFFFFFF );
}
void ColorPalette::importPalette( BiffInputStream& rStrm )
@@ -550,11 +525,10 @@ void ColorPalette::importPalette( BiffInputStream& rStrm )
// fill palette from BIFF_COLOR_USEROFFSET
mnAppendIndex = BIFF_COLOR_USEROFFSET;
- Color aColor;
for( sal_uInt16 nIndex = 0; !rStrm.isEof() && (nIndex < nCount); ++nIndex )
{
- aColor.importColorRgb( rStrm );
- appendColor( aColor.getColor( *this ) );
+ sal_Int32 nRgb = lclReadRgbColor( rStrm );
+ appendColor( nRgb & 0xFFFFFF );
}
}
@@ -574,7 +548,7 @@ sal_Int32 ColorPalette::getColor( sal_Int32 nPaletteIdx ) const
case OOX_COLOR_WINDOWBACK:
case OOX_COLOR_CHWINDOWBACK: nColor = getBaseFilter().getSystemColor( XML_window ); break;
case OOX_COLOR_BUTTONBACK: nColor = getBaseFilter().getSystemColor( XML_btnFace ); break;
- case OOX_COLOR_CHBORDERAUTO: nColor = 0x000000; /* really always black? */ break;
+ case OOX_COLOR_CHBORDERAUTO: nColor = API_RGB_BLACK; /* really always black? */ break;
case OOX_COLOR_NOTEBACK: nColor = getBaseFilter().getSystemColor( XML_infoBk ); break;
case OOX_COLOR_NOTETEXT: nColor = getBaseFilter().getSystemColor( XML_infoText ); break;
case OOX_COLOR_FONTAUTO: nColor = API_RGB_TRANSPARENT; break;
@@ -1013,7 +987,7 @@ void Font::finalizeImport()
rtl_getTextEncodingFromWindowsCharset( static_cast< sal_uInt8 >( maModel.mnCharSet ) ) );
// color, height, weight, slant, strikeout, outline, shadow
- maApiData.mnColor = maModel.maColor.getColor( *this, API_RGB_TRANSPARENT );
+ maApiData.mnColor = maModel.maColor.getColor( getBaseFilter() );
maApiData.maDesc.Height = static_cast< sal_Int16 >( maModel.mfHeight * 20.0 );
maApiData.maDesc.Weight = maModel.mbBold ? cssawt::FontWeight::BOLD : cssawt::FontWeight::NORMAL;
maApiData.maDesc.Slant = maModel.mbItalic ? cssawt::FontSlant_ITALIC : cssawt::FontSlant_NONE;
@@ -1750,7 +1724,7 @@ BorderLineModel* Border::getBorderLine( sal_Int32 nElement )
bool Border::convertBorderLine( BorderLine& rBorderLine, const BorderLineModel& rModel )
{
- rBorderLine.Color = rModel.maColor.getColor( *this, API_RGB_BLACK );
+ rBorderLine.Color = rModel.maColor.getColor( getBaseFilter(), API_RGB_BLACK );
switch( rModel.mnStyle )
{
case XML_dashDot: lclSetBorderLineWidth( rBorderLine, API_LINE_THIN ); break;
@@ -2046,6 +2020,8 @@ void Fill::importCfRule( BiffInputStream& rStrm, sal_uInt32 nFlags )
void Fill::finalizeImport()
{
+ const FilterBase& rFilter = getBaseFilter();
+
if( mxPatternModel.get() )
{
// finalize the OOX data struct
@@ -2096,15 +2072,16 @@ void Fill::finalizeImport()
case XML_solid: nAlpha = 0x80; break;
}
+ sal_Int32 nWinTextColor = rFilter.getSystemColor( XML_windowText );
+ sal_Int32 nWinColor = rFilter.getSystemColor( XML_window );
+
if( !rModel.mbPattColorUsed )
rModel.maPatternColor.setAuto();
- sal_Int32 nPattColor = rModel.maPatternColor.getColor(
- *this, getBaseFilter().getSystemColor( XML_windowText ) );
+ sal_Int32 nPattColor = rModel.maPatternColor.getColor( rFilter, nWinTextColor );
if( !rModel.mbFillColorUsed )
rModel.maFillColor.setAuto();
- sal_Int32 nFillColor = rModel.maFillColor.getColor(
- *this, getBaseFilter().getSystemColor( XML_window ) );
+ sal_Int32 nFillColor = rModel.maFillColor.getColor( rFilter, nWinColor );
maApiData.mnColor = lclGetMixedColor( nPattColor, nFillColor, nAlpha );
maApiData.mbTransparent = false;
@@ -2116,11 +2093,11 @@ void Fill::finalizeImport()
maApiData.mbUsed = true; // no support for differential attributes
GradientFillModel::ColorMap::const_iterator aIt = rModel.maColors.begin();
OSL_ENSURE( !aIt->second.isAuto(), "Fill::finalizeImport - automatic gradient color" );
- maApiData.mnColor = aIt->second.getColor( *this );
+ maApiData.mnColor = aIt->second.getColor( rFilter, API_RGB_WHITE );
if( ++aIt != rModel.maColors.end() )
{
OSL_ENSURE( !aIt->second.isAuto(), "Fill::finalizeImport - automatic gradient color" );
- sal_Int32 nEndColor = aIt->second.getColor( *this );
+ sal_Int32 nEndColor = aIt->second.getColor( rFilter, API_RGB_WHITE );
maApiData.mnColor = lclGetMixedColor( maApiData.mnColor, nEndColor, 0x40 );
maApiData.mbTransparent = false;
}
@@ -2369,10 +2346,7 @@ void Xf::writeToPropertyMap( PropertyMap& rPropMap ) const
// create and set cell style
if( maModel.mbCellXf )
- {
- const OUString& rStyleName = rStyles.createCellStyle( maModel.mnStyleXfId );
- rPropMap[ PROP_CellStyle ] <<= rStyleName;
- }
+ rPropMap[ PROP_CellStyle ] <<= rStyles.createCellStyle( maModel.mnStyleXfId );
if( maModel.mbFontUsed )
rStyles.writeFontToPropertyMap( rPropMap, maModel.mnFontId );
@@ -2552,30 +2526,27 @@ void Dxf::finalizeImport()
mxFill->finalizeImport();
}
-const OUString& Dxf::createDxfStyle( sal_Int32 nDxfId )
+void Dxf::writeToPropertyMap( PropertyMap& rPropMap ) const
{
- if( maFinalName.getLength() == 0 )
- {
- maFinalName = OUStringBuffer( CREATE_OUSTRING( "ConditionalStyle_" ) ).append( nDxfId + 1 ).makeStringAndClear();
- Reference< XStyle > xStyle = createStyleObject( maFinalName, false );
- // write style formatting properties
- PropertyMap aPropMap;
- if( mxFont.get() )
- mxFont->writeToPropertyMap( aPropMap, FONT_PROPTYPE_CELL );
- if( mxNumFmt.get() )
- mxNumFmt->writeToPropertyMap( aPropMap );
- if( mxAlignment.get() )
- mxAlignment->writeToPropertyMap( aPropMap );
- if( mxProtection.get() )
- mxProtection->writeToPropertyMap( aPropMap );
- if( mxBorder.get() )
- mxBorder->writeToPropertyMap( aPropMap );
- if( mxFill.get() )
- mxFill->writeToPropertyMap( aPropMap );
- PropertySet aPropSet( xStyle );
- aPropSet.setProperties( aPropMap );
- }
- return maFinalName;
+ if( mxFont.get() )
+ mxFont->writeToPropertyMap( rPropMap, FONT_PROPTYPE_CELL );
+ if( mxNumFmt.get() )
+ mxNumFmt->writeToPropertyMap( rPropMap );
+ if( mxAlignment.get() )
+ mxAlignment->writeToPropertyMap( rPropMap );
+ if( mxProtection.get() )
+ mxProtection->writeToPropertyMap( rPropMap );
+ if( mxBorder.get() )
+ mxBorder->writeToPropertyMap( rPropMap );
+ if( mxFill.get() )
+ mxFill->writeToPropertyMap( rPropMap );
+}
+
+void Dxf::writeToPropertySet( PropertySet& rPropSet ) const
+{
+ PropertyMap aPropMap;
+ writeToPropertyMap( aPropMap );
+ rPropSet.setProperties( aPropMap );
}
// ============================================================================
@@ -2585,11 +2556,7 @@ namespace {
const sal_Char* const spcLegacyStyleNamePrefix = "Excel_BuiltIn_";
const sal_Char* const sppcLegacyStyleNames[] =
{
-#if OOX_XLS_USE_DEFAULT_STYLE
- "", // use existing "Default" style
-#else
"Normal",
-#endif
"RowLevel_", // outline level will be appended
"ColumnLevel_", // outline level will be appended
"Comma",
@@ -2605,11 +2572,7 @@ const sal_Int32 snLegacyStyleNamesCount = static_cast< sal_Int32 >( STATIC_ARRAY
const sal_Char* const spcStyleNamePrefix = "Excel Built-in ";
const sal_Char* const sppcStyleNames[] =
{
-#if OOX_XLS_USE_DEFAULT_STYLE
- "", // use existing "Default" style
-#else
"Normal",
-#endif
"RowLevel_", // outline level will be appended
"ColLevel_", // outline level will be appended
"Comma",
@@ -2666,50 +2629,32 @@ const sal_Char* const sppcStyleNames[] =
};
const sal_Int32 snStyleNamesCount = static_cast< sal_Int32 >( STATIC_ARRAY_SIZE( sppcStyleNames ) );
-#if OOX_XLS_USE_DEFAULT_STYLE
-const sal_Char* const spcDefaultStyleName = "Default";
-#endif
-
OUString lclGetBuiltinStyleName( sal_Int32 nBuiltinId, const OUString& rName, sal_Int32 nLevel = 0 )
{
+ OSL_ENSURE( (0 <= nBuiltinId) && (nBuiltinId < snStyleNamesCount), "lclGetBuiltinStyleName - unknown built-in style" );
OUStringBuffer aStyleName;
- OSL_ENSURE( (0 <= nBuiltinId) && (nBuiltinId < snStyleNamesCount), "lclGetBuiltinStyleName - unknown builtin style" );
-#if OOX_XLS_USE_DEFAULT_STYLE
- if( nBuiltinId == OOX_STYLE_NORMAL ) // "Normal" becomes "Default" style
- {
- aStyleName.appendAscii( spcDefaultStyleName );
- }
+ aStyleName.appendAscii( spcStyleNamePrefix );
+ if( (0 <= nBuiltinId) && (nBuiltinId < snStyleNamesCount) && (sppcStyleNames[ nBuiltinId ][ 0 ] != 0) )
+ aStyleName.appendAscii( sppcStyleNames[ nBuiltinId ] );
+ else if( rName.getLength() > 0 )
+ aStyleName.append( rName );
else
- {
-#endif
- aStyleName.appendAscii( spcStyleNamePrefix );
- if( (0 <= nBuiltinId) && (nBuiltinId < snStyleNamesCount) && (sppcStyleNames[ nBuiltinId ][ 0 ] != 0) )
- aStyleName.appendAscii( sppcStyleNames[ nBuiltinId ] );
- else if( rName.getLength() > 0 )
- aStyleName.append( rName );
- else
- aStyleName.append( nBuiltinId );
- if( (nBuiltinId == OOX_STYLE_ROWLEVEL) || (nBuiltinId == OOX_STYLE_COLLEVEL) )
- aStyleName.append( nLevel );
-#if OOX_XLS_USE_DEFAULT_STYLE
- }
-#endif
+ aStyleName.append( nBuiltinId );
+ if( (nBuiltinId == OOX_STYLE_ROWLEVEL) || (nBuiltinId == OOX_STYLE_COLLEVEL) )
+ aStyleName.append( nLevel );
return aStyleName.makeStringAndClear();
}
-bool lclIsBuiltinStyleName( const OUString& rStyleName, sal_Int32* pnBuiltinId, sal_Int32* pnNextChar )
+OUString lclGetBuiltInStyleName( const OUString& rName )
{
-#if OOX_XLS_USE_DEFAULT_STYLE
- // "Default" becomes "Normal"
- if( rStyleName.equalsIgnoreAsciiCaseAscii( spcDefaultStyleName ) )
- {
- if( pnBuiltinId ) *pnBuiltinId = OOX_STYLE_NORMAL;
- if( pnNextChar ) *pnNextChar = rStyleName.getLength();
- return true;
- }
-#endif
+ OUStringBuffer aStyleName;
+ aStyleName.appendAscii( spcStyleNamePrefix ).append( rName );
+ return aStyleName.makeStringAndClear();
+}
- // try the other builtin styles
+bool lclIsBuiltinStyleName( const OUString& rStyleName, sal_Int32* pnBuiltinId, sal_Int32* pnNextChar )
+{
+ // try the other built-in styles
OUString aPrefix = OUString::createFromAscii( spcStyleNamePrefix );
sal_Int32 nPrefixLen = aPrefix.getLength();
sal_Int32 nFoundId = 0;
@@ -2719,20 +2664,13 @@ bool lclIsBuiltinStyleName( const OUString& rStyleName, sal_Int32* pnBuiltinId,
OUString aShortName;
for( sal_Int32 nId = 0; nId < snStyleNamesCount; ++nId )
{
-#if OOX_XLS_USE_DEFAULT_STYLE
- if( nId != OOX_STYLE_NORMAL )
+ aShortName = OUString::createFromAscii( sppcStyleNames[ nId ] );
+ if( rStyleName.matchIgnoreAsciiCase( aShortName, nPrefixLen ) &&
+ (nNextChar < nPrefixLen + aShortName.getLength()) )
{
-#endif
- aShortName = OUString::createFromAscii( sppcStyleNames[ nId ] );
- if( rStyleName.matchIgnoreAsciiCase( aShortName, nPrefixLen ) &&
- (nNextChar < nPrefixLen + aShortName.getLength()) )
- {
- nFoundId = nId;
- nNextChar = nPrefixLen + aShortName.getLength();
- }
-#if OOX_XLS_USE_DEFAULT_STYLE
+ nFoundId = nId;
+ nNextChar = nPrefixLen + aShortName.getLength();
}
-#endif
}
}
@@ -2791,20 +2729,21 @@ CellStyleModel::CellStyleModel() :
{
}
-bool CellStyleModel::isDefaultStyle() const
+bool CellStyleModel::isBuiltin() const
{
- return mbBuiltin && (mnBuiltinId == OOX_STYLE_NORMAL);
+ return mbBuiltin && (mnBuiltinId >= 0);
}
-OUString CellStyleModel::createStyleName() const
+bool CellStyleModel::isDefaultStyle() const
{
- return isBuiltin() ? lclGetBuiltinStyleName( mnBuiltinId, maName, mnLevel ) : maName;
+ return mbBuiltin && (mnBuiltinId == OOX_STYLE_NORMAL);
}
// ============================================================================
CellStyle::CellStyle( const WorkbookHelper& rHelper ) :
- WorkbookHelper( rHelper )
+ WorkbookHelper( rHelper ),
+ mbCreated( false )
{
}
@@ -2823,8 +2762,8 @@ void CellStyle::importCellStyle( RecordInputStream& rStrm )
{
sal_uInt16 nFlags;
rStrm >> maModel.mnXfId >> nFlags;
- maModel.mnBuiltinId = rStrm.readuInt8();
- maModel.mnLevel = rStrm.readuInt8();
+ maModel.mnBuiltinId = rStrm.readInt8();
+ maModel.mnLevel = rStrm.readInt8();
rStrm >> maModel.maName;
maModel.mbBuiltin = getFlag( nFlags, OOBIN_CELLSTYLE_BUILTIN );
maModel.mbCustom = getFlag( nFlags, OOBIN_CELLSTYLE_CUSTOM );
@@ -2839,62 +2778,231 @@ void CellStyle::importStyle( BiffInputStream& rStrm )
maModel.mbBuiltin = getFlag( nStyleXf, BIFF_STYLE_BUILTIN );
if( maModel.mbBuiltin )
{
- maModel.mnBuiltinId = rStrm.readuInt8();
- maModel.mnLevel = rStrm.readuInt8();
+ maModel.mnBuiltinId = rStrm.readInt8();
+ maModel.mnLevel = rStrm.readInt8();
}
else
{
maModel.maName = (getBiff() == BIFF8) ?
rStrm.readUniString() : rStrm.readByteStringUC( false, getTextEncoding() );
+ // #i103281# check if this is a new built-in style introduced in XL2007
+ if( (getBiff() == BIFF8) && (rStrm.getNextRecId() == BIFF_ID_STYLEEXT) && rStrm.startNextRecord() )
+ {
+ sal_uInt8 nExtFlags;
+ rStrm.skip( 12 );
+ rStrm >> nExtFlags;
+ maModel.mbBuiltin = getFlag( nExtFlags, BIFF_STYLEEXT_BUILTIN );
+ maModel.mbCustom = getFlag( nExtFlags, BIFF_STYLEEXT_CUSTOM );
+ maModel.mbHidden = getFlag( nExtFlags, BIFF_STYLEEXT_HIDDEN );
+ if( maModel.mbBuiltin )
+ {
+ maModel.mnBuiltinId = rStrm.readInt8();
+ maModel.mnLevel = rStrm.readInt8();
+ }
+ }
}
}
-const OUString& CellStyle::createCellStyle( sal_Int32 nXfId, bool bSkipDefaultBuiltin )
+void CellStyle::createCellStyle()
{
- if( maCalcName.getLength() == 0 )
+ // #i1624# #i1768# ignore unnamed user styles
+ if( !mbCreated )
+ mbCreated = maFinalName.getLength() == 0;
+
+ /* #i103281# do not create another style of the same name, if it exists
+ already. This is needed to prevent that styles pasted from clipboard
+ get duplicated over and over. */
+ if( !mbCreated ) try
+ {
+ Reference< XNameAccess > xCellStylesNA( getStyleFamily( false ), UNO_QUERY_THROW );
+ mbCreated = xCellStylesNA->hasByName( maFinalName );
+ }
+ catch( Exception& )
+ {
+ }
+
+ // create the style object in the document
+ if( !mbCreated ) try
{
- bool bBuiltin = maModel.isBuiltin();
- if( !bSkipDefaultBuiltin || !bBuiltin || maModel.mbCustom )
+ mbCreated = true;
+ Reference< XStyle > xStyle( createStyleObject( maFinalName, false ), UNO_SET_THROW );
+ // write style formatting properties
+ PropertySet aPropSet( xStyle );
+ getStyles().writeStyleXfToPropertySet( aPropSet, maModel.mnXfId );
+ if( !maModel.isDefaultStyle() )
+ xStyle->setParentStyle( getStyles().getDefaultStyleName() );
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+void CellStyle::finalizeImport( const OUString& rFinalName )
+{
+ maFinalName = rFinalName;
+ if( !maModel.isBuiltin() || maModel.mbCustom )
+ createCellStyle();
+}
+
+// ============================================================================
+
+CellStyleBuffer::CellStyleBuffer( const WorkbookHelper& rHelper ) :
+ WorkbookHelper( rHelper )
+{
+}
+
+CellStyleRef CellStyleBuffer::importCellStyle( const AttributeList& rAttribs )
+{
+ CellStyleRef xCellStyle( new CellStyle( *this ) );
+ xCellStyle->importCellStyle( rAttribs );
+ insertCellStyle( xCellStyle );
+ return xCellStyle;
+}
+
+CellStyleRef CellStyleBuffer::importCellStyle( RecordInputStream& rStrm )
+{
+ CellStyleRef xCellStyle( new CellStyle( *this ) );
+ xCellStyle->importCellStyle( rStrm );
+ insertCellStyle( xCellStyle );
+ return xCellStyle;
+}
+
+CellStyleRef CellStyleBuffer::importStyle( BiffInputStream& rStrm )
+{
+ CellStyleRef xCellStyle( new CellStyle( *this ) );
+ xCellStyle->importStyle( rStrm );
+ insertCellStyle( xCellStyle );
+ return xCellStyle;
+}
+
+void CellStyleBuffer::finalizeImport()
+{
+ // calculate final names of all styles
+ typedef RefMap< OUString, CellStyle, IgnoreCaseCompare > CellStyleNameMap;
+ CellStyleNameMap aCellStyles;
+ CellStyleVector aConflictNameStyles;
+
+ /* First, reserve style names that are built-in in Calc. This causes that
+ imported cell styles get different unused names and thus do not try to
+ overwrite these built-in styles. For BIFF4 workbooks (which contain a
+ separate list of cell styles per sheet), reserve all existing styles if
+ current sheet is not the first sheet (this styles buffer will be
+ constructed again for every new sheet). This will create unique names
+ for styles in different sheets with the same name. Assuming that the
+ BIFF4W import filter is never used to import from clipboard... */
+ bool bReserveAll = (getFilterType() == FILTER_BIFF) && (getBiff() == BIFF4) && isWorkbookFile() && (getCurrentSheetIndex() > 0);
+ try
+ {
+ // unfortunately, com.sun.star.style.StyleFamily does not implement XEnumerationAccess...
+ Reference< XIndexAccess > xStyleFamilyIA( getStyleFamily( false ), UNO_QUERY_THROW );
+ for( sal_Int32 nIndex = 0, nCount = xStyleFamilyIA->getCount(); nIndex < nCount; ++nIndex )
{
- // name of the style (generate unique name for builtin styles)
- maCalcName = maModel.createStyleName();
- // #i1624# #i1768# ignore unnamed user styles
- if( maCalcName.getLength() > 0 )
+ Reference< XStyle > xStyle( xStyleFamilyIA->getByIndex( nIndex ), UNO_QUERY_THROW );
+ if( bReserveAll || !xStyle->isUserDefined() )
{
- Reference< XStyle > xStyle;
-#if OOX_XLS_USE_DEFAULT_STYLE
- // special handling for default style (do not create, but use existing)
- if( isDefaultStyle() )
- {
- /* Set all flags to true to have all properties in the style,
- even if the used flags are not set (that's what Excel does). */
- if( Xf* pXf = getStyles().getStyleXf( nXfId ).get() )
- pXf->setAllUsedFlags( true );
- // use existing built-in style
- xStyle = getStyleObject( maCalcName, false );
- }
- else
-#endif
- {
- /* Insert into cell styles collection, rename existing user styles,
- if this is a built-in style, but do not do this in BIFF4 workspace
- files, where built-in styles occur repeatedly. */
- bool bRenameExisting = bBuiltin && (getBiff() != BIFF4);
- xStyle = createStyleObject( maCalcName, false, bRenameExisting );
- }
-
- // write style formatting properties
- PropertySet aPropSet( xStyle );
- getStyles().writeStyleXfToPropertySet( aPropSet, nXfId );
-#if OOX_XLS_USE_DEFAULT_STYLE
-#else
- if( !isDefaultStyle() && xStyle.is() )
- xStyle->setParentStyle( getStyles().getDefaultStyleName() );
-#endif
+ Reference< XNamed > xStyleName( xStyle, UNO_QUERY_THROW );
+ // create an empty entry by using ::std::map<>::operator[]
+ aCellStyles[ xStyleName->getName() ];
}
}
}
- return maCalcName;
+ catch( Exception& )
+ {
+ }
+
+ /* Calculate names of built-in styles. Store styles with reserved names
+ in the aConflictNameStyles list. */
+ for( CellStyleVector::iterator aIt = maBuiltinStyles.begin(), aEnd = maBuiltinStyles.end(); aIt != aEnd; ++aIt )
+ {
+ const CellStyleModel& rModel = (*aIt)->getModel();
+ OUString aStyleName = lclGetBuiltinStyleName( rModel.mnBuiltinId, rModel.maName, rModel.mnLevel );
+ OSL_ENSURE( bReserveAll || (aCellStyles.count( aStyleName ) == 0),
+ "CellStyleBuffer::finalizeImport - multiple styles with equal built-in identifier" );
+ if( aCellStyles.count( aStyleName ) > 0 )
+ aConflictNameStyles.push_back( *aIt );
+ else
+ aCellStyles[ aStyleName ] = *aIt;
+ }
+
+ /* Calculate names of user defined styles. Store styles with reserved
+ names in the aConflictNameStyles list. */
+ for( CellStyleVector::iterator aIt = maUserStyles.begin(), aEnd = maUserStyles.end(); aIt != aEnd; ++aIt )
+ {
+ const CellStyleModel& rModel = (*aIt)->getModel();
+ // #i1624# #i1768# ignore unnamed user styles
+ if( rModel.maName.getLength() > 0 )
+ {
+ if( aCellStyles.count( rModel.maName ) > 0 )
+ aConflictNameStyles.push_back( *aIt );
+ else
+ aCellStyles[ rModel.maName ] = *aIt;
+ }
+ }
+
+ // find unused names for all styles with conflicting names
+ for( CellStyleVector::iterator aIt = aConflictNameStyles.begin(), aEnd = aConflictNameStyles.end(); aIt != aEnd; ++aIt )
+ {
+ const CellStyleModel& rModel = (*aIt)->getModel();
+ OUString aUnusedName;
+ sal_Int32 nIndex = 0;
+ do
+ {
+ aUnusedName = OUStringBuffer( rModel.maName ).append( sal_Unicode( ' ' ) ).append( ++nIndex ).makeStringAndClear();
+ }
+ while( aCellStyles.count( aUnusedName ) > 0 );
+ aCellStyles[ aUnusedName ] = *aIt;
+ }
+
+ // set final names and create user-defined and modified built-in cell styles
+ aCellStyles.forEachMemWithKey( &CellStyle::finalizeImport );
+}
+
+sal_Int32 CellStyleBuffer::getDefaultXfId() const
+{
+ return mxDefStyle.get() ? mxDefStyle->getModel().mnXfId : -1;
+}
+
+OUString CellStyleBuffer::getDefaultStyleName() const
+{
+ return createCellStyle( mxDefStyle );
+}
+
+OUString CellStyleBuffer::createCellStyle( sal_Int32 nXfId ) const
+{
+ return createCellStyle( maStylesByXf.get( nXfId ) );
+}
+
+// private --------------------------------------------------------------------
+
+void CellStyleBuffer::insertCellStyle( CellStyleRef xCellStyle )
+{
+ const CellStyleModel& rModel = xCellStyle->getModel();
+ if( rModel.mnXfId >= 0 )
+ {
+ // insert into the built-in map or user defined map
+ (rModel.isBuiltin() ? maBuiltinStyles : maUserStyles).push_back( xCellStyle );
+
+ // insert into the XF identifier map
+ OSL_ENSURE( maStylesByXf.count( rModel.mnXfId ) == 0, "CellStyleBuffer::insertCellStyle - multiple styles with equal XF identifier" );
+ maStylesByXf[ rModel.mnXfId ] = xCellStyle;
+
+ // remember default cell style
+ if( rModel.isDefaultStyle() )
+ mxDefStyle = xCellStyle;
+ }
+}
+
+OUString CellStyleBuffer::createCellStyle( const CellStyleRef& rxCellStyle ) const
+{
+ if( rxCellStyle.get() )
+ {
+ rxCellStyle->createCellStyle();
+ const OUString& rStyleName = rxCellStyle->getFinalStyleName();
+ if( rStyleName.getLength() > 0 )
+ return rStyleName;
+ }
+ // on error: fallback to default style
+ return lclGetBuiltinStyleName( OOX_STYLE_NORMAL, OUString() );
}
// ============================================================================
@@ -2903,8 +3011,7 @@ StylesBuffer::StylesBuffer( const WorkbookHelper& rHelper ) :
WorkbookHelper( rHelper ),
maPalette( rHelper ),
maNumFmts( rHelper ),
- maDefStyleName( lclGetBuiltinStyleName( OOX_STYLE_NORMAL, OUString() ) ),
- mnDefStyleXf( -1 )
+ maCellStyles( rHelper )
{
}
@@ -2973,10 +3080,7 @@ NumberFormatRef StylesBuffer::importNumFmt( const AttributeList& rAttribs )
CellStyleRef StylesBuffer::importCellStyle( const AttributeList& rAttribs )
{
- CellStyleRef xCellStyle( new CellStyle( *this ) );
- xCellStyle->importCellStyle( rAttribs );
- insertCellStyle( xCellStyle );
- return xCellStyle;
+ return maCellStyles.importCellStyle( rAttribs );
}
void StylesBuffer::importPaletteColor( RecordInputStream& rStrm )
@@ -2991,9 +3095,7 @@ void StylesBuffer::importNumFmt( RecordInputStream& rStrm )
void StylesBuffer::importCellStyle( RecordInputStream& rStrm )
{
- CellStyleRef xCellStyle( new CellStyle( *this ) );
- xCellStyle->importCellStyle( rStrm );
- insertCellStyle( xCellStyle );
+ maCellStyles.importCellStyle( rStrm );
}
void StylesBuffer::importPalette( BiffInputStream& rStrm )
@@ -3044,9 +3146,7 @@ void StylesBuffer::importXf( BiffInputStream& rStrm )
void StylesBuffer::importStyle( BiffInputStream& rStrm )
{
- CellStyleRef xCellStyle( new CellStyle( *this ) );
- xCellStyle->importStyle( rStrm );
- insertCellStyle( xCellStyle );
+ maCellStyles.importStyle( rStrm );
}
void StylesBuffer::finalizeImport()
@@ -3071,16 +3171,11 @@ void StylesBuffer::finalizeImport()
maStyleXfs.forEachMem( &Xf::finalizeImport );
maCellXfs.forEachMem( &Xf::finalizeImport );
- // conditional formatting
- maDxfs.forEachMem( &Dxf::finalizeImport );
+ // built-in and user defined cell styles
+ maCellStyles.finalizeImport();
- // create the default cell style first
- if( CellStyle* pDefStyle = maCellStyles.get( mnDefStyleXf ).get() )
- pDefStyle->createCellStyle( mnDefStyleXf );
- /* Create user-defined and modified builtin cell styles, passing true to
- createStyleSheet() skips unchanged builtin styles. */
- for( CellStyleMap::iterator aIt = maCellStyles.begin(), aEnd = maCellStyles.end(); aIt != aEnd; ++aIt )
- aIt->second->createCellStyle( aIt->first, true );
+ // differential formatting (for conditional formatting)
+ maDxfs.forEachMem( &Dxf::finalizeImport );
}
sal_Int32 StylesBuffer::getPaletteColor( sal_Int32 nPaletteIdx ) const
@@ -3119,7 +3214,7 @@ FontRef StylesBuffer::getFontFromCellXf( sal_Int32 nXfId ) const
FontRef StylesBuffer::getDefaultFont() const
{
FontRef xDefFont;
- if( const Xf* pXf = getStyleXf( mnDefStyleXf ).get() )
+ if( const Xf* pXf = getStyleXf( maCellStyles.getDefaultXfId() ).get() )
xDefFont = pXf->getFont();
// no font from styles - try first loaded font (e.g. BIFF2)
if( !xDefFont )
@@ -3134,29 +3229,36 @@ const FontModel& StylesBuffer::getDefaultFontModel() const
return xDefFont.get() ? xDefFont->getModel() : getTheme().getDefaultFontModel();
}
-const OUString& StylesBuffer::createCellStyle( sal_Int32 nXfId ) const
+OUString StylesBuffer::getDefaultStyleName() const
{
- if( CellStyle* pCellStyle = maCellStyles.get( nXfId ).get() )
- return pCellStyle->createCellStyle( nXfId );
- // on error: fallback to default style
- return maDefStyleName;
+ return maCellStyles.getDefaultStyleName();
}
-const OUString& StylesBuffer::createDxfStyle( sal_Int32 nDxfId ) const
+OUString StylesBuffer::createCellStyle( sal_Int32 nXfId ) const
{
- if( Dxf* pDxf = maDxfs.get( nDxfId ).get() )
- return pDxf->createDxfStyle( nDxfId );
- // on error: fallback to default style
- return maDefStyleName;
+ return maCellStyles.createCellStyle( nXfId );
}
-#if OOX_XLS_USE_DEFAULT_STYLE
-#else
-const OUString& StylesBuffer::getDefaultStyleName() const
+OUString StylesBuffer::createDxfStyle( sal_Int32 nDxfId ) const
{
- return createCellStyle( mnDefStyleXf );
+ OUString& rStyleName = maDxfStyles[ nDxfId ];
+ if( rStyleName.getLength() == 0 )
+ {
+ if( Dxf* pDxf = maDxfs.get( nDxfId ).get() )
+ {
+ rStyleName = OUStringBuffer( CREATE_OUSTRING( "ConditionalStyle_" ) ).append( nDxfId + 1 ).makeStringAndClear();
+ // create the style sheet (this may change rStyleName if such a style already exists)
+ Reference< XStyle > xStyle = createStyleObject( rStyleName, false );
+ // write style formatting properties
+ PropertySet aPropSet( xStyle );
+ pDxf->writeToPropertySet( aPropSet );
+ }
+ // on error: fallback to default style
+ if( rStyleName.getLength() == 0 )
+ rStyleName = maCellStyles.getDefaultStyleName();
+ }
+ return rStyleName;
}
-#endif
void StylesBuffer::writeFontToPropertyMap( PropertyMap& rPropMap, sal_Int32 nFontId ) const
{
@@ -3205,16 +3307,6 @@ void StylesBuffer::writeStyleXfToPropertySet( PropertySet& rPropSet, sal_Int32 n
pXf->writeToPropertySet( rPropSet );
}
-void StylesBuffer::insertCellStyle( CellStyleRef xCellStyle )
-{
- if( xCellStyle->getXfId() >= 0 )
- {
- maCellStyles[ xCellStyle->getXfId() ] = xCellStyle;
- if( xCellStyle->isDefaultStyle() )
- mnDefStyleXf = xCellStyle->getXfId();
- }
-}
-
// ============================================================================
} // namespace xls
diff --git a/oox/source/xls/themebuffer.cxx b/oox/source/xls/themebuffer.cxx
index b2baefccd5a5..e089e5fece77 100644
--- a/oox/source/xls/themebuffer.cxx
+++ b/oox/source/xls/themebuffer.cxx
@@ -117,14 +117,6 @@ sal_Int32 ThemeBuffer::getColorByToken( sal_Int32 nToken ) const
return getClrScheme().getColor( nToken, nColor ) ? nColor : API_RGB_TRANSPARENT;
}
-sal_Int32 ThemeBuffer::getColorByIndex( sal_Int32 nIndex ) const
-{
- static const sal_Int32 spnColorTokens[] = {
- XML_lt1, XML_dk1, XML_lt2, XML_dk2, XML_accent1, XML_accent2,
- XML_accent3, XML_accent4, XML_accent5, XML_accent6, XML_hlink, XML_folHlink };
- return getColorByToken( STATIC_ARRAY_SELECT( spnColorTokens, nIndex, XML_TOKEN_INVALID ) );
-}
-
// ============================================================================
} // namespace xls
diff --git a/oox/source/xls/viewsettings.cxx b/oox/source/xls/viewsettings.cxx
index caeacaf6d45d..2d53541b404c 100644
--- a/oox/source/xls/viewsettings.cxx
+++ b/oox/source/xls/viewsettings.cxx
@@ -56,7 +56,8 @@ using ::com::sun::star::container::XNameContainer;
using ::com::sun::star::container::XIndexContainer;
using ::com::sun::star::container::XIndexAccess;
using ::com::sun::star::document::XViewDataSupplier;
-using ::com::sun::star::table::CellAddress;
+using ::com::sun::star::table::CellAddress;
+using ::oox::core::FilterBase;
namespace oox {
namespace xls {
@@ -199,6 +200,11 @@ sal_Int32 SheetViewModel::getPageBreakZoom() const
return getLimitedValue< sal_Int32 >( nZoom, API_ZOOMVALUE_MIN, API_ZOOMVALUE_MAX );
}
+sal_Int32 SheetViewModel::getGridColor( const FilterBase& rFilter ) const
+{
+ return mbDefGridColor ? API_RGB_TRANSPARENT : maGridColor.getColor( rFilter );
+}
+
const PaneSelectionModel* SheetViewModel::getPaneSelection( sal_Int32 nPaneId ) const
{
return maPaneSelMap.get( nPaneId ).get();
@@ -500,7 +506,7 @@ void SheetViewSettings::finalizeImport()
}
// sheet selected (active sheet must be selected)
- bool bSelected = xModel->mbSelected || (getSheetIndex() == getViewSettings().getActiveSheetIndex());
+ bool bSelected = xModel->mbSelected || (getSheetIndex() == getViewSettings().getActiveCalcSheet());
// visible area and current cursor position (selection not supported via API)
CellAddress aFirstPos = xModel->maFirstPos;
@@ -560,10 +566,6 @@ void SheetViewSettings::finalizeImport()
break;
}
- // automatic grid color
- if( xModel->mbDefGridColor )
- xModel->maGridColor.setAuto();
-
// write the sheet view settings into the property sequence
PropertyMap aPropMap;
aPropMap[ PROP_TableSelected ] <<= bSelected;
@@ -581,7 +583,7 @@ void SheetViewSettings::finalizeImport()
aPropMap[ PROP_ZoomType ] <<= API_ZOOMTYPE_PERCENT;
aPropMap[ PROP_ZoomValue ] <<= static_cast< sal_Int16 >( xModel->getNormalZoom() );
aPropMap[ PROP_PageViewZoomValue ] <<= static_cast< sal_Int16 >( xModel->getPageBreakZoom() );
- aPropMap[ PROP_GridColor ] <<= xModel->maGridColor.getColor( *this );
+ aPropMap[ PROP_GridColor ] <<= xModel->getGridColor( getBaseFilter() );
aPropMap[ PROP_ShowPageBreakPreview ] <<= xModel->isPageBreakPreview();
aPropMap[ PROP_ShowFormulas ] <<= xModel->mbShowFormulas;
aPropMap[ PROP_ShowGrid ] <<= xModel->mbShowGrid;
@@ -692,7 +694,7 @@ void ViewSettings::importWindow1( BiffInputStream& rStrm )
}
}
-void ViewSettings::setSheetViewSettings( sal_Int32 nSheet, const SheetViewModelRef& rxSheetView, const Any& rProperties )
+void ViewSettings::setSheetViewSettings( sal_Int16 nSheet, const SheetViewModelRef& rxSheetView, const Any& rProperties )
{
maSheetViews[ nSheet ] = rxSheetView;
maSheetProps[ nSheet ] = rProperties;
@@ -701,7 +703,7 @@ void ViewSettings::setSheetViewSettings( sal_Int32 nSheet, const SheetViewModelR
void ViewSettings::finalizeImport()
{
const WorksheetBuffer& rWorksheets = getWorksheets();
- if( rWorksheets.getSheetCount() <= 0 ) return;
+ if( rWorksheets.getWorksheetCount() <= 0 ) return;
// force creation of workbook view model to get the Excel defaults
const WorkbookViewModel& rModel = maBookViews.empty() ? createWorkbookView() : *maBookViews.front();
@@ -716,7 +718,7 @@ void ViewSettings::finalizeImport()
ContainerHelper::insertByName( xSheetsNC, rWorksheets.getCalcSheetName( aIt->first ), aIt->second );
// use active sheet to set sheet properties that are document-global in Calc
- sal_Int32 nActiveSheet = getActiveSheetIndex();
+ sal_Int16 nActiveSheet = getActiveCalcSheet();
SheetViewModelRef& rxActiveSheetView = maSheetViews[ nActiveSheet ];
OSL_ENSURE( rxActiveSheetView.get(), "ViewSettings::finalizeImport - missing active sheet view settings" );
if( !rxActiveSheetView )
@@ -735,7 +737,7 @@ void ViewSettings::finalizeImport()
aPropMap[ PROP_ShowObjects ] <<= nShowMode;
aPropMap[ PROP_ShowCharts ] <<= nShowMode;
aPropMap[ PROP_ShowDrawing ] <<= nShowMode;
- aPropMap[ PROP_GridColor ] <<= rxActiveSheetView->maGridColor.getColor( *this );
+ aPropMap[ PROP_GridColor ] <<= rxActiveSheetView->getGridColor( getBaseFilter() );
aPropMap[ PROP_ShowPageBreakPreview ] <<= rxActiveSheetView->isPageBreakPreview();
aPropMap[ PROP_ShowFormulas ] <<= rxActiveSheetView->mbShowFormulas;
aPropMap[ PROP_ShowGrid ] <<= rxActiveSheetView->mbShowGrid;
@@ -754,10 +756,9 @@ void ViewSettings::finalizeImport()
}
}
-sal_Int32 ViewSettings::getActiveSheetIndex() const
+sal_Int16 ViewSettings::getActiveCalcSheet() const
{
- sal_Int32 nSheetCount = getLimitedValue< sal_Int32, sal_Int32 >( getWorksheets().getSheetCount(), 1, SAL_MAX_INT32 );
- return maBookViews.empty() ? 0 : getLimitedValue< sal_Int32, sal_Int32 >( maBookViews.front()->mnActiveSheet, 0, nSheetCount - 1 );
+ return maBookViews.empty() ? 0 : ::std::max< sal_Int16 >( getWorksheets().getCalcSheetIndex( maBookViews.front()->mnActiveSheet ), 0 );
}
// private --------------------------------------------------------------------
diff --git a/oox/source/xls/workbookfragment.cxx b/oox/source/xls/workbookfragment.cxx
index d5904877b7ee..a372ef714633 100644
--- a/oox/source/xls/workbookfragment.cxx
+++ b/oox/source/xls/workbookfragment.cxx
@@ -101,8 +101,9 @@ ContextHandlerRef OoxWorkbookFragment::onCreateContext( sal_Int32 nElement, cons
case XLS_TOKEN( definedNames ):
case XLS_TOKEN( pivotCaches ): return this;
- case XLS_TOKEN( workbookPr ): getWorkbookSettings().importWorkbookPr( rAttribs ); break;
- case XLS_TOKEN( calcPr ): getWorkbookSettings().importCalcPr( rAttribs ); break;
+ case XLS_TOKEN( fileSharing ): getWorkbookSettings().importFileSharing( rAttribs ); break;
+ case XLS_TOKEN( workbookPr ): getWorkbookSettings().importWorkbookPr( rAttribs ); break;
+ case XLS_TOKEN( calcPr ): getWorkbookSettings().importCalcPr( rAttribs ); break;
}
break;
@@ -151,6 +152,7 @@ ContextHandlerRef OoxWorkbookFragment::onCreateRecordContext( sal_Int32 nRecId,
case OOBIN_ID_EXTERNALREFS:
case OOBIN_ID_PIVOTCACHES: return this;
+ case OOBIN_ID_FILESHARING: getWorkbookSettings().importFileSharing( rStrm ); break;
case OOBIN_ID_WORKBOOKPR: getWorkbookSettings().importWorkbookPr( rStrm ); break;
case OOBIN_ID_CALCPR: getWorkbookSettings().importCalcPr( rStrm ); break;
case OOBIN_ID_DEFINEDNAME: getDefinedNames().importDefinedName( rStrm ); break;
@@ -231,13 +233,15 @@ void OoxWorkbookFragment::finalizeImport()
some preprocessing in the fragment constructors, e.g. loading the table
fragments for all sheets that are needed before the cell formulas are
loaded. */
- typedef ::std::map< sal_Int32, FragmentHandlerRef > SheetFragmentMap;
- SheetFragmentMap aSheetFragments;
+ typedef ::std::vector< FragmentHandlerRef > SheetFragmentVector;
+ SheetFragmentVector aSheetFragments;
WorksheetBuffer& rWorksheets = getWorksheets();
- sal_Int32 nSheetCount = rWorksheets.getSheetCount();
- for( sal_Int32 nSheet = 0; nSheet < nSheetCount; ++nSheet )
+ sal_Int32 nWorksheetCount = rWorksheets.getWorksheetCount();
+ for( sal_Int32 nWorksheet = 0; nWorksheet < nWorksheetCount; ++nWorksheet )
{
- if( const Relation* pRelation = getRelations().getRelationFromRelId( rWorksheets.getSheetRelId( nSheet ) ) )
+ sal_Int16 nCalcSheet = rWorksheets.getCalcSheetIndex( nWorksheet );
+ const Relation* pRelation = getRelations().getRelationFromRelId( rWorksheets.getWorksheetRelId( nWorksheet ) );
+ if( (nCalcSheet >= 0) && pRelation )
{
// get fragment path of the sheet
OUString aFragmentPath = getFragmentPathFromRelation( *pRelation );
@@ -245,33 +249,33 @@ void OoxWorkbookFragment::finalizeImport()
if( aFragmentPath.getLength() > 0 )
{
::rtl::Reference< OoxWorksheetFragmentBase > xFragment;
- double fSegmentLength = getProgressBar().getFreeLength() / (nSheetCount - nSheet);
+ double fSegmentLength = getProgressBar().getFreeLength() / (nWorksheetCount - nWorksheet);
ISegmentProgressBarRef xSheetSegment = getProgressBar().createSegment( fSegmentLength );
// create the fragment according to the sheet type
if( pRelation->maType == CREATE_OFFICEDOC_RELATIONSTYPE( "worksheet" ) )
{
- xFragment.set( new OoxWorksheetFragment( *this, aFragmentPath, xSheetSegment, SHEETTYPE_WORKSHEET, nSheet ) );
+ xFragment.set( new OoxWorksheetFragment( *this, aFragmentPath, xSheetSegment, SHEETTYPE_WORKSHEET, nCalcSheet ) );
}
else if( pRelation->maType == CREATE_OFFICEDOC_RELATIONSTYPE( "chartsheet" ) )
{
- xFragment.set( new OoxChartsheetFragment( *this, aFragmentPath, xSheetSegment, nSheet ) );
+ xFragment.set( new OoxChartsheetFragment( *this, aFragmentPath, xSheetSegment, nCalcSheet ) );
}
else if( (pRelation->maType == CREATE_MSOFFICE_RELATIONSTYPE( "xlMacrosheet" )) ||
(pRelation->maType == CREATE_MSOFFICE_RELATIONSTYPE( "xlIntlMacrosheet" )) )
{
- xFragment.set( new OoxWorksheetFragment( *this, aFragmentPath, xSheetSegment, SHEETTYPE_MACROSHEET, nSheet ) );
+ xFragment.set( new OoxWorksheetFragment( *this, aFragmentPath, xSheetSegment, SHEETTYPE_MACROSHEET, nCalcSheet ) );
}
else if( pRelation->maType == CREATE_OFFICEDOC_RELATIONSTYPE( "dialogsheet" ) )
{
- xFragment.set( new OoxWorksheetFragment( *this, aFragmentPath, xSheetSegment, SHEETTYPE_DIALOGSHEET, nSheet ) );
+ xFragment.set( new OoxWorksheetFragment( *this, aFragmentPath, xSheetSegment, SHEETTYPE_DIALOGSHEET, nCalcSheet ) );
}
// insert the fragment into the map
OSL_ENSURE( xFragment.is(), "OoxWorkbookFragment::finalizeImport - unknown sheet type" );
OSL_ENSURE( !xFragment.is() || xFragment->isValidSheet(), "OoxWorkbookFragment::finalizeImport - missing sheet in document" );
if( xFragment.is() && xFragment->isValidSheet() )
- aSheetFragments[ nSheet ].set( xFragment.get() );
+ aSheetFragments.push_back( xFragment.get() );
}
}
}
@@ -281,17 +285,13 @@ void OoxWorkbookFragment::finalizeImport()
getTables().finalizeImport();
// load all worksheets
- for( sal_Int32 nSheet = 0; nSheet < nSheetCount; ++nSheet )
+ for( SheetFragmentVector::iterator aIt = aSheetFragments.begin(), aEnd = aSheetFragments.end(); aIt != aEnd; ++aIt )
{
- SheetFragmentMap::iterator aIt = aSheetFragments.find( nSheet );
- if( aIt != aSheetFragments.end() )
- {
- OOX_LOADSAVE_TIMER( IMPORTSHEETFRAGMENT );
- // import the sheet fragment
- importOoxFragment( aIt->second );
- // delete fragment object, will free all allocated sheet buffers
- aSheetFragments.erase( aIt );
- }
+ OOX_LOADSAVE_TIMER( IMPORTSHEETFRAGMENT );
+ // import the sheet fragment
+ importOoxFragment( *aIt );
+ // delete fragment object, will free all allocated sheet buffers
+ aIt->clear();
}
// final conversions, e.g. calculation settings and view settings
@@ -366,13 +366,14 @@ bool BiffWorkbookFragment::importFragment()
// load sheet fragments (do not return false in bRet on missing/broken sheets)
WorksheetBuffer& rWorksheets = getWorksheets();
bool bNextSheet = bRet;
- for( sal_Int32 nSheet = 0, nSheetCount = rWorksheets.getSheetCount(); bNextSheet && (nSheet < nSheetCount); ++nSheet )
+ for( sal_Int32 nWorksheet = 0, nWorksheetCount = rWorksheets.getWorksheetCount(); bNextSheet && (nWorksheet < nWorksheetCount); ++nWorksheet )
{
// try to start a new sheet fragment
- double fSegmentLength = getProgressBar().getFreeLength() / (nSheetCount - nSheet);
+ double fSegmentLength = getProgressBar().getFreeLength() / (nWorksheetCount - nWorksheet);
ISegmentProgressBarRef xSheetProgress = getProgressBar().createSegment( fSegmentLength );
- BiffFragmentType eSheetFragment = startFragment( getBiff() );
- bNextSheet = importSheetFragment( *xSheetProgress, eSheetFragment, nSheet );
+ BiffFragmentType eSheetFragment = startFragment( getBiff(), rWorksheets.getBiffRecordHandle( nWorksheet ) );
+ sal_Int16 nCalcSheet = rWorksheets.getCalcSheetIndex( nWorksheet );
+ bNextSheet = importSheetFragment( *xSheetProgress, eSheetFragment, nCalcSheet );
}
}
break;
@@ -402,7 +403,8 @@ bool BiffWorkbookFragment::importFragment()
}
// final conversions, e.g. calculation settings and view settings
- finalizeWorkbookImport();
+ if( bRet )
+ finalizeWorkbookImport();
return bRet;
}
@@ -432,19 +434,19 @@ bool BiffWorkbookFragment::importWorkspaceFragment()
// load sheet fragments (do not return false in bRet on missing/broken sheets)
bool bNextSheet = bRet;
- for( sal_Int32 nSheet = 0, nSheetCount = rWorksheets.getSheetCount(); bNextSheet && (nSheet < nSheetCount); ++nSheet )
+ for( sal_Int32 nWorksheet = 0, nWorksheetCount = rWorksheets.getWorksheetCount(); bNextSheet && (nWorksheet < nWorksheetCount); ++nWorksheet )
{
// try to start a new sheet fragment (with leading SHEETHEADER record)
bNextSheet = mrStrm.startNextRecord() && (mrStrm.getRecId() == BIFF_ID_SHEETHEADER);
if( bNextSheet )
{
- double fSegmentLength = getProgressBar().getFreeLength() / (nSheetCount - nSheet);
+ double fSegmentLength = getProgressBar().getFreeLength() / (nWorksheetCount - nWorksheet);
ISegmentProgressBarRef xSheetProgress = getProgressBar().createSegment( fSegmentLength );
/* Read current sheet name (sheet substreams may not be in the
same order as SHEET records are). */
mrStrm.skip( 4 );
OUString aSheetName = mrStrm.readByteStringUC( false, getTextEncoding() );
- sal_Int32 nCurrSheet = rWorksheets.getCalcSheetIndex( aSheetName );
+ sal_Int16 nCurrSheet = rWorksheets.getCalcSheetIndex( aSheetName );
// load the sheet fragment records
BiffFragmentType eSheetFragment = startFragment( getBiff() );
bNextSheet = importSheetFragment( *xSheetProgress, eSheetFragment, nCurrSheet );
@@ -509,33 +511,35 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress
case BIFF3: switch( nRecId )
{
- case BIFF_ID_CRN: bExtLinkRec = true; break;
- case BIFF3_ID_DEFINEDNAME: bExtLinkRec = true; break;
- case BIFF3_ID_EXTERNALNAME: bExtLinkRec = true; break;
- case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break;
- case BIFF3_ID_FONT: rStyles.importFont( mrStrm ); break;
- case BIFF2_ID_FORMAT: rStyles.importFormat( mrStrm ); break;
- case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( mrStrm ); break;
- case BIFF_ID_PALETTE: rStyles.importPalette( mrStrm ); break;
- case BIFF_ID_STYLE: rStyles.importStyle( mrStrm ); break;
- case BIFF_ID_XCT: bExtLinkRec = true; break;
- case BIFF3_ID_XF: rStyles.importXf( mrStrm ); break;
+ case BIFF_ID_CRN: bExtLinkRec = true; break;
+ case BIFF3_ID_DEFINEDNAME: bExtLinkRec = true; break;
+ case BIFF3_ID_EXTERNALNAME: bExtLinkRec = true; break;
+ case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break;
+ case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( mrStrm ); break;
+ case BIFF3_ID_FONT: rStyles.importFont( mrStrm ); break;
+ case BIFF2_ID_FORMAT: rStyles.importFormat( mrStrm ); break;
+ case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( mrStrm ); break;
+ case BIFF_ID_PALETTE: rStyles.importPalette( mrStrm ); break;
+ case BIFF_ID_STYLE: rStyles.importStyle( mrStrm ); break;
+ case BIFF_ID_XCT: bExtLinkRec = true; break;
+ case BIFF3_ID_XF: rStyles.importXf( mrStrm ); break;
}
break;
case BIFF4: switch( nRecId )
{
- case BIFF_ID_CRN: bExtLinkRec = true; break;
- case BIFF3_ID_DEFINEDNAME: bExtLinkRec = true; break;
- case BIFF3_ID_EXTERNALNAME: bExtLinkRec = true; break;
- case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break;
- case BIFF3_ID_FONT: rStyles.importFont( mrStrm ); break;
- case BIFF4_ID_FORMAT: rStyles.importFormat( mrStrm ); break;
- case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( mrStrm ); break;
- case BIFF_ID_PALETTE: rStyles.importPalette( mrStrm ); break;
- case BIFF_ID_STYLE: rStyles.importStyle( mrStrm ); break;
- case BIFF_ID_XCT: bExtLinkRec = true; break;
- case BIFF4_ID_XF: rStyles.importXf( mrStrm ); break;
+ case BIFF_ID_CRN: bExtLinkRec = true; break;
+ case BIFF3_ID_DEFINEDNAME: bExtLinkRec = true; break;
+ case BIFF3_ID_EXTERNALNAME: bExtLinkRec = true; break;
+ case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break;
+ case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( mrStrm ); break;
+ case BIFF3_ID_FONT: rStyles.importFont( mrStrm ); break;
+ case BIFF4_ID_FORMAT: rStyles.importFormat( mrStrm ); break;
+ case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( mrStrm ); break;
+ case BIFF_ID_PALETTE: rStyles.importPalette( mrStrm ); break;
+ case BIFF_ID_STYLE: rStyles.importStyle( mrStrm ); break;
+ case BIFF_ID_XCT: bExtLinkRec = true; break;
+ case BIFF4_ID_XF: rStyles.importXf( mrStrm ); break;
}
break;
@@ -546,6 +550,7 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress
case BIFF5_ID_DEFINEDNAME: bExtLinkRec = true; break;
case BIFF5_ID_EXTERNALNAME: bExtLinkRec = true; break;
case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break;
+ case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( mrStrm ); break;
case BIFF5_ID_FONT: rStyles.importFont( mrStrm ); break;
case BIFF4_ID_FORMAT: rStyles.importFormat( mrStrm ); break;
case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( mrStrm ); break;
@@ -567,6 +572,7 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress
case BIFF_ID_EXTERNALBOOK: bExtLinkRec = true; break;
case BIFF5_ID_EXTERNALNAME: bExtLinkRec = true; break;
case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break;
+ case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( mrStrm ); break;
case BIFF5_ID_FONT: rStyles.importFont( mrStrm ); break;
case BIFF4_ID_FORMAT: rStyles.importFormat( mrStrm ); break;
case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( mrStrm ); break;
@@ -591,8 +597,11 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress
// finalize global buffers
rProgressBar.setPosition( 0.5 );
- rSharedStrings.finalizeImport();
- rStyles.finalizeImport();
+ if( bRet )
+ {
+ rSharedStrings.finalizeImport();
+ rStyles.finalizeImport();
+ }
/* Import external link data (EXTERNSHEET, EXTERNALNAME, DEFINEDNAME)
which need existing internal sheets (SHEET records). The SHEET records
@@ -620,8 +629,12 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress
return bRet;
}
-bool BiffWorkbookFragment::importSheetFragment( ISegmentProgressBar& rProgressBar, BiffFragmentType eFragment, sal_Int32 nSheet )
+bool BiffWorkbookFragment::importSheetFragment( ISegmentProgressBar& rProgressBar, BiffFragmentType eFragment, sal_Int16 nCalcSheet )
{
+ // no Calc sheet - skip the fragment
+ if( nCalcSheet < 0 )
+ return skipFragment();
+
// find the sheet type for this fragment
WorksheetType eSheetType = SHEETTYPE_EMPTYSHEET;
switch( eFragment )
@@ -636,7 +649,7 @@ bool BiffWorkbookFragment::importSheetFragment( ISegmentProgressBar& rProgressBa
/* #i11183# Clear buffers that are used per-sheet, e.g. external links in
BIFF4W and BIFF5 files, or defined names in BIFF4W files. */
- createBuffersPerSheet();
+ createBuffersPerSheet( nCalcSheet );
// preprocess some records
switch( getBiff() )
@@ -646,8 +659,6 @@ bool BiffWorkbookFragment::importSheetFragment( ISegmentProgressBar& rProgressBa
case BIFF3:
case BIFF4:
{
- // set sheet index in defined names buffer to handle built-in names correctly
- getDefinedNames().setLocalSheetIndex( nSheet );
// remember current record to seek back below
sal_Int64 nRecHandle = mrStrm.getRecHandle();
// import the global records
@@ -685,14 +696,14 @@ bool BiffWorkbookFragment::importSheetFragment( ISegmentProgressBar& rProgressBa
case SHEETTYPE_WORKSHEET:
case SHEETTYPE_MACROSHEET:
case SHEETTYPE_DIALOGSHEET:
- xFragment.reset( new BiffWorksheetFragment( *this, xSheetProgress, eSheetType, nSheet ) );
+ xFragment.reset( new BiffWorksheetFragment( *this, xSheetProgress, eSheetType, nCalcSheet ) );
break;
case SHEETTYPE_CHARTSHEET:
- xFragment.reset( new BiffChartsheetFragment( *this, xSheetProgress, nSheet ) );
+ xFragment.reset( new BiffChartsheetFragment( *this, xSheetProgress, nCalcSheet ) );
break;
case SHEETTYPE_MODULESHEET:
case SHEETTYPE_EMPTYSHEET:
- xFragment.reset( new BiffSkipWorksheetFragment( *this, xSheetProgress, nSheet ) );
+ xFragment.reset( new BiffSkipWorksheetFragment( *this, xSheetProgress, nCalcSheet ) );
break;
}
// load the sheet fragment records
diff --git a/oox/source/xls/workbookhelper.cxx b/oox/source/xls/workbookhelper.cxx
index 5f2fcced80cb..69a578c051b7 100644
--- a/oox/source/xls/workbookhelper.cxx
+++ b/oox/source/xls/workbookhelper.cxx
@@ -250,6 +250,15 @@ TimeCount& WorkbookHelper::getTimeCount( TimerType eType ) const
// ============================================================================
+bool IgnoreCaseCompare::operator()( const OUString& rName1, const OUString& rName2 ) const
+{
+ // there is no wrapper in rtl::OUString, TODO: compare with collator
+ return ::rtl_ustr_compareIgnoreAsciiCase_WithLength(
+ rName1.getStr(), rName1.getLength(), rName2.getStr(), rName2.getLength() ) < 0;
+}
+
+// ============================================================================
+
class WorkbookData
#if OSL_DEBUG_LEVEL > 0
: public dbg::WorkbookData
@@ -298,8 +307,8 @@ public:
Reference< XStyle > getStyleObject( const OUString& rStyleName, bool bPageStyle ) const;
/** Creates and returns a defined name on-the-fly in the Calc document. */
Reference< XNamedRange > createNamedRangeObject( OUString& orName, sal_Int32 nNameFlags ) const;
- /** Creates a com.sun.star.style.Style object and returns its final name. */
- Reference< XStyle > createStyleObject( OUString& orStyleName, bool bPageStyle, bool bRenameOldExisting ) const;
+ /** Creates and returns a com.sun.star.style.Style object for cells or pages. */
+ Reference< XStyle > createStyleObject( OUString& orStyleName, bool bPageStyle ) const;
// buffers ----------------------------------------------------------------
@@ -365,7 +374,7 @@ public:
/** Enables workbook file mode, used for BIFF4 workspace files. */
void setIsWorkbookFile();
/** Recreates global buffers that are used per sheet in specific BIFF versions. */
- void createBuffersPerSheet();
+ void createBuffersPerSheet( sal_Int16 nSheet );
/** Returns the codec helper that stores the encoder/decoder object. */
inline BiffCodecHelper& getCodecHelper() { return *mxCodecHelper; }
@@ -561,14 +570,14 @@ Reference< XNamedRange > WorkbookData::createNamedRangeObject( OUString& orName,
return xNamedRange;
}
-Reference< XStyle > WorkbookData::createStyleObject( OUString& orStyleName, bool bPageStyle, bool bRenameOldExisting ) const
+Reference< XStyle > WorkbookData::createStyleObject( OUString& orStyleName, bool bPageStyle ) const
{
Reference< XStyle > xStyle;
try
{
Reference< XNameContainer > xStylesNC( getStyleFamily( bPageStyle ), UNO_SET_THROW );
xStyle.set( mrBaseFilter.getModelFactory()->createInstance( bPageStyle ? maPageStyleServ : maCellStyleServ ), UNO_QUERY_THROW );
- orStyleName = ContainerHelper::insertByUnusedName( xStylesNC, orStyleName, ' ', Any( xStyle ), bRenameOldExisting );
+ orStyleName = ContainerHelper::insertByUnusedName( xStylesNC, orStyleName, ' ', Any( xStyle ), false );
}
catch( Exception& )
{
@@ -603,22 +612,28 @@ void WorkbookData::setIsWorkbookFile()
mbWorkbook = true;
}
-void WorkbookData::createBuffersPerSheet()
+void WorkbookData::createBuffersPerSheet( sal_Int16 nSheet )
{
+ // set mnCurrSheet to enable usage of WorkbookHelper::getCurrentSheetIndex()
+ mnCurrSheet = nSheet;
switch( meBiff )
{
case BIFF2:
case BIFF3:
+ OSL_ENSURE( mnCurrSheet == 0, "WorkbookData::createBuffersPerSheet - unexpected sheet index" );
+ mxDefNames->setLocalCalcSheet( mnCurrSheet );
break;
case BIFF4:
- // #i11183# sheets in BIFF4W files have own styles or names
- if( mbWorkbook )
+ OSL_ENSURE( mbWorkbook || (mnCurrSheet == 0), "WorkbookData::createBuffersPerSheet - unexpected sheet index" );
+ // #i11183# sheets in BIFF4W files have own styles and names
+ if( mbWorkbook && (mnCurrSheet > 0) )
{
mxStyles.reset( new StylesBuffer( *this ) );
mxDefNames.reset( new DefinedNamesBuffer( *this ) );
mxExtLinks.reset( new ExternalLinkBuffer( *this ) );
}
+ mxDefNames->setLocalCalcSheet( mnCurrSheet );
break;
case BIFF5:
@@ -632,6 +647,7 @@ void WorkbookData::createBuffersPerSheet()
case BIFF_UNKNOWN:
break;
}
+ mnCurrSheet = -1;
}
// private --------------------------------------------------------------------
@@ -848,7 +864,7 @@ Reference< XNameAccess > WorkbookHelper::getDdeLinks() const
return mrBookData.getDdeLinks();
}
-Reference< XSpreadsheet > WorkbookHelper::getSheetFromDoc( sal_Int32 nSheet ) const
+Reference< XSpreadsheet > WorkbookHelper::getSheetFromDoc( sal_Int16 nSheet ) const
{
Reference< XSpreadsheet > xSheet;
try
@@ -919,9 +935,9 @@ Reference< XNamedRange > WorkbookHelper::createNamedRangeObject( OUString& orNam
return mrBookData.createNamedRangeObject( orName, nNameFlags );
}
-Reference< XStyle > WorkbookHelper::createStyleObject( OUString& orStyleName, bool bPageStyle, bool bRenameOldExisting ) const
+Reference< XStyle > WorkbookHelper::createStyleObject( OUString& orStyleName, bool bPageStyle ) const
{
- return mrBookData.createStyleObject( orStyleName, bPageStyle, bRenameOldExisting );
+ return mrBookData.createStyleObject( orStyleName, bPageStyle );
}
// buffers --------------------------------------------------------------------
@@ -1071,9 +1087,9 @@ void WorkbookHelper::setIsWorkbookFile()
mrBookData.setIsWorkbookFile();
}
-void WorkbookHelper::createBuffersPerSheet()
+void WorkbookHelper::createBuffersPerSheet( sal_Int16 nSheet )
{
- mrBookData.createBuffersPerSheet();
+ mrBookData.createBuffersPerSheet( nSheet );
}
BiffCodecHelper& WorkbookHelper::getCodecHelper() const
diff --git a/oox/source/xls/workbooksettings.cxx b/oox/source/xls/workbooksettings.cxx
index b91315f663fb..3473dbcc330e 100644
--- a/oox/source/xls/workbooksettings.cxx
+++ b/oox/source/xls/workbooksettings.cxx
@@ -32,10 +32,12 @@
#include <com/sun/star/util/Date.hpp>
#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
#include <com/sun/star/sheet/XCalculatable.hpp>
+#include <comphelper/mediadescriptor.hxx>
#include "properties.hxx"
#include "oox/helper/attributelist.hxx"
#include "oox/helper/propertyset.hxx"
#include "oox/helper/recordinputstream.hxx"
+#include "oox/core/filterbase.hxx"
#include "oox/xls/biffinputstream.hxx"
#include "oox/xls/unitconverter.hxx"
@@ -45,6 +47,7 @@ using ::com::sun::star::uno::UNO_QUERY;
using ::com::sun::star::util::Date;
using ::com::sun::star::util::XNumberFormatsSupplier;
using ::com::sun::star::sheet::XCalculatable;
+using ::oox::core::CodecHelper;
namespace oox {
namespace xls {
@@ -73,6 +76,14 @@ const sal_Int16 API_SHOWMODE_PLACEHOLDER = 2; /// Show placeholder
// ============================================================================
+FileSharingModel::FileSharingModel() :
+ mnPasswordHash( 0 ),
+ mbRecommendReadOnly( false )
+{
+}
+
+// ============================================================================
+
WorkbookSettingsModel::WorkbookSettingsModel() :
mnShowObjectMode( XML_all ),
mnUpdateLinksMode( XML_userSet ),
@@ -113,6 +124,13 @@ WorkbookSettings::WorkbookSettings( const WorkbookHelper& rHelper ) :
{
}
+void WorkbookSettings::importFileSharing( const AttributeList& rAttribs )
+{
+ maFileSharing.maUserName = rAttribs.getXString( XML_userName, OUString() );
+ maFileSharing.mnPasswordHash = CodecHelper::getPasswordHash( rAttribs, XML_reservationPassword );
+ maFileSharing.mbRecommendReadOnly = rAttribs.getBool( XML_readOnlyRecommended, false );
+}
+
void WorkbookSettings::importWorkbookPr( const AttributeList& rAttribs )
{
maBookSettings.maCodeName = rAttribs.getString( XML_codePage, OUString() );
@@ -138,6 +156,12 @@ void WorkbookSettings::importCalcPr( const AttributeList& rAttribs )
maCalcSettings.mbConcurrent = rAttribs.getBool( XML_concurrentCalc, true );
}
+void WorkbookSettings::importFileSharing( RecordInputStream& rStrm )
+{
+ maFileSharing.mbRecommendReadOnly = rStrm.readuInt16() != 0;
+ rStrm >> maFileSharing.mnPasswordHash >> maFileSharing.maUserName;
+}
+
void WorkbookSettings::importWorkbookPr( RecordInputStream& rStrm )
{
sal_uInt32 nFlags;
@@ -170,6 +194,23 @@ void WorkbookSettings::setSaveExtLinkValues( bool bSaveExtLinks )
maBookSettings.mbSaveExtLinkValues = bSaveExtLinks;
}
+void WorkbookSettings::importFileSharing( BiffInputStream& rStrm )
+{
+ maFileSharing.mbRecommendReadOnly = rStrm.readuInt16() != 0;
+ rStrm >> maFileSharing.mnPasswordHash;
+ if( getBiff() == BIFF8 )
+ {
+ sal_uInt16 nStrLen = rStrm.readuInt16();
+ // there is no string flags field if string is empty
+ if( nStrLen > 0 )
+ maFileSharing.maUserName = rStrm.readUniStringBody( nStrLen );
+ }
+ else
+ {
+ maFileSharing.maUserName = rStrm.readByteStringUC( false, getTextEncoding() );
+ }
+}
+
void WorkbookSettings::importBookBool( BiffInputStream& rStrm )
{
// value of 0 means save external values, value of 1 means strip external values
@@ -254,6 +295,12 @@ void WorkbookSettings::finalizeImport()
break;
}
+ // write protection
+ if( maFileSharing.mbRecommendReadOnly || (maFileSharing.mnPasswordHash != 0) )
+ getBaseFilter().getMediaDescriptor()[ CREATE_OUSTRING( "ReadOnly" ) ] <<= true;
+ if( maFileSharing.mnPasswordHash != 0 )
+ aPropSet.setProperty( PROP_WriteProtectionPassword, static_cast< sal_Int32 >( maFileSharing.mnPasswordHash ) );
+
// calculation settings
Date aNullDate = getNullDate();
diff --git a/oox/source/xls/worksheetbuffer.cxx b/oox/source/xls/worksheetbuffer.cxx
index 64e8acbb6c9c..5f19fd55dbcd 100644
--- a/oox/source/xls/worksheetbuffer.cxx
+++ b/oox/source/xls/worksheetbuffer.cxx
@@ -38,7 +38,6 @@
#include <com/sun/star/sheet/XSheetLinkable.hpp>
#include "properties.hxx"
#include "oox/helper/attributelist.hxx"
-#include "oox/helper/containerhelper.hxx"
#include "oox/helper/propertyset.hxx"
#include "oox/helper/recordinputstream.hxx"
#include "oox/core/filterbase.hxx"
@@ -61,22 +60,8 @@ namespace xls {
// ============================================================================
-namespace {
-
-/** Returns the base file name without path and extension. */
-OUString lclGetBaseFileName( const OUString& rUrl )
-{
- sal_Int32 nFileNamePos = ::std::max< sal_Int32 >( rUrl.lastIndexOf( '/' ) + 1, 0 );
- sal_Int32 nExtPos = rUrl.lastIndexOf( '.' );
- if( nExtPos <= nFileNamePos ) nExtPos = rUrl.getLength();
- return rUrl.copy( nFileNamePos, nExtPos - nFileNamePos );
-}
-
-} // namespace
-
-// ============================================================================
-
SheetInfoModel::SheetInfoModel() :
+ mnBiffHandle( -1 ),
mnSheetId( -1 ),
mnState( XML_visible )
{
@@ -89,11 +74,19 @@ WorksheetBuffer::WorksheetBuffer( const WorkbookHelper& rHelper ) :
{
}
+/*static*/ OUString WorksheetBuffer::getBaseFileName( const OUString& rUrl )
+{
+ sal_Int32 nFileNamePos = ::std::max< sal_Int32 >( rUrl.lastIndexOf( '/' ) + 1, 0 );
+ sal_Int32 nExtPos = rUrl.lastIndexOf( '.' );
+ if( nExtPos <= nFileNamePos ) nExtPos = rUrl.getLength();
+ return rUrl.copy( nFileNamePos, nExtPos - nFileNamePos );
+}
+
void WorksheetBuffer::initializeSingleSheet()
{
OSL_ENSURE( maSheetInfos.empty(), "WorksheetBuffer::initializeSingleSheet - invalid call" );
SheetInfoModel aModel;
- aModel.maName = lclGetBaseFileName( getBaseFilter().getFileUrl() );
+ aModel.maName = getBaseFileName( getBaseFilter().getFileUrl() );
insertSheet( aModel );
}
@@ -119,125 +112,149 @@ void WorksheetBuffer::importSheet( RecordInputStream& rStrm )
void WorksheetBuffer::importSheet( BiffInputStream& rStrm )
{
- sal_uInt16 nState = 0;
+ SheetInfoModel aModel;
if( getBiff() >= BIFF5 )
{
- rStrm.skip( 4 );
- rStrm >> nState;
+ rStrm.enableDecoder( false );
+ aModel.mnBiffHandle = rStrm.readuInt32();
+ rStrm.enableDecoder( true );
+ sal_uInt16 nState = rStrm.readuInt16();
+ static const sal_Int32 spnStates[] = { XML_visible, XML_hidden, XML_veryHidden };
+ aModel.mnState = STATIC_ARRAY_SELECT( spnStates, nState, XML_visible );
}
-
- SheetInfoModel aModel;
aModel.maName = (getBiff() == BIFF8) ?
rStrm.readUniStringBody( rStrm.readuInt8() ) :
rStrm.readByteStringUC( false, getTextEncoding() );
- static const sal_Int32 spnStates[] = { XML_visible, XML_hidden, XML_veryHidden };
- aModel.mnState = STATIC_ARRAY_SELECT( spnStates, nState, XML_visible );
insertSheet( aModel );
}
sal_Int16 WorksheetBuffer::insertEmptySheet( const OUString& rPreferredName, bool bVisible )
{
- IndexNamePair aIndexName = insertSheet( rPreferredName, SAL_MAX_INT16, bVisible );
- return aIndexName.first;
+ return createSheet( rPreferredName, SAL_MAX_INT32, bVisible ).first;
}
-sal_Int32 WorksheetBuffer::getSheetCount() const
+sal_Int32 WorksheetBuffer::getWorksheetCount() const
{
return static_cast< sal_Int32 >( maSheetInfos.size() );
}
-OUString WorksheetBuffer::getSheetRelId( sal_Int32 nSheet ) const
+OUString WorksheetBuffer::getWorksheetRelId( sal_Int32 nWorksheet ) const
{
- OUString aRelId;
- if( const SheetInfoModel* pModel = getSheetInfo( nSheet ) )
- aRelId = pModel->maRelId;
- return aRelId;
+ const SheetInfo* pSheetInfo = maSheetInfos.get( nWorksheet ).get();
+ return pSheetInfo ? pSheetInfo->maRelId : OUString();
}
-OUString WorksheetBuffer::getCalcSheetName( sal_Int32 nSheet ) const
+sal_Int64 WorksheetBuffer::getBiffRecordHandle( sal_Int32 nWorksheet ) const
{
- OUString aName;
- if( const SheetInfoModel* pModel = getSheetInfo( nSheet ) )
- aName = pModel->maFinalName;
- return aName;
+ const SheetInfo* pSheetInfo = maSheetInfos.get( nWorksheet ).get();
+ return pSheetInfo ? pSheetInfo->mnBiffHandle : -1;
}
-OUString WorksheetBuffer::getCalcSheetName( const OUString& rModelName ) const
+sal_Int16 WorksheetBuffer::getCalcSheetIndex( sal_Int32 nWorksheet ) const
{
- for( SheetInfoModelVec::const_iterator aIt = maSheetInfos.begin(), aEnd = maSheetInfos.end(); aIt != aEnd; ++aIt )
- // TODO: handle encoded characters
- if( aIt->maName.equalsIgnoreAsciiCase( rModelName ) )
- return aIt->maFinalName;
- return OUString();
+ const SheetInfo* pSheetInfo = maSheetInfos.get( nWorksheet ).get();
+ return pSheetInfo ? pSheetInfo->mnCalcSheet : -1;
}
-sal_Int32 WorksheetBuffer::getCalcSheetIndex( const OUString& rModelName ) const
+OUString WorksheetBuffer::getCalcSheetName( sal_Int32 nWorksheet ) const
{
- for( SheetInfoModelVec::const_iterator aIt = maSheetInfos.begin(), aEnd = maSheetInfos.end(); aIt != aEnd; ++aIt )
- // TODO: handle encoded characters
- if( aIt->maName.equalsIgnoreAsciiCase( rModelName ) )
- return static_cast< sal_Int32 >( aIt - maSheetInfos.begin() );
- return -1;
+ const SheetInfo* pSheetInfo = maSheetInfos.get( nWorksheet ).get();
+ return pSheetInfo ? pSheetInfo->maCalcName : OUString();
+}
+
+sal_Int16 WorksheetBuffer::getCalcSheetIndex( const OUString& rWorksheetName ) const
+{
+ const SheetInfo* pSheetInfo = maSheetInfosByName.get( rWorksheetName ).get();
+ return pSheetInfo ? pSheetInfo->mnCalcSheet : -1;
+}
+
+OUString WorksheetBuffer::getCalcSheetName( const OUString& rWorksheetName ) const
+{
+ if( const SheetInfo* pSheetInfo = maSheetInfosByName.get( rWorksheetName ).get() )
+ {
+ bool bIsQuoted = pSheetInfo->maName != rWorksheetName;
+ return bIsQuoted ? pSheetInfo->maCalcQuotedName : pSheetInfo->maCalcName;
+ }
+ return OUString();
}
// private --------------------------------------------------------------------
-const SheetInfoModel* WorksheetBuffer::getSheetInfo( sal_Int32 nSheet ) const
+namespace {
+
+OUString lclQuoteName( const OUString& rName )
+{
+ OUStringBuffer aBuffer( rName );
+ // duplicate all quote characters
+ for( sal_Int32 nPos = aBuffer.getLength() - 1; nPos >= 0; --nPos )
+ if( aBuffer.charAt( nPos ) == '\'' )
+ aBuffer.insert( nPos, sal_Unicode( '\'' ) );
+ // add outer quotes and return
+ return aBuffer.insert( 0, sal_Unicode( '\'' ) ).append( sal_Unicode( '\'' ) ).makeStringAndClear();
+}
+
+} // namespace
+
+WorksheetBuffer::SheetInfo::SheetInfo( const SheetInfoModel& rModel, sal_Int16 nCalcSheet, const OUString& rCalcName ) :
+ SheetInfoModel( rModel ),
+ maCalcName( rCalcName ),
+ maCalcQuotedName( lclQuoteName( rCalcName ) ),
+ mnCalcSheet( nCalcSheet )
{
- return ContainerHelper::getVectorElement( maSheetInfos, nSheet );
}
-WorksheetBuffer::IndexNamePair WorksheetBuffer::insertSheet( const OUString& rPreferredName, sal_Int16 nSheet, bool bVisible )
+WorksheetBuffer::IndexNamePair WorksheetBuffer::createSheet( const OUString& rPreferredName, sal_Int32 nSheetPos, bool bVisible )
{
- IndexNamePair aIndexName;
- aIndexName.first = -1;
- aIndexName.second = (rPreferredName.getLength() == 0) ? CREATE_OUSTRING( "Sheet" ) : rPreferredName;
try
{
Reference< XSpreadsheets > xSheets( getDocument()->getSheets(), UNO_QUERY_THROW );
Reference< XIndexAccess > xSheetsIA( xSheets, UNO_QUERY_THROW );
Reference< XNameAccess > xSheetsNA( xSheets, UNO_QUERY_THROW );
+ sal_Int16 nCalcSheet = -1;
+ OUString aSheetName = (rPreferredName.getLength() == 0) ? CREATE_OUSTRING( "Sheet" ) : rPreferredName;
PropertySet aPropSet;
- if( nSheet < xSheetsIA->getCount() )
+ if( nSheetPos < xSheetsIA->getCount() )
{
+ nCalcSheet = static_cast< sal_Int16 >( nSheetPos );
// existing sheet - try to rename
- Reference< XNamed > xSheetName( xSheetsIA->getByIndex( nSheet ), UNO_QUERY_THROW );
- if( xSheetName->getName() != aIndexName.second )
+ Reference< XNamed > xSheetName( xSheetsIA->getByIndex( nSheetPos ), UNO_QUERY_THROW );
+ if( xSheetName->getName() != aSheetName )
{
- aIndexName.second = ContainerHelper::getUnusedName( xSheetsNA, aIndexName.second, ' ' );
- xSheetName->setName( aIndexName.second );
+ aSheetName = ContainerHelper::getUnusedName( xSheetsNA, aSheetName, ' ' );
+ xSheetName->setName( aSheetName );
}
aPropSet.set( xSheetName );
}
else
{
+ nCalcSheet = static_cast< sal_Int16 >( xSheetsIA->getCount() );
// new sheet - insert with unused name
- aIndexName.second = ContainerHelper::getUnusedName( xSheetsNA, aIndexName.second, ' ' );
- nSheet = static_cast< sal_Int16 >( xSheetsIA->getCount() );
- xSheets->insertNewByName( aIndexName.second, nSheet );
- aPropSet.set( xSheetsIA->getByIndex( nSheet ) );
+ aSheetName = ContainerHelper::getUnusedName( xSheetsNA, aSheetName, ' ' );
+ xSheets->insertNewByName( aSheetName, nCalcSheet );
+ aPropSet.set( xSheetsIA->getByIndex( nCalcSheet ) );
}
// sheet properties
aPropSet.setProperty( PROP_IsVisible, bVisible );
// return final sheet index if sheet exists
- aIndexName.first = nSheet;
+ return IndexNamePair( nCalcSheet, aSheetName );
}
catch( Exception& )
{
- OSL_ENSURE( false, "WorksheetBuffer::insertSheet - cannot insert or rename worksheet" );
+ OSL_ENSURE( false, "WorksheetBuffer::createSheet - cannot insert or rename worksheet" );
}
- return aIndexName;
+ return IndexNamePair( -1, OUString() );
}
void WorksheetBuffer::insertSheet( const SheetInfoModel& rModel )
{
- sal_Int16 nSheet = static_cast< sal_Int16 >( maSheetInfos.size() );
- maSheetInfos.push_back( rModel );
- IndexNamePair aIndexName = insertSheet( rModel.maName, nSheet, rModel.mnState == XML_visible );
- if( aIndexName.first >= 0 )
- maSheetInfos.back().maFinalName = aIndexName.second;
+ sal_Int32 nWorksheet = static_cast< sal_Int32 >( maSheetInfos.size() );
+ IndexNamePair aIndexName = createSheet( rModel.maName, nWorksheet, rModel.mnState == XML_visible );
+ ::boost::shared_ptr< SheetInfo > xSheetInfo( new SheetInfo( rModel, aIndexName.first, aIndexName.second ) );
+ maSheetInfos.push_back( xSheetInfo );
+ maSheetInfosByName[ rModel.maName ] = xSheetInfo;
+ maSheetInfosByName[ lclQuoteName( rModel.maName ) ] = xSheetInfo;
}
// ============================================================================
diff --git a/oox/source/xls/worksheetfragment.cxx b/oox/source/xls/worksheetfragment.cxx
index 4b754114b031..ed8907cb5f03 100644
--- a/oox/source/xls/worksheetfragment.cxx
+++ b/oox/source/xls/worksheetfragment.cxx
@@ -228,7 +228,7 @@ void OoxDataValidationsContext::importDataValidation( RecordInputStream& rStrm )
// ============================================================================
OoxWorksheetFragment::OoxWorksheetFragment( const WorkbookHelper& rHelper,
- const OUString& rFragmentPath, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int32 nSheet ) :
+ const OUString& rFragmentPath, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) :
OoxWorksheetFragmentBase( rHelper, rFragmentPath, xProgressBar, eSheetType, nSheet )
{
// import data tables related to this worksheet
@@ -741,7 +741,7 @@ void OoxWorksheetFragment::importEmbeddedOleData( StreamDataSequence& orEmbedded
// ============================================================================
-BiffWorksheetFragment::BiffWorksheetFragment( const BiffWorkbookFragmentBase& rParent, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int32 nSheet ) :
+BiffWorksheetFragment::BiffWorksheetFragment( const BiffWorkbookFragmentBase& rParent, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) :
BiffWorksheetFragmentBase( rParent, xProgressBar, eSheetType, nSheet )
{
}
diff --git a/oox/source/xls/worksheethelper.cxx b/oox/source/xls/worksheethelper.cxx
index be8ac3d359db..ab2d5c1b1946 100644
--- a/oox/source/xls/worksheethelper.cxx
+++ b/oox/source/xls/worksheethelper.cxx
@@ -362,7 +362,7 @@ public:
const WorkbookHelper& rHelper,
ISegmentProgressBarRef xProgressBar,
WorksheetType eSheetType,
- sal_Int32 nSheet );
+ sal_Int16 nSheet );
/** Returns true, if this helper refers to an existing Calc sheet. */
inline bool isValidSheet() const { return mxSheet.is(); }
@@ -522,8 +522,10 @@ private:
/** Inserts all imported hyperlinks into their cell ranges. */
void finalizeHyperlinkRanges() const;
+ /** Generates the final URL for the passed hyperlink. */
+ OUString getHyperlinkUrl( const HyperlinkModel& rHyperlink ) const;
/** Inserts a hyperlinks into the specified cell. */
- void finalizeHyperlink( const CellAddress& rAddress, const OUString& rUrl ) const;
+ void insertHyperlink( const CellAddress& rAddress, const OUString& rUrl ) const;
/** Inserts all imported data validations into their cell ranges. */
void finalizeValidationRanges() const;
@@ -593,7 +595,7 @@ private:
// ----------------------------------------------------------------------------
-WorksheetData::WorksheetData( const WorkbookHelper& rHelper, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int32 nSheet ) :
+WorksheetData::WorksheetData( const WorkbookHelper& rHelper, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) :
WorkbookHelper( rHelper ),
maTrueFormula( CREATE_OUSTRING( "=TRUE()" ) ),
maFalseFormula( CREATE_OUSTRING( "=FALSE()" ) ),
@@ -608,10 +610,9 @@ WorksheetData::WorksheetData( const WorkbookHelper& rHelper, ISegmentProgressBar
maSheetViewSett( *this ),
mxProgressBar( xProgressBar ),
meSheetType( eSheetType ),
- mnSheet( static_cast< sal_Int16 >( nSheet ) ),
+ mnSheet( nSheet ),
mbHasDefWidth( false )
{
- OSL_ENSURE( nSheet <= SAL_MAX_INT16, "WorksheetData::WorksheetData - invalid sheet index" );
mxSheet = getSheetFromDoc( nSheet );
if( !mxSheet.is() )
mnSheet = -1;
@@ -978,14 +979,11 @@ void WorksheetData::convertRowFormat( sal_Int32 nFirstRow, sal_Int32 nLastRow, s
void WorksheetData::initializeWorksheetImport()
{
-#if OOX_XLS_USE_DEFAULT_STYLE
-#else
// set default cell style for unused cells
PropertySet aPropSet( mxSheet );
aPropSet.setProperty( PROP_CellStyle, getStyles().getDefaultStyleName() );
-#endif
- /* remember current sheet index in global data, needed by some global
+ /* Remember current sheet index in global data, needed by some global
objects, e.g. the chart converter. */
setCurrentSheetIndex( mnSheet );
}
@@ -1006,9 +1004,9 @@ void WorksheetData::finalizeWorksheetImport()
convertColumns();
convertRows();
lclUpdateProgressBar( mxFinalProgress, 0.75 );
- maComments.finalizeImport();
finalizeDrawing();
finalizeVmlDrawing();
+ maComments.finalizeImport(); // after VML drawing
lclUpdateProgressBar( mxFinalProgress, 1.0 );
// reset current sheet index in global data
@@ -1169,42 +1167,44 @@ void WorksheetData::finalizeHyperlinkRanges() const
{
for( HyperlinkModelList::const_iterator aIt = maHyperlinks.begin(), aEnd = maHyperlinks.end(); aIt != aEnd; ++aIt )
{
- OUStringBuffer aUrlBuffer;
- if( aIt->maTarget.getLength() > 0 )
- aUrlBuffer.append( getBaseFilter().getAbsoluteUrl( aIt->maTarget ) );
- if( aIt->maLocation.getLength() > 0 )
- aUrlBuffer.append( sal_Unicode( '#' ) ).append( aIt->maLocation );
- OUString aUrl = aUrlBuffer.makeStringAndClear();
+ OUString aUrl = getHyperlinkUrl( *aIt );
+ // try to insert URL into each cell of the range
if( aUrl.getLength() > 0 )
- {
- // convert '#SheetName!A1' to '#SheetName.A1'
- if( aUrl[ 0 ] == '#' )
- {
- sal_Int32 nSepPos = aUrl.lastIndexOf( '!' );
- if( nSepPos > 0 )
- {
- // replace the exclamation mark with a period
- aUrl = aUrl.replaceAt( nSepPos, 1, OUString( sal_Unicode( '.' ) ) );
- // #i66592# convert sheet names that have been renamed on import
- bool bQuotedName = (nSepPos > 3) && (aUrl[ 1 ] == '\'') && (aUrl[ nSepPos - 1 ] == '\'');
- sal_Int32 nNamePos = bQuotedName ? 2 : 1;
- sal_Int32 nNameLen = nSepPos - (bQuotedName ? 3 : 1);
- OUString aSheetName = aUrl.copy( nNamePos, nNameLen );
- OUString aCalcName = getWorksheets().getCalcSheetName( aSheetName );
- if( aCalcName.getLength() > 0 )
- aUrl = aUrl.replaceAt( nNamePos, nNameLen, aCalcName );
- }
- }
-
- // try to insert URL into each cell of the range
for( CellAddress aAddress( mnSheet, aIt->maRange.StartColumn, aIt->maRange.StartRow ); aAddress.Row <= aIt->maRange.EndRow; ++aAddress.Row )
for( aAddress.Column = aIt->maRange.StartColumn; aAddress.Column <= aIt->maRange.EndColumn; ++aAddress.Column )
- finalizeHyperlink( aAddress, aUrl );
+ insertHyperlink( aAddress, aUrl );
+ }
+}
+
+OUString WorksheetData::getHyperlinkUrl( const HyperlinkModel& rHyperlink ) const
+{
+ OUStringBuffer aUrlBuffer;
+ if( rHyperlink.maTarget.getLength() > 0 )
+ aUrlBuffer.append( getBaseFilter().getAbsoluteUrl( rHyperlink.maTarget ) );
+ if( rHyperlink.maLocation.getLength() > 0 )
+ aUrlBuffer.append( sal_Unicode( '#' ) ).append( rHyperlink.maLocation );
+ OUString aUrl = aUrlBuffer.makeStringAndClear();
+
+ // convert '#SheetName!A1' to '#SheetName.A1'
+ if( (aUrl.getLength() > 0) && (aUrl[ 0 ] == '#') )
+ {
+ sal_Int32 nSepPos = aUrl.lastIndexOf( '!' );
+ if( nSepPos > 0 )
+ {
+ // replace the exclamation mark with a period
+ aUrl = aUrl.replaceAt( nSepPos, 1, OUString( sal_Unicode( '.' ) ) );
+ // #i66592# convert sheet names that have been renamed on import
+ OUString aSheetName = aUrl.copy( 1, nSepPos - 1 );
+ OUString aCalcName = getWorksheets().getCalcSheetName( aSheetName );
+ if( aCalcName.getLength() > 0 )
+ aUrl = aUrl.replaceAt( 1, nSepPos - 1, aCalcName );
}
}
+
+ return aUrl;
}
-void WorksheetData::finalizeHyperlink( const CellAddress& rAddress, const OUString& rUrl ) const
+void WorksheetData::insertHyperlink( const CellAddress& rAddress, const OUString& rUrl ) const
{
Reference< XCell > xCell = getCell( rAddress );
if( xCell.is() ) switch( xCell->getType() )
@@ -1217,7 +1217,7 @@ void WorksheetData::finalizeHyperlink( const CellAddress& rAddress, const OUStri
{
// create a URL field object and set its properties
Reference< XTextContent > xUrlField( getDocumentFactory()->createInstance( maUrlTextField ), UNO_QUERY );
- OSL_ENSURE( xUrlField.is(), "WorksheetData::finalizeHyperlink - cannot create text field" );
+ OSL_ENSURE( xUrlField.is(), "WorksheetData::insertHyperlink - cannot create text field" );
if( xUrlField.is() )
{
// properties of the URL field
@@ -1233,7 +1233,7 @@ void WorksheetData::finalizeHyperlink( const CellAddress& rAddress, const OUStri
}
catch( const Exception& )
{
- OSL_ENSURE( false, "WorksheetData::finalizeHyperlink - cannot insert text field" );
+ OSL_ENSURE( false, "WorksheetData::insertHyperlink - cannot insert text field" );
}
}
}
@@ -1246,7 +1246,7 @@ void WorksheetData::finalizeHyperlink( const CellAddress& rAddress, const OUStri
case ::com::sun::star::table::CellContentType_VALUE:
{
Reference< XFormulaTokens > xTokens( xCell, UNO_QUERY );
- OSL_ENSURE( xTokens.is(), "WorksheetHelper::finalizeHyperlink - missing formula interface" );
+ OSL_ENSURE( xTokens.is(), "WorksheetHelper::insertHyperlink - missing formula interface" );
if( xTokens.is() )
{
SimpleFormulaContext aContext( xTokens, false, false );
@@ -2072,7 +2072,7 @@ WorksheetDataOwner::~WorksheetDataOwner()
// ----------------------------------------------------------------------------
-WorksheetHelperRoot::WorksheetHelperRoot( const WorkbookHelper& rHelper, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int32 nSheet ) :
+WorksheetHelperRoot::WorksheetHelperRoot( const WorkbookHelper& rHelper, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) :
prv::WorksheetDataOwner( prv::WorksheetDataRef( new WorksheetData( rHelper, xProgressBar, eSheetType, nSheet ) ) ),
WorksheetHelper( *mxSheetData )
{
diff --git a/oox/source/xls/worksheetsettings.cxx b/oox/source/xls/worksheetsettings.cxx
index 48cc9c3041df..d791e4801217 100644
--- a/oox/source/xls/worksheetsettings.cxx
+++ b/oox/source/xls/worksheetsettings.cxx
@@ -41,6 +41,7 @@ using ::com::sun::star::uno::Exception;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::UNO_QUERY_THROW;
using ::com::sun::star::util::XProtectable;
+using ::oox::core::CodecHelper;
namespace oox {
namespace xls {
@@ -112,16 +113,6 @@ SheetProtectionModel::SheetProtectionModel() :
// ============================================================================
-namespace {
-
-sal_uInt16 lclGetCheckedHash( sal_Int32 nHash )
-{
- OSL_ENSURE( (0 <= nHash) && (nHash <= SAL_MAX_UINT16), "lclGetCheckedHash - invalid password hash" );
- return getLimitedValue< sal_uInt16, sal_Int32 >( nHash, 0, SAL_MAX_UINT16 );
-}
-
-} // namespace
-
WorksheetSettings::WorksheetSettings( const WorksheetHelper& rHelper ) :
WorksheetHelper( rHelper ),
maPhoneticSett( rHelper )
@@ -153,7 +144,7 @@ void WorksheetSettings::importOutlinePr( const AttributeList& rAttribs )
void WorksheetSettings::importSheetProtection( const AttributeList& rAttribs )
{
- maSheetProt.mnPasswordHash = lclGetCheckedHash( rAttribs.getIntegerHex( XML_password, 0 ) );
+ maSheetProt.mnPasswordHash = CodecHelper::getPasswordHash( rAttribs, XML_password );
maSheetProt.mbSheet = rAttribs.getBool( XML_sheet, false );
maSheetProt.mbObjects = rAttribs.getBool( XML_objects, false );
maSheetProt.mbScenarios = rAttribs.getBool( XML_scenarios, false );
@@ -174,7 +165,7 @@ void WorksheetSettings::importSheetProtection( const AttributeList& rAttribs )
void WorksheetSettings::importChartProtection( const AttributeList& rAttribs )
{
- maSheetProt.mnPasswordHash = lclGetCheckedHash( rAttribs.getIntegerHex( XML_password, 0 ) );
+ maSheetProt.mnPasswordHash = CodecHelper::getPasswordHash( rAttribs, XML_password );
maSheetProt.mbSheet = rAttribs.getBool( XML_content, false );
maSheetProt.mbObjects = rAttribs.getBool( XML_objects, false );
}
diff --git a/oox/util/makefile.mk b/oox/util/makefile.mk
index f98003b0fe0d..bf12b1addf1b 100644
--- a/oox/util/makefile.mk
+++ b/oox/util/makefile.mk
@@ -39,7 +39,7 @@ ENABLE_EXCEPTIONS=TRUE
# --- Settings -----------------------------------------------------
.INCLUDE : settings.mk
-
+.IF "$(L10N_framework)"==""
# --- Allgemein ----------------------------------------------------
LIB1TARGET= $(SLB)$/$(TARGET).lib
@@ -74,11 +74,26 @@ SHL1STDLIBS= \
$(BASEGFXLIB) \
$(SAXLIB)
+# link openssl, copied this bit from ucb/source/ucp/webdav/makefile.mk
+.IF "$(GUI)"=="WNT"
+SHL1STDLIBS+= $(OPENSSLLIB)
+.ELSE # WNT
+.IF "$(OS)"=="SOLARIS"
+SHL1STDLIBS+= -lnsl -lsocket -ldl
+.ENDIF # SOLARIS
+.IF "$(SYSTEM_OPENSSL)"=="YES"
+SHL1STDLIBS+= $(OPENSSLLIB)
+.ELSE
+SHL1STDLIBS+= $(OPENSSLLIBST)
+.ENDIF
+.ENDIF # WNT
+
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
SHL1LIBS= $(LIB1TARGET)
DEF1NAME =$(SHL1TARGET)
DEFLIB1NAME =$(TARGET)
# --- Targets ----------------------------------------------------------
+.ENDIF # L10N_framework
.INCLUDE : target.mk
diff --git a/oox/workben/pagesize/excel_pagesize.txt b/oox/workben/pagesize/excel_pagesize.txt
deleted file mode 100644
index e6d8a05583cb..000000000000
--- a/oox/workben/pagesize/excel_pagesize.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-1 = Letter paper (8.5 in. by 11 in.)
-2 = Letter small paper (8.5 in. by 11 in.)
-3 = Tabloid paper (11 in. by 17 in.)
-4 = Ledger paper (17 in. by 11 in.)
-5 = Legal paper (8.5 in. by 14 in.)
-6 = Statement paper (5.5 in. by 8.5 in.)
-7 = Executive paper (7.25 in. by 10.5 in.)
-8 = A3 paper (297 mm by 420 mm)
-9 = A4 paper (210 mm by 297 mm)
-10 = A4 small paper (210 mm by 297 mm)
-11 = A5 paper (148 mm by 210 mm)
-12 = B4 paper (250 mm by 353 mm)
-13 = B5 paper (176 mm by 250 mm)
-14 = Folio paper (8.5 in. by 13 in.)
-15 = Quarto paper (215 mm by 275 mm)
-16 = Standard paper (10 in. by 14 in.)
-17 = Standard paper (11 in. by 17 in.)
-18 = Note paper (8.5 in. by 11 in.)
-19 = #9 envelope (3.875 in. by 8.875 in.)
-20 = #10 envelope (4.125 in. by 9.5 in.)
-21 = #11 envelope (4.5 in. by 10.375 in.)
-22 = #12 envelope (4.75 in. by 11 in.)
-23 = #14 envelope (5 in. by 11.5 in.)
-24 = C paper (17 in. by 22 in.)
-25 = D paper (22 in. by 34 in.)
-26 = E paper (34 in. by 44 in.)
-27 = DL envelope (110 mm by 220 mm)
-28 = C5 envelope (162 mm by 229 mm)
-29 = C3 envelope (324 mm by 458 mm)
-30 = C4 envelope (229 mm by 324 mm)
-31 = C6 envelope (114 mm by 162 mm)
-32 = C65 envelope (114 mm by 229 mm)
-33 = B4 envelope (250 mm by 353 mm)
-34 = B5 envelope (176 mm by 250 mm)
-35 = B6 envelope (176 mm by 125 mm)
-36 = Italy envelope (110 mm by 230 mm)
-37 = Monarch envelope (3.875 in. by 7.5 in.).
-38 = 6 3/4 envelope (3.625 in. by 6.5 in.)
-39 = US standard fanfold (14.875 in. by 11 in.)
-40 = German standard fanfold (8.5 in. by 12 in.)
-41 = German legal fanfold (8.5 in. by 13 in.)
-42 = ISO B4 (250 mm by 353 mm)
-43 = Japanese double postcard (200 mm by 148 mm)
-44 = Standard paper (9 in. by 11 in.)
-45 = Standard paper (10 in. by 11 in.)
-46 = Standard paper (15 in. by 11 in.)
-47 = Invite envelope (220 mm by 220 mm)
-50 = Letter extra paper (9.275 in. by 12 in.)
-51 = Legal extra paper (9.275 in. by 15 in.)
-52 = Tabloid extra paper (11.69 in. by 18 in.)
-53 = A4 extra paper (236 mm by 322 mm)
-54 = Letter transverse paper (8.275 in. by 11 in.)
-55 = A4 transverse paper (210 mm by 297 mm)
-56 = Letter extra transverse paper (9.275 in. by 12 in.)
-57 = SuperA/SuperA/A4 paper (227 mm by 356 mm)
-58 = SuperB/SuperB/A3 paper (305 mm by 487 mm)
-59 = Letter plus paper (8.5 in. by 12.69 in.)
-60 = A4 plus paper (210 mm by 330 mm)
-61 = A5 transverse paper (148 mm by 210 mm)
-62 = JIS B5 transverse paper (182 mm by 257 mm)
-63 = A3 extra paper (322 mm by 445 mm)
-64 = A5 extra paper (174 mm by 235 mm)
-65 = ISO B5 extra paper (201 mm by 276 mm)
-66 = A2 paper (420 mm by 594 mm)
-67 = A3 transverse paper (297 mm by 420 mm)
-68 = A3 extra transverse paper (322 mm by 445 mm)
diff --git a/oox/workben/pagesize/parsePageSize.py b/oox/workben/pagesize/parsePageSize.py
deleted file mode 100755
index 8b536baaeba4..000000000000
--- a/oox/workben/pagesize/parsePageSize.py
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-
-class PageSize(object):
- def __init__ (self):
- self.index = 0
- self.list = []
-
- def parseLine (self, line):
- lhs, rhs = line.split("=")
- name, size = rhs.split("(")
- index = int(lhs)
- name = name.strip()
- size = size[:size.rfind(")")]
- words = size.split()
- width, height = float(words[0]), float(words[3])
- if words[1] != words[4]:
- print "unit mismatch", words[1], words[4]
- sys.exit(1)
- unit = ''
- if words[1] == 'mm':
- unit = 'mm'
- elif words[1] == 'in.':
- unit = 'inches'
- else:
- print "unknown unit:", words[1]
- sys.exit(1)
-
- item = {'index': index, 'name': name, 'width': width, 'height': height, 'unit': unit}
- self.list.append(item)
-
- def output (self):
- print "static const XmlPaperSize PaperSizeTable[] ="
- print "{"
- line = " { 0, 0 },"
- while len(line) <= 60:
- line += ' '
- line += "// 0 - (undefined)"
- print line
- n = len(self.list)
- for i in xrange(0, n):
- if self.list[i]['unit'] == 'mm':
- macro = 'MM2MM100'
- elif self.list[i]['unit'] == 'inches':
- macro = 'IN2MM100'
- else:
- print "unknown unit:", self.list[i]['unit']
- sys.exit(1)
- line = " "
- line += '{ ' + macro + "( %g )"%self.list[i]['width'] + ','
- while len(line) <= 28:
- line += ' '
- line += macro + "( %g )"%self.list[i]['height']
- while len(line) <= 48:
- line += ' '
- line += '}'
- if i != n - 1:
- line += ","
- while len(line) <= 60:
- line += ' '
- if self.list[i]['index'] < 10:
- line += "// %d - "%self.list[i]['index'] + self.list[i]['name']
- else:
- line += "// %d - "%self.list[i]['index'] + self.list[i]['name']
-
- print line
- print "};"
- return
-
-
-if len(sys.argv) < 2:
- sys.exit(1)
-
-obj = PageSize()
-for line in open(sys.argv[1], 'r').readlines():
- obj.parseLine(line)
-obj.output()