From: chanywa Date: Thu, 12 Nov 2015 02:08:50 +0000 (+0900) Subject: Synchronization with Tizen 2.4 and open source files of maps-plugin-here package X-Git-Tag: accepted/tizen/mobile/20151126.113045~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F64%2F51664%2F2;p=platform%2Fcore%2Flocation%2Fmaps-plugin-here.git Synchronization with Tizen 2.4 and open source files of maps-plugin-here package Change-Id: Id4da16a533fca2196bf350720ccfb7f98d09878f --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c54075..cb083d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,78 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT("maps-plugin-here") +SET(pkg_name "maps-plugin-here") +PROJECT(${pkg_name} C CXX) +SET(CMAKE_INSTALL_PREFIX /usr) SET(PREFIX ${CMAKE_INSTALL_PREFIX}) -INSTALL(FILES ${ARCH}/libmaps-plugin-here.so DESTINATION lib/maps/plugins) -INSTALL(FILES ${ARCH}/libheremaps-engine.so DESTINATION lib) +# Dependencies +SET(dependents "glib-2.0 gmodule-2.0 libxml-2.0 dlog capi-network-connection capi-appfw-app-manager capi-maps-service") + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs REQUIRED ${dependents}) +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") + SET(EXTRA_CXXFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + + +# Build +SET(CMAKE_INSTALL_PREFIX /usr) +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fvisibility=hidden -fPIC -Wall -Werror") +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} -Wall -fPIC -std=c++0x -fvisibility=hidden") +SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") + +ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") +ADD_DEFINITIONS("-DEXPORT_API=__attribute__((visibility(\"default\")))") +ADD_DEFINITIONS("-DTIZEN_DEBUG") + + +# Main Include file +SET(INC_DIR + inc + inc/engine +) + +INCLUDE_DIRECTORIES( + ${INC_DIR} +) + +#This file must be corrected + +# Source Lists +SET(SRCS + # Maps API + src/here_plugin.cpp + + # Here plug-in + src/here_api.cpp + src/here_base.cpp + src/here_manager.cpp + src/here_geocode.cpp + src/here_place.cpp + src/here_revgeocode.cpp + src/here_route.cpp + src/here_utils.cpp +) + +ADD_LIBRARY(${pkg_name} SHARED ${SRCS}) + +SET_TARGET_PROPERTIES(${pkg_name} + PROPERTIES + VERSION ${FULLVER} + SOVERSION ${MAJORVER} + CLEAN_DIRECT_OUTPUT 1 +) + +TARGET_LINK_LIBRARIES(${pkg_name} ${pkgs_LDFLAGS}) + +# Install +INSTALL(TARGETS ${pkg_name} DESTINATION ${LIBDIR}/maps/plugins) +INSTALL(FILES lib/${ARCH}/libheremaps-engine.so DESTINATION lib) + +# Test Suite +#IF("${BINTYPE}" STREQUAL "eng") +#ENDIF("${BINTYPE}" STREQUAL "eng") diff --git a/aarch64/libheremaps-engine.so.1 b/aarch64/libheremaps-engine.so.1 deleted file mode 120000 index 0fc20c3..0000000 --- a/aarch64/libheremaps-engine.so.1 +++ /dev/null @@ -1 +0,0 @@ -libheremaps-engine.so.1.0.6_6 \ No newline at end of file diff --git a/aarch64/libheremaps-engine.so.1.0.6_6 b/aarch64/libheremaps-engine.so.1.0.6_6 deleted file mode 100755 index eb41c8f..0000000 Binary files a/aarch64/libheremaps-engine.so.1.0.6_6 and /dev/null differ diff --git a/aarch64/libmaps-plugin-here.so b/aarch64/libmaps-plugin-here.so deleted file mode 120000 index 89d69a6..0000000 --- a/aarch64/libmaps-plugin-here.so +++ /dev/null @@ -1 +0,0 @@ -libmaps-plugin-here.so.0 \ No newline at end of file diff --git a/aarch64/libmaps-plugin-here.so.0 b/aarch64/libmaps-plugin-here.so.0 deleted file mode 120000 index f343856..0000000 --- a/aarch64/libmaps-plugin-here.so.0 +++ /dev/null @@ -1 +0,0 @@ -libmaps-plugin-here.so.0.1.6 \ No newline at end of file diff --git a/aarch64/libmaps-plugin-here.so.0.1.6 b/aarch64/libmaps-plugin-here.so.0.1.6 deleted file mode 100755 index f89f98f..0000000 Binary files a/aarch64/libmaps-plugin-here.so.0.1.6 and /dev/null differ diff --git a/arm/libheremaps-engine.so.1 b/arm/libheremaps-engine.so.1 deleted file mode 120000 index 0fc20c3..0000000 --- a/arm/libheremaps-engine.so.1 +++ /dev/null @@ -1 +0,0 @@ -libheremaps-engine.so.1.0.6_6 \ No newline at end of file diff --git a/arm/libheremaps-engine.so.1.0.6_6 b/arm/libheremaps-engine.so.1.0.6_6 deleted file mode 100755 index f25ef47..0000000 Binary files a/arm/libheremaps-engine.so.1.0.6_6 and /dev/null differ diff --git a/arm/libmaps-plugin-here.so b/arm/libmaps-plugin-here.so deleted file mode 120000 index 89d69a6..0000000 --- a/arm/libmaps-plugin-here.so +++ /dev/null @@ -1 +0,0 @@ -libmaps-plugin-here.so.0 \ No newline at end of file diff --git a/arm/libmaps-plugin-here.so.0 b/arm/libmaps-plugin-here.so.0 deleted file mode 120000 index f343856..0000000 --- a/arm/libmaps-plugin-here.so.0 +++ /dev/null @@ -1 +0,0 @@ -libmaps-plugin-here.so.0.1.6 \ No newline at end of file diff --git a/arm/libmaps-plugin-here.so.0.1.6 b/arm/libmaps-plugin-here.so.0.1.6 deleted file mode 100755 index 34228b2..0000000 Binary files a/arm/libmaps-plugin-here.so.0.1.6 and /dev/null differ diff --git a/i586/libheremaps-engine.so.1 b/i586/libheremaps-engine.so.1 deleted file mode 120000 index 0fc20c3..0000000 --- a/i586/libheremaps-engine.so.1 +++ /dev/null @@ -1 +0,0 @@ -libheremaps-engine.so.1.0.6_6 \ No newline at end of file diff --git a/i586/libheremaps-engine.so.1.0.6_6 b/i586/libheremaps-engine.so.1.0.6_6 deleted file mode 100755 index 400a010..0000000 Binary files a/i586/libheremaps-engine.so.1.0.6_6 and /dev/null differ diff --git a/i586/libmaps-plugin-here.so b/i586/libmaps-plugin-here.so deleted file mode 120000 index 89d69a6..0000000 --- a/i586/libmaps-plugin-here.so +++ /dev/null @@ -1 +0,0 @@ -libmaps-plugin-here.so.0 \ No newline at end of file diff --git a/i586/libmaps-plugin-here.so.0 b/i586/libmaps-plugin-here.so.0 deleted file mode 120000 index f343856..0000000 --- a/i586/libmaps-plugin-here.so.0 +++ /dev/null @@ -1 +0,0 @@ -libmaps-plugin-here.so.0.1.6 \ No newline at end of file diff --git a/i586/libmaps-plugin-here.so.0.1.6 b/i586/libmaps-plugin-here.so.0.1.6 deleted file mode 100755 index b2c636f..0000000 Binary files a/i586/libmaps-plugin-here.so.0.1.6 and /dev/null differ diff --git a/inc/engine/base/BaseBufferBase.h b/inc/engine/base/BaseBufferBase.h new file mode 100755 index 0000000..79950de --- /dev/null +++ b/inc/engine/base/BaseBufferBase.h @@ -0,0 +1,56 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef BASE_BUFFER_BASE_H +#define BASE_BUFFER_BASE_H + +#include "common/HereMaps_global.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class BufferBase +{ +public: + BufferBase(void); + virtual ~BufferBase(void); + + int GetCapacity(void) const; + int GetLimit(void) const; + + class _BufferData + { + public: + _BufferData(void); + virtual ~_BufferData(void); + byte* GetArray(void); + + + // Attribute + unsigned long long capacityInByte; + long refCount; + }; // _BufferData + + int _capacity; + int _position; + int _limit; + int _mark; + _BufferData* _pData; + byte* __pArrayStart; +}; // BufferBase + +TIZEN_MAPS_END_NAMESPACE + +#endif /* BASE_BUFFER_BASE_H */ diff --git a/inc/engine/base/BaseByteBuffer.h b/inc/engine/base/BaseByteBuffer.h new file mode 100755 index 0000000..0dd4c99 --- /dev/null +++ b/inc/engine/base/BaseByteBuffer.h @@ -0,0 +1,37 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef BASE_BYTE_BUFFER_H +#define BASE_BYTE_BUFFER_H + +#include "common/HereMaps_global.h" +#include "base/BaseBufferBase.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class ByteBuffer : public BufferBase +{ +public: + ByteBuffer(void); + virtual ~ByteBuffer(void); + unsigned long Construct(const byte* pBuffer, int index, int length, int capacity); + byte* GetPointer(void) const; + +}; // ByteBuffer + +TIZEN_MAPS_END_NAMESPACE + +#endif /* BASE_BYTE_BUFFER_H */ diff --git a/inc/engine/base/BaseObject.h b/inc/engine/base/BaseObject.h new file mode 100755 index 0000000..ba651a1 --- /dev/null +++ b/inc/engine/base/BaseObject.h @@ -0,0 +1,41 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef BASE_OBJECT_H +#define BASE_OBJECT_H + +#include "common/HereMaps_global.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class Object +{ +public: + Object(void); + virtual ~Object(void); + virtual bool Equals(const Object& obj) const; + virtual long GetHashCode(void) const; + +protected: + Object(const Object& obj); + Object& operator =(const Object& rhs); + virtual void Object_Reserved1(void) { } + +}; // Object + +TIZEN_MAPS_END_NAMESPACE + +#endif /* BASE_OBJECT_H */ diff --git a/inc/engine/base/EventDrivenThread.h b/inc/engine/base/EventDrivenThread.h new file mode 100755 index 0000000..05215c1 --- /dev/null +++ b/inc/engine/base/EventDrivenThread.h @@ -0,0 +1,127 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_EVENTDRIVENTHREAD_H +#define HERE_EVENTDRIVENTHREAD_H + +#include +#include +#include + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class EventDrivenThread; + +typedef std::vector FireArg_List; + +class EventDrivenThread : public Object +{ +public: + /** + * This is the default constructor for this class. + * + * @since 2.0 + * + * @remarks After creating an instance of this class, one of the + * Construct() methods must be called explicitly to initialize this instance. + */ + EventDrivenThread(void); + + /** + * This is the destructor for this class. + * + * @since 2.0 + * + */ + virtual ~EventDrivenThread(void); + + result Construct(bool Delegate); + + void Quit(void); + + int Join(void); + + /** + * Sends a user event to the event-driven thread. + * + * @since 2.0 + * + * @final Although this method is virtual, it must not be overridden. + * If overridden, it may not work as expected. + * + * @return An error code + * @param[in] requestId The user-defined event ID + * @param[in] pArgs A pointer to the list of arguments + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_STATE The thread is in an invalid state. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_SYSTEM A system error has occurred. + * + * @see OnUserEventReceivedN() + */ + int SendUserEvent(int requestType, void* pArgs); + + void Fire(void* pArgs); + + virtual void FireImpl( void* pArgs) = 0; + + /** + * Called when the user event is received. + * + * @since 2.0 + * + * @param[in] requestId The user-defined event ID + * @param[in] pArgs A pointer to the list of arguments + * + * @see SendUserEvent() + */ + virtual void OnUserEventReceivedN(int requestId, void* pArgs) = 0; + +private: + bool __constructed; + bool __is_quit; + GSource* __pSource; + GIOChannel* __pChannel; + GMainContext* __pGmainContext; + + int __WorkingThreadNum; + bool __WaitingForJoin; + pthread_cond_t __join_condition; + pthread_mutex_t __join_mutex; + + class ThreadArg + { + public: + int requestType; + void* pArg; + void* ReqInstance; + }; + + FireArg_List FireArgs; + pthread_mutex_t FireArgsLock; + + static void* EventDrivenThreadHandler(void* thread_arg); + static gboolean OnEventReceived(GIOChannel* pChannel, GIOCondition condition, gpointer data); + static gboolean __stopWaitingForJoin(gpointer data); + +}; // EventDrivenThread + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_EVENTDRIVENTHREAD_H */ diff --git a/inc/engine/base/HereObject.h b/inc/engine/base/HereObject.h new file mode 100755 index 0000000..b0928a3 --- /dev/null +++ b/inc/engine/base/HereObject.h @@ -0,0 +1,41 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_OBJECT_H +#define HERE_OBJECT_H + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class HereObject: public Object +{ +public: + HereObject(); + HereObject(void* user_data); + ~HereObject(); + void set_user_data(void* user_data); + void* data(void); + +protected: + void* __user_data; + +}; + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_OBJECT_H */ diff --git a/inc/engine/base/Timer.h b/inc/engine/base/Timer.h new file mode 100755 index 0000000..166fc40 --- /dev/null +++ b/inc/engine/base/Timer.h @@ -0,0 +1,169 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_TIMER_H +#define HERE_TIMER_H + +#include + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class Timer; + +enum TimerStatus +{ + TIMER_STATUS_NOT_ACTIVATED, // This enum value is for internal use only. Using this enum can cause behavioral, security-related, and consistency-related issues in the application. + TIMER_STATUS_ACTIVATED, // This enum value is for internal use only. Using this enum can cause behavioral, security-related, and consistency-related issues in the application. + TIMER_STATUS_CANCELED, // This enum value is for internal use only. Using this enum can cause behavioral, security-related, and consistency-related issues in the application. + TIMER_STATUS_EXPIRED, // This enum value is for internal use only. Using this enum can cause behavioral, security-related, and consistency-related issues in the application. + TIMER_STATUS_ACTIVATED_REPEATABLE, // This enum value is for internal use only. Using this enum can cause behavioral, security-related, and consistency-related issues in the application. +}; + +class ITimerEventListener +{ +public: + /** + * This is the destructor for this class. + * + * @since 2.0 + */ + virtual ~ITimerEventListener(void) {} + + /** + * Called when the timer has expired. + * + * @since 2.0 + * + * @param[in] timer The expired timer + */ + virtual void OnTimerExpired(Timer& timer) = 0; + +}; // ITimerEventListener + +class Timer : public Object +{ +public: + /** + * This is the default constructor for this class. + * + * @since 2.0 + */ + Timer(void); + + + /** + * This is the destructor for this class. + * + * @since 2.0 + */ + virtual ~Timer(void); + + /** + * Initializes this instance of %Timer with the specified listener. + * + * @since 2.0 + * + * @return An error code + * @param[in] listener The event listener + * @exception E_SUCCESS The method is successful. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_SYSTEM A system error has occurred. + */ + int Construct(ITimerEventListener& listener); + + /** + * Starts the timer. + * + * @if OSPCOMPAT + * @brief [Compatibility] + * @endif + * + * @since 2.0 + * + * @if OSPCOMPAT + * @compatibility This method has compatibility issues with Tizen API versions @b prior @b to @b 2.1. @n + * For more information, see @ref CompTimerStartPage "here". + * @endif + * + * @return An error code + * @param[in] timeout The timeout interval in milliseconds + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_ARG The specified input parameter is invalid. + * @exception E_INVALID_STATE The timer cannot start as it is in an invalid state. + * @exception E_SYSTEM A system error has occurred. + * @remarks Once the timer has been started, it cannot be started again until it has expired. + * @see Cancel() + */ + int Start(int timeout); + + /** + * @page CompTimerStartPage Compatibility for Start(int timeout) + * @section CompTimerStartPageIssueSection Issues + * Implementation of this method in Tizen API versions prior to 2.1 has the following issue: @n + * -# The method returns @c E_INVALID_ARG if timeout is equal to zero. + * + * @section CompTimerStartPageSolutionSection Resolutions + * The issue mentioned above is resolved in Tizen API version 2.1, and it is recommended to use Tizen API version 2.1 or above. + * -# In case of zero, %Timer sets the timeout to the best possible minimum interval without returning @c E_INVALID_ARG. + */ + + /** + * Starts the timer. @n + * The timer expires repeatedly until it is cancelled. + * + * @since 2.0 + * + * @return An error code + * @param[in] interval The timeout interval in milliseconds + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_ARG The specified input parameter is invalid. + * @exception E_INVALID_STATE The timer cannot start as it is in an invalid state. + * @exception E_SYSTEM A system error has occurred. + * @remarks To stop the timer expiration or restart the timer, the timer must be cancelled. + * @see Cancel() + */ + int StartAsRepeatable(int interval); + + /** + * Cancels the timer. + * + * @since 2.0 + * + * @return An error code + * @exception E_SUCCESS The method is successful. + * @exception E_SYSTEM A system error has occurred. + * @remarks The started timer can be cancelled when it does not get expired. @n + * If the timer has already expired, this method also returns @c E_SUCCESS which causes the same effect as when cancelled normally. + */ + int Cancel(void); + +private: + Timer(const Timer& rhs); + + Timer& operator =(const Timer& rhs); + +private: + friend class _TimerImpl; + class _TimerImpl * __pTimerImpl; + +}; // Timer + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_TIMER_H */ diff --git a/inc/engine/common/Address.h b/inc/engine/common/Address.h new file mode 100755 index 0000000..0ad3889 --- /dev/null +++ b/inc/engine/common/Address.h @@ -0,0 +1,307 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef ADDRESS_H +#define ADDRESS_H + +#include "HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates a street address. It is used both in geocoding + * requests and in responses received from the server. + * + */ +class EXPORT_API Address +{ +public: + + /** + * This is the default constructor. + */ + Address(); + + /** + * This method is the copy constructor. + * + * @param rRhs A constant reference to an Address object to + * copy. + */ + Address(const Address& rRhs); + + /** + * This method is the destructor. + */ + ~Address(); + + /** + * This is the assignment operator. + * + * @param rRhs A constant reference to an Address object to + * copy. + * + * @return A reference to the given instance of Address whose + * contents now mirror those of the object supplied by the caller. + */ + Address& operator=(const Address& rRhs); + + /** + * This method sets the name of the country. + * + * @param sCountry A constant reference to a string containing the name of + * a country. + */ + void SetCountry(const String& sCountry); + + /** + * This method retrieves the country code. + * + * @return A constant reference to a string containing the country code. + */ + const String& GetCountryCode() const; + + /** + * This method sets the country code. + * + * @param sCountryCode A constant reference to a string containing the + * country code. + */ + void SetCountryCode(const String& sCountryCode); + + /** + * This method retrieves the name of the country. + * + * @return A constant reference to a string containing the name of + * a country. + */ + const String& GetCountry() const; + + /** + * This method sets the name of the county. + * + * @param sCounty A constant reference to a string containing the name of + * a county. + */ + void SetCounty(const String& sCounty); + + /** + * This method retrieves the name of the county. + * + * @return A constant reference to a string containing the name of + * a county. + */ + const String& GetCounty() const; + + /** + * This method sets the address label. + * + * @param sLabel A constant reference to a string containing the label. + */ + void SetLabel(const String& sLabel); + + /** + * This method retrieves the address label. + * + * @return A constant reference to a string containing the label. + */ + const String& GetLabel() const; + + /** + * This method sets the identifier of the state. State corresponds to a state + * in the USA or Bundesland in Germany. + * + * @param sState A constant reference to a string containing the name or the + * abbreviation of the name of the state. + */ + void SetState(const String& sState); + + /** + * This method retrieves the identifier the state. State corresponds to a + * state in the USA or Bundesland in Germany. + * + * @return A constant reference to a string containing the identifier of the + * state. + */ + const String& GetState() const; + + /** + * This method sets the name of the city. + * + * @param sCity A constant reference to a string containing the name of the + * city. + */ + void SetCity(const String& sCity); + + /** + * This method retrieves the name of the city. + * + * @return A constant reference to a string containing the name of the + * city. + */ + const String& GetCity() const; + + /** + * This method sets the name of the district. A district corresponds either to + * an administrative area within a city or a neighborhood, for example "Greenwich + * Village", "Kreuzberg" (in Berlin). + * + * @param sDistrict A constant reference to a string containing the name of the + * district. + */ + void SetDistrict(const String& sDistrict); + + /** + * This method retrieves the name of the district. A district corresponds + * either to an administrative area within a city or a neighborhood, for + * example "Greenwich Village", "Kreuzberg" (in Berlin). + * + * @return A constant reference to a string containing the name of the + * district. + */ + const String& GetDistrict() const; + + /** + * This method sets the street name. + * + * @param sStreet A constant reference to a string containing the name of the + * street. + */ + void SetStreet(const String& sStreet); + + /** + * This method retrieves the street name. + * + * @return A constant reference to a string containing the name of the + * street. + */ + const String& GetStreet() const; + + /** + * This method sets the house number (or house name if appropriate). + * + * @param sHouseNumber A constant reference to a string containing the + * house number (or the house name if appropriate). + */ + void SetHouseNumber(const String& sHouseNumber); + + /** + * This method retrieves the house number (or house name if appropriate). + * + * @return A constant reference to a string containing the + * house number (or the house name if appropriate). + */ + const String& GetHouseNumber() const; + + /** + * This method sets the post code. + * + * @param sPostalCode A constant reference to a string containing the post + * code. + */ + void SetPostalCode(const String& sPostalCode); + + /** + * This method retrieves the post code. + * + * @return A constant reference to a string containing the post + * code. + */ + const String& GetPostalCode() const; + + /** + * This method sets the identifier of the floor (within a building). + * + * @param sFloor A constant reference to a string containing the identifier + * of the floor. + */ + void SetFloor(const String& sFloor); + + /** + * This method retrieves the identifier of the floor (within a building). + * + * @return A constant reference to a string containing the identifier + * of the floor. + */ + const String& GetFloor() const; + + /** + * This method sets the identifier of suite (within a building). + * + * @param sSuite A constant reference to a string containing the identifier + * of the suite. + */ + void SetSuite(const String& sSuite); + + /** + * This method retrieves the identifier of suite (within a building). + * + * @return A constant reference to a string containing the identifier + * of the suite. + */ + const String& GetSuite() const; + + /** + * This method associates an adidtional data item with the given address. + * + * @param sKey A constant reference to a string containing the key + * that identifies the data item (in a map of additional data items). + * + * @param sValue A constant reference to a string containing the value of + * the data item identified by sKey. + */ + void AddAdditionalData(const String& sKey, const String& sValue); + + /** + * This method retrieves the value of an additional address data item on the + * basis of a key provided by the caller. + * + * @param sKey A constant reference to a string containing the key + * that identifies the data item to retrieve. + */ + const String* GetAdditionalDataValue(const String& sKey) const; + + /** + * This method retrieves a value indicating how many additional address data + * items have been associated with the given instance of + * Address. + * + * @return An integer indicating the number of additional data items that + * are associated with the given instance of Address. + */ + size_t GetNumAdditionalDataEntries() const; + + /** + * This method retrieves the key of the additional data item at the index + * specified by the caller. + * + * @param idx An integer value specifying the index of the additional address + * data item whose key is to be retrieved. + * + * @return A constant pointer to a string containing the key + * for an additional address data item. + */ + const String* GetAdditionalDataKey(size_t idx) const; + +private: + class AddressImpl; + AddressImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/common/ApplicationContext.h b/inc/engine/common/ApplicationContext.h new file mode 100755 index 0000000..d19dd95 --- /dev/null +++ b/inc/engine/common/ApplicationContext.h @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef APPLICATIONCONTEXT_H +#define APPLICATIONCONTEXT_H + +#include "common/HereMaps_global.h" + +#include + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates the credentials required to use the Geocoding API. + * The credentials consists of the app code and app id. + * + * The class is a singleton. + */ +class EXPORT_API ApplicationContext +{ +public: + /** + * This is the destructor. + */ + ~ApplicationContext(); + + /** + * This method sets the preferred language, using a two-letter BCP-47 code + * supplied by the caller. + * + * @param sLanguage A const reference to a string containing a two-letter + * code identifying the preferred map language. + */ + void SetPreferredLanguage(const String& sLanguage); + + /** + * This method retrieves a string containing a BCP-47 code that indicates + * the preferred language. + * + * @return A constant reference to a string containing a two-letter BCP-47 + * code indicating the preferred language. + */ + const String& GetPreferredLanguage() const; + + /** + * This method retrieves the app code. + * + * @return A constant reference to a string containing the app code. + */ + const String& GetAppCode() const; + + /** + * This method retrieves the app id. + * + * @return A constant reference to a string containing the app id. + */ + const String& GetAppId() const; + + /** + * This is a static method which returns the singleton's instance. + * + * @return A static reference to the instance of this singleton class. + */ + static ApplicationContext& GetInstance(); + + /** + * This method initialises the singleton object. + * + * @param sAppCode A constant reference to a string containing the app code. + * + * @param sAppId A constant reference to a string containing the app id. + * + * @return A Boolean indicating the result of initialization, + * true on success, false on failure. Note + * that if the object already exists and has been initialized, + * further attempts to call this methods fail (the return value is + * false. + */ + bool Initialize(const String& sAppCode, const String& sAppId); + + /** + * This method queries initialisation status. + * + * @return A Boolean indicating the status of initialization, + * true if the object is initialized, otherwise + * false. + */ + bool IsInitialized() const; + + /** + * This method sets a flag to indicate whether a high-resolution map is to be used. + * + * @param haveHighResolution A Boolean, true to indicate that a + * high-resolution map is to be used, otherwise false. + */ + void SetHighResolutionMap(bool haveHighResolution); + + /** + * This method retrieves a Boolean value indicating whether a high-resolution map is used. + * + * @return A Boolean, true to indicate that a + * high-resolution map is (to be) used, otherwise false. + */ + bool HaveHighResolutionMap() const; + +private: + /** + * This method is a private constructor for the singleton. + */ + ApplicationContext(); + + HERE_MAPS_NO_COPY_NO_ASSIGN(ApplicationContext); + + class ApplicationContextImpl; + ApplicationContextImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // APPLICATIONCONTEXT_H diff --git a/inc/engine/common/BaseQuery.h b/inc/engine/common/BaseQuery.h new file mode 100755 index 0000000..3123bd7 --- /dev/null +++ b/inc/engine/common/BaseQuery.h @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef BASEQUERY_H +#define BASEQUERY_H + +#include "common/HereMaps_global.h" +#include "common/QueryListener.h" +#include "common/RestItemHandle.h" +#ifdef TIZEN_MIGRATION +#include "base/HereObject.h" +#else +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class BaseReply; +class QueryListener; +class GeoCoordinates; +class GeoBoundingBox; + +/** + * This class is the base class representing any rest based query class + * in this library + */ +class BaseQuery +{ +public: + typedef int RequestId; + + /** + * This is the destructor. + */ + virtual ~BaseQuery(); + + /** + * This method creates the query URI. It is to be implemented be derived classes. + * + * @return URI string. + */ + virtual String CreateUri() const = 0; + +protected: + /** + * This constant represents an illegal URL (an empty string). + */ + static const String ILLEGAL_URL; + + /** + * This is the default constructor. + */ + BaseQuery(); + + /** + * This method appends authentication credentials to the query. The + * authentication credentials are app_id and + * app_code. The method obtains the credentials set at + * initialization and copies them to the destination provided by the caller, + * following the standard query-parameter format: + * app_id=app_id_value&app_code=app_code_value + * + * @param sDst A reference to a string to receive the authentication + * credentials. + * + * @return true if the destination string has been set with the + * authentication credentials, false if the the + * ApplicationContext is uninitialized. + */ + bool AppendCredentials(String& sDst) const; + +#ifndef TIZEN_MIGRATION + /** + * This method retrieves the user data associated with the query. + * + * @return A pointer to an object containing the user data. + */ + Tizen::Maps::HereObject* GetUserData() const; +#endif + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(BaseQuery); + + class BaseQueryImpl; + BaseQueryImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // BASEQUERY_H diff --git a/inc/engine/common/BaseReply.h b/inc/engine/common/BaseReply.h new file mode 100755 index 0000000..be04a4e --- /dev/null +++ b/inc/engine/common/BaseReply.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef BASEREPLY_H +#define BASEREPLY_H + +#include "common/HereMaps_global.h" +#include "common/QueryListener.h" + +#ifdef TIZEN_MIGRATION +#include +#else +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class ErrorBase; + +/** + * This class is the base class that encapsulates a reply to a REST-based query. + * + * @ingroup TODO + */ +class EXPORT_API BaseReply +{ +public: + /** + * This method is a destructor. + */ + virtual ~BaseReply(); + + /** + * This method retrieves error information associated with the query + * response received from the server. + * + * @return A constant pointer to an object containing the error details. + */ + const ErrorBase* GetError() const; + + /** + * This method sets (saves) a pointer to user data associated with the + * reply to the query. + * + * @param pUserData A pointer to user data. + */ + void SetUserData(Tizen::Maps::HereObject* pUserData); + + /** + * This method retrieves the pointer the user data. + * + * @return A pointer to the user data. + */ + Tizen::Maps::HereObject* GetUserData() const; + +protected: + /** + * This method is the default constructor. + */ + BaseReply(); + + /** + * This method appends information about an error associated with the server + * response. + * + * @param rError A reference to an object containing the error details. + */ + void Append(ErrorBase& rError); + +private: + virtual bool OnDataReceived(const unsigned char* pBuffer, size_t uSize) = 0; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(BaseReply); + friend class RestItem; + + class BaseReplyImpl; + BaseReplyImpl* m_pImpl; +}; + +typedef std::tr1::shared_ptr BaseReplyPtr; + +HERE_MAPS_END_NAMESPACE + +#endif // BASEREPLY_H diff --git a/inc/engine/common/CommunicationError.h b/inc/engine/common/CommunicationError.h new file mode 100755 index 0000000..7d7c163 --- /dev/null +++ b/inc/engine/common/CommunicationError.h @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef COMMUNICATIONERROR_H +#define COMMUNICATIONERROR_H + +#include "common/HereMaps_global.h" +#include "common/ErrorBase.h" + +#ifndef TIZEN_MIGRATION +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates information about an error condition that may arise + * in network communications between the client and the server. + */ +class EXPORT_API CommunicationError : public ErrorBase +{ +public: + /** + * This enumeration defines error code identifiers. + */ + enum ErrorCode + { + CE_HttpError, ///< Indicates an HTTP error. + CE_NetworkError, ///< Indicates a network error. + CE_RestEngineError, ///< Indicates a REST engine error. + CE_MaxRequests ///< Indicates that the maximum number of requests + /// has been reached. + }; + + /** + * This typedef defines a HTTP status code as a type. + */ +#ifdef TIZEN_MIGRATION + typedef long HttpStatusCode; +#else + typedef Tizen::Net::Http::NetHttpStatusCode HttpStatusCode; +#endif + + /** + * This method is a constructor. + * + * @param aErrorCode A value representing an error code. + */ + CommunicationError(ErrorCode aErrorCode); + + /** + * This method is a constructor. + * + * @param aHttpStatusCode A value representing an HTTP status code as + * defined on http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html. + */ + CommunicationError(HttpStatusCode aHttpStatusCode); + + /** + * This method is a (virtual) destructor. + * + */ + virtual ~CommunicationError(); + + /** + * This method retrieves an error code. + * + * @return A value representing an error code. + */ + ErrorCode GetErrorCode() const; + + /** + * This method retrieves a string representation of the given instance of + * CommunicationError. + * + * @return A string representation of the given instance of + * CommunicationError. + */ + virtual String ToString() const; + + /** + * This method sets an HTTP status code. + * + * @param aHttpStatusCode A value representing an HTTP status code as + * defined on http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html. + */ + void SetHttpStatusCode(HttpStatusCode aHttpStatusCode); + +#ifdef TIZEN_MIGRATION + /** + * This method retrieves the HTTP status code associated with the given + * instance of the class. + * + * @return aHttpStatusCode A value representing an HTTP status code as + * defined on http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html. + */ + const HttpStatusCode GetHttpStatusCode(); +#endif + + /** + * This method associates a text string describing an error with the given + * instance of the class. + * + * @param sDesc A constant reference to a string containing the error + * description. + */ + void SetErrorDescription(const String& sDesc); + + /** + * This method retrieves the error description associated with the given + * instance of the class. + * + * @return A constant reference to a string containing the error + * description. + */ + const String& GetErrorDescription() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(CommunicationError); + + class CommunicationErrorImpl; + CommunicationErrorImpl* m_pImpl; + +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/common/ErrorBase.h b/inc/engine/common/ErrorBase.h new file mode 100755 index 0000000..abcff3d --- /dev/null +++ b/inc/engine/common/ErrorBase.h @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef ERRORBASE_H +#define ERRORBASE_H + +#include "common/HereMaps_global.h" + +#include + +HERE_MAPS_BEGIN_NAMESPACE + +class BaseReply; +class GeoCoderReplyParser; + +/** + * This class is the base class for classes that encapsulate error conditions, + * for example CommunicationError. + */ +class EXPORT_API ErrorBase +{ +public: + /** + * This enumeration defines identifiers for error categories. + */ + enum ErrorCategory + { + EC_None = 0, ///< Indicates success. + EC_CommunicationsError, ///< Indicates a communications error. + EC_ParserError, ///< Indicates a parser error. + EC_RouterError, ///< Indicates a router error. + EC_TileMapError, ///< Indicates a tile map error. + EC_FinderError ///< Indicates a finder/places error. + }; + + /** + * This method is the (virtual) destructor. + */ + virtual ~ErrorBase(); + + /** + * This method produces a string representation of the given instance of + * the class. The method must be implemented by derived classes. + * + * @return A string containing a text representation of the given instance + * of the class. + */ + virtual String ToString() const = 0; + + /** + * This method prints the text representation of the given instance of the + * class to the stream identified by the caller. + * + * \sa ToString + * + * @param rSink A reference to the steam to which to output the (text + * representeation) of the given instance. + */ + void Print(std::ostream& rSink) const; + + /** + * This method retrieves a value representing the error category assigned to + * the given instance of the class. + * + * @return A value representing the error category assigned to + * the given instance of the class. + */ + ErrorCategory GetErrorCategory() const; + +protected: + /** + * This method is the default constructor. + */ + ErrorBase(); + + /** + * This method sets the error category for the given instance of the class. + * + * @param aErrorCategory A value representing the error category to be + * assigned to the given instance of the class. + */ + void SetErrorCategory(ErrorCategory aErrorCategory); + +private: + // HERE_MAPS_NO_COPY_NO_ASSIGN(ErrorBase); + + friend class BaseReply; + friend class GeoCoderReplyParser; + friend class GeoRouterReplyParser; + friend class JsonParser; + friend class TestErrorBase; + + + /* + * \brief note ownership of parameter is transferred + * \param rError error that is appended to linked list of error - must be allocated on heap + */ + void Append(ErrorBase& rError); + + class ErrorBaseImpl; + ErrorBaseImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/common/GeoBoundingArea.h b/inc/engine/common/GeoBoundingArea.h new file mode 100755 index 0000000..86a9b89 --- /dev/null +++ b/inc/engine/common/GeoBoundingArea.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOBOUNDINGAREA_H +#define GEOBOUNDINGAREA_H + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoCoordinates; + +/** + * This class encapsulates a bounding area defined in terms of the geographic + * coordinates of its top left and bottom right corners. + * + * The virtual methods of the class must be implemented by derived classes. + */ +class EXPORT_API GeoBoundingArea +{ +public: + /** + * This enumeration defines identifiers for types of bounding areas. + */ + enum AreaType + { + AT_BoxType, ///< Indicates that the bounding area is a box. + AT_CircleType ///< Indicates that the bounding area is a circle. + }; + + /** + * This method is a (virtual) destructor. + */ + virtual ~GeoBoundingArea() + { + } + + /** + * This method retrieves a value indicating what type of area the given + * object represents. + * + * @return A value indicating the area type. + */ + virtual AreaType GetType() const = 0; + + /** + * This method checks if the given bounding area contains the location + * whose coordinates are provided by the caller. + * + * @param rCoordinate An object containing the geographic coordinates of the + * location to check. + * + * @return true if the location lies within the given bounding + * box, otherwise false. + */ + virtual bool Contains(const GeoCoordinates& rCoordinate) const = 0; +}; + +HERE_MAPS_END_NAMESPACE + +#endif /* GEOBOUNDINGAREA_H */ diff --git a/inc/engine/common/GeoBoundingBox.h b/inc/engine/common/GeoBoundingBox.h new file mode 100755 index 0000000..d21b1bb --- /dev/null +++ b/inc/engine/common/GeoBoundingBox.h @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOBOUNDINGBOX_H +#define GEOBOUNDINGBOX_H + +#include + +#include "common/HereMaps_global.h" +#include "common/GeoBoundingArea.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoCoordinates; + +class GeoBoundingBox; + +/** + * This typedef defines a vector of instances of GeoBoundingBox as + * a type. + */ +typedef std::vector GeoBoundingBoxList; + +/** + * This class encapsulates a bounding box defined in terms of the geographic + * coordinates of its top-left and bottom-right corners. + */ +class EXPORT_API GeoBoundingBox : public GeoBoundingArea +{ +public: + /** + * This method is the default constructor. + */ + GeoBoundingBox(); + + /** + * This method is a copy constructor. + * + * @param rRhs A constant reference to an object whose contents are to be + * used to populate the new instance of this class. + */ + GeoBoundingBox(const GeoBoundingBox& rRhs); + + /** + * This method is a constructor that creates a new instance, using the + * coordinates of the top-left and bottom=right corners provided by the + * caller. + * + * @param rTopLeft A constant reference to an object providing the + * geographic coordinates of the top-left corner of the given + * bounding box. + * + * @param rBottomRight A constant reference to an object providing the + * geographic coordinates of the bottom-right corner of the given + * bounding box. + */ + GeoBoundingBox(const GeoCoordinates& rTopLeft, const GeoCoordinates& rBottomRight); + + /** + * This method constructs a rectangle from the coordinates of its boundaries. + * + * If west is larger than east, then the new + * rectangle lies on the opposite side of the globe, i.e. +180 meridian. + * + * @param west A value indicating the minimum longitude. + * @param east A value indicating the maximum longitude. + * @param south A value indicating the minimum latitude. + * @param north A value indicating the the maximum latitude. + */ + GeoBoundingBox( double west, double east, double south, double north ); + + /** + * This method is the destructor. + */ + ~GeoBoundingBox(); + + /** + * This is the assignment operator. + * + * @param rRhs A constant reference to an object whose contents + * are to be copied to the given instance of the class. + * + * @return A reference to the given instance of the class after the + * assignment. + */ + GeoBoundingBox& operator=(const GeoBoundingBox& rRhs); + + /** + * This method sets the coordinates of the top-left corner of the given + * instance of GeoBoundingBox. + * + * @param A constant reference to an object containing the new geographic + * coordinates of the top-left corner of the bounding box. + */ + void SetTopLeft(const GeoCoordinates& rCoord); + + /** + * This method retrieves the coordinates of the top-left corner of the given + * instance of GeoBoundingBox. + * + * @return A constant reference to an object containing the geographic + * coordinates of the top-left corner of the bounding box. + */ + const GeoCoordinates& GetTopLeft() const; + + /** + * This method sets the coordinates of the bottom-right corner of the given + * instance of GeoBoundingBox. + * + * @param A constant reference to an object containing the new geographic + * coordinates of the bottom-right corner of the bounding box. + */ + void SetBottomRight(const GeoCoordinates& rCoord); + + /** + * This method retrieves the coordinates of the bottom-right corner of the + * given instance of GeoBoundingBox. + * + * @return A constant reference to an object containing the geographic + * coordinates of the bottom-right corner of the bounding box. + */ + const GeoCoordinates& GetBottomRight() const; + + /** + * This method calculates a bounding box that represents the union of the + * given GeoBoundingBox and the instance provided by the + * caller. + * + * @param A constant reference to an object for which to calculate a union + * with the given instance of GeoBoundingBox. + * + * @return An object representing the union of two instances of + * GeoBoundingBox. + */ + GeoBoundingBox Union(const GeoBoundingBox& rOther); + + /** + * This method retrieves a value indicating the area type represented by the + * given object. + * + * @return A value indicating the area type. + */ + AreaType GetType() const; + + /** + * This method checks if the given bounding box contains the location + * provided by the caller. + * + * @param rCoordinate An object containing the geographic coordinates of the + * location to check. + * + * @return true if the location lies within the given bounding + * box, otherwise false. + */ + bool Contains(const GeoCoordinates& rCoordinate) const; + + /** + * This method checks if the coordinates of the given instance of + * GeoBoundingBox are valid. + * + * @return Value true if the coordinates of the top-left and + * bottom-right corners are valid, otherwise false. + */ + bool IsValid() const; + +private: + class GeoBoundingBoxImpl; + GeoBoundingBoxImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/common/GeoBoundingCircle.h b/inc/engine/common/GeoBoundingCircle.h new file mode 100755 index 0000000..a60146c --- /dev/null +++ b/inc/engine/common/GeoBoundingCircle.h @@ -0,0 +1,138 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOBOUNDINGCIRCLE_H +#define GEOBOUNDINGCIRCLE_H + +#include "common/HereMaps_global.h" +#include "common/GeoBoundingArea.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoCoordinates; + +/** + * This class encapsulates a bounding circle defined in terms of the geographic + * coordinates of its center and a radius. + */ +class EXPORT_API GeoBoundingCircle : public GeoBoundingArea +{ +public: + /** + * This method is the default constructor. + */ + GeoBoundingCircle(); + + /** + * This method is a copy constructor. + * + * @param rRhs A constant reference to an object whose contents are to be + * used to set the properties of a new instance of this class. + */ + GeoBoundingCircle(const GeoBoundingCircle& rRhs); + + /** + * This method is a constructor that creates a new instance, using the + * coordinates of the center of the circle and the length of its radius. + * + * @param rCenter A constant reference to an object providing the + * geographic coordinates of the center of the given + * bounding circle. + * + * @param rRadius A value providing the length of the radius in meters. + */ + GeoBoundingCircle(const GeoCoordinates& rCenter, double rRadius); + + /** + * This method is the destructor. + */ + ~GeoBoundingCircle(); + + /** + * This is the assignment operator. + * + * @param rRhs A constant reference to the right-hand object whose contents + * are to be copied to the given instance of the class. + * + * @return A reference to the given instance of the class after the + * assignment. + */ + GeoBoundingCircle& operator = (const GeoBoundingCircle& rRhs); + + /** + * This method sets the coordinates of the center of the given + * instance of GeoBoundingCircle. + * + * @param A constant reference to an object containing the new geographic + * coordinates of the center of the bounding circle. + */ + void SetCenter(const GeoCoordinates& rCenter); + + /** + * This method retrieves the coordinates of the center of the given + * instance of GeoBoundingCircle. + * + * @return A constant reference to an object containing the geographic + * coordinates of the center of the bounding circle. + */ + const GeoCoordinates& GetCenter() const; + + /** + * This method sets the radius of the given + * instance of GeoBoundingCircle. + * + * @param rRadius A value providing the length of the radius in meters. + */ + void SetRadius(double aRadius); + + /** + * This method retrieves the radius of the given + * instance of GeoBoundingCircle. + * + * @return A value providing the length of the radius in meters. + */ + double GetRadius() const; + + + /** + * This method retrieves a value indicating the area type applicable to the + * given object. + * + * @return A value indicating the area type. + */ + AreaType GetType() const; + + /** + * This method checks if the given bounding circle contains the location + * defined by the object provided by the caller. + * + * @param rCoordinate An object containing the geographic coordinates of the + * location to check. + * + * @return true if the location lies within the given bounding + * box, otherwise false. + */ + bool Contains(const GeoCoordinates& rCoordinate) const; + +private: + class GeoBoundingCircleImpl; + GeoBoundingCircleImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif /* GEOBOUNDINGCIRCLE_H */ diff --git a/inc/engine/common/GeoCoordinates.h b/inc/engine/common/GeoCoordinates.h new file mode 100755 index 0000000..e8f6a30 --- /dev/null +++ b/inc/engine/common/GeoCoordinates.h @@ -0,0 +1,169 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOCOORDINATES_H +#define GEOCOORDINATES_H + +#include + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoCoordinates; +typedef std::vector GeoCoordinateList; + +/** + * This class represents a geographic location defined in terms of WGS84 + * coordinates. The coordinates (latitude, longitude and altitude) are stored + * as doubles. + */ +class EXPORT_API GeoCoordinates +{ +public: + static const double LATITUDE_RANGE; + static const double LONGITUDE_RANGE; + + /** + * This method is the default constructor. + */ + GeoCoordinates(); + + /** + * This method is the copy constructor. + * + * @param rRhs A constant reference to an instance of + * GeoCoordinates whose contents are to be copied into + * the object being created. + */ + GeoCoordinates(const GeoCoordinates& rRhs); + + /** + * This method is a constructor. + * + * @param fLatitude A value specifying WGS84 latitude in degrees. + * + * @param fLongitude A value specifying WGS84 longitude in degrees. + * + * @param fAltitude A value specifying the altitude in meters, + * as height above the WGS84 geoid; optional, the default + * is 0. + */ + GeoCoordinates(double fLatitude, double fLongitude, double fAltitude = 0.); + + /** + * This method is the destructor. + */ + ~GeoCoordinates(); + + /** + * This is the assignment operator. + * + * @param rRhs A constant reference to an instance of + * GeoCoordinates whose contents are to be copied into + * the given instance. + */ + GeoCoordinates& operator=(const GeoCoordinates& rRhs); + + /** + * This method sets the value of longitude. + * + * @param fValue A value specifying WGS84 longitude in degrees. + */ + void SetLongitude(double fValue); + + /** + * This method retrieves the value of longitude. + * + * @return A value specifying WGS84 longitude in degrees. + */ + double GetLongitude() const; + + /** + * This method sets the value of latitude. + * + * @param fValue A value specifying WGS84 latitude in degrees. + */ + void SetLatitude(double fValue); + + /** + * This method retrieves the value of latitude. + * + * @return A value specifying WGS84 latitude in degrees. + */ + double GetLatitude() const; + + /** + * This method sets the value of altitude. + * + * @param fValue A value representing altitude as height above + * the WGS84 geoid in meters. + */ + void SetAltitude(double fValue); + + /** + * This method retrieves the value of altitude. + * + * @return A value representing altitude as height above + * the WGS84 geoid in meters. + */ + double GetAltitude() const; + + /** + * This method checks if the given object is valid. + * + * The object is valid if the latitude and longitude have been set, + * latitude is in the range [-85.015113..85.015113] (degrees) and longitude is + * in the range [-180..180] (degrees). + * + * @return true if the object is valid, otherwise + * false. + */ + bool IsValid() const; + + /** + * This operator checks if the given object is identical to the right-hand + * object. + * + * @param other A constant reference to an object which is to be compared to + * the given instance. + * + * @return true if the two objects are identical, otherwise + * false. + */ + bool operator == (const GeoCoordinates& other) const; + + /** + * This operator checks if the given object differs (is not equal to) the + * right-hand object. + * + * @param other A constant reference to an object which is to be compared to + * the given instance. + * + * @return true if the two objects are different, otherwise + * false. + */ + bool operator != (const GeoCoordinates& other) const; + +private: + class GeoCoordinatesImpl; + GeoCoordinatesImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/common/GeoLocation.h b/inc/engine/common/GeoLocation.h new file mode 100755 index 0000000..0f26c6f --- /dev/null +++ b/inc/engine/common/GeoLocation.h @@ -0,0 +1,219 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef LOCATION_H +#define LOCATION_H + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class Address; +class GeoCoordinates; +class GeoBoundingBox; + +/** + * This class represents the standard set of basic location information. + * + * This includes the address, coordinates and map view. + * + */ +class EXPORT_API GeoLocation +{ +public: + /** + * This enumeration defines identifiers for location types. + */ + enum LocationType + { + LT_Unknown = -1, ///< Indicates an unknown location type. + LT_Point, ///< Indicates that the location is a point. + LT_Area, ///< Indicates that the location is an area. + LT_Line ///< Indicates that the location is a line. + }; + + /** + * This method is the default constructor. + */ + GeoLocation(); + + /** + * This method is the copy constructor. + * + * @param rRhs A constant reference to an instance of + * GeoLocation whose contents are to be copied into + * the object being created. + */ + GeoLocation(const GeoLocation& rRhs); + + /** + * This method is the destructor. + */ + ~GeoLocation(); + + /** + * This is the assignment operator. + * + * @param rRhs A constant reference to an instance of + * GeoLocation whose contents are to be copied into + * the given instance. + */ + GeoLocation& operator=(const GeoLocation& rRhs); + + /** + * This method sets the address of the location. + * + * @param rAddress A constant reference to an object containing an address. + */ + void SetAddress(const Address& rAddress); + + /** + * This method retrieves the address of the location. + * + * @return A constant reference to an object containing an address. + */ + const Address& GetAddress() const; + + /** + * This method sets the label for the location. + * + * @param sLabel A constant reference to an object containing the value of + * the label. + */ + void SetLabel(const String& sLabel); + + /** + * This method retrieves the label for the location. + * + * @return A constant reference to an object containing the value of + * the label. + */ + const String& GetLabel() const; + + /** + * This method sets the display position of the location. The display + * position contains the coordinates at which to place a marker indicating + * the given location on the map. + * + * @param rCoord A constant reference to an object containing the geographic + * coordinates of the display position. + */ + void SetDisplayPosition(const GeoCoordinates& rCoord); + + /** + * This method retrieves the display position of the location. The display + * position contains the coordinates at which to place a marker indicating + * the given location on the map. + * + * @return A constant reference to an object containing the geographic + * coordinates of the display position. + */ + const GeoCoordinates& GetDisplayPosition() const; + + /** + * This method appends the navigation position. A navigation position + * contains the coordinates of a potential route waypoint. It is used for + * routes that pass through the given location. + * + * @param rCoord A constant reference to an object containing the geographic + * coordinates of the navigation position. + */ + void AppendNavigationPosition(const GeoCoordinates& rCoord); + + /** + * This method retrieves the number of navigation positions that have been set. + * + * @return An integer indicating the number of navigation positions. + */ + size_t GetNumNavigationPositions() const; + + /** + * This method retrieves the navigation position from the index specified by + * the caller. A navigation position contains the coordinates of a potential + * route waypoint. It is used for routes that pass through the given + * location. + * + * @param idx A value specifying the index into an array of navigation + * positions. + * + * @return A constant pointer to an object containing the geographic + * coordinates of the display position. + */ + const GeoCoordinates* GetNavigationPosition(size_t idx) const; + + /** + * This method sets the map view of the location. + * + * @param rBbox A constant reference to an object that defines the map view + * as a bounding box. + */ + void SetMapView(const GeoBoundingBox& rBbox); + + /** + * This method retrieves the map view of the location. + * + * @return A constant reference to an object that defines the map view + * as a bounding box. + */ + const GeoBoundingBox& GetMapView() const; + + /** + * This method sets the id of the location. + * + * @param sLocationId A constant reference to a string containing the + * location id. + */ + void SetLocationId(const String& sLocationId); + + /** + * This method retrieves the id of the location. + * + * @return A constant reference to a string containing the + * location id. + */ + const String& GetLocationId() const; + + /** + * This method sets the location type. + * + * @param aType A numeric value indicating the location type. + */ + void SetLocationType(LocationType aType); + + /** + * This method sets the location type. + * + * @param sType A constant reference to string identifying the location + * type. The supported values are "area", "point", and "line". + */ + void SetLocationType(const String& sType); + + /** + * This method retrieves the location type. + * + * @return A numeric value indicating the location type. + */ + LocationType GetLocationType() const; + +private: + class GeoLocationImpl; + GeoLocationImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/common/HereConfig.h b/inc/engine/common/HereConfig.h new file mode 100755 index 0000000..840de74 --- /dev/null +++ b/inc/engine/common/HereConfig.h @@ -0,0 +1,41 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_CONFIG_H +#define HERE_CONFIG_H + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class EXPORT_API HereConfig +{ +public: + HereConfig(); + ~HereConfig(); + static void SetProxyAddress(char* address); + static char* GetProxyAddress(void); + static void Shutdown(void); + +//private: + static char* __proxy_address; +}; + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_CONFIG_H */ + diff --git a/inc/engine/common/HereMaps_global.h b/inc/engine/common/HereMaps_global.h new file mode 100755 index 0000000..8c5f6af --- /dev/null +++ b/inc/engine/common/HereMaps_global.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef HEREMAPS_GLOBAL_H +#define HEREMAPS_GLOBAL_H + +#ifndef TIZEN_MIGRATION // Migration for Tizen 2.4 +#define TIZEN_MIGRATION +#endif + +#ifndef TIZEN_CUSTOMIZATION +#define TIZEN_CUSTOMIZATION +#endif + + + +#ifdef TIZEN_MIGRATION +#include + +typedef unsigned long result; +typedef std::string String; +typedef std::string Uri; +typedef std::wstring WString; + +typedef unsigned char byte; +#ifndef null +#define null 0 +#endif // null +#endif + + +/* + * Note: DEBUG variable should be set from the outside. + * Currently done in CMAKE file + */ + +#define HERE_MAPS_BEGIN_NAMESPACE namespace Here { namespace Maps { +#define HERE_MAPS_END_NAMESPACE }} +#define HERE_MAPS_NAMESPACE_PREFIX Here::Maps + +#define TIZEN_MAPS_BEGIN_NAMESPACE namespace Tizen { namespace Maps { +#define TIZEN_MAPS_END_NAMESPACE }} +#define TIZEN_MAPS_NAMESPACE_PREFIX Tizen::Maps + +#include +#include + +//logging macro prototypes +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "HERE_PLUGIN" + +#define MAPS_LOGD(fmt,args...) LOGD(fmt, ##args) +#define MAPS_LOGW(fmt,args...) LOGW(fmt, ##args) +#define MAPS_LOGI(fmt,args...) LOGI(fmt, ##args) +#define MAPS_LOGE(fmt,args...) LOGE(fmt, ##args) +#define MAPS_SECLOG(fmt,args...) SECURE_LOGD(fmt, ##args) + +#define HERE_MAPS_LOG_DBG_INFO(fmt,args...) LOGD(fmt, ##args); +#define HERE_MAPS_LOG_ERROR(fmt,args...) LOGE(fmt, ##args); +#define HERE_MAPS_LOG_WARNING(fmt,args...) LOGW(fmt, ##args); + +#define HERE_MAPS_RETURN_RESULT(cond,ret,fmt,args...)\ + if (!cond) {\ + LOGE(fmt, ##args);\ + return ret;\ + } + +#define HERE_MAPS_TRY_CATCH(cond,catch,fmt,args...)\ + if (!cond) {\ + LOGE(fmt, ##args);\ + catch;\ + goto CATCH;\ + } + +// Error severities +#define E_SUCCESS 0 +#define E_FAILURE -1 +#define E_SYSTEM -2 +#define E_INVALID_STATE -3 +#define E_OUT_OF_MEMORY -4 + +#ifndef INFINITE +#define INFINITE 0xFFFFFFFF +#endif // INFINITE + +//assertions +#include +#if DEBUG +#define HERE_MAPS_ASSERT(x) assert(x); +#else +#define HERE_MAPS_ASSERT(x) +#endif + +typedef unsigned char Byte; +typedef unsigned int UInt; + + + +#define HERE_MAPS_NO_COPY_NO_ASSIGN(ClassName) \ + private: \ + ClassName(const ClassName&); \ + ClassName& operator=(const ClassName&) + + +HERE_MAPS_BEGIN_NAMESPACE +extern void Stopwatch_Start(int aIndex); +extern void Stopwatch_Stop(int aIndex); +extern void Stopwatch_Show(int aIndex); +extern void Stopwatch_Reset(int aIndex); +HERE_MAPS_END_NAMESPACE + +#endif // HEREMAPS_GLOBAL_H diff --git a/inc/engine/common/Mutex.h b/inc/engine/common/Mutex.h new file mode 100755 index 0000000..1cc5375 --- /dev/null +++ b/inc/engine/common/Mutex.h @@ -0,0 +1,151 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file FBaseRtMutex.h + * @brief This is the header file for the %Mutex class. + * + * This header file contains the declarations of the %Mutex class. + */ + +#ifndef _TIZEN_MAPS_MUTEX_H_ +#define _TIZEN_MAPS_MUTEX_H_ + + +#include "HereMaps_global.h" +#include "base/BaseObject.h" + + +TIZEN_MAPS_BEGIN_NAMESPACE + + +class Mutex + : public Tizen::Maps::Object +{ +public: + /** + * This is the default constructor for this class. + * + * @since 2.0 + * @remarks After creating an instance of this class, you must explicitly call one of + * the Create() methods to initialize the instance. + */ + Mutex(void); + + /** + * This is the destructor for this class. + * + * @since 2.0 + */ + virtual ~Mutex(void); + + /** + * Creates an unnamed Mutex. + * + * @since 2.0 + * @return An error code + * @exception E_SUCCESS The method was successful. + * @exception E_SYSTEM An unknown operating system error occurred. + */ + result Create(void); + + /** + * Creates a non-recursive mutex. + * + * @since 2.0 + * @return An error code + * @exception E_SUCCESS The method was successful. + * @exception E_SYSTEM An unknown operating system error occurred. + */ + result CreateNonRecursiveMutex(void); + + /** + * Creates a named Mutex. @n + * If there is already a Mutex with the specified name, this creates a Mutex which references that particular Mutex. + * + * @since 2.0 + * @return An error code + * @param[in] name The name of the Mutex + * @exception E_SUCCESS The method was successful. + * @exception E_SYSTEM An unknown operating system error occurred. + */ + result Create(const String& name); + + /** + * Acquires the Mutex if it is not acquired. @n + * If the Mutex is already acquired by another thread, + * the current thread is blocked until the Mutex is released. + * + * @since 2.0 + * @return An error code + * @param[in] timeout The period during which the thread tries to acquire the mutex + * @exception E_SUCCESS The method was successful. + * @exception E_TIMEOUT The operation could not be completed within the specified time period. @n + * @exception E_SYSTEM An unknown operating system error occurred. @n + * Failed to acquire the Mutex because an OS failure occurred. + */ + result Acquire(long timeout); + + /** + * Releases the Mutex. + * + * @since 2.0 + * @return An error code + * @exception E_SUCCESS The method was successful. + * @exception E_SYSTEM An unknown operating system error occurred. @n + * Failed to acquire the Mutex because an OS failure occurred. + */ + result Release(void); + + /** + * Acquires the Mutex if it is not acquired. @n + * If the Mutex is already acquired by another thread, + * the current thread is blocked until the Mutex is released. + * + * @since 2.0 + * @return An error code + * @exception E_SUCCESS The method was successful. + * @exception E_SYSTEM An unknown operating system error occurred. @n + * Failed to acquire the Mutex because an OS failure occurred. + */ + result Acquire(void); + + /** + * Acquires the mutex if it is not acquired. @n + * If the mutex is already acquired by another thread, E_OBJECT_LOCKED is returned. + * + * @since 2.0 + * + * @return An error code + * @exception E_SUCCESS The method is successful. + * @exception E_OBJECT_LOCKED The mutex is already locked. + * @exception E_INVALID_STATE The mutex has not been initialized as yet. + * @exception E_SYSTEM A system error has occurred. + */ + result TryToAcquire(void); + +private: + pthread_mutex_t* __pMutex; + String __name; + +}; + + + +TIZEN_MAPS_END_NAMESPACE + +#endif // _TIZEN_MAPS_MUTEX_H_ + diff --git a/inc/engine/common/Operators.h b/inc/engine/common/Operators.h new file mode 100755 index 0000000..249aff8 --- /dev/null +++ b/inc/engine/common/Operators.h @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef OPERATORS_H +#define OPERATORS_H + +#include "common/HereMaps_global.h" + +#include + +HERE_MAPS_BEGIN_NAMESPACE + +class Result; +class Address; +class MetaInfo; +class GeoLocation; +class GeoCoordinates; + +HERE_MAPS_END_NAMESPACE + +//add operators to global namespace + +/** + * This is an operator that inserts the contents of a Result object + * into the output steam. + * + * @param os A reference to the output stream to which the right-hand object is inserted. + * + * @param rResult A constant reference to an object whose contents are to be + * inserted (output). + * + * @return A reference to the output stream after insertion. + */ +std::ostream& operator<<(std::ostream& os, const HERE_MAPS_NAMESPACE_PREFIX::Result& rResult); + +/** + * This is an operator that inserts the contents of a MetaInfo + * object into the output steam. + * + * @param os A reference to the output stream to which the right-hand object is + * inserted. + * + * @param rMetaInfo A constant reference to an object whose contents are to be + * inserted (output). + * + * @return A reference to the output stream after insertion. + */ +std::ostream& operator<<(std::ostream& os, const HERE_MAPS_NAMESPACE_PREFIX::MetaInfo& rMetaInfo); + +/** + * This is an operator that inserts the contents of a GeoLocation + * object into the output steam. + * + * @param os A reference to the output stream to which the right-hand object is + * inserted. + * + * @param rLocation A constant reference to an object whose contents are to be + * inserted (output). + * + * @return A reference to the output stream after insertion. + */ +std::ostream& operator<<(std::ostream& os, const HERE_MAPS_NAMESPACE_PREFIX::GeoLocation& rLocation); + +/** + * This is an operator that inserts the contents of an Address + * object into the output steam. + * + * @param os A reference to the output stream to which the right-hand object is + * inserted. + * + * @param rAddress A constant reference to an object whose contents are to be + * inserted (output). + * + * @return A reference to the output stream after insertion. + */ +std::ostream& operator<<(std::ostream& os, const HERE_MAPS_NAMESPACE_PREFIX::Address& rAddress); + +/** + * This is an operator that inserts the contents of a + * GeoCoordinates object into the output steam. + * + * @param os A reference to the output stream to which the right-hand object is + * inserted. + * + * @param rCoord A constant reference to an object whose contents are to be + * inserted (output). + * + * @return A reference to the output stream after insertion. + */ +std::ostream& operator<<(std::ostream& os, const HERE_MAPS_NAMESPACE_PREFIX::GeoCoordinates& rCoord); + +#endif diff --git a/inc/engine/common/ParserError.h b/inc/engine/common/ParserError.h new file mode 100755 index 0000000..909cab7 --- /dev/null +++ b/inc/engine/common/ParserError.h @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef PARSERERROR_H +#define PARSERERROR_H + +#include "HereMaps_global.h" + +#include "common/ErrorBase.h" + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates an XML parser error. It allows you to set and + * retrieve the error message, error type and other details concerning an error + * condition. + */ +class EXPORT_API ParserError : public ErrorBase +{ +public: + /** + * This enumeration defines identifiers for the recognized error types. + */ + enum Type + { + PE_InvalidXmlDocument, ///< Indicates that the XML document is invalid. + PE_Utf8ConversionFailed, ///< Indicates that UTF8 conversion failed. + PE_ExtractXMLTextNodeFail, ///< Indicates that it an attempt to extract an XML node failed. + PE_MissingAttribute, ///< Indicates that an attribute is missing. + PE_InternalParserError ///< Indicates that an internal parser error occurred. + }; + + /** + * This method is a constructor. + * + * @param aType A value indicating the error type. + */ + ParserError(Type aType); + + /** + * This method is a constructor. + * + * @param aType A value indicating the error type. + * + * @param sParentNodename A constant reference to the parent node (XML). + */ + ParserError(Type aType, const String& sParentNodename); + + /** + * This method is a constructor. + * + * @param aType A value indicating the error type. + * + * @param sParentNodename A constant reference to a string containing the + * name of the parent node (XML). + * + * @param sDescription A constant reference to a string containing the error description. + */ + ParserError(Type aType, const String& sParentNodename, const String& sDescription); + + /** + * This method is the destructor. + */ + virtual ~ParserError(); + + /** + * This method converts the given instance to a string. The default + * implementation outputs a string containing the error type, description, + * parser input and the name of the parent element. + * + * @return A string representation of the given instance of the class. + */ + virtual String ToString() const; + + /** + * This method retrieves a value indicating the error type. + * + * @return A value indicating the error type. + */ + Type getParserErrorType() const; + + /** + * This method sets the parser input. + * + * @param sInput A constant reference to a string containing parser input. + */ + void setParserInput(const String& sInput); + + /** + * This method retrieves the parser input. + * + * @return A constant reference to a string containing parser input. + */ + const String& getParserInput() const; + + /** + * This method sets the name of the parent node. + * + * @param sNodename A constant reference to a string containing name of the + * parent (XML) node. + */ + void setParentElement(const String& sNodename); + + /** + * This method retrieves the name of the parent node. + * + * @return A constant reference to a string containing name of the + * parent (XML) node. + */ + const String& getParentElement() const; + + /** + * This method sets the error description. + * + * @param sDsc A constant reference to a string containing the + * description of the error. + */ + void setDescription(const String& sDsc); + + /** + * This method retrieves the error description. + * + * @return A constant reference to a string containing the + * description of the error. + */ + const String& getDescription() const; + +private: + class ParserErrorImpl; + ParserErrorImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/common/QueryListener.h b/inc/engine/common/QueryListener.h new file mode 100755 index 0000000..931a549 --- /dev/null +++ b/inc/engine/common/QueryListener.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef QUERYLISTENER_H +#define QUERYLISTENER_H + +#include +#include "common/HereMaps_global.h" + +#ifndef TIZEN_MIGRATION +#include +#include +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class BaseReply; +class ErrorBase; + +typedef std::tr1::shared_ptr BaseReplyPtr; +/** + * This class encapsulates an object that is notified when a response to a query + * has become available. + * + * Derived classes must implement the virtual methods of this class. + */ +class EXPORT_API QueryListener +#ifndef TIZEN_MIGRATION +: public Tizen::Base::Runtime::Event +, public Tizen::Base::Runtime::IEventListener +#endif +{ +public: + /** + * This is the default constructor for the class. + */ + QueryListener(); + + /** + * This is a virtual destructor for the class. + */ + virtual ~QueryListener(); + + /** + * This method triggers a call to the listener's method + * OnReplySuccess(). + * + * @param pReply A pointer to the query reply. + */ + void NotifyForSuccess(BaseReplyPtr pReply); + + /** + * This method triggers a call to the listener's method + * OnReplyFailure(). + * + * @param pReply A pointer to the query reply. + */ + void NotifyForFailure(BaseReplyPtr pReply); + + /** + * This method is a callback invoked when a query is successful. The + * implementation of this method handles the reply to a successful query. + * + * @param rReply A Reference to the query reply object. + * + */ + virtual void OnReplySuccess(BaseReply& rReply) = 0; + + /** + * This method is a callback invoked when a query fails. The + * implementation of this method handles the reply. + * + * @param rReply A Constant reference to the reply. Only the error and user + * data are valid. + */ +#ifdef TIZEN_MIGRATION + virtual void OnFailure(const BaseReply& rReply) = 0; +#else + virtual void OnFailure(const BaseReply& rReply); +#endif + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(QueryListener); + class Arguments; +#ifndef TIZEN_MIGRATION + void FireImpl(Tizen::Base::Runtime::IEventListener& rListener, const Tizen::Base::Runtime::IEventArg& rArgs); +#endif +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/common/RestItemHandle.h b/inc/engine/common/RestItemHandle.h new file mode 100644 index 0000000..f3a9340 --- /dev/null +++ b/inc/engine/common/RestItemHandle.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef RESTITEMHANDLE_H +#define RESTITEMHANDLE_H + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class represents a handle to a REST request. + * + */ +class EXPORT_API RestItemHandle +{ +public: + /** + * This typedef defines a type that represents a REST request id. + */ + typedef int RequestId; + + /** + * This constant represents a passive REST request item. + */ + static const RequestId PASSIVE_RESTITEM; + + /** + * This constant represents an invalid REST request item. + */ + static const RequestId INVALID_RESTITEM; + + /** + * This method is a virtual destructor. + */ + virtual ~RestItemHandle(); + + /** + * This methos cancels a request with the id specified by the caller. + * + * @param aRequestId A value indicating the id of the request to cancel. + */ + static void Cancel(RequestId aRequestId); + + /** + * This method checks if the request id provided by the caller is valid. + * + * @param aRequestId A value indicating the id of the request to cancel. + */ + static bool IsValid(RequestId aRequestId); + +private: + RestItemHandle(); +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/common/Size.h b/inc/engine/common/Size.h new file mode 100644 index 0000000..6382a17 --- /dev/null +++ b/inc/engine/common/Size.h @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef _SIZE_H_ +#define _SIZE_H_ + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates a image size defined in terms of its width and + * height. It can apply to a map, an overlay or an icon. + */ +class Size +{ +public: + /** + * This method is the default constructor. + */ + Size(); + + /** + * This method is a constructor that initializes the new instance with the + * width and height supplied by the caller. + * + * @param aWidth A value specifying the image width in pixels. + * + * @param aHeight A value specifying the image height in pixels. + */ + Size(int aWidth, int aHeight); + + /** + * This method is a copy constructor that initializes the new instance by + * copying the properties of the instance supplied by the caller. + * + * @param rRhs A constant reference to an object whose properties are to be + * copied to initialize the new instance. + */ + Size(const Size& rRhs); + + /** + * This method is the destructor. + */ + ~Size(); + + /** + * This method sets the properties of the given instance of the class. + * + * @param aWidth A value specifying the image width in pixels. + * + * @param aHeight A value specifying the image height in pixels. + */ + void SetSize(int aWidth, int aHeight); + + /** + * This method retrieves the width of the image. + * + * @return A value representing the width of the image. + */ + int GetWidth() const; + + /** + * This method retrieves the height of the image. + * + * @return A value representing the height of the image. + */ + int GetHeight() const; + + /** + * This is the assignment operator. + * + * @param rRhs A constant reference to an object whose properties are to be copied + * to the given instance. + * + * @return A Reference to the given instance of the class after its + * properties have been updated. + */ + Size& operator = (const Size& rRhs); + + /** + * This is the quality operator. It check if the given instance of the class + * is identical to the right-hand-side object. + * + * @param rRhs A constant reference to an object whose properties are to be + * compared to the properties of the given instance. + * + * @return true if the objects are identical, otherwise + * false. + */ + bool operator == (const Size& rRhs) const; + +private: + class SizeImpl; + SizeImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif /* _SIZE_H_ */ diff --git a/inc/engine/common/TileKey.h b/inc/engine/common/TileKey.h new file mode 100755 index 0000000..77b2216 --- /dev/null +++ b/inc/engine/common/TileKey.h @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef TILEKEY_H_ +#define TILEKEY_H_ + +#include "common/HereMaps_global.h" +#include "maps/GeoTiledMap.h" + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates information that identifies a map tile in a grid + * reflecting the normalized Mercator projection. The projection represents the + * surface of the globe as a set of squares. The size of the grid depends on the + * map zoom level. At the lowest zoom level, the entire globe is + * shown in one square, which means that the tile grid consists of one row and + * one column. At the next higher zoom level, the tile grid contains two rows + * and two columns per row, at the next, four rows and four columns per row, and + * so on -- in other words, the number of rows and columns doubles at each + * higher zoom level. + */ +class TileKey +{ +public: + /** + * This is a constructor. It initializes a new instance of the tile key with + * the zoom level and the x and y coordinates of the tile at that zoom level. + * + * @param aLevel A value indicating the zoom level. + * + * @param aX A value indicating the x coordinate in the map tile grid. + * + * @param aY A value indicating the y coordinate in the map tile grid. + * + * @param aMapLanguage A value indicating the map language. + * + * @param aMapLanguage A value indicating the map type. + */ + TileKey(int aLevel, + int aX, + int aY, + String sMapLanguage = String("eng"), + GeoTiledMap::MapType aMapType = GeoTiledMap::MT_Normal_Day) + { + m_aLevel = aLevel; + m_aX = aX; + m_aY = aY; + m_sMapLanguage = sMapLanguage; + m_aMapType = aMapType; + } + + /** + * This method is a copy constructor. + * + * @param rRhs A constant reference to an object whose contents are to be + * copied into the present instance. + */ + TileKey(const TileKey& rRhs) + { + operator = (rRhs); + } + + /** + * This method retrieves a tile hash value based on the tile key properties. + * + * @return An integer value representing the tile hash. + */ + int GetHash() const + { + int hashValue = (((int)m_aMapType) << 25) + + (m_aLevel << 16) + + (m_aY << 8) + + m_aX; + return hashValue; + } + + /** + * This is an equality operator. + * + * @param rRhs A constant reference to an object that is to be compared to + * the present instance. + * + * @return true if the given instance and the right-hand object + * are identical, otherwise false. + */ + bool operator == (const TileKey& rRhs) const + { + return m_aLevel == rRhs.m_aLevel && + m_aX == rRhs.m_aX && + m_aY == rRhs.m_aY && + m_sMapLanguage == rRhs.m_sMapLanguage && + m_aMapType == rRhs.m_aMapType; + } + + /** + * This is an assignment operator. + * + * @param rRhs A constant reference to an object whose contents are to be + * copied into the present instance. + * + * @return A reference to the given instance of the class after the assignment. + */ + TileKey& operator = (const TileKey& rRhs) + { + if (&rRhs != this) + { + m_aLevel = rRhs.m_aLevel; + m_aX = rRhs.m_aX; + m_aY = rRhs.m_aY; + m_sMapLanguage = rRhs.m_sMapLanguage; + m_aMapType = rRhs.m_aMapType; + } + return *this; + } + + /** + * This member variable holds a value indicating the tile zoom level. + */ + int m_aLevel; + + /** + * This member variable holds a value indicating the x coordinate of the tile. + */ + int m_aX; + + /** + * This member variable holds a value indicating the y coordinate of the tile. + */ + int m_aY; + + /** + * This member variable holds a value indicating the map language. + */ + String m_sMapLanguage; + + /** + * This member variable holds a value indicating the map type. + */ + GeoTiledMap::MapType m_aMapType; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // TILEKEY_H_ diff --git a/inc/engine/debug/EchoQuery.h b/inc/engine/debug/EchoQuery.h new file mode 100755 index 0000000..6ca5645 --- /dev/null +++ b/inc/engine/debug/EchoQuery.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef ECHOQUERY_H +#define ECHOQUERY_H + +#include "common/HereMaps_global.h" + +#include "common/BaseQuery.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class EchoQuery : public BaseQuery +{ +public: + EchoQuery(unsigned int data); + ~EchoQuery(); + + virtual bool Execute(QueryListener& rListener, Tizen::Maps::HereObject* pUserData = NULL) const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(EchoQuery); + + class EchoQueryImpl; + EchoQueryImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/debug/EchoReply.h b/inc/engine/debug/EchoReply.h new file mode 100644 index 0000000..53de75b --- /dev/null +++ b/inc/engine/debug/EchoReply.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef ECHOREPLY_H +#define ECHOREPLY_H + +#include "common/HereMaps_global.h" + +#include "common/BaseReply.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class EchoReply : public BaseReply +{ +public: + EchoReply(unsigned int data); + virtual ~EchoReply(); + + virtual bool OnDataReceived(const unsigned char* pBuffer, size_t uSize); + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(EchoReply); + + class EchoReplyImpl; + EchoReplyImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/finder/BaseContent.h b/inc/engine/finder/BaseContent.h new file mode 100755 index 0000000..2abe795 --- /dev/null +++ b/inc/engine/finder/BaseContent.h @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef BASE_CONTENT_H_ +#define BASE_CONTENT_H_ + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class LinkObject; + +/** + * This class encapsulates basic data relating to a place. The basic data + * include supplier, attribution and via information. + * + * \ingroup finder + */ +class BaseContent +{ +public: + + /** + * This is the default constructor. + */ + BaseContent(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + BaseContent(const BaseContent& rRhs); + + /** + * This method is the (virtual) destructor. + */ + virtual ~BaseContent(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + BaseContent& operator=(const BaseContent& rRhs); + + /** + * This method retrieves information about the supplier of place-related + * information. + * + * @return An object containing information about the supplier. + */ + LinkObject GetSupplier() const; + + + /** + * This method retrieves the attribution text for place-related + * information. + * + * @return A string containing the attribution text. + */ + String GetAttribution() const; + + + /** + * This method retrieves an object containing a hypermedia link to the origin + * of the information about the place, usually a Web site of the supplier. + * + * @return An object containing a link to the origin of the information about + * the place. + */ + LinkObject GetVia() const; + + /** + * This method sets information about the supplier of place-related + * information. + * + * @return rSupplier A constant reference to an object containing information + * about the supplier. + */ + void SetSupplier(const LinkObject& rSupplier); + + /** + * This method sets the attribution text for place-related + * information. + * + * @return rAttribution A constant reference to a string containing the + * attribution text. + */ + void SetAttribution(const String& rsAttribution); + + /** + * This method sets an object containing a hypermedia link to the origin + * of the information about the place, usually a Web site of the supplier. + * + * @param rVia A constant reference to an object containing a link to the + * origin of the information about the place. + */ + void SetVia(const LinkObject& rVia); + +private: + class BaseContentImpl; + BaseContentImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // BASE_CONTENT_H_ diff --git a/inc/engine/finder/BaseFinderReply.h b/inc/engine/finder/BaseFinderReply.h new file mode 100644 index 0000000..c9f7568 --- /dev/null +++ b/inc/engine/finder/BaseFinderReply.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef BASEFINDERREPLY_H +#define BASEFINDERREPLY_H + +#include "common/BaseReply.h" + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates a basic reply to a places search query. + */ +class BaseFinderReply : public BaseReply +{ +public: + /** + * This enumeration defines identifiers for supported reply types. + */ + enum ReplyType + { + RT_Discovery = 0, // Indicates a reply to a discovery query. + RT_PlaceDetails // Indicates a reply to a request for place details. + }; + /** + * This method is the constructor. + */ + BaseFinderReply(ReplyType aReplyType); + + /** + * This method is a virtual destructor. + */ + virtual ~BaseFinderReply(); + + /** + * This method retrieves the reply type. + * + * @return A value that ientifies the reply type. + */ + ReplyType GetFinderReplyType() const; + +private: + + ReplyType m_aReplyType; + +}; + +HERE_MAPS_END_NAMESPACE + +#endif // BASEFINDERREPLY_H diff --git a/inc/engine/finder/Category.h b/inc/engine/finder/Category.h new file mode 100755 index 0000000..a54c229 --- /dev/null +++ b/inc/engine/finder/Category.h @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef CATEGORY_H_ +#define CATEGORY_H_ + +#include +#include "common/HereMaps_global.h" +#ifndef TIZEN_MIGRATION +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class CategoryId; +class Category; + + +/** + * This typedef defines a type representing a list of Category + * instances. + * + * \ingroup finder + */ +typedef std::vector CategoryList; + +/** + * This class encapsulates information about a Point of Interest (POI) category + * that can be applied to a place. + * + * \ingroup finder + */ +class EXPORT_API Category +{ +public: + + /** + * This method is the default constructor. + */ + Category(); + + /** + * This method is a constructor. + */ + Category(const CategoryId& rId); + + /** + * This method is a copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + Category(const Category& rRhs); + + /** + * This method is the (virtual) destructor. + */ + virtual ~Category(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + Category& operator=(const Category& rRhs); + + /** + * This method retrieves the category identifier. + * + * @return A string containing the identifier of the POI category. + */ + const CategoryId& GetCategoryId() const; + + /** + * This method sets the category identifier. + * + * @param rsId A constant reference to an object containing the identifier + * of the POI category. + */ + void SetCategoryId(const CategoryId& rsId); + + /** + * This method retrieves the category name (localized). + * + * @return A string containing the localized name of the POI category. + */ + String GetTitle() const; + + /** + * This method retrieves the URI of the category resource (icon). + * + * @return A string containing the URI of the icon of the POI category. + */ + String GetHref() const; + + /** + * This method retrieves the resource type identifier for the given + * category. + * + * @return A string containing the type identifier, which is either a valid + * MIME type or a URI. + */ + String GetType() const; + + /** + * This method retrieves the path to the category icon. + * + * @return A URI object containing the path to the category icon. + */ + String GetIconPath() const; + + /** + * This method sets the category name (localized). + * + * @param sTitle A constant reference to a string containing the localized + * name of the POI category. + */ + void SetTitle(const String& sTitle); + + /** + * This method sets the URI of the category resource (icon). + * + * @param sHref A constant reference to a string containing the URI of the icon + * of the POI category. + */ + void SetHref(const String& sHref); + + /** + * This method sets the resource type identifier for the given + * category. + * + * @param sType A constant reference to a string containing the type + * identifier, which is either a valid MIME type or a URI. + */ + void SetType(const String& sType); + + /** + * This method sets the path to the category icon. + * + * @param rIcon A constant reference to a URI object containing the path to + * the category icon. + */ + void SetIconPath(const String& rIcon); + +private: + class CategoryImpl; + CategoryImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // CATEGORY_H_ diff --git a/inc/engine/finder/CategoryId.h b/inc/engine/finder/CategoryId.h new file mode 100755 index 0000000..a4bad29 --- /dev/null +++ b/inc/engine/finder/CategoryId.h @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef CATEGORYID_H_ +#define CATEGORYID_H_ + +#include "common/HereMaps_global.h" + +#ifdef TIZEN_MIGRATION +namespace Here { namespace PlugIn { //for plug-in +class HerePlace; +}} +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class represents a (Place of Interest or POI) category identifier. + * \ingroup Finder + */ +class EXPORT_API CategoryId +{ +public: + + /** + * This method is the destructor. + */ + virtual ~CategoryId( ); + + /** + * This method checks if the given instance of CategoryId is + * valid. An instance of this class is valid if its id element is not empty. + * + * @return true if the instance is valid, otherwise + * false. + */ + bool IsValid( ) const; + + /** + * This method obtains a string representation of the given instance. + * + * @return A Unicode string containing a string representation of the given + * instance of CategoryId. + */ + String ToString( ) const; + + /** + * This method obtains an invalid category id object. + * + * @return A constant reference to an invalid category id object. + */ + static const CategoryId& GetInvalidCategoryId( ); + + /** + * This method obtains the id of the root category from the given instance. + * + * @return A constant reference to an instance of the class representing the + * root category id. + */ + static const CategoryId& GetRootCategoryId( ); + + // Factory methods for category filters + /** + * This factory method obtains a category id object representing the + * eat-drink category. + * + * @return A constant reference to an instance of the class representing the + * eat-drink category id. + */ + static const CategoryId& GetEatDrinkCategoryId(); + + /** + * This factory method obtains a category id object representing the + * going-out category. + * + * @return A constant reference to an instance of the class representing the + * going-out category id. + */ + static const CategoryId& GetGoingOutCategoryId(); + + /** + * This factory method obtains a category id object representing the + * sights-museums category. + * + * @return A constant reference to an instance of the class representing the + * sights-museums category id. + */ + static const CategoryId& GetSightsMuseumsCategoryId(); + + /** + * This factory method obtains a category id object representing the + * transport category. + * + * @return A constant reference to an instance of the class representing the + * transport category id. + */ + static const CategoryId& GetTransportCategoryId(); + + /** + * This factory method obtains a category id object representing the + * accommodation category. + * + * @return A constant reference to an instance of the class representing the + * accommodation category id. + */ + static const CategoryId& GetAccommodationCategoryId(); + + /** + * This factory method obtains a category id object representing the + * shopping category. + * + * @return A constant reference to an instance of the class representing the + * shopping category id. + */ + static const CategoryId& GetShoppingCategoryId(); + + /** + * This factory method obtains a category id object representing the + * leisure-outdoor category. + * + * @return A constant reference to an instance of the class representing the + * leisure-outdoor category id. + */ + static const CategoryId& GetLeisureOutdoorCategoryId(); + + /** + * This factory method obtains a category id object representing the + * administrative-areas-buildings category. + * + * @return A constant reference to an instance of the class representing the + * administrative-areas-buildings category id. + */ + static const CategoryId& GetAdministrativeAreasBuildingsCategoryId(); + + /** + * This factory method obtains a category id object representing the + * natural-geographical category. + * + * @return A constant reference to an instance of the class representing the + * natural-geographical category id. + */ + static const CategoryId& GetNaturalGeographicalCategoryId(); + +private: + CategoryId(const CategoryId&); + CategoryId& operator=(const CategoryId&); + + /** Create an invalid instance */ + CategoryId( const String& id); + +private: + class CategoryIdImpl; + CategoryIdImpl* m_pImpl; + + friend class JsonParser; + friend class Category; + friend class TestCategoryId; +#ifdef TIZEN_MIGRATION + friend class Here::PlugIn::HerePlace; //for plug-in +#endif +}; + + +HERE_MAPS_END_NAMESPACE + +#endif // CATEGORYID_H_ diff --git a/inc/engine/finder/ContactDetails.h b/inc/engine/finder/ContactDetails.h new file mode 100755 index 0000000..8198042 --- /dev/null +++ b/inc/engine/finder/ContactDetails.h @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef CONTACT_DETAILS_H_ +#define CONTACT_DETAILS_H_ + +#include + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class EXPORT_API ContactDetails; +/** + * This typedef defines a type representing a list of ContactDetails + * instances. + */ +typedef std::vector ContactDetailsList; + +/** + * This class encapsulates contact information relating to a place. + * + * \ingroup finder + */ +class ContactDetails +{ +public: + /** + * This method is the default constructor. + */ + ContactDetails(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + ContactDetails(const ContactDetails& rRhs); + + /** + * This method is the destructor. + */ + ~ContactDetails(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + ContactDetails& operator=(const ContactDetails& rRhs); + + /** + * This method retrieves the contact type, which can be telephone, e-mail, + * website, site, etc. + * + * @return A string containing the contact type identifier. The possible + * values are "phone", "website", "fax", or "email". + */ + String GetContactType() const; + + /** + * This method retrieves the contact detail label, which is a localized + * string identifying the purpose of the contact, for example "Phone", + * "Mobile". Note that label is accompanied by a "value" filed, which for + * example for a "Phone" contains the telephone number. + * + * @return A string containing the contact label. + */ + String GetLabel() const; + + /** + * This method retrieves the value for the associated contact label. + * + * @return A string containing the value corresponding to the contact label. + */ + String GetValue() const; + + /** + * This method sets the contact type, which can be telephone, e-mail, + * website, site, etc. + * + * @param rsName A string containing the contact type identifier. The + * possible values are "phone", "website", "fax", or "email". + */ + void SetContactType(const String& rsName); + + /** + * This method sets the contact detail label, which is a localized + * string identifying the purpose of the contact, for example "Phone", + * "Mobile". Note that label is accompanied by a "value" filed, which for + * example for a "Phone" contains the telephone number. + * + * @param rsLabel A string containing the contact label. + */ + void SetLabel(const String& rsLabel); + + /** + * This method sets the value for the contact label. + * + * @param rsValue A string containing the value corresponding to the contact + * label (for example, if the label is "Phone", the value is the + * telephone number). + */ + void SetValue(const String& rsValue); + +private: + class ContactDetailsImpl; + ContactDetailsImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // CONTACT_DETAILS_H_ diff --git a/inc/engine/finder/DiscoveryQuery.h b/inc/engine/finder/DiscoveryQuery.h new file mode 100755 index 0000000..c13c931 --- /dev/null +++ b/inc/engine/finder/DiscoveryQuery.h @@ -0,0 +1,295 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef DISCOVERY_QUERY_H_ +#define DISCOVERY_QUERY_H_ + +#include "common/HereMaps_global.h" +#include "common/BaseQuery.h" +#include "finder/Category.h" +#ifdef TIZEN_CUSTOMIZATION +#include "common/GeoBoundingArea.h" +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class QueryListener; +class GeoCoordinates; +class FinderQueryListener; +class FinderError; + +/** + * This class encapsulates a places discovery query. + * + * \ingroup finder + */ +class EXPORT_API DiscoveryQuery : public BaseQuery +{ +public: + /** + * This enumeration defines identifiers for the supported discovery query + * types. + */ + enum QueryType + { + QT_SEARCH = 0, ///< Indicates a search query (based on the search terms + /// supplied by the application user); results are + /// paginated. + QT_HERE, ///< Indicates query that searches for places at or + /// within 200 meters of a specific location; a category + /// can be specified as an option. + QT_AROUND, ///< Indicates a query that searches for places within a + /// certain radius around a location; results are + /// paginated; a category can be specified as an option. + QT_EXPLORE ///< Indicates a query that searches for popular places + /// based on a location context provided by the + /// application user; results are paginated; a category + /// can be specified as an option. + }; + + /** + * This enumeration defines identifiers for the supported discovery query + * result types. + */ + /* + * The identifiers are not valid for search QueryTypes. + */ + enum ResultTypes + { + SIT_PLACE = 0, ///< Indicates that the result contains only place items + SIT_SEARCH, ///< Indicates that the result contains only search items + SIT_PLACEANDSEARCH ///< Indicates that the result contains place and search items + }; + +public: + + /** + * This method is the default constructor. + */ + DiscoveryQuery(); + + /** + * This method is a constructor. It constructs a valid DiscoveryQuery from + * a URL provided by the caller. + * + * @param sUrl A constant reference to the URL of the location whose details + * are to be retrieved from the server + */ + DiscoveryQuery(const String& sUrl); + + /** + * This method is the (virtual) destructor. + */ + virtual ~DiscoveryQuery(); + + /** + * This method retrieves a value indicating the query type. + * + * @return A value indicating the query type. + */ + QueryType GetType() const; + + /** + * This method sets the query type. + * + * @param eType A value indicating the query type. + */ + void SetType(QueryType eType); + + /** + * This method sets the search text (terms). + * + * @param sSearch A constant reference to a string containing the search + * terms. + */ + void SetSearchText(const String& sSearch); + + /** + * This method retrieves the search text (terms). + * + * @return A string containing the search terms. + */ + String GetSearchText() const; + + /** + * This method retrieves the search proximity. + * + * @return An object containing the geographic coordinates of the location + * around which the search is/was to be conducted and within whose + * proximity the results must lie. + */ + GeoCoordinates GetProximity() const; + + /** + * This method sets search proximity. + * + * @param rCoord An object containing the geographic coordinates of the + * location around which the search is/was to be conducted and within + * whose proximity the results must lie. + */ + void SetProximity(const GeoCoordinates& rCoord); + +#ifdef TIZEN_CUSTOMIZATION + /** + * This method retrieves the bounding area. + * + * @return An object containing the geographic bounding area of the location + * around which the search is/was to be conducted and within whose + * area the results must lie. + */ + GeoBoundingArea* GetArea() const; + + /** + * This method sets search bounding area. + * + * @param rArea An object containing the geographic bounding area of the + * location around which the search is/was to be conducted and within + * whose bounding area the results must lie. + */ + void SetArea(const GeoBoundingArea &rArea); +#endif + + /** + * This method retrieves a BCP 47 identifier of the search language. + * + * @return A string containing a BCP 47 identifier of the language. + */ + String GetLanguage() const; + + /** + * This method sets the langauge, using a BCP 47 langauge code. + * + * @param sSearch A constant reference to a string containing a BCP 47 + * identifier of the language. + */ + void SetLanguage(const String& sLang); + + /** + * This method retrieves a value that indicates the maximum number of search + * results to be retrieved in response to the query. + * + * @return An integer indicating the maximum number of results to be + * retrieved. + */ + size_t GetMaxResults() const; + + /** + * This method sets a value that indicates the maximum number of search + * results to be retrieved in response to the query. + * + * @param uMaxResults An integer indicating the maximum number of results to + * be retrieved. + */ + void SetMaxResults(size_t uMaxResults); + + /** + * This method retrieves a value that indicates the search item types + * to be retrieved in response to the query. + * + * @return A value indicating the search item type of results to be + * retrieved. + */ + ResultTypes GetResultTypes() const; + + /** + * This method sets a value that indicates the search item types + * to be retrieved in response to the query. + * + * @param eItemType A value indicating the search item type of results to + * be retrieved. + */ + void SetResultTypes(ResultTypes eItemType); + + /** + * This method retrieves a list of categories used by the query. + * + * @return An object containing a list of POI categories used by the query. + */ + CategoryList GetCategoriesFilter() const; + + /** + * This method sets a list of categories used by the query. + * + * @param filters A constant reference to an object containing a list of POI + * categories used by the query. + */ + void SetCategoriesFilter(const CategoryList& filters); + + /** + * This method attempts to establish a connection + * with the server and then, if the connection has been established, it + * builds and submits a query. + * + * @param rDst A reference to an object that is to be notified when the + * reply to the query has arrived from the server. + * + * @param pUserData A pointer to user data to be passed back within the + * corresponding reply object. + * + * @return Identifier of issued request. + */ + RestItemHandle::RequestId Execute(FinderQueryListener& rListener, Tizen::Maps::HereObject* pUserData = NULL) const; + + /** + * This method retrieves error information associated with the query. + * + * @return A constant pointer to an object containing the error details. + */ + const FinderError* GetError() const; + + /** + * This static method returns the base URI to be used for all subsequent + * discovery queries. + * + * @return A string containing the base URI. + */ + static String GetBaseUri(); + + /** + * This static method returns the base URI to be used for all subsequent + * discovery queries. + * + * @param sUri A constant reference to a string containing the base URI. + */ + static void SetBaseUri(const String& sUri); + +private: + + /** + * This method creates the URI for the request. + * + * @return URI request string. + */ + String CreateUri() const; + + bool AppendService(DiscoveryQuery::QueryType eType, String& sDst) const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(DiscoveryQuery); + + class DiscoveryQueryImpl; + DiscoveryQueryImpl* m_pImpl; + + friend class DiscoveryReply; + + static String s_sBaseUri; + +}; + +HERE_MAPS_END_NAMESPACE + +#endif // DISCOVERY_QUERY_H_ diff --git a/inc/engine/finder/DiscoveryReply.h b/inc/engine/finder/DiscoveryReply.h new file mode 100755 index 0000000..bb1589c --- /dev/null +++ b/inc/engine/finder/DiscoveryReply.h @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef DISCOVERY_REPLY_H_ +#define DISCOVERY_REPLY_H_ + +#include "finder/BaseFinderReply.h" +#include "finder/SearchItem.h" +#include "finder/PlaceItem.h" +#include "finder/DiscoveryQuery.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class SearchContext; + +/** + * This class encapsulates a response to a discovery query. The response is a + * page of link objects, each containing information about one place. It also + * includes a link to the next page of results, if available. + * + * \ingroup finder + */ +class EXPORT_API DiscoveryReply : public BaseFinderReply +{ +public: + + /** + * This is the default constructor. + */ + DiscoveryReply(); + + /** + * This is the (virtual) destructor. + */ + virtual ~DiscoveryReply(); + + /** + * This method retrieves a list of search result items that can lead an + * application user to detailed information about specific places. + * + * @return A vector of instances of SearchItem which represent + * individual search results. + */ + SearchItemList GetSearchItems() const; + + /** + * This method retrieves a list of objects each of which contains + * information about a single place. + * + * @return A vector of instances of PlaceItem which represent + * individual places. + */ + PlaceItemList GetPlaceItems() const; + + /** + * This method retrieves a string that contains the URL to the next page of + * search result items. + * + * @return A string containing the URL to a page containing the next set of + * results. + */ + String GetNextResultsString() const; + + /** + * This method retrieves the offset (index) of the first item on the + * current page of results + * + * @return An integer indicating the index of the first result item on the + * current page. + */ + size_t GetOffset() const; + + /** + * This method retrieves an object that defines the search context used in + * the original query. + * + * @return An object containing the search context. + */ + SearchContext GetSearchContext() const; + + /** + * This method retrieves a query object that can be used to retrieve the + * next page of results. + * + * @return A pointer to an object encapsulating a query to the next page of + * results. + */ + DiscoveryQuery* GetNextPageQuery() const; + +private: + void SetSearchItems(const SearchItemList&); + void SetPlaceItems(const PlaceItemList&); + void SetNextResults(const String&); + void SetOffset(size_t); + void SetSearchContext(const SearchContext& sContext); + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(DiscoveryReply); + friend class TestDiscoveryReply; + + virtual bool OnDataReceived(const unsigned char* pBuffer, size_t uSize); + + class DiscoveryReplyImpl; + DiscoveryReplyImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // DISCOVERY_REPLY_H_ diff --git a/inc/engine/finder/EditorialContent.h b/inc/engine/finder/EditorialContent.h new file mode 100755 index 0000000..274445d --- /dev/null +++ b/inc/engine/finder/EditorialContent.h @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef EDITORIAL_CONTENT_H_ +#define EDITORIAL_CONTENT_H_ + +#include + +#include "common/HereMaps_global.h" +#include "finder/BaseContent.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class EditorialContent; + +/** + * This typedef defines a list of editorial content items as a type. + */ +typedef std::vector EditorialContentList; + +/** + * This class encapsulates editorial content relating to a place. + * + * \ingroup finder + */ +class EXPORT_API EditorialContent : public BaseContent +{ +public: + + /** + * This is the default constructor. + */ + EditorialContent(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + EditorialContent(const EditorialContent& rRhs); + + /** + * This method is a (virtual) destructor. + */ + virtual ~EditorialContent(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + EditorialContent& operator=(const EditorialContent& rRhs); + + /** + * This method retrieves the description (the contents of an editorial + * item). + * + * @return A string containing the description. + */ + String GetDescription() const; + + /** + * This method retrieves the identifier of the language of the editorial + * item. The identifier is a string containing a BCP 47 language code (see + * also http://tools.ietf.org/html/rfc5646). + * + * @return A string containing the language identifier. + */ + String GetLanguage() const; + + /** + * This method sets the description (the contents of an editorial + * item). + * + * @param sText A constant reference to a string containing the description. + */ + void SetDescription(const String& sText); + + /** + * This method retrieves the identifier of the language of the editorial + * item. The identifier is a string containing a BCP 47 language code (see + * also http://tools.ietf.org/html/rfc5646). + * + * @param rLanguage A constant reference to a string containing the language + * identifier. + */ + void SetLanguage(const String& rLanguage); + +private: + class EditorialContentImpl; + EditorialContentImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // EDITORIAL_CONTENT_H_ diff --git a/inc/engine/finder/ExtendedAttribute.h b/inc/engine/finder/ExtendedAttribute.h new file mode 100755 index 0000000..b882cb3 --- /dev/null +++ b/inc/engine/finder/ExtendedAttribute.h @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef EXTENDED_ATTRIBUTE_H_ +#define EXTENDED_ATTRIBUTE_H_ + +#include "common/HereMaps_global.h" +#include + +HERE_MAPS_BEGIN_NAMESPACE + +class ExtendedAttribute; +/** + * This typedef defines a list of extended attributes as a type. + */ +typedef std::vector< ExtendedAttribute > ExtendedAttributeList; + +/** + * This class encapsulates an extended attribute relating to a place. + * + * Extended attributes can be used to provide additional information about a + * place. They contain a localized label and a text field that can be displayed + * without modification. + * + * \ingroup finder + */ +class ExtendedAttribute +{ +public: + /** + * This method is the default constructor. + */ + ExtendedAttribute(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + ExtendedAttribute(const ExtendedAttribute& rRhs); + + /** + * This method is the (virtual) destructor. + */ + virtual ~ExtendedAttribute(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + ExtendedAttribute& operator=(const ExtendedAttribute& rRhs); + + /** + * This method retrieves a string that indicates the type of the extended + * attribute. + * + * @return A string containing the attribute type identifier. + */ + String GetAttributeType() const; + + /** + * This method retrieves the extended attribute label, which is a localized + * string identifying the attribute. + * + * @return A string containing the extended attribute label. + */ + String GetLabel() const; + + /** + * This method retrieves the extended attribute text, which can be displayed + * without modification. + * + * @return A string containing the extended attribute text. + */ + String GetText() const; + + /** + * This method sets the type of the extended attribute. + * + * @rsType A constant reference to a string containing the attribute type + * identifier. + */ + void SetAttributeType(const String& rsType); + + /** + * This method sets the extended attribute label, which is a localized + * string identifying the attribute. + * + * @param rsLabel A constant reference to a string containing the extended + * attribute label. + */ + void SetLabel(const String& rsLabel); + + /** + * This method sets the extended attribute text, which can be displayed + * without modification. + * + * @param rsText A constant reference to a string containing the extended + * attribute text. + */ + void SetText(const String& rsText); + +private: + class ExtendedAttributeImpl; + ExtendedAttributeImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // EXTENDED_ATTRIBUTE_H_ diff --git a/inc/engine/finder/FinderError.h b/inc/engine/finder/FinderError.h new file mode 100755 index 0000000..9356fcb --- /dev/null +++ b/inc/engine/finder/FinderError.h @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef FINDER_ERROR_H_ +#define FINDER_ERROR_H_ + +#include "common/HereMaps_global.h" + +#include "common/ErrorBase.h" + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates error information reflecting an error that + * may arise when a parsing a finder request. + * + * \ingroup finder + */ +class EXPORT_API FinderError : public ErrorBase +{ +public: + + /** + * This enumeration defines identifiers for the recognized error types. + */ + enum ErrorType + { + ET_InvalidQueryArguments, ///< Indicates invalid query argument. + ET_ParserError, ///< Indicates that an internal parser error occurred. + ET_InvalidCredentials, ///< Indicates that credentials are not correct or empty + ET_UnknownError ///< Indicate an unkown error + }; + + /** + * This method is a constructor. + * + * @param sStr A constant reference to a string containing an error message. + */ + FinderError(ErrorType etype); + + /** + * This method is a constructor. + * + * @param aType A value indicating the error type. + * + * @param sDescription A constant reference to a string containing the error + * description. + */ + FinderError(ErrorType eType, const String& sDescription); + + /** + * This method is a (virtual) destructor. + */ + virtual ~FinderError(); + + /** + * This method retrieves a string representation of the given instance of + * the class. + * + * @return A string containing the error information held in the given + * instance of the class. + */ + virtual String ToString() const; + + /** + * This method sets the error description. + * + * @param sDsc A constant reference to a string containing the + * description of the error. + */ + void SetDescription(const String& sDsc); + + /** + * This method retrieves the error description. + * + * @return A constant reference to a string containing the + * description of the error. + */ + String GetDescription() const; + + /** + * This method retrieves the error type. + * + * @return A value indicating the error type. + */ + ErrorType GetErrorType() const; + + /** + * This method sets the error type. + * + * @param aType An error type. + */ + void SetErrorType(ErrorType aType); + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(FinderError); + + class FinderErrorImpl; + FinderErrorImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // FINDER_ERROR_H_ diff --git a/inc/engine/finder/FinderQueryListener.h b/inc/engine/finder/FinderQueryListener.h new file mode 100755 index 0000000..9a84d48 --- /dev/null +++ b/inc/engine/finder/FinderQueryListener.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef FINDERQUERYLISTENER_H +#define FINDERQUERYLISTENER_H + +#include "common/HereMaps_global.h" + +#include "common/QueryListener.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class DiscoveryReply; +class PlaceDetailsReply; + +/** + * This class encapsulates an object that is notified when a response to a query + * has become available. The derived classes must implement the methods defined + * on this class to handle the replies from the server. + */ +class EXPORT_API FinderQueryListener : public QueryListener +{ +public: + + /** + * This is the default constructor. + */ + FinderQueryListener(); + + /** + * This method is the destructor. + */ + ~FinderQueryListener(); + + /** + * This method is a callback invoked when data have arrived in response to a + * places search request. + * + * @param rReply A constant reference to an object containing the response data. + */ + virtual void OnDiscoverReply(const DiscoveryReply& rReply) = 0; + + #ifdef TIZEN_MIGRATION + /** + * This method is a callback invoked when geocoding request is failed. + * + * @param rReply A Constant reference to an object containing the response data. + */ + virtual void OnDiscoverFailure(const DiscoveryReply& rReply) = 0; + #endif + + /** + * This method is a callback invoked when data have arrived in response to a + * places details request. + * + * @param rReply A constant reference to an object containing the response data. + */ + virtual void OnPlaceDetailsReply(const PlaceDetailsReply& rReply) = 0; + + #ifdef TIZEN_MIGRATION + /** + * This method is a callback invoked when geocoding request is failed. + * + * @param rReply A Constant reference to an object containing the response data. + */ + virtual void OnPlaceDetailsFailure(const PlaceDetailsReply& rReply) = 0; + #endif + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(FinderQueryListener); + + void OnReplySuccess(BaseReply& rReply); + + #ifdef TIZEN_MIGRATION + void OnFailure(const BaseReply& rReply); + #endif +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/finder/ImageContent.h b/inc/engine/finder/ImageContent.h new file mode 100755 index 0000000..46deb52 --- /dev/null +++ b/inc/engine/finder/ImageContent.h @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef IMAGE_CONTENT_H_ +#define IMAGE_CONTENT_H_ + +#include +#include "common/HereMaps_global.h" +#ifndef TIZEN_MIGRATION +#include +#endif + +#include "finder/BaseContent.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class LinkObject; + +class ImageContent; +/** + * This typedef defines a list of image content objects as a type. + */ +typedef std::vector ImageContentList; + +/** + * This class encapsulates the contents of an image. It includes information + * such as the source URL, image id, and the details of the user (provider). + * + * \ingroup finder + */ +class EXPORT_API ImageContent : public BaseContent +{ +public: + /** + * This method is the default constructor. + */ + ImageContent(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + ImageContent(const ImageContent& rRhs); + + /** + * This method is a (virtual) destructor. + */ + virtual ~ImageContent(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + ImageContent& operator=(const ImageContent& rRhs); + + /** + * This method retrieves the URI of the image source. + * + * @return An object containing the URI of the image source. + */ + String GetSource() const; + + /** + * This method retrieves the image identifier. Note that a meaningful + * identifier can be retrieved only if the image the image has been uploaded + * via the Places API. + * + * @return A string containing the id of the image. + */ + String GetImageId() const; + + /** + * This method retrieves a link to the provider of the image. + * + * @return An object with a link to the provider of the image. + */ + LinkObject GetUser() const; + + /** + * This method sets the URI of the image source. + * + * @param rUrl A constant reference to an object containing the URI of the + * image source. + */ + void SetSource(const String& rUrl); + + /** + * This method sets the image identifier. Note that a meaningful + * identifier can be retrieved only if the image has been uploaded + * via the Places API. + * + * @param rImageId A constant reference to a string containing the id of the + * image. + */ + void SetImageId(const String& rImageId); + + /** + * This method sets a link to the provider of the image. + * + * @param rUrl A constant reference to an object with a link to the provider + * of the image. + */ + void SetUser(const LinkObject& rUrl); + +private: + class ImageContentImpl; + ImageContentImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif //IMAGE_CONTENT_H_ diff --git a/inc/engine/finder/LinkObject.h b/inc/engine/finder/LinkObject.h new file mode 100755 index 0000000..2e0d2a0 --- /dev/null +++ b/inc/engine/finder/LinkObject.h @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef LINKOBJECT_H_ +#define LINKOBJECT_H_ + +#include "common/HereMaps_global.h" + +#ifndef TIZEN_MIGRATION +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates a link that may be included in a search (result) + * item. + * + * \ingroup finder + */ +class EXPORT_API LinkObject +{ +public: + + /** + * This method is the default constructor. + */ + LinkObject(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + LinkObject(const LinkObject& rRhs); + + /** + * This method is the destructor. + */ + ~LinkObject(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + LinkObject& operator=(const LinkObject& rRhs); + + /** + * This method retrieves the id of the resource to which the link points. + * + * @return A string containing the identifier of the object to which the + * link points. + */ + String GetId() const; + + /** + * This method retrieves the title of the resource to which the link points. + * + * @return A string containing a localized title for the resource to which + * the link refers. + */ + String GetTitle() const; + + /** + * This method retrieves the URI of the resource to which the link points. + * + * @return The URI for the resource to which the link refers. + */ + String GetHref() const; + + /** + * This method retrieves the identifier of the type of the resource to which + * the link points. + * + * @return A string containing the type identifier for the resource to which + * the link refers. + */ + String GetType() const; + + /** + * This method retrieves the URI of the icon for the resource to which the + * link points. + * + * @return The URI of the icon for the resource to which the link points. + */ + String GetIconPath() const; + + /** + * This method sets the id of the resource to which the link points. + * + * @param rsIdentifier A constant reference to a string containing the + * identifier of the object to which the link points. + */ + void SetId(const String& rsIdentifier); + + /** + * This method sets the title of the resource to which the link points. + * + * @param sTitle A constant reference to a string containing a localized + * title for the resource to which the link refers. + */ + void SetTitle(const String& sTitle); + + /** + * This method sets the URI of the resource to which the link points. + * + * @param rHref A constant reference to an object holding the URI for the + * resource to which the link refers. + */ + void SetHref(const String& rHref); + + /** + * This method sets the identifier of the type of the resource to which + * the link points. + * + * @param sType A constant reference to a string containing the type + * identifier for the resource to which the link refers. + */ + void SetType(const String& sType); + + /** + * This method sets the URI of the icon for the resource to which the + * link points. + * + * @param A constant reference to an object containing the URI of the icon + * for the resource to which the link points. + */ + void SetIconPath(const String& rIconUrl); + +private: + class LinkObjectImpl; + LinkObjectImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // LINKOBJECT_H_ diff --git a/inc/engine/finder/PlaceDetails.h b/inc/engine/finder/PlaceDetails.h new file mode 100755 index 0000000..40ee8ef --- /dev/null +++ b/inc/engine/finder/PlaceDetails.h @@ -0,0 +1,363 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef PLACE_DETAILS_H_ +#define PLACE_DETAILS_H_ + +#include "finder/ContactDetails.h" +#include "finder/PlacesGlobals.h" +#include "finder/Category.h" +#include "finder/ImageContent.h" +#include "finder/ReviewContent.h" +#include "finder/EditorialContent.h" +#include "finder/ExtendedAttribute.h" +#include "common/HereMaps_global.h" +#include "internal/StringHelper.h" + +#include + +HERE_MAPS_BEGIN_NAMESPACE + +class Ratings; +class GeoLocation; +class ExtendedAttribute; +class RelatedItem; +class BaseContent; + +/** + * This class encapsulates detailed information about a place, including name, + * id, contact, category, location, ratings, review(s) and image(s). + * + * \ingroup finder + */ +class EXPORT_API PlaceDetails +{ +public: + /** + * This typedef defines a map holding alternative place names as a type. + */ + typedef std::map< String, std::vector< String >, TSPredicate > AlternativeNames; + +public: + /** + * This method is the default constructor. + */ + PlaceDetails(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + PlaceDetails(const PlaceDetails& rRhs); + + /** + * This method is the destructor. + */ + ~PlaceDetails(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + PlaceDetails& operator=(const PlaceDetails& rRhs); + + /** + * This method retrieves the name of the place. + * + * @return A string containing the place name. + */ + String GetName() const; + + /** + * This method retrieves the place id, which is a unique identifier in the + * Places database and can be used to obtain the complete information + * about the place. + * + * @return A string containing the unique id of the place. + */ + String GetPlaceId() const; + + /** + * This method retrieves a link to a representation of the + * place that can be viewed by end users. + * + * @return A string containing a link to a view of the place. + */ + String GetView() const; + + /** + * This method retrieves a map object containing the alternative names of the + * place. + * + * @return An object containing the alternative names of the place. + */ + AlternativeNames GetAlternativeNames() const; + + /** + * This method retrieves detailed location information for the place. + * + * @return An object containing the address and the geographical coordinates + * of the place. + */ + GeoLocation GetLocation() const; + + /** + * This method retrieves basic information about the place. + * + * @return An object containing basic information about the place. + */ + BaseContent GetBaseContent() const; + + /** + * This method retrieves a list of contact types available for the given + * place. Contact types can include telephone, e-mail, website, site, etc. + * + * @return A list of strings containing contact type identifiers. The + * possible values for contact type identifiers are "phone", + * "website", "fax", or "email". + */ + StringList GetContactTypes() const; + + /** + * This method retrieves a list of contact details for the given place. + * + * @return A vector containing instances of ContactDetails. + */ + ContactDetailsList GetContactDetails() const; + + /** + * This method retrieves a list of categories applicable to the given place. + * + * @return A vector containing instances of Category + */ + CategoryList GetCategories() const; + + /** + * This method retrieves information on user rating of the given place. + * + * @return An object containing user rating information. + */ + Ratings GetRatings() const; + + /** + * This method retrieves the URI of the icon that represents the given + * place. + * + * @return A URI of the place icon. + */ + String GetIconPath() const; + + /** + * This method retrieves a list object containing image content information + * for images relating to the given place. + * + * @return An object containing a vector of instances of + * ImageContent. + */ + ImageContentList GetImageContent() const; + + /** + * This method retrieves a list object containing review content + * relating to the given place. + * + * @return An object containing a vector of instances of + * ReviewContent. + */ + ReviewContentList GetReviewContent() const; + + /** + * This method retrieves a list object containing editorial content + * relating to the given place. + * + * @return An object containing a vector of instances of + * EditorialContent. + */ + EditorialContentList GetEditorialContent() const; + + /** + * This method retrieves a list of strings, each containing an identifier of + * an extended attribute type applicable to the given place. + * + * @return A list of strings containing extended attribute type identifiers. + */ + StringList GetExtendedAttributeTypes() const; + + /** + * This method retrieves a list object containing extended attributes + * applicable to the given place. + * + * @return An object containing a vector of instances of + * ExtendedAttribute. + */ + ExtendedAttributeList GetExtendedAttributes() const; + + /** + * This method retrieves an object containing a list of places that + * are related to the given place (or places that may be be interesting to + * users who have looked at the given place). + * + * @return An object encapsulating places related to the given place. + */ + RelatedItem GetRelatedItem() const; + + /** + * This method sets the name of the place. + * + * @param rsName A constant reference to a string containing the place name. + */ + void SetName(const String& rsName); + + /** + * This method sets the place id, which is a unique identifier in the + * Places database and can be used to obtain the complete information + * about the place. + * + * @param rsIdentifier A constant reference to a string containing the + * unique id of the place. + */ + void SetPlaceId(const String& rsIdentifier); + + /** + * This method sets a link to a representation of the + * place that can be viewed by end users. + * + * @param rsView A constant reference to a string containing a link to a + * view of the place. + */ + void SetView(const String& rsView); + + /** + * This method sets a map object containing the alternative names of the + * place. + * + * @param vNames A constant reference to an object containing the alternative + * names of the place. + */ + void SetAlternativeNames(const AlternativeNames& vNames); + + /** + * This method sets the location details for the place. + * + * @param rLocation A constant reference to an object containing the address + * and the geographical coordinates of the place. + */ + void SetLocation(const GeoLocation& rLocation); + + /** + * This method sets basic information about the place. + * + * @param rContent A constant reference to an object containing basic + * information about the place. + */ + void SetContent(const BaseContent& rContent); + + /** + * This method sets a list of contact details for the given place. + * + * @param vDetails A constant reference to a vector containing instances of + * ContactDetails. + */ + void SetContactDetails(const ContactDetailsList& vDetails); + + /** + * This method sets a list of (POI) categories applicable to the given place. + * + * @param rvCategories A constant reference to a vector containing instances + * of Category + */ + void SetCategories(const CategoryList& rvCategories); + + /** + * This method sets information on user rating of the given place. + * + * @param rRatings A constant reference to an object containing user rating + * information. + */ + void SetRatings(const Ratings& rRatings); + + /** + * This method sets the URI of the icon that represents the given + * place. + * + * @param rIcon A constant reference to an object containing the URI of the + * place icon. + */ + void SetIconPath(const String rIcon); + + /** + * This method sets a list object containing image content data + * for images relating to the given place. + * + * @param rContent A constant reference to a vector of + * instances of ImageContent. + */ + void SetImageContent(const ImageContentList& rContent); + + /** + * This method sets a list object containing review content + * relating to the given place. + * + * @param rContent A constant reference to a vector of + * instances of ReviewContent. + */ + void SetReviewContent(const ReviewContentList& rContent); + + /** + * This method sets a list object containing editorial content + * relating to the given place. + * + * @param rContent A constant reference to a vector of + * instances of EditorialContent. + */ + void SetEditorialContent(const EditorialContentList& rContent); + + /** + * This method sets a list object containing extended attributes + * applicable to the given place. + * + * @param rAttribute A constant reference to a vector of + * instances of ExtendedAttribute. + */ + void SetExtendedAttributes(const ExtendedAttributeList& rAttribute); + + /** + * This method sets an object containing a list of places that + * are related to the given place (or places that may be of interest to + * users who have looked at the given place). + * + * @param rAttribute A constant reference to a object encapsulating places + * related to the given place. + */ + void SetRelatedItem(const RelatedItem& rAttribute); + +private: + class PlaceDetailsImpl; + PlaceDetailsImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // PLACE_DETAILS_H_ diff --git a/inc/engine/finder/PlaceDetailsQuery.h b/inc/engine/finder/PlaceDetailsQuery.h new file mode 100755 index 0000000..134db79 --- /dev/null +++ b/inc/engine/finder/PlaceDetailsQuery.h @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef PLACE_DETAILS_QUERY_H +#define PLACE_DETAILS_QUERY_H + +#include "common/HereMaps_global.h" +#include "common/BaseQuery.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class PlaceDetailsReply; +class FinderQueryListener; +class FinderError; + +/** + * This class encapsulates a request for detailed information about a specific + * place. + * + * \ingroup finder + */ +class EXPORT_API PlaceDetailsQuery : public BaseQuery +{ +public: + + /** + * This method is the default constructor. + */ + PlaceDetailsQuery(); + + /** + * This method is a copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + PlaceDetailsQuery(const PlaceDetailsQuery& rRhs); + + /** + * This method is the destructor. + */ + ~PlaceDetailsQuery(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + PlaceDetailsQuery& operator=(const PlaceDetailsQuery& rRhs); + + /** + * This method sets the place id. + * + * @param rPlaceId A constant reference to a string containing the unique + * identifier of the place whose details are to be obtained. + */ + void SetPlaceId(const String& rPlaceId); + + /** + * This method retrieves the place id. + * + * @return A string containing the unique identifier of the place whose + * details are to be obtained. + */ + String GetPlaceId() const; + + /** + * This method retrieves a BCP 47 code representing the search language. + * + * @return A string containing a BCP 47 identifier of the language. + */ + String GetLanguage() const; + + /** + * This method sets the langauge, using a BCP 47 identifier. + * + * @param sSearch A constant reference to a string containing a BCP 47 + * identifier of the language. + */ + void SetLanguage(const String& sLang); + + /** + * This method attempts to establish a connection with the server and then, + * if the connection has been established, builds and submits a query. + * + * @param rListener A reference to an object that is to be notified when the + * reply to the query has arrived from the server. + * + * @param pUserData A pointer to user data to be passed back within the + * corresponding reply object. + * + * @return Identifier of issued request. + */ + RestItemHandle::RequestId Execute(FinderQueryListener& rListener, Tizen::Maps::HereObject* pUserData = NULL, const char* pUrl="") const; + + /** + * This method retrieves error information associated with the query parameters + * + * @return A constant pointer to an object containing the error details. + */ + const FinderError* GetError() const; + + /** + * This static method returns the base URI to be used for all subsequent + * place detail queries. + * + * @return A string containing the base URI. + */ + static String GetBaseUri(); + + /** + * This static method returns the base URI to be used for all subsequent + * place detail queries. + * + * @param sUri A constant reference to a string containing the base URI. + */ + static void SetBaseUri(const String& sUri); + +private: + /** + * This method creates the URI for the request. + * + * @return URI request string. + */ + String CreateUri() const; + +private: + class PlaceDetailsQueryImpl; + PlaceDetailsQueryImpl* m_pImpl; + + static String s_sBaseUri; + +}; + +HERE_MAPS_END_NAMESPACE + +#endif // PLACE_DETAILS_QUERY_H diff --git a/inc/engine/finder/PlaceDetailsReply.h b/inc/engine/finder/PlaceDetailsReply.h new file mode 100755 index 0000000..1bbb36b --- /dev/null +++ b/inc/engine/finder/PlaceDetailsReply.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef PLACE_DETAILS_REPLY_H_ +#define PLACE_DETAILS_REPLY_H_ + +#include "common/HereMaps_global.h" +#include "finder/BaseFinderReply.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class PlaceDetails; + +/** + * This class encapsulates a response to a request for place details + * (PlaceDetailsQuery). + * + * \ingroup finder + */ +class EXPORT_API PlaceDetailsReply : public BaseFinderReply +{ +public: + + /** + * This is the default constructor. + */ + PlaceDetailsReply(); + + /** + * This is the destructor. + */ + ~PlaceDetailsReply(); + + /** + * This method retrieves the details of the place that have been returned by + * the server. + * + * @return An object containing the place details. + */ + PlaceDetails GetPlaceDetails() const; + +private: + void SetPlaceDetails(const PlaceDetails& rPlace); + bool OnDataReceived(const unsigned char* pBuffer, size_t uSize); + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(PlaceDetailsReply); + friend class TestPlaceDetailsReply; + + class PlaceDetailsReplyImpl; + PlaceDetailsReplyImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // PLACE_DETAILS_REPLY_H_ diff --git a/inc/engine/finder/PlaceItem.h b/inc/engine/finder/PlaceItem.h new file mode 100755 index 0000000..38eae3d --- /dev/null +++ b/inc/engine/finder/PlaceItem.h @@ -0,0 +1,234 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef PLACE_ITEM_H_ +#define PLACE_ITEM_H_ + +#include +#include "common/HereMaps_global.h" +#ifndef TIZEN_MIGRATION +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoCoordinates; +class Category; +class LinkObject; +class GeoBoundingBox; + +class PlaceItem; +/** + * This typedef defines a vector of place items as a type. + * + * \ingroup finder + */ +typedef std::vector< PlaceItem > PlaceItemList; + +/** + * This class encapsulates information about a place that has been returned as + * part of a reply to a search query (an item in a search result). This + * information can be used to obtain place details. + * + * \ingroup finder + */ +class EXPORT_API PlaceItem +{ +public: + + /** + * This method is the default constructor. + */ + PlaceItem(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + PlaceItem(const PlaceItem& rRhs); + + /** + * This method is the destructor. + */ + ~PlaceItem(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + PlaceItem& operator=(const PlaceItem& rRhs); + + /** + * This method retrieves the geographic coordinates of the given place. + * + * @return An object containing the geographic coordinates of the place. + */ + GeoCoordinates GetPosition() const; + + /** + * This method retrieves the distance in meters between the given place and + * the search context (center). + * + * @return A value indicating how far the given place lies from the search + * context (center). + */ + double GetDistance() const; + + /** + * This method retrieves a value that represents the average rating of the + * place by users. + * + * @return A value that represents the average rating of the place by users. + */ + double GetAverageRating() const; + + /** + * This method retrieves an object representing the category to which the + * given place is assigned. + * + * @return An object representing the category to which the given place is + * assigned. + */ + Category GetCategory() const; + + /** + * This method retrieves a link to a resource associated with the given + * place item. + * + * @return An object encapsulating a link to a resource. + */ + LinkObject GetLinkObject() const; + + /** + * This method retrieves text describing the location of the place. The text + * is typically derived from the address of the place, but may also contain + * any other information that can help the user understand, where the place is + * located. + * + * @return A string containing the description of the vicinity (location) of + * the place. + */ + String GetVicinity() const; + + /** + * This method retrieves a Boolean value indicating if the given search + * result is sponsored or not. + * + * @return true if the given search result is sponsored, + * otherwise false. + */ + bool GetIsSponsored() const; + + /** + * This method retrieves the bounding box enclosing the given place. + * + * @return An object representing the bounding box (defined in terms of the + * geographical coordinates of its top-left and bottom-right corners) + * that encloses the given place. + */ + GeoBoundingBox GetBBox() const; + + /** + * This method sets the geographic coordinates of the given place. + * + * @param rPosition GeoCoordinates A constant reference to a object + * containing the geographic coordinates of the place. + */ + void SetPosition(const GeoCoordinates& rPosition); + + /** + * This method sets the distance in meters between the given place and + * the search context (center). + * + * @param dDistance A value indicating how far the + * given place lies from the search context (center). + */ + void SetDistance(double dDistance); + + /** + * This method sets a value that represents the average rating of the + * place by users. + * + * @param dAverageRating A value that represents the average rating of the + * place by users. + */ + void SetAverageRating(double dAverageRating); + + /** + * This method sets an object representing the category to which the + * given place is assigned. + * + * @param rCategory A constant reference to an object representing the + * category to which the given place is assigned. + */ + void SetCategory(const Category& rCategory); + + /** + * This method sets text describing the location of the place. The text + * is typically derived from the address of the place, but may also contain + * any other information that may help the user understand, where the place is + * located. + * + * @param sVicinity A constant reference to a string containing the + * description of the vicinity (location) of the place. + */ + void SetVicinity(const String& sVicinity); + + /** + * This method sets a link to a resource associated with the given + * place item. + * + * @param rLinkObject A constant reference to an object encapsulating a link + * to a resource. + */ + void SetLinkObject(const LinkObject& rLinkObject); + + /** + * This method sets a Boolean value indicating if the given search + * result item is sponsored or not. + * + * @param bIsSponsored true if the given search result item is + * sponsored, otherwise false. + */ + void SetIsSponsored(bool bIsSponsored); + + /** + * This method sets the bounding box enclosing the given place. + * + * @param rBbox A constant reference to an object representing the bounding + * box (defined in terms of the geographical coordinates of its + * top-left and bottom-right corners) that encloses the given place. + */ + void SetBBox(const GeoBoundingBox& rBbox); + +private: + class PlaceItemImpl; + PlaceItemImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // PLACE_ITEM_H_ diff --git a/inc/engine/finder/PlacesError.h b/inc/engine/finder/PlacesError.h new file mode 100755 index 0000000..b9c8bf3 --- /dev/null +++ b/inc/engine/finder/PlacesError.h @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef PLACES_ERROR_H_ +#define PLACES_ERROR_H_ + +#include "common/HereMaps_global.h" +#include "common/ErrorBase.h" + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates an error condition that may arise when submitting + * places-related queries and retrieving results. + * + * \ingroup finder + */ +class PlacesError : public ErrorBase +{ +public: + /** + * This enumeration defines identifiers for both success and error + * conditions. + */ + enum ErrorCode + { + EC_NoError, ///< Indicates success. + EC_PlaceDoesNotExistError, ///< Indicates that the play does not exist. + EC_CategoryDoesNotExistError, ///< Indicates that the category does not exist. + EC_ParseError, ///< Indicates a parsing error. + EC_PermissionsError, ///< Indicates that the required + /// permissions are not in place. + EC_UnsupportedError, ///< Indicates that a query/operation is + /// not supported. + EC_BadArgumentError, ///< Indicates that an argument supplied + /// by the caller is bad or not recognized. + EC_CancelError, ///< Indicates that an error occurred when + /// attempting to cancel a request. + EC_UnknownError ///< Indicates an unspecified/unknown error. + }; + + /** + * This is a constructor for the class. + * + * @param aErrorCode A value representing the error code with which to + * initialize a new instance of the class. + */ + PlacesError(ErrorCode aErrorCode); + + /** + * This method is the (virtual) destructor for the class. + */ + virtual ~PlacesError(); + + /** + * This method retrieves a value representing the error code assigned to + * the given instance of the class. + * + * @return A value representing the error code assigned to + * the given instance of the class. + */ + ErrorCode GetErrorCode() const; + + /** + * This method retrieves a string representation of the given instance of + * the class. + * + * @return A String representation of + * the given instance of the class. The possible values are + * "No Error", "Place Doesn't exist", "Category doesn't exist", + * "Parse error", "Permissions error", "Unsupported error", + * "Bad argument", "Cancel error", "Unknown error", + * or "No defined error". + */ + virtual String ToString() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(PlacesError); + + class PlacesErrorImpl; + PlacesErrorImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // PLACES_ERROR_H_ diff --git a/inc/engine/finder/PlacesGlobals.h b/inc/engine/finder/PlacesGlobals.h new file mode 100755 index 0000000..577e106 --- /dev/null +++ b/inc/engine/finder/PlacesGlobals.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef PLACES_GLOBAL_H_ +#define PLACES_GLOBAL_H_ + +#include "common/HereMaps_global.h" + +#ifndef TIZEN_MIGRATION +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This typedef defines a list of strings as a type. + * + * \ingroup finder + * \typedef std::vector StringList + */ +typedef std::vector StringList; + +HERE_MAPS_END_NAMESPACE + +#endif // PLACES_GLOBAL_H_ diff --git a/inc/engine/finder/Ratings.h b/inc/engine/finder/Ratings.h new file mode 100755 index 0000000..87107be --- /dev/null +++ b/inc/engine/finder/Ratings.h @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef RATINGS_H_ +#define RATINGS_H_ + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates place ratings contributed by users. + * + * \ingroup finder + */ +class EXPORT_API Ratings +{ +public: + + /** + * This method is the default constructor. + */ + Ratings(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + Ratings(const Ratings& rRhs); + + /** + * This method is the destructor. + */ + ~Ratings(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + Ratings& operator=(const Ratings& rRhs); + + /** + * This method retrieves the average rating for a place. + * + * @return A value reflecting the average user rating for a place. + */ + double GetAverage() const; + + /** + * This method retrieves a value indicating how many users have rated a place. + * + * @return A value indicating how many users have rated a place. + */ + size_t GetCount() const; + + /** + * This method sets the average rating for a place. + * + * @param aAverage A value reflecting the average user rating for a place. + */ + void SetAverage(double aAverage); + + /** + * This method sets a value indicating how many users have rated a place. + * + * @param aCount A value indicating how many users have rated a place. + */ + void SetCount(size_t aCount); + +private: + class RatingsImpl; + RatingsImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // RATINGS_H_ diff --git a/inc/engine/finder/RelatedItem.h b/inc/engine/finder/RelatedItem.h new file mode 100755 index 0000000..2e55176 --- /dev/null +++ b/inc/engine/finder/RelatedItem.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef RELATED_ITEM_H_ +#define RELATED_ITEM_H_ + +#include "common/HereMaps_global.h" + +#ifndef TIZEN_MIGRATION +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates an item related to a place returned as part of a + * response to a query. + * + * \ingroup finder + */ +class EXPORT_API RelatedItem +{ +public: + + /** + * This method is the default constructor. + */ + RelatedItem(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + RelatedItem(const RelatedItem& rRhs); + + /** + * This method is the destructor. + */ + ~RelatedItem(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + RelatedItem& operator=(const RelatedItem& rRhs); + + /** + * This method retrieves the title/name of the related/recommended item. + * + * @return A string containing the title or name. + */ + String GetTitle() const; + + /** + * This method retrieves the type specifier for the related/recommended item. + * + * @return A string containing the type specifier for the + * related/recommended item. + */ + String GetType() const; + + /** + * This method retrieves a hyperlink that refers to the resource + * represented by the related/recommended item. + * + * @return A string containing a hyperlink that refers to the resource + * represented by the related/recommended item. + */ + String GetHref() const; + + /** + * This method sets the title/name of the related/recommended item. + * + * @param sTitle A constant reference to a string containing the title or + * name. + */ + void SetTitle(const String& sTitle); + + /** + * This method sets the type specifier for the related/recommended item. + * + * @param sType A constant reference to a string containing the type + * specifier for the related/recommended item. + */ + void SetType(const String& sType); + + /** + * This method sets a hyperlink that refers to the resource + * represented by the related/recommended item. + * + * @param uHref A constant reference to an object containing a hyperlink that + * refers to the resource represented by the related/recommended + * item. + */ + void SetHref(const String& uHref); + +private: + class RelatedItemImpl; + RelatedItemImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // RELATED_ITEM_H_ + diff --git a/inc/engine/finder/ReviewContent.h b/inc/engine/finder/ReviewContent.h new file mode 100755 index 0000000..a83f562 --- /dev/null +++ b/inc/engine/finder/ReviewContent.h @@ -0,0 +1,182 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef REVIEW_CONTENT_H_ +#define REVIEW_CONTENT_H_ + +#include +#include "common/HereMaps_global.h" +#ifndef TIZEN_MIGRATION +#include +#endif + +#include "finder/BaseContent.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class LinkObject; + +class ReviewContent; +/** + * This typedef defines a list or review content items as a type. + */ +typedef std::vector ReviewContentList; + +/** + * This class encapsulates the content of a review related to a place. + * + * \ingroup finder + */ +class EXPORT_API ReviewContent : public BaseContent +{ +public: + + /** + * This method is the default constructor. + */ + ReviewContent(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + ReviewContent(const ReviewContent& rRhs); + + /** + * This method is the (virtual) destructor. + */ + virtual ~ReviewContent(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + ReviewContent& operator=(const ReviewContent& rRhs); + + /** + * This method retrieves the review date as a string. + * + * @return A string containing the date of the review. + */ + String GetDateTime() const; + + /** + * This method retrieves the review title. + * + * @return A string containing the review title. + */ + String GetTitle() const; + + /** + * This method retrieves the review rating. + * + * @return A double containing the retrieved value of rating. + */ + double GetRating() const; + + /** + * This method retrieves the review description (text). + * + * @return A string containing the review + * description (text). + */ + String GetDescription() const; + + /** + * This method retrieves a link to the website of the user, who submitted + * the review. + * + * @return An object representing a link to the website of the user, who submitted + * the review. + */ + LinkObject GetUser() const; + + /** + * This method retrieves the BCP 47 identifier of the language used in the + * review. + * + * @return A string containing the identifier of the language used in the + * review. + */ + String GetLanguage() const; + + /** + * This method sets the review date as a string. + * + * @param rDateTime A constant reference to a string containing the date of + * the review. + */ + void SetDateTime(const String &rDateTime); + + /** + * This method sets the review title. + * + * @param rTitle A constant reference to a string containing the review + * title. + */ + void SetTitle(const String& rTitle); + + /** + * This method sets the review rating. + * + * @param dRating A double containing the retrieved value of rating. + */ + void SetRating(double dRating); + + /** + * This method sets the review description (text). + * + * @param sText A constant reference to a string containing the review + * description (text). + */ + void SetDescription(const String& sText); + + /** + * This method sets a link to the website of the user, who submitted + * the review. + * + * @param cUser A constant reference to an object representing a link to the + * website of the user, who submitted the review. + */ + void SetUser(const LinkObject& cUser); + + /** + * This method sets the BCP 47 identifier of the language used in the + * review. + * + * @param sLanguage A constant reference to a string containing the + * identifier of the language used in the review. + */ + void SetLanguage(const String& sLanguage); + +private: + class ReviewContentImpl; + ReviewContentImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // REVIEW_CONTENT_H_ diff --git a/inc/engine/finder/SearchContext.h b/inc/engine/finder/SearchContext.h new file mode 100755 index 0000000..68513f7 --- /dev/null +++ b/inc/engine/finder/SearchContext.h @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef SEARCH_CONTEXT_H_ +#define SEARCH_CONTEXT_H_ + +#include "common/HereMaps_global.h" +#ifndef TIZEN_MIGRATION +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoLocation; + +/** + * This class encapsulates the search context used in queries. The context + * defines the point around which the search is conducted or an area within + * which the search is conducted. + * + * \ingroup finder + */ +class SearchContext +{ +public: + + /** + * This method is the default constructor. + */ + SearchContext(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + SearchContext(const SearchContext& rRhs); + + /** + * This method is the destructor. + */ + ~SearchContext(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + SearchContext& operator=(const SearchContext& rRhs); + + /** + * This method retrieves a Boolean value that indicates if the retrieved + * location is different from the location context used in the search. The + * retrieved location is not the same as the location context, typically when + * the location context is implicit (derived from request headers). + * + * @return true if the retrieved location is different from the + * one used in the search, otherwise false. + */ + bool GetMoved() const; + + /** + * This method retrieves an object containing the details of the search + * context such as the geographic coordinates and street address. + * + * @return An object containing the details of the search context + * (geographic coordinates and address if available) + */ + GeoLocation GetLocation() const; + + /** + * This method retrieves the media type specifier for the given search + * context. + * + * @return A string containing the media type specifier for the search + * context, "urn:nlp-types:place". + */ + String GetType() const; + + /** + * This method retrieves the title of the given search context. + * + * @return A string containing the title of the search context. + */ + String GetTitle() const; + + /** + * This method retrieves a link to the details of the place at + * the center of the search context. Note that the link is available only if + * the search context points to a recognized place, rather than, for + * example, the middle of an ocean. + * + * @return A URI (link) to the details of the place at the center of the + * search context, if available. + */ + String GetHref() const; + + /** + * This method sets a Boolean value that indicates if the retrieved + * location is different from the location context used in the search. The + * retrieved location is not the same as the location context, typically when + * the location context is implicit (derived from request headers). + * + * @param bMoved true if the retrieved location is different from the + * one used in the search, otherwise false. + */ + void SetMoved(bool bMoved); + + /** + * This method sets an object containing the details of the search + * context such as the geographic coordinates and street address. + * + * @return A constant reference to an object containing the details of the + * search context (geographic coordinates and address if available) + */ + void SetLocation(const GeoLocation& rLocation); + + /** + * This method sets the media type specifier for the given search + * context. + * + * @param sType A constant reference to a string containing the media type + * specifier for the search context, "urn:nlp-types:place". + */ + void SetType(const String& sType); + + /** + * This method sets the title of the given search context. + * + * @param sTitle A constant reference to a string containing the title of + * the search context. + */ + void SetTitle(const String& sTitle); + + /** + * This method sets a link to the details of the place at + * the center of the search context. Note that the link is available only if + * the search context points to a recognized place, rather than, for + * example, the middle of an ocean. + * + * @param uHref A constant reference to a URI (link) to the details of the + * place at the center of the search context, if available. + */ + void SetHref(const String& uHref); + +private: + class SearchContextImpl; + SearchContextImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // SEARCH_CONTEXT_H_ diff --git a/inc/engine/finder/SearchItem.h b/inc/engine/finder/SearchItem.h new file mode 100755 index 0000000..5d983f2 --- /dev/null +++ b/inc/engine/finder/SearchItem.h @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef SEARCH_ITEM_H_ +#define SEARCH_ITEM_H_ + +#include +#include "common/HereMaps_global.h" +#ifndef TIZEN_MIGRATION +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class LinkObject; + +class SearchItem; +/** + * This typedef defines a list of search items as a type. + */ +typedef std::vector< SearchItem > SearchItemList; + +/** + * This class encapsulates a search item returned by the server as part of a + * response to a discovery query. + * + * \ingroup finder + */ +class SearchItem +{ +public: + + /** + * This method is the default constructor. + */ + SearchItem(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + SearchItem(const SearchItem& rRhs); + + /** + * This method is the destructor. + */ + ~SearchItem(); + + /** + * This is the assignment operator. + * + * @param rRhs An object whose contents are to be copied to the given + * instance. + * + * @return A reference to the given instance of the class after its contents + * have been updated. + */ + SearchItem& operator=(const SearchItem& rRhs); + + /** + * This method retrieves the link object from the given search item. The + * link points to another resource. + * + * @return An object containing a link to another resource. + */ + LinkObject GetLinkObject() const; + + /** + * This method retrieves the URI to the detailed information about the place + * to which the given search item refers. + * + * @return The URI of the detailed information about the + * place to which the given search item refers. + */ + String GetPlacesPath() const; + + /** + * This method retrieves a value representing the weighting of the given + * search item. + * + * @return A value that represents the weighting of the given + * search item. + */ + double GetWeight() const; + + /** + * This method sets the link object from the given search item. The + * link points to another resource. + * + * @param uLink A constant reference to an object containing a link to + * another resource. + */ + void SetLinkObject(const LinkObject& uLink); + + /** + * This method sets the URI to the detailed information about the place + * to which the given search item refers. + * + * @param uPlacesPath A constant reference to an object containing the URI + * of the detailed information about the place to which the given + * search item refers. + */ + void SetPlacesPath(const String& uPlacesPath); + + /** + * This method sets a value representing the weighting of the given + * search item. + * + * @param dWeight A value that represents the weighting of the given search + * item. + */ + void SetWeight(double dWeight); + +private: + + class SearchItemImpl; + SearchItemImpl* m_pImpl; + + friend class JsonParser; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // SEARCH_ITEM_H_ diff --git a/inc/engine/geocoder/GeoCoderQuery.h b/inc/engine/geocoder/GeoCoderQuery.h new file mode 100755 index 0000000..d88ca4a --- /dev/null +++ b/inc/engine/geocoder/GeoCoderQuery.h @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOCODERQUERY_H_ +#define GEOCODERQUERY_H_ + +#include "common/HereMaps_global.h" + +#include "geocoder/GeoCoderQueryBase.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class Address; +class GeoCoderReply; +class GeoBoundingBox; +class ApplicationContext; +class GeoCoderQueryListener; + +/** + * This class represents a geocoding query. + * + * Instances of this class are used to obtain the geographic coordinates of + * locations on the basis of an address (complete or partial) and/or a free text + * search string. + * + * @ingroup geocoding + */ +class EXPORT_API GeoCoderQuery : public GeoCoderQueryBase +{ +public: + + /** + * This is the default constructor. + */ + GeoCoderQuery(); + + /** + * This method is a constructor. + * + * @param rAddress A constant reference to an object providing the details + * of an address to use in the query. + */ + GeoCoderQuery(const Address& rAddress); + + /** + * This method is a constructor. + * + * @param rAddress A constant reference to an object that provides the details + * of an address to use in the query. + * + * @param sSearch A constant reference to a string containing the search + * text to use in the query. + */ + GeoCoderQuery(const Address& rAddress, const String& sSearch); + + /** + * This method is a constructor. + * + * @param sSearch A constant reference to a string containing the search + * text to use in the query. + */ + GeoCoderQuery(const String& sSearch); + + /** + * This method is a virtual destructor. + */ + virtual ~GeoCoderQuery(); + + /** + * This method sets the properties defining a circular area within which a + * search is to be conducted. The area is defined in terms of its center and + * radius. + * + * @param rCoord A constant reference to an object containing the latitude + * and longitude of the center of the proximity area (search center). + * + * @param rRadius A value specifying the radius of the search area in meters. + */ + void SetProximity(const GeoCoordinates& rCoord, float fRadius = 0); + + /** + * This method detects whether coordinates/proximity (the center of search area + * set or not). + * + * @return true if the proximity was set, + * otherwise false + */ + bool HasProximity() const; + + /** + * This method sets the address to be used in the query. + * + * @param rAddress A constant reference to an object providing the details + * of an address to use in the query. + */ + void SetAddress(const Address& rAddress); + + /** + * This method sets the search text to be used in the query. + * + * @param sSearch A constant reference to a string containing the search + * text to use in the query. + */ + void SetSearchtext(const String& sSearch); + + /** + * This method sets the map view using the bounding box object provided by + * the caller. The map view is a soft filter, which means that the + * response includes relevant results from within the map view, but also + * possibly from a wider area, and even relevant global results are + * also returned. + * + * @param rMapView A constant reference to a bounding box object that + * defines the map view in terms of the geographic coordinates of + * the top-left and bottom-right corners. + */ + void SetMapView(const GeoBoundingBox& rMapView); + + /** + * This method sets the bounding box to be used in the query. The bounding + * box is a hard filter in that the response includes relevant results from + * within the area it defines. + * + * @param A constant reference to an instance of + * GeoBoundingBox, representing a geographic area within + * which to perform the search. + */ + void SetBoundingBox(const GeoBoundingBox& rBoundingBox); + + /** + * This method sets the location identifier to be used in the query. + * + * @param sID a constant reference to a string containing the location + * identifier. + */ + + void SetLocationId(const String& sId); + + /** + * This method attempts to establish a connection + * with the server and then, if the connection has been established, it + * builds and submits a query. + * + * @param rListener A reference to an object that is to be notified when + * the reply to the query has arrived from the server. + * + * @param pUserData A pointer to user data to be passed back within the + * corresponding reply object. + * + * @return Identifier of issued request. + */ + RestItemHandle::RequestId Execute(GeoCoderQueryListener& rListener, Tizen::Maps::HereObject* pUserData = NULL) const; + + /** + * This method returns the base URI to be used for all subsequent + * geo coder queries. + * + * @return A string containing the base URI. + */ + String GetBaseUri() const; + + /** + * This method returns the base URI to be used for all subsequent + * geo coder queries. + * + * @param sUri A constant reference to a string containing the base URI. + */ + void SetBaseUri(const String& sUri); + +private: + /** + * This method creates the URI for the request. + * + * @return URI request string. + */ + String CreateUri() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoCoderQuery); + + class GeoCoderQueryImpl; + GeoCoderQueryImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif /* GEOCODERQUERY_H_ */ diff --git a/inc/engine/geocoder/GeoCoderQueryBase.h b/inc/engine/geocoder/GeoCoderQueryBase.h new file mode 100755 index 0000000..29df37d --- /dev/null +++ b/inc/engine/geocoder/GeoCoderQueryBase.h @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOCODERQUERYBASE_H +#define GEOCODERQUERYBASE_H + +#include "common/HereMaps_global.h" + +#include "common/BaseQuery.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class ApplicationContext; + +/** + * This is the base class for implementations of geocoding query classes. + * + * The virtual method require implementation in derived classes. + * + * \ingroup geocoding + */ +class EXPORT_API GeoCoderQueryBase : public BaseQuery +{ +public: + /** + * This enumeration defines identifiers for response attribute switches that + * indicate which attributes are to be included in query responses from the + * server. + */ + enum ResponseAttribute + { + RA_PerformedSearch, ///< Indicates that completed searches are to be included in the response. + RA_Label, ///< Indicates that labels are to be included in the response. + RA_DidYouMeanSuggestion, ///< Indicates that did-you-mean suggestions are to be included in the response. + RA_MatchQuality, ///< Indicates that match quality is to be included in the response. + RA_MatchType, ///< Indicates that match type specifiers are to be included in the response. + RA_MatchCode, ///< Indicates that match codes are to be included in the response. + RA_ParsedRequest, ///< Indicates that parsed requests are to be included in the response. + RA_All, ///< Indicates that all attributes are to be included in the response. + RA_None ///< Indicates that no attributes are to be included in the response. + }; + + /** + * This method is the destructor. + * + * @return + */ + ~GeoCoderQueryBase(); + + /** + * This method sets the properties defining a circular area within which a + * search is to be conducted. The area is defined in terms of its center and + * radius. + * + * @param rCoord A constant reference to an object containing the latitude + * and longitude of the center of the proximity area (search center). + * + * @param rRadius A value specifying the radius of the search area in meters. + */ + virtual void SetProximity(const GeoCoordinates& rCoord, float fRadius = 0) = 0; + + /** + * This method detects whether coordinates/proximity (the center of search area + * set or not). + * + * @return true if the proximity was set, + * otherwise false + */ + virtual bool HasProximity() const = 0; + + /** + * This method adds a language code provided by the caller to the list of + * preferred languages. + * + * @param sPreferredLang A constant reference to a string containing a BCP + * 47 language code (see also http://tools.ietf.org/html/rfc5646). + * identifying the preferred language. + */ + void AppendPreferredLanguage(const String& sPreferredLang); + + /** + * This method retrieves a value indicating the number of preferred + * languages that have been set. + * + * @return A value indicating how many preferred languages have been set. + */ + size_t GetNumPreferredLanguages() const; + + /** + * This method retrieves the preferred language identifier at the index + * specified by the caller. The identifier is a BCP 47 language code (see + * also http://tools.ietf.org/html/rfc5646). + * + * @param idx A value representing an index into the array of preferred + * languages from which to retrieve the language identifier. + * + * @return A constant pointer to a string containing the language identifier + * or NULL if the supplied index is not valid. + */ + const String* GetPreferredLanguage(size_t idx) const; + + /** + * This method sets a value indicating the maximum number of query results + * to be returned. + * + * @param uMaxResults A value indicating the maximum number of query results + * to be returned. + */ + void SetMaxResults(size_t uMaxResults); + + /** + * This method sets a value indicating which page is to be returned in a + * paging scenario. Note that the value has no effect unless a value + * indicating the maximum number of results to retrieve has been specified + * (see SetMaxResults). + * + * @param uPage An unsigned integer indicating the page number. + */ + void SetPageInformation(size_t uPage); + + /** + * This method allows the caller to set a value that determines the + * functionality and data delivered by the underlying version of the RESTful + * service. + * + * @param iValue An integer value that determines the functionality of (and + * data delivered by) the underlying RESTful service: + *
    + *
  • 0 - indicates the default behavior of the underlying RESTful + * service + *
  • + *
  • 1 - indicates the default behavior of the underlying service and: + *
    • reverse geocoding responses include area names if addresses + * cannot be determined
    • + *
    • addresses/locations can be matched at + * intersection level
    • + *
    + *
  • + *
  • 2 - as 1 plus: + *
    • reverse geocoding responses include the area + * display position (center)
    • + *
    • map version can be requested (and + * included in responses)
    • + *
    + *
  • + *
+ */ + void SetGenParameter(int iValue); + + + /** + * This method adds a response attribute specified by the caller. + * + * @param aAttr A value identifying the response attribute to add. + */ + void AddResponseAttribute(ResponseAttribute aAttr); + + /** + * This method removes the response attribute specified by the caller. + * + * @param aAttr A value identifying the response attribute to remove. + */ + void RemoveResponseAttribute(ResponseAttribute aAttr); + + /** + * This method adds a key-value pair representing an additional parameter + * and its value. + * + * @param sKey A constant reference to a string containing the name/key of + * the additional parameter. + * + * @param sValue A constant reference to a string containing the value of the + * additional parameter. + */ + void AddAdditionalParameter(const String& sKey, const String& sValue); + + /** + * This method returns the base URI to be used for all subsequent + * geo coder queries. + * + * @return A string containing the base URI. + */ + virtual String GetBaseUri() const = 0; + + /** + * This method returns the base URI to be used for all subsequent + * geo coder queries. + * + * @param sUri A constant reference to a string containing the base URI. + */ + virtual void SetBaseUri(const String& sUri) = 0; + +protected: + + /** + * This method is the default constructor. + */ + GeoCoderQueryBase(); + + /** + * This method obtains the base URL for the service named by the caller. + * + * @param sService A constant reference to a string that identifies the + * service whose base URL is to be obtained. + * + * @param sDst A reference to an object which is to receive the result. + * + * @return true if the base URL has been created successfully, + * otherwise false + */ + bool CreateBaseUrl(const String& sService, String& sDst) const; + + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoCoderQueryBase); + + class GeoCoderQueryBaseImpl; + GeoCoderQueryBaseImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/geocoder/GeoCoderQueryListener.h b/inc/engine/geocoder/GeoCoderQueryListener.h new file mode 100755 index 0000000..bcdb996 --- /dev/null +++ b/inc/engine/geocoder/GeoCoderQueryListener.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOCODERQUERYLISTENER_H +#define GEOCODERQUERYLISTENER_H + +#include "common/HereMaps_global.h" + +#include "common/QueryListener.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoCoderReply; + +/** + * This class encapsulates a listener facility that is informed when the results + * of a query become available. + * + * The class exposes a callback method that must be implemented by the derived + * classes to process the data received from the server. + * + * @ingroup geocoding + */ +class EXPORT_API GeoCoderQueryListener : public QueryListener +{ +public: + /** + * This method is the default constructor. + */ + GeoCoderQueryListener(); + + /** + * This method is the destructor. + */ + ~GeoCoderQueryListener(); + + /** + * This method is a callback invoked when data have arrived in response to a + * geocoding request. + * + * @param rReply A Constant reference to an object containing the response data. + */ + virtual void OnGeoCoderReply(const GeoCoderReply& rReply) = 0; + + #ifdef TIZEN_MIGRATION + /** + * This method is a callback invoked when geocoding request is failed. + * + * @param rReply A Constant reference to an object containing the response data. + */ + virtual void OnGeoCoderFailure(const GeoCoderReply& rReply) = 0; + #endif + +private: + + void OnReplySuccess(BaseReply& rReply); + + #ifdef TIZEN_MIGRATION + void OnFailure(const BaseReply& rReply); + #endif + +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/geocoder/GeoCoderReply.h b/inc/engine/geocoder/GeoCoderReply.h new file mode 100755 index 0000000..a821eb2 --- /dev/null +++ b/inc/engine/geocoder/GeoCoderReply.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOCODERREPLY_H_ +#define GEOCODERREPLY_H_ + +#include "common/HereMaps_global.h" +#include "common/BaseReply.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class Result; +class MetaInfo; + + +/** + * This class encapsulates a reply to a geocoding query. + * + * The class receives the response data returned by the server in reply to a + * query asynchronously. Notification that the data is available comes via a + * listener object registered on the class by calling AddListener(). + * + * @ingroup geocoding + */ +class EXPORT_API GeoCoderReply : public BaseReply +{ +public: + + /** + * This is the default constructor. + */ + GeoCoderReply(); + + /** + * This is a destructor. + */ + virtual ~GeoCoderReply(); + + /** + * This method retrieves a value indicating the number of results in the + * reply to the query. + * + * @return An integer value indicating the number of results. + */ + size_t GetNumResults() const; + + /** + * This method retrieves a result at the index specified by the caller. + * + * @param A value indicating the index of the result to retrieve. + * + * @return A constant pointer to an instance of Result. + */ + const Result* GetResult(size_t idx) const; + + /** + * This method retrieves the reply meta information. + * + * @return A constant pointer to an instance of MetaInfo. + */ + const MetaInfo* GetMetaInfo() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoCoderReply); + friend class TestGeoCoderParser; + + virtual bool OnDataReceived(const unsigned char* pBuffer, size_t uSize); + + class GeoCoderReplyImpl; + GeoCoderReplyImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif /* GEOCODERREPLY_H_ */ diff --git a/inc/engine/geocoder/GeoCoderReplyParser.h b/inc/engine/geocoder/GeoCoderReplyParser.h new file mode 100755 index 0000000..20fba2a --- /dev/null +++ b/inc/engine/geocoder/GeoCoderReplyParser.h @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOCODERREPLYPARSER_H +#define GEOCODERREPLYPARSER_H + +#include "common/HereMaps_global.h" + +#include +#include + +HERE_MAPS_BEGIN_NAMESPACE + +class Result; +class Address; +class MetaInfo; +class ErrorBase; +class ParserError; +class GeoLocation; +class GeoCoordinates; +class GeoBoundingBox; + +/** + * This class encapsulates a request reply parser. It provides methods dedicated + * to parsing specific nodes of the reply data and populating a destination + * object supplied by the caller. + * + * \ingroup geocoding + */ +class GeoCoderReplyParser +{ +public: + /** + * This method retrieves reply meta info held in the XML node supplied + * by the caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseMetaInfo(xmlNodePtr pNode, MetaInfo& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + + /** + * This method retrieves a result entry held in the XML node supplied + * by the caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseResultEntry(xmlNodePtr pNode, Result& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + + /** + * This method retrieves an address held in the XML node supplied + * by the caller + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseAddress(xmlNodePtr pNode, Address& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + + /** + * This method retrieves geographic coordinates held in the XML node supplied + * by the caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseCoordinate(xmlNodePtr pNode, GeoCoordinates& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + + /** + * This method retrieves location information held in the XML node supplied + * by the caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseLocation(xmlNodePtr pNode, GeoLocation& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + + /** + * This method retrieves match quality information held in the XML node supplied + * by the caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseMatchQualitites(xmlNodePtr pNode, Result& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + + /** + * This method retrieves held in the XML node supplied + * by the caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseBoundingBox(xmlNodePtr pNode, GeoBoundingBox& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + +private: + static bool ExtractContent(xmlNodePtr pNode, String& sDst, ParserError*& pError); + static bool ExtractNodeName(xmlNodePtr pNode, String& sDst, ParserError*& pError); + static xmlNodePtr FindChildNode(xmlNodePtr pNode, const char* pUTF8Literal); + + static void AppendOrSet(ParserError*& pError, ParserError* pLoc); + + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoCoderReplyParser); +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/geocoder/GeoCoderReplyParserError.h b/inc/engine/geocoder/GeoCoderReplyParserError.h new file mode 100755 index 0000000..e2879ff --- /dev/null +++ b/inc/engine/geocoder/GeoCoderReplyParserError.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOCODERERROR_H +#define GEOCODERERROR_H + +#include "common/HereMaps_global.h" + +#include "common/ErrorBase.h" + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates information about an error that + * may arise when a parsing a geocoding request. + * + * \ingroup geocoding + */ +class GeoCoderReplyParserError : public ErrorBase +{ +public: + /** + * This method is a constructor. + * + * @param sStr A constant reference to a string containing an error message. + */ + GeoCoderReplyParserError(const std::string& sStr); + + /** + * This method is a (virtual) destructor. + */ + virtual ~GeoCoderReplyParserError(); + + /** + * This method retrieves a string representation of the given instance of + * the class. + * + * @return A string containing the error information held in the given + * instance of the class. + */ + virtual String ToString() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoCoderReplyParserError); + + class GeoCoderReplyParserErrorImpl; + GeoCoderReplyParserErrorImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/geocoder/MetaInfo.h b/inc/engine/geocoder/MetaInfo.h new file mode 100755 index 0000000..bf10e66 --- /dev/null +++ b/inc/engine/geocoder/MetaInfo.h @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef METAINFO_H +#define METAINFO_H + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates meta information included in the search responses. + * + * \ingroup geocoding + */ +class MetaInfo +{ +public: + /** + * This method is the default constructor. + */ + MetaInfo(); + + /** + * This method is the copy constructor. + * + * @param rRhs A constant reference to an object whose contents are to be + * copied to the newly created instance of the class. + */ + MetaInfo(const MetaInfo& rRhs); + + /** + * This method is the destructor. + */ + ~MetaInfo(); + + /** + * This is the assignment operator. + * + * @param rRhs A constant reference to an instance of + * MetaInfo whose contents are to be copied into + * the given instance. + */ + MetaInfo& operator=(const MetaInfo& rRhs); + + /** + * This methos sets a key that can be used in subsequent requests to + * access the next n results. + * + * @param n A key that can be used in subsequent requests to + * access the next n results. + */ + void SetNextPageInformation(size_t n); + + /** + * This method retrieves a key that can be used in subsequent requests to + * access the next n results. + * + * @return A key that can be used in subsequent requests to + * access the next n results. + */ + bool GetNextPageInformation(size_t& rDst) const; + + /** + * This method sets a key that can be used in subsequent requests to + * access the previous n results. + * + * @param n A key that can be used in subsequent requests to + * access the previous n results. + */ + void SetPreviousPageInformation(size_t n); + + /** + * This method retrieves a key that can be used in subsequent requests to + * access the previous n results. + * + * @return A key that can be used in subsequent requests to + * access the previous n results. + */ + bool GetPreviousPageInformation(size_t& rDst) const; + + /** + * This method sets the timestamp indicating when the search was run. + * + * @param sTimestamp A constant reference to a string containing the + * timestamp indicating when the search was run. + */ + void SetTimestamp(const String& sTimestamp); + + /** + * This method retrieves the timestamp indicating when the search was run. + * + * @param rDst A reference to a string to which the + * timestamp indicating when the search was run is to be copied. + * + * @return true if the timestamp has been retrieved + * successfully, false if the time stamp cannot be + * retrieved. + */ + bool GetTimestamp(String& rDst) const; + +private: + class MetaInfoImpl; + MetaInfoImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/geocoder/Result.h b/inc/engine/geocoder/Result.h new file mode 100755 index 0000000..eaa19a8 --- /dev/null +++ b/inc/engine/geocoder/Result.h @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef RESULT_H +#define RESULT_H + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoLocation; + +/** + * This class encapsulates a result item returned by the server in response to a + * geocoding or reverse geocoding request. + * + * \ingroup geocoding + */ +class EXPORT_API Result +{ +public: + /** + * This enumeration defines identifiers for match levels -- they reflect how + * closely (to what level of detail) the result matches the request. + */ + enum MatchLevel + { + ML_Unknown = -1, ///< Indicates that the match level is unknown. + ML_Country = 0, ///< Indicates country match. + ML_State, ///< Indicates state match. + ML_County, ///< Indicates county match. + ML_City, ///< Indicates city match. + ML_District, ///< Indicates district match. + ML_Street, ///< Indicates street match. + ML_Intersection, ///< Indicates intersection match. + ML_HouseNumber, ///< Indicates house-number match. + ML_PostalCode, ///< Indicates postal code match. + ML_Suite, ///< Indicates suite match. + ML_Floor ///< Indicates floor match. + }; + + /** + * This method is the default constructor. + */ + Result(); + + /** + * This method is the destructor. + */ + ~Result(); + + /** + * This method sets location details for the given result. + * + * @param rLocation A constant reference to an object containing the + * location details. + */ + void SetLocation(const GeoLocation& rLocation); + + /** + * This method retrieves the location details from the given result object. + * + * @param rLocation A constant reference to an object containing the + * location details. + */ + const GeoLocation& GetLocation() const; + + /** + * This method sets the relevance value on the given result. + * + * @param A float indicating the relevance of the given result in the range + * [0..1], where 1 indicates maximum relevance. + */ + void SetRelevance(float fValue); + + /** + * This method retrieves a value indicating the relevance of the given result. + * + * @param A float indicating the relevance of the given result; the value is + * in the range [0..1], where 1 indicates maximum relevance. + */ + float GetRelevance() const; + +#ifdef TIZEN_CUSTOMIZATION + /** + * This method sets a value representing the distance for the given result. + * + * @param fValue A value indicating distance. + */ + void SetDistance(float fValue); + + /** + * This method retrieves a value representing the distance for the given + * result. + * + * @return A value indicating distance. + */ + float GetDistance() const; +#endif + + /** + * This method sets a value representing the match level for the given + * result. + * + * @param aLevel A value indicating match level (see also + * Result::MatchLevel). + */ + void SetMatchLevel(MatchLevel aLevel); + + /** + * This method sets a value representing the match level for the given + * result. + * + * @param sLevel A constant reference to a string indicating the match level + * to set (see also Result::MatchLevel). The value of + * the string must be one of "country", "state", "county", "city", + * "street", "intersection", "housenumber", "postalcode", "suite", + * "floor", "district". + */ + void SetMatchLevel(const String& sLevel); + + /** + * This method retrieves a value representing the match level for the given + * result. + * + * @return A value indicating match level (see also + * Result::MatchLevel). + */ + MatchLevel GetMatchLevel() const; + + /** + * This method adds a match level indicator and sets the associated match + * quality value. + * + * @param aMatchLevel A value indicating the match level to set (see also + * Result::MatchLevel). + * + * @param fQuality A float value indicating the match quality. + */ + void AddMatchQuality(MatchLevel aMatchLevel, float fQuality); + + /** + * This method adds a match level indicator and sets the associated match + * qualityf value. + * + * @param sLevel A constant reference to a string indicating the match level + * to set (see also Result::MatchLevel). The value of + * the string must be one of "country", "state", "county", "city", + * "street", "intersection", "housenumber", "postalcode", "suite", + * "floor", "district". + * + * @param fQuality A float value indicating the match quality. + */ + void AddMatchQuality(const String& sLevel, float fQuality); + + /** + * This method retrieves a value representing match quality of the given + * result for the match level specified by the caller. + * + * @param aMatchLevel A value indicating the match level to set (see also + * Result::MatchLevel). + * + * @return A float value indicating the match quality. + */ + float GetMatchQuality(MatchLevel aMatchLevel) const; + + /** + * This method retrieves the number of match quality values available for + * the given result. + * + * @return A value indicating the number of match quality values. + */ + unsigned int GetNumMatchQualities() const; + + /** + * This method retrieves a value identifying the match level at the index + * specified by the caller. + * + * @param uIdx A value representing the index from which to retrieve the + * match level indicator (value). Note that the index must not be + * greater than the return value from + * Result::GetNumMatchQualities(). + * + * @return A value indicating the match level at the index specified by the + * caller (see also Result::MatchLevel). + */ + MatchLevel GetMatchQualityLevel(unsigned int uIdx) const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(Result); + + class ResultImpl; + ResultImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/geocoder/ReverseGeoCoderQuery.h b/inc/engine/geocoder/ReverseGeoCoderQuery.h new file mode 100755 index 0000000..1a633e8 --- /dev/null +++ b/inc/engine/geocoder/ReverseGeoCoderQuery.h @@ -0,0 +1,164 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef REVERSEGEOCODERQUERY_H +#define REVERSEGEOCODERQUERY_H + +#include "common/HereMaps_global.h" + +#include "geocoder/GeoCoderQueryBase.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoCoderReply; +class GeoCoordinates; +class GeoCoderQueryListener; + +/** + * This class represents a reverse geocoding query. + * + * Instances of the class are used to obtain an address (or a set of addresses) + * corresponding to a set of geographic coordinates. + * + * @ingroup geocoding + */ +class EXPORT_API ReverseGeoCoderQuery : public GeoCoderQueryBase +{ +public: + /** + * This enumeration defines identifiers for reverse geocoding modes. A mode + * indicates whether addresses are to be returned or + * administrative area names (such as city, county, state, country). + */ + enum ReverseMode + { + RM_RetrieveAreas, ///< Indicates that administrative area names are to be retrieved. + RM_RetrieveAddresses ///< Indicates that addresses are to be retrieved. + }; + + /** + * This method is the default constructor. + */ + ReverseGeoCoderQuery(); + + /** + * This method is a constructor that initializes the query with the location + * to reverse-geocode and the mode. + * + * @param rCoordinate A constant reference to an object containing the geographic + * coordinates of the location to reverse-geocode. + * + * @param aMode A value indicating the reverse geocoding mode to use. + */ + ReverseGeoCoderQuery(const GeoCoordinates& rCoordinate, ReverseMode aMode); + + /** + * This method is a constructor that initializes the query with the location + * to reverse-geocode, the mode and the radius within which to conduct the + * search. + * + * @param rCoordinate A constant reference to an object containing the geographic + * coordinates of the location to reverse-geocode. + * + * @param aMode A value indicating the reverse geocoding mode to use. + * + * @param fRadius A float value indicating the radius (in meters) within + * which to search. + */ + ReverseGeoCoderQuery(const GeoCoordinates& rCoordinate, ReverseMode aMode, float fRadius); + + /** + * This method is the (virtual) destructor. + */ + virtual ~ReverseGeoCoderQuery(); + + /** + * This method sets the properties defining a circular area within which a + * search is to be conducted. The area is defined in terms of its center and + * radius. + * + * @param rCoord A constant reference to an object containing the latitude + * and longitude of the center of the proximity area (search center). + * + * @param rRadius A value specifying the radius of the search area in meters. + */ + void SetProximity(const GeoCoordinates& rCoord, float fRadius = 0); + + /** + * This method detects whether coordinates/proximity (the center of search area + * set or not). + * + * @return true if the proximity was set, + * otherwise false + */ + bool HasProximity() const; + + /** + * This method sets the reverse geocoding mode to apply to the query. + * + * @param aMode A value indicating the reverse geocoding mode to use. + */ + void SetMode(ReverseMode aMode); + + /** + * This method attempts to establish a connection + * with the server and then, if the connection has been established, it + * builds and submits a query. + * + * @param rListener A shared pointer to an object that is to be notified when + * the reply to the query has arrived from the server. + * + * @param pUserData A pointer to user data to be echoed in the reply object. + * + * @return A value representing the identifier of the issued request. + */ + RestItemHandle::RequestId Execute(GeoCoderQueryListener& rListener, Tizen::Maps::HereObject* pUserData = NULL) const; + + /** + * This method returns the base URI to be used for all subsequent + * reverse geocoder queries. + * + * @return A string containing the base URI. + */ + String GetBaseUri() const; + + /** + * This method returns the base URI to be used for all subsequent + * reverse geocoder queries. + * + * @param sUri A constant reference to a string containing the base URI. + */ + void SetBaseUri(const String& sUri); + +private: + /** + * This method creates the URI for the request. + * + * @return URI request string. + */ + String CreateUri() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(ReverseGeoCoderQuery); + + class ReverseGeoCoderQueryImpl; + ReverseGeoCoderQueryImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/graphic/Bitmap.h b/inc/engine/graphic/Bitmap.h new file mode 100755 index 0000000..07b0162 --- /dev/null +++ b/inc/engine/graphic/Bitmap.h @@ -0,0 +1,68 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_GRAPHIC_BITMAP_H +#define HERE_GRAPHIC_BITMAP_H + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" +#include "graphic/Dimension.h" +#include "graphic/Rectangle.h" +#include "graphic/BufferInfo.h" + + +TIZEN_MAPS_BEGIN_NAMESPACE + +enum BitmapPixelFormat +{ + BITMAP_PIXEL_FORMAT_RGB565 = 1, /**< The RGB565 pixel format */ + BITMAP_PIXEL_FORMAT_ARGB8888, /**< The ARGB8888 pixel format */ + BITMAP_PIXEL_FORMAT_R8G8B8A8, /**< The R8G8B8A8 pixel format, the order of the color component is guaranteed by the byte unit */ + BITMAP_PIXEL_FORMAT_MAX, // This enum value is for internal use only. Using this enum value can cause behavioral, security-related, and consistency-related issues in the application. + BITMAP_PIXEL_FORMAT_MIN = 0 // This enum value is for internal use only. Using this enum value can cause behavioral, security-related, and consistency-related issues in the application. +}; + +class EXPORT_API Bitmap : public Object +{ +public: + Bitmap(void); + + virtual ~Bitmap(void); + + result Construct(const Dimension& dim, BitmapPixelFormat bitmapPixelFormat=BITMAP_PIXEL_FORMAT_R8G8B8A8); + result Construct(const Bitmap& bitmap, const Rectangle& rect); + result Construct(const byte* pBuffer, int bufferSize, const Dimension& dim, BitmapPixelFormat bitmapPixelFormat=BITMAP_PIXEL_FORMAT_R8G8B8A8); + result Lock(BufferInfo& info, long timeout = INFINITE); + result Unlock(void); + + int GetWidth(void) const; + int GetHeight(void) const; + void SetAlphaConstant(int opacity); + unsigned char* GetBuffer() const; + BitmapPixelFormat GetPixelColorFormat() const; +private: + int width; + int height; + int bytes_per_pixel; + BitmapPixelFormat pixel_format; + unsigned char* buffer; + + void BitBlt(int xDest, int yDest, unsigned char *pSrcBuffer, int xSour, int ySour, int wSour, int hSour, int nPitch, unsigned long opacity = 255); +}; + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_GRAPHIC_BITMAP_H */ diff --git a/inc/engine/graphic/BufferInfo.h b/inc/engine/graphic/BufferInfo.h new file mode 100755 index 0000000..6bad4a9 --- /dev/null +++ b/inc/engine/graphic/BufferInfo.h @@ -0,0 +1,291 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_GRAPHIC_BUFFERINFO_H +#define HERE_GRAPHIC_BUFFERINFO_H + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" +#include "graphic/Rectangle.h" + +#if 0 +typedef enum +{ + PIXEL_FORMAT_RGB565 = 1, /**< The RGB565 pixel format */ + PIXEL_FORMAT_ARGB8888, /**< The ARGB8888 pixel format */ + PIXEL_FORMAT_R8G8B8A8, /**< The R8G8B8A8 pixel format @n + The order of color component is guaranteed by the byte unit. */ + PIXEL_FORMAT_YCbCr420_PLANAR, /**< The 8-bit Y-plane followed by 8-bit 2x2 sub sampled U-plane and V-plane */ + PIXEL_FORMAT_JPEG, /**< The encoded format */ + PIXEL_FORMAT_NV12, /**< The NV12 pixel format */ + PIXEL_FORMAT_UYVY, /**< The UYVY pixel format */ + PIXEL_FORMAT_MAX, // This enum value is for internal use only. Using this enum value can cause behavioral, security-related, and consistency-related issues in the application. + PIXEL_FORMAT_MIN = 0 // This enum value is for internal use only. Using this enum value can cause behavioral, security-related, and consistency-related issues in the application. +} PixelFormat; +#endif + +TIZEN_MAPS_BEGIN_NAMESPACE + +class BufferInfo; + +class _BufferInfoImpl +{ +public: + enum + { + INVALID_BUFFER_HANDLE = 0 + }; + + enum Orientation + { + ORIENTATION_PORTRAIT, + ORIENTATION_LANDSCAPE, + ORIENTATION_PORTRAIT_REVERSE, + ORIENTATION_LANDSCAPE_REVERSE + }; + + enum HandleType + { + HANDLE_TYPE_NONE, + HANDLE_TYPE_OVERLAY_REGION, + HANDLE_TYPE_VE_SURFACE, + HANDLE_TYPE_CANVAS_TEXTURE, + HANDLE_TYPE_NATIVE_PIXMAP + }; + + enum Rotation + { + ROTATION_0, + ROTATION_90, + ROTATION_180, + ROTATION_270 + }; + + /** + * This is the default constructor for this class. + */ + _BufferInfoImpl(); + + /** + * This is the destructor for this class. + */ + virtual ~_BufferInfoImpl(); + + /* + * Gets the handle of the current instance of _BufferInfoImpl. + * + * @return The runtime handle + * + */ + int GetHandle(HandleType handleType) const; + + void* GetUserData(HandleType handleType) const; + + /* + * Sets the handle of the current instance of _BufferInfoImpl. + * + */ + void SetHandle(HandleType handleType, int handle, void* pUserData = null); + + /* + * Gets the orientation of the current instance of _BufferInfoImpl. + * + */ + Orientation GetOrientation(void) const; + + /* + * Sets the orientation of the current instance of _BufferInfoImpl. + * + */ + void SetOrientation(Orientation orientation); + + /* + * Gets the bounds of the current instance of _BufferInfoImpl. + * + */ + Rectangle GetBounds(void) const; + + /* + * Sets the bounds of the current instance of _BufferInfoImpl. + * + */ + void SetBounds(const Rectangle& rect); + + /* + * Gets the rotation of the current instance of _BufferInfoImpl. + * + */ + Rotation GetRotation(void) const; + + /* + * Sets the rotation of the current instance of _BufferInfoImpl. + * + */ + void SetRotation(Rotation rotation); + + static _BufferInfoImpl* GetInstance(BufferInfo& bufferInfo); + static const _BufferInfoImpl* GetInstance(const BufferInfo& bufferInfo); + +private: + /** + * This is the default copy constructor for this class. + */ + _BufferInfoImpl(const _BufferInfoImpl& src); + + /** + * This is the default assignment operator for this class. + */ + _BufferInfoImpl& operator =(const _BufferInfoImpl& rhs); + + friend class BufferInfo; + + HandleType __handleType; + int __handle; + void* __pUserData; + Orientation __orientation; + Rectangle __bounds; + Rotation __rotation; + +}; // _BufferInfoImpl + +class BufferInfo : public Object +{ +public: + /** + * This is the default constructor for this class. + * + * @since 2.0 + */ + BufferInfo(void); + + /** + * This is the copy constructor for the %BufferInfo class. + * + * @since 2.0 + * + * @param[in] rhs An instance of %BufferInfo + */ + BufferInfo(const BufferInfo& rhs); + + /** + * This is the destructor for this class. + * + * @since 2.0 + */ + virtual ~BufferInfo(void); + + /** + * This is the default assignment operator for this class. + * + * @since 2.0 + * + * @param[in] rhs An instance of %BufferInfo + */ + BufferInfo& operator =(const BufferInfo& rhs); + + /** + * Checks whether the value of the specified instance equals the value of the current instance. + * + * @since 2.0 + * + * @return @c true if the value of the current instance equals the value of the specified instance, @n + * else @c false + * @param[in] rhs The object to compare with the current instance + */ + virtual bool Equals(const Object& rhs) const; + + /** + * Gets the hash value of the current instance. + * + * @since 2.0 + * + * @return An integer value indicating the hash value of the current instance + */ + virtual long GetHashCode(void) const; + +public: + /** + * The width of the buffer's logical dimensions in pixels. + * + * @since 2.0 + */ + int width; + + /** + * The height of the buffer's logical dimensions in pixels. + * + * @since 2.0 + */ + int height; + + /** + * The length of the buffer scan-line in bytes. + * + * @since 2.0 + */ + int pitch; + + /** + * The bits per pixel of the buffer. + * + * @since 2.0 + */ + int bitsPerPixel; + + /** + * The color format of the buffer. + * + * @since 2.0 + */ + enum PixelFormat + { + PIXEL_FORMAT_RGB565 = 1, /**< The RGB565 pixel format */ + PIXEL_FORMAT_ARGB8888, /**< The ARGB8888 pixel format */ + PIXEL_FORMAT_R8G8B8A8, /**< The R8G8B8A8 pixel format @n + The order of color component is guaranteed by the byte unit. */ + PIXEL_FORMAT_YCbCr420_PLANAR, /**< The 8-bit Y-plane followed by 8-bit 2x2 sub sampled U-plane and V-plane */ + PIXEL_FORMAT_JPEG, /**< The encoded format */ + PIXEL_FORMAT_NV12, /**< The NV12 pixel format */ + PIXEL_FORMAT_UYVY, /**< The UYVY pixel format */ + PIXEL_FORMAT_MAX, // This enum value is for internal use only. Using this enum value can cause behavioral, security-related, and consistency-related issues in the application. + PIXEL_FORMAT_MIN = 0 // This enum value is for internal use only. Using this enum value can cause behavioral, security-related, and consistency-related issues in the application. + }; + + PixelFormat pixelFormat; + + /** + * A pointer to the actual locked pixel bits. + * + * @since 2.0 + */ + void* pPixels; + +private: + friend class _BufferInfoImpl; + + // + // This variable is for internal use only. + // Using this variable can cause behavioral, security-related, and consistency-related issues in the application. + // + // @since 2.0 + // + class _BufferInfoImpl * __pImpl; + +}; // BufferInfo + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_GRAPHIC_BUFFERINFO_H */ diff --git a/inc/engine/graphic/Canvas.h b/inc/engine/graphic/Canvas.h new file mode 100755 index 0000000..7c14229 --- /dev/null +++ b/inc/engine/graphic/Canvas.h @@ -0,0 +1,57 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_GRAPHIC_CANVAS_H +#define HERE_GRAPHIC_CANVAS_H + +#include +#include +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" +#include "graphic/Color.h" +#include "graphic/BufferInfo.h" +#include "graphic/FloatPoint.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class Canvas : public Object +{ +public: + typedef std::vector tPoint; + Canvas(void); + virtual ~Canvas(void); + result Construct(const BufferInfo& bufferInfo); + result FillPolygon(const Color& color, const tPoint& points); + result DrawPolyline(const tPoint& points); + result SetLineWidth(int width); + void SetForegroundColor(const Color& fgColor); +protected: + void* _pNativeGfxEngine; +private: + unsigned long __ComposeColor(unsigned long color32, int opacity); + void __SetColor(cairo_t* pCairo, unsigned long composedColor); + + unsigned long* __pBuffer; + unsigned long __fgColor; + int __lineWidth; + cairo_operator_t __cairo_operator; + Color __fgColorNative; + int __fgOpacity; +}; + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_GRAPHIC_CANVAS_H */ diff --git a/inc/engine/graphic/Color.h b/inc/engine/graphic/Color.h new file mode 100755 index 0000000..db68462 --- /dev/null +++ b/inc/engine/graphic/Color.h @@ -0,0 +1,483 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_GRAPHIC_COLOR_H +#define HERE_GRAPHIC_COLOR_H + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class EXPORT_API Color; + +/** + * @class Color32 + * @brief This template code makes a 32-bit combination from each color component. + * @since 2.0 + * + * The following example demonstrates how to use this template code. + * + * @code + * + * #include + * + * using namespace Tizen::Graphics; + * + * // 0xFFFF00FF: Opaque magenta + * const unsigned int MY_COLOR1 = Color32<255, 0, 255>::Value; + * + * // 0x80FF0000: Red with 50% opacity + * const unsigned int MY_COLOR2 = Color32<255, 0, 0, 128>::Value; + * + * @endcode + */ +template +struct Color32 +{ + enum + { + Value = static_cast(alpha) << 24 | + static_cast(red) << 16 | + static_cast(green) << 8 | + static_cast(blue) + }; +}; + +/** + * @enum ColorId + * + * Defines the color ID. + * + * @since 2.0 + */ +enum ColorId +{ + COLOR_ID_BLACK, /**< This attribute is pre-defined. Its value is black. */ + COLOR_ID_BLUE, /**< This attribute is pre-defined. Its value is blue. */ + COLOR_ID_CYAN, /**< This attribute is pre-defined. Its value is cyan. */ + COLOR_ID_GREEN, /**< This attribute is pre-defined. Its value is green. */ + COLOR_ID_GREY, /**< This attribute is pre-defined. Its value is grey. */ + COLOR_ID_MAGENTA, /**< This attribute is pre-defined. Its value is magenta. */ + COLOR_ID_RED, /**< This attribute is pre-defined. Its value is red. */ + COLOR_ID_VIOLET, /**< This attribute is pre-defined. Its value is violet. */ + COLOR_ID_YELLOW, /**< This attribute is pre-defined. Its value is yellow. */ + COLOR_ID_WHITE /**< This attribute is pre-defined. Its value is white. */ +}; + +/** + * @class Color + * @brief This class encapsulates a color. + * + * @since 2.0 + * + * @final This class is not intended for extension. + * + * The %Color class provides an ARGB (Alpha, Red, Green, Blue) color model. + * + * For more information on the class features, see Color. + */ +class Color : public Object +{ + +public: + /** + * This is the default constructor for this class. + * + * @since 2.0 + */ + Color(void); + + /** + * This is the copy constructor for the %Color class. @n + * This constructor initializes the instance of %Color with the attributes of the specified instance of %Color. + * + * @since 2.0 + * + * @param[in] rhs An instance of %Color + */ + Color(const Color& rhs); + + /** + * Initializes the instance of %Color with the specified ARGB values. + * + * @since 2.0 + * + * @param[in] r The red component + * @param[in] g The green component + * @param[in] b The blue component + * @param[in] a The alpha component + */ + Color(byte r, byte g, byte b, byte a = 0xFF); + + /** + * Initializes the instance of %Color with the specified RGB value. + * + * @since 2.0 + * + * @param[in] rgb The RGB color value + * @param[in] hasAlpha Set to @c true if @c rgb contains an alpha value, @n + * else @c false + */ + Color(unsigned int rgb, bool hasAlpha = true); + + /** + * This is the destructor for this class. + * + * @since 2.0 + */ + virtual ~Color(void); + + +public: + /** + * Checks whether the two instances of %Color are equal. + * + * @since 2.0 + * + * @return @c true if the values of the two instances of %Color are equal, @n + * else @c false + * @param[in] rhs An instance of %Color + */ + bool operator ==(const Color& rhs) const; + + /** + * Checks whether the two instances of %Color are not equal. + * + * @since 2.0 + * + * @return @c true if the values of the two instances of %Color are not equal, @n + * else @c false + * @param[in] rhs An instance of %Color + * + */ + bool operator !=(const Color& rhs) const; + + /** + * Assigns the values of the RGB components of the specified instance to the current instance of %Color. + * + * @since 2.0 + * + * @return The reference to the instance of %Color + * @param[in] rhs An instance of %Color + */ + Color& operator =(const Color& rhs); + + +public: + /** + * Checks whether the current instance of %Color equals the specified instance of %Color. + * + * @since 2.0 + * + * @return @c true if the values of the current instance is equal to the value of the specified instance, @n + * else @c false + * @param[in] rhs An instance of %Color + * @remarks + * - This method overrides Tizen::Base::Object::Equals(). + * - This method uses the values of the RGB components to compare the two instances. + */ + virtual bool Equals(const Object& rhs) const; + + /** + * Gets the hash value of the current instance of %Color. + * + * @since 2.0 + * + * @return The hash value of the current instance + * @remarks Two equal instances must return the same hash value. @n For better performance, + * the used hash function must generate a random distribution for all inputs. + */ + virtual long GetHashCode(void) const; + + +public: + /** + * Gets the value of the alpha component of the current instance of %Color. + * + * @since 2.0 + * + * @return A @c byte representation of the alpha component of the current instance of %Color + */ + byte GetAlpha(void) const; + + /** + * Gets the value of the red component of the current instance of %Color. + * + * @since 2.0 + * + * @return A @c byte representation of the red component of the current instance of %Color + */ + byte GetRed(void) const; + + /** + * Gets the value of the blue component of the current instance of %Color. + * + * @since 2.0 + * + * @return A @c byte representation of the blue component of the current instance of %Color + */ + byte GetBlue(void) const; + + /** + * Gets the value of the green component of the current instance of %Color. + * + * @since 2.0 + * + * @return A @c byte representation of the green component of the current instance of %Color + */ + byte GetGreen(void) const; + + /** + * Gets the ARGB components of the current instance of %Color. + * + * @since 2.0 + * + * @param[out] r The red component + * @param[out] g The green component + * @param[out] b The blue component + * @param[out] a The alpha component + */ + void GetColorComponents(byte& r, byte& g, byte& b, byte& a) const; + + /** + * Gets the 32-bit integer value of the current instance of %Color. + * + * @since 2.0 + * + * @return An @c unsigned integer value representing the current instance of %Color + */ + unsigned int GetRGB32(void) const; + + /** + * Sets the value of the alpha component of the current instance of %Color. + * + * @since 2.0 + * + * @param[in] a The new value of the alpha component + */ + void SetAlpha(byte a); + + /** + * Sets the value of the red component of the current instance of %Color. + * + * @since 2.0 + * + * @param[in] r The new value of the red component + */ + void SetRed(byte r); + + /** + * Sets the value of the green component of the current instance of %Color. + * + * @since 2.0 + * + * @param[in] g The new value of the green component + */ + void SetGreen(byte g); + + /** + * Sets the value of the blue component of the current instance of %Color. + * + * @since 2.0 + * + * @param[in] b The new value of the blue component + */ + void SetBlue(byte b); + + /** + * Sets the values of the ARGB components of the current instance of %Color. + * + * @since 2.0 + * + * @param[in] r The red component + * @param[in] g The green component + * @param[in] b The blue component + * @param[in] a The alpha component + */ + void SetColorComponents(byte r, byte g, byte b, byte a = 0xFF); + + /** + * Sets the current instance of %Color to the specified 32-bit integer value. + * + * @since 2.0 + * + * @param[in] rgb The new RGB color value + * @param[in] hasAlpha @c true if @c rgb contains alpha value, @n + else @c false + */ + void SetRGB32(unsigned int rgb, bool hasAlpha = true); + + /** + * Gets the %Color object for the specified color. + * + * @since 2.0 + * @return The %Color object + * @param[in] colorId The enum value for the specified color + */ + static Color GetColor(ColorId colorId); + + +public: + /** + * @if OSPDEPREC + * This attribute is pre-defined. Its value is black. + * + * @brief [Deprecated] + * @since 2.0 + * + * @deprecated This object is provided only for backward compatibility and will be deleted in a future release. + * Instead of using this static constant, it is recommended to use GetColor(COLOR_ID_BLACK). + * @endif + */ + const static Color COLOR_BLACK; + + /** + * @if OSPDEPREC + * This attribute is pre-defined. Its value is blue. + * + * @brief [Deprecated] + * @since 2.0 + * + * @deprecated This object is provided only for backward compatibility and will be deleted in a future release. + * Instead of using this static constant, it is recommended to use GetColor(COLOR_ID_BLUE). + * @endif + */ + const static Color COLOR_BLUE; + + /** + * @if OSPDEPREC + * This attribute is pre-defined. Its value is cyan. + * + * @brief [Deprecated] + * @since 2.0 + * + * @deprecated This object is provided only for backward compatibility and will be deleted in a future release. + * Instead of using this static constant, it is recommended to use GetColor(COLOR_ID_CYAN). + * @endif + */ + const static Color COLOR_CYAN; + + /** + * @if OSPDEPREC + * This attribute is pre-defined. Its value is green. + * + * @brief [Deprecated] + * @since 2.0 + * + * @deprecated This object is provided only for backward compatibility and will be deleted in a future release. + * Instead of using this static constant, it is recommended to use GetColor(COLOR_ID_GREEN). + * @endif + */ + const static Color COLOR_GREEN; + + /** + * @if OSPDEPREC + * This attribute is pre-defined. Its value is grey. + * + * @brief [Deprecated] + * @since 2.0 + * + * @deprecated This object is provided only for backward compatibility and will be deleted in a future release. + * Instead of using this static constant, it is recommended to use GetColor(COLOR_ID_GREY). + * @endif + */ + const static Color COLOR_GREY; + + /** + * @if OSPDEPREC + * This attribute is pre-defined. Its value is magenta. + * + * @brief [Deprecated] + * @since 2.0 + * + * @deprecated This object is provided only for backward compatibility and will be deleted in a future release. + * Instead of using this static constant, it is recommended to use GetColor(COLOR_ID_MAGENTA). + * @endif + */ + const static Color COLOR_MAGENTA; + + /** + * @if OSPDEPREC + * This attribute is pre-defined. Its value is red. + * + * @brief [Deprecated] + * @since 2.0 + * + * @deprecated This object is provided only for backward compatibility and will be deleted in a future release. + * Instead of using this static constant, it is recommended to use GetColor(COLOR_ID_RED). + * @endif + */ + const static Color COLOR_RED; + + /** + * @if OSPDEPREC + * This attribute is pre-defined. Its value is violet. + * + * @brief [Deprecated] + * @since 2.0 + * + * @deprecated This object is provided only for backward compatibility and will be deleted in a future release. + * Instead of using this static constant, it is recommended to use GetColor(COLOR_ID_VIOLET). + * @endif + */ + const static Color COLOR_VIOLET; + + /** + * @if OSPDEPREC + * This attribute is pre-defined. Its value is yellow. + * + * @brief [Deprecated] + * @since 2.0 + * + * @deprecated This object is provided only for backward compatibility and will be deleted in a future release. + * Instead of using this static constant, it is recommended to use GetColor(COLOR_ID_YELLOW). + * @endif + */ + const static Color COLOR_YELLOW; + + /** + * @if OSPDEPREC + * This attribute is pre-defined. Its value is white. + * + * @brief [Deprecated] + * @since 2.0 + * + * @deprecated This object is provided only for backward compatibility and will be deleted in a future release. + * Instead of using this static constant, it is recommended to use GetColor(COLOR_ID_WHITE). + * @endif + */ + const static Color COLOR_WHITE; + + +private: + unsigned int __color; + + friend class _ColorImpl; + + // + // This variable is for internal use only. + // Using this variable can cause behavioral, security-related, and consistency-related issues in the application. + // + // @since 2.0 + // + class _ColorImpl * __pImpl; + +}; // Color + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_GRAPHIC_COLOR_H */ diff --git a/inc/engine/graphic/Dimension.h b/inc/engine/graphic/Dimension.h new file mode 100755 index 0000000..d4e535d --- /dev/null +++ b/inc/engine/graphic/Dimension.h @@ -0,0 +1,159 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_GRAPHIC_DIMENSION_H +#define HERE_GRAPHIC_DIMENSION_H + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class Dimension; + +class EXPORT_API Dimension : public Object +{ +public: + /** + * This is the default constructor for this class. @n + * This constructor initializes an instance of %Dimension with the width and the height set as @c 0. + * + * @since 2.0 + */ + Dimension(void); + + /** + * This is the copy constructor for the %Dimension class. + * + * @since 2.0 + * + * @param[in] rhs An instance of %Dimension + */ + Dimension(const Dimension& rhs); + + /** + * Initializes an instance of %Dimension with the specified values of width and height. + * + * @since 2.0 + * + * @param[in] width The width to set + * @param[in] height The height to set + */ + Dimension(int width, int height); + + /** + * This is the destructor for this class. + * + * @since 2.0 + */ + virtual ~Dimension(void); + + /** + * Assigns the value of the specified instance to the current instance of %Dimension. + * + * @since 2.0 + * + * @param[in] rhs An instance of %Dimension + */ + Dimension& operator =(const Dimension& rhs); + + /** + * Checks whether the two instances of %Dimension have equal width and height values. + * + * @since 2.0 + * + * @return @c true if the values of the width and height of the two instances of %Dimension are equal, @n + * else @c false + * @param[in] rhs An instance of %Dimension + */ + bool operator ==(const Dimension& rhs) const; + + /** + * Checks whether the two instances of %Dimension have different width and height values. + * + * @since 2.0 + * + * @return @c true if the values of the width and the height of the two instances of %Dimension are not equal, @n + * else @c false + * @param[in] rhs An instance of %Dimension + */ + bool operator !=(const Dimension& rhs) const; + + /** + * Checks whether the value of the current instance of %Dimension equals the value of the specified instance. + * + * @since 2.0 + * + * @return @c true if the value of the current instance equals the value of the specified instance, @n + * else @c false + * @param[in] rhs An instance of %Dimension + * @remarks The %Dimension class has a semantic value, which means that the + * Equals() method checks whether the two instances have the same width and height. + */ + virtual bool Equals(const Object& rhs) const; + + /** + * Gets the hash value of the current instance. + * + * @since 2.0 + * + * @return The hash value of the current instance + * @remarks Two equal instances must return the same hash value. For better performance, + * the used hash function must generate a random distribution for all inputs. + */ + virtual long GetHashCode(void) const; + + /** + * Sets the size of the current instance of %Dimension. + * + * @since 2.0 + * + * @param[in] width The new width + * @param[in] height The new height + */ + void SetSize(int width, int height); + +public: + /** + * The width of the current instance of %Dimension. + * + * @since 2.0 + */ + int width; + + /** + * The height of the current instance of %Dimension. + * + * @since 2.0 + */ + int height; + +private: + friend class _DimensionImpl; + + // + // This variable is for internal use only. + // Using this variable can cause behavioral, security-related, and consistency-related issues in the application. + // + // @since 2.0 + // + class _DimensionImpl * __pImpl; + +}; // Dimension + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_GRAPHIC_DIMENSION_H */ diff --git a/inc/engine/graphic/DoubleMatrix4.h b/inc/engine/graphic/DoubleMatrix4.h new file mode 100755 index 0000000..2377d9a --- /dev/null +++ b/inc/engine/graphic/DoubleMatrix4.h @@ -0,0 +1,388 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_DOUBLEMATRIX4_H +#define HERE_DOUBLEMATRIX4_H + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class DoubleMatrix4; + +class DoubleMatrix4 : public Object +{ +public: + /** + * This is the default constructor for this class. @n + * Constructs a 4 X 4 null matrix in which all the elements are zero. + * + * @since 2.0 + */ + DoubleMatrix4(void); + + /** + * Copying of objects using this copy constructor is allowed. + * + * @since 2.0 + * + * @param[in] rhs An instance of %DoubleMatrix4 to copy + */ + DoubleMatrix4(const DoubleMatrix4& rhs); + + /** + * Constructs a 4 by 4 matrix initialized to the value in the specified array. + * + * @since 2.0 + * + * @param[in] matrix The matrix with 16 @c double values + */ + DoubleMatrix4(const double matrix[4][4]); + + /** + * This destructor overrides Object::~Object(). + * + * @since 2.0 + */ + virtual ~DoubleMatrix4(void); + + /** + * Checks whether the current instance and the specified instance of %DoubleMatrix4 are equal. + * + * @since 2.0 + * + * @return @c true if all the matrix members of the current instance are equal to the corresponding matrix members in the specified instance, @n + * else @c false + * @param[in] rhs An instance of %DoubleMatrix4 + */ + bool operator ==(const DoubleMatrix4& rhs) const; + + /** + * Checks whether the current instance and the specified instance of %DoubleMatrix4 are not equal. + * + * @since 2.0 + * + * @return @c true if all the matrix members of the current instance are not equal to the corresponding matrix members in the specified instance, @n + * else @c false + * @param[in] rhs An instance of %DoubleMatrix4 + */ + bool operator !=(const DoubleMatrix4& rhs) const; + + /** + * Copying of objects using this copy assignment operator is allowed. + * + * @since 2.0 + * + * @return A reference to this instance + * @param[in] rhs An instance of %DoubleMatrix4 + */ + DoubleMatrix4& operator =(const DoubleMatrix4& rhs); + + /** + * Assigns the value of the specified instance to the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A reference to this instance + * @param[in] value The @c double value to assign + */ + DoubleMatrix4& operator =(double value); + + /** + * Multiplies the value of the specified instance with the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A new instance of %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] rhs An instance of %DoubleMatrix4 + */ + DoubleMatrix4 operator *(const DoubleMatrix4& rhs) const; + + /** + * Multiplies the value to each matrix member of current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A new instance of %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] value The @c double value to multiply + */ + DoubleMatrix4 operator *(double value) const; + + /** + * Adds the value of the specified instance to the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A new instance of %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] rhs An instance of %DoubleMatrix4 + */ + DoubleMatrix4 operator +(const DoubleMatrix4& rhs) const; + + /** + * Adds the value to each matrix member of the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A new instance of %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] value The @c double value to add + */ + DoubleMatrix4 operator +(double value) const; + + /** + * Subtracts the value of the specified instance from the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A new instance of %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] rhs An instance of %DoubleMatrix4 + */ + DoubleMatrix4 operator -(const DoubleMatrix4& rhs) const; + + /** + * Subtracts the value from each matrix member of the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A new instance of %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] value The @c double value to subtract + */ + DoubleMatrix4 operator -(double value) const; + + /** + * Multiplies the value of the specified instance and the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return The reference to %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] rhs An instance of %DoubleMatrix4 + */ + DoubleMatrix4& operator *=(const DoubleMatrix4& rhs); + + /** + * Multiplies the value to each matrix member of the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A reference to %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] value The @c double value to multiply + */ + DoubleMatrix4& operator *=(double value); + + /** + * Adds the value of the specified instance to the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A reference to %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] rhs An instance of %DoubleMatrix4 + */ + DoubleMatrix4& operator +=(const DoubleMatrix4& rhs); + + /** + * Adds the value to each matrix member of the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A reference to %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] value The @c double value to add + */ + DoubleMatrix4& operator +=(double value); + + /** + * Subtracts the value of the specified instance from the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A reference to %DoubleMatrix4 cthat contains the resulting value of the operation + * @param[in] rhs An instance of %DoubleMatrix4 + */ + DoubleMatrix4& operator -=(const DoubleMatrix4& rhs); + + /** + * Subtracts the value from each matrix member of the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A reference to %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] value The @c double value to subtract + */ + DoubleMatrix4& operator -=(double value); + + /** + * Gets an instance of %DoubleMatrix4 resulting from the sum of the value and the specified instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A new instance of %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] value The @c double value to add + * @param[in] rhs An instance of %DoubleMatrix4 + */ + friend DoubleMatrix4 operator +(const double& value, const DoubleMatrix4& rhs); + + /** + * Gets an instance of %DoubleMatrix4 resulting from the product of the value and the specified instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A new instance of %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] value The @c double value to multiply + * @param[in] rhs An instance of %DoubleMatrix4 + */ + friend DoubleMatrix4 operator *(const double& value, const DoubleMatrix4& rhs); + + /** + * Gets an instance of %DoubleMatrix4 resulting from the difference between the value and the specified instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A new instance of %DoubleMatrix4 that contains the resulting value of the operation + * @param[in] value The @c double value to subtract + * @param[in] rhs An instance of %DoubleMatrix4 + */ + friend DoubleMatrix4 operator -(const double& value, const DoubleMatrix4& rhs); + + /** + * Checks whether the current instance of %DoubleMatrix4 equals the specified instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return @c true if the values of the current instance is equal to the value of the specified instance, @n + * else @c false + * @param[in] obj An instance of %DoubleMatrix4 + * @remarks + * - This method overrides Object::Equals(). + * - This method uses the values of the Matrix components to compare the two instances. + */ + virtual bool Equals(const Object& obj) const; + + /** + * Gets the determinant of the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return The determinant value of the current instance + */ + double GetDeterminant(void) const; + + /** + * Gets the inverse matrix of the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A new instance of %DoubleMatrix4 that contains the resulting value of the operation + * @remarks This method must be called after checking whether the matrix is invertible or not. + */ + DoubleMatrix4 GetInverse(void) const; + + /** + * Gets the trace of the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return The trace of the current instance + */ + double GetTrace(void) const; + + /** + * Gets the transpose matrix of the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return A new instance of %DoubleMatrix4 that contains the resulting value of the operation + */ + DoubleMatrix4 GetTranspose(void) const; + + /** + * Checks whether the current instance is an identity matrix. + * + * @since 2.0 + * + * @return @c true if the matrix is an identity matrix, @n + * else @c false + */ + bool IsIdentity(void) const; + + /** + * Checks whether the current matrix is invertible. + * + * @since 2.0 + * + * @return @c true if the matrix is invertible, @n + * else @c false + */ + bool IsInvertible(void) const; + + /** + * Negates the matrix members of the current instance of %DoubleMatrix4. + * + * @since 2.0 + */ + void Negate(void); + + /** + * Sets the identity matrix to the current instance of %DoubleMatrix4. + * + * @since 2.0 + */ + void SetAsIdentity(void); + + /** + * Sets the inverse matrix to the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @return An error code + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_OPERATION The current instance is not invertible. + */ + result Invert(void); + + /** + * Sets the transposed matrix to the current instance of %DoubleMatrix4. + * + * @since 2.0 + */ + void Transpose(void); + + /** + * Sets the matrix members of the current instance of %DoubleMatrix4 to zero. + * + * @since 2.0 + */ + void SetAsNull(void); + + int Compare(const double d1, const double d2) const; + + /** + * The matrix of the current instance of %DoubleMatrix4. + * + * @since 2.0 + * + * @remarks The column-major order matrix. + */ + double matrix[4][4]; + +private: + friend class _DoubleMatrix4Impl; + class _DoubleMatrix4Impl* __pImpl; + +}; // DoubleMatrix4 + + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_DOUBLEMATRIX4_H */ diff --git a/inc/engine/graphic/FloatDimension.h b/inc/engine/graphic/FloatDimension.h new file mode 100755 index 0000000..3eff37a --- /dev/null +++ b/inc/engine/graphic/FloatDimension.h @@ -0,0 +1,159 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_GRAPHIC_FLOATDIMENTION_H +#define HERE_GRAPHIC_FLOATDIMENTION_H + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class FloatDimension; + +class EXPORT_API FloatDimension : public Object +{ +public: + /** + * This is the default constructor for this class. @n + * This constructor initializes an instance of %FloatDimension with the width and the height set as @c 0.f. + * + * @since 2.0 + */ + FloatDimension(void); + + /** + * This is the copy constructor for the %FloatDimension class. + * + * @since 2.0 + * + * @param[in] rhs An instance of %FloatDimension + */ + FloatDimension(const FloatDimension& rhs); + + /** + * Initializes an instance of %FloatDimension with the specified values of width and height. + * + * @since 2.0 + * + * @param[in] width The width to set + * @param[in] height The height to set + */ + FloatDimension(float width, float height); + + /** + * This is the destructor for this class. + * + * @since 2.0 + */ + virtual ~FloatDimension(void); + + /** + * This is the default assignment operator for this class. + * + * @since 2.0 + * + * @param[in] rhs An instance of %FloatDimension + */ + FloatDimension& operator=(const FloatDimension& rhs); + + /** + * Checks whether the two instances of %FloatDimension have equal width and height values. + * + * @since 2.0 + * + * @return @c true if the values of the width and height of the two instances of %FloatDimension are equal, @n + * else @c false + * @param[in] rhs An instance of %FloatDimension + */ + bool operator==(const FloatDimension& rhs) const; + + /** + * Checks whether the two instances of %FloatDimension have different width and height values. + * + * @since 2.0 + * + * @return @c true if the values of the width and height of the two instances of %FloatDimension are not equal, @n + * else @c false + * @param[in] rhs An instance of %FloatDimension + */ + bool operator!=(const FloatDimension& rhs) const; + + /** + * Checks whether the value of the current instance of %FloatDimension equals the value of the specified instance. + * + * @since 2.0 + * + * @return @c true if the value of the current instance equals the value of the specified instance, @n + * else @c false + * @param[in] rhs An instance of %FloatDimension + * @remarks The %FloatDimension class has a semantic value, which means that the + * Equals() method checks whether the two instances have the same width and height. + */ + virtual bool Equals(const Object& rhs) const; + + /** + * Gets the hash value of the current instance. + * + * @since 2.0 + * + * @return The hash value of the current instance + * @remarks Two equal instances must return the same hash value. For better performance, + * the used hash function must generate a random distribution for all inputs. + */ + virtual long GetHashCode(void) const; + + /** + * Sets the size of the current instance of %FloatDimension. + * + * @since 2.0 + * + * @param[in] width The new width + * @param[in] height The new height + */ + void SetSize(float width, float height); + +public: + /** + * The width of the current instance of %FloatDimension. + * + * @since 2.0 + */ + float width; + + /** + * The height of the current instance of %FloatDimension. + * + * @since 2.0 + */ + float height; + +private: + friend class _FloatDimensionImpl; + + // + // This variable is for internal use only. + // Using this variable can cause behavioral, security-related, and consistency-related issues in the application. + // + // @since 2.0 + // + class _FloatDimensionImpl* __pImpl; + +}; // FloatDimension + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_GRAPHIC_FLOATDIMENTION_H */ diff --git a/inc/engine/graphic/FloatPoint.h b/inc/engine/graphic/FloatPoint.h new file mode 100755 index 0000000..dae6d4d --- /dev/null +++ b/inc/engine/graphic/FloatPoint.h @@ -0,0 +1,217 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_GRAPHIC_FLOATPOINT_H +#define HERE_GRAPHIC_FLOATPOINT_H + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class FloatPoint; + +class EXPORT_API FloatPoint : public Object +{ +public: + /** + * This is the default constructor for this class. @n + * This constructor initializes an instance of %FloatPoint with the values (0.f, 0.f). + * + * @since 2.0 + */ + FloatPoint(void); + + /** + * This is the copy constructor for the %FloatPoint class. + * + * @since 2.0 + * + * @param[in] rhs An instance of %FloatPoint + */ + FloatPoint(const FloatPoint& rhs); + + /** + * Initializes an instance of %FloatPoint with the specified location. + * + * @since 2.0 + * + * @param[in] x The x-coordinate + * @param[in] y The y-coordinate + */ + FloatPoint(float x, float y); + + /** + * This is the destructor for this class. + * + * @since 2.0 + */ + virtual ~FloatPoint(void); + + /** + * This is the default assignment operator for this class. + * + * @since 2.0 + * + * @param[in] rhs An instance of %FloatPoint + */ + FloatPoint& operator=(const FloatPoint& rhs); + + /** + * Checks whether the current instance and the specified instance of %FloatPoint are equal. + * + * @since 2.0 + * + * @return @c true if the two instances of %FloatPoint are at the same location, @n + * else @c false + * @param[in] rhs An instance of %FloatPoint + */ + bool operator==(const FloatPoint& rhs) const; + + /** + * Checks whether the current instance and the specified instance of %FloatPoint are not equal. + * + * @since 2.0 + * + * @return @c true if the two instances of %FloatPoint are at different locations, @n + * else @c false + * @param[in] rhs An instance of %FloatPoint + */ + bool operator!=(const FloatPoint& rhs) const; + + /** + * Adds the value of the specified instance of %FloatPoint and the current instance. + * + * @since 2.0 + * + * @return A new instance of %FloatPoint containing the resulting value of the operation + * @param[in] rhs An instance of %FloatPoint + */ + FloatPoint operator+(const FloatPoint& rhs) const; + + /** + * Subtracts the value of the specified instance of %FloatPoint from the current instance. + * + * @since 2.0 + * + * @return A new instance of %FloatPoint containing the resulting value of the operation + * @param[in] rhs An instance of %FloatPoint + */ + FloatPoint operator-(const FloatPoint& rhs) const; + + /** + * Adds the value of the specified instance of %FloatPoint to the current instance. + * + * @since 2.0 + * + * @param[in] point An instance of %FloatPoint + */ + FloatPoint& operator+=(const FloatPoint& point); + + /** + * Subtracts the value of the specified instance of %FloatPoint from the current instance. + * + * @since 2.0 + * + * @param[in] point An instance of %FloatPoint + */ + FloatPoint& operator-=(const FloatPoint& point); + + /** + * Checks whether the value of the specified instance of %FloatPoint equals the value of the current instance. + * + * @since 2.0 + * + * @return @c true if the value of the specified instance equals the value of the current instance, @n + * else @c false + * @param[in] rhs An instance of %FloatPoint + * @remarks The %FloatPoint class has a semantic value, which means that the + * Equals() method checks whether the two instances have the same + * location. + */ + virtual bool Equals(const Object& rhs) const; + + /** + * Gets the hash value of the current instance. + * + * @since 2.0 + * + * @return The hash value of the current instance + * @remarks Two equal instances must return the same hash value. @n For better performance, + * the used hash function must generate a random distribution for all inputs. + */ + virtual long GetHashCode(void) const; + + /** + * Sets the x and y coordinates for the current instance of %FloatPoint. + * + * @since 2.0 + * + * @param[in] x The new x-coordinate + * @param[in] y The new y-coordinate + */ + void SetPosition(float x, float y); + + /** + * Sets the current instance of %FloatPoint. + * + * @since 2.0 + * + * @param[in] point An instance of %FloatPoint + */ + void SetPosition(const FloatPoint& point); + + /** + * Translates this %FloatPoint to the indicated distance. + * + * @since 2.0 + * + * @param[in] deltaX The distance to move this point along the x-axis + * @param[in] deltaY The distance to move this point along the y-axis + */ + void Translate(float deltaX, float deltaY); + +public: + /** + * The x-coordinate of the point. + * + * @since 2.0 + */ + float x; + + /** + * The y-coordinate of the point. + * + * @since 2.0 + */ + float y; + +private: + friend class _FloatPointImpl; + + // + // This variable is for internal use only. + // Using this variable can cause behavioral, security-related, and consistency-related issues in the application. + // + // @since 2.0 + // + class _FloatPointImpl* __pImpl; + +}; // FloatPoint + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_GRAPHIC_FLOATPOINT_H */ diff --git a/inc/engine/graphic/FloatRectangle.h b/inc/engine/graphic/FloatRectangle.h new file mode 100755 index 0000000..24e94c7 --- /dev/null +++ b/inc/engine/graphic/FloatRectangle.h @@ -0,0 +1,329 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_GRAPHIC_FLOATRECTANGLE_H +#define HERE_GRAPHIC_FLOATRECTANGLE_H + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" +#include "graphic/FloatDimension.h" +#include "graphic/FloatPoint.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class FloatRectangle; + +class EXPORT_API FloatRectangle : public Object +{ +public: + /** + * This is the default constructor for this class. @n + * It initializes an instance of %FloatRectangle with all its attributes set to @c 0.f. + * + * @since 2.0 + * + * @remarks The attribute value is @c 0 when initialized. + */ + FloatRectangle(void); + + /** + * This is the copy constructor for the %FloatRectangle class. + * + * @since 2.0 + * + * @param[in] rhs An instance of %FloatRectangle + */ + FloatRectangle(const FloatRectangle& rhs); + + /** + * Initializes an instance of %FloatRectangle with the specified location and dimension. + * + * @since 2.0 + * + * @param[in] x The x-coordinate of the top-left corner of the rectangle + * @param[in] y The y-coordinate of the top-left corner of the rectangle + * @param[in] width The width of the rectangle + * @param[in] height The height of the rectangle + * + */ + FloatRectangle(float x, float y, float width, float height); + + /** + * Initializes an instance of %FloatRectangle at the location specified by @c point and + * with dimension specified by @c dim. + * + * @since 2.0 + * + * @param[in] point The location of the top-left corner of the rectangle + * @param[in] dim The width and height of the rectangle + */ + FloatRectangle(const FloatPoint& point, const FloatDimension& dim); + + /** + * This is the destructor for this class. + * + * @since 2.0 + */ + virtual ~FloatRectangle(void); + + /** + * This is the default assignment operator for this class. + * + * @since 2.0 + * + * @param[in] rhs An instance of %FloatRectangle + */ + FloatRectangle& operator=(const FloatRectangle& rhs); + + /** + * Checks whether the location and dimension of the current instance of %FloatRectangle match those of the + * specified instance of %FloatRectangle. + * + * @since 2.0 + * + * @return @c true if the location and dimension of the current instance match those of the specified instance, @n + * else @c false + * @param[in] rhs An instance of %FloatRectangle + */ + bool operator==(const FloatRectangle& rhs) const; + + /** + * Checks whether the location and dimension of the current instance of %FloatRectangle do not match those of the + * specified instance of %FloatRectangle. + * + * @since 2.0 + * + * @return @c true if the location and dimension of the current instance do not match those of the specified instance, @n + * else @c false + * @param[in] rhs An instance of %FloatRectangle + */ + bool operator!=(const FloatRectangle& rhs) const; + + /** + * Checks whether the specified point lies inside the current instance of %FloatRectangle. + * + * @since 2.0 + * + * @return @c true if the location represented by @c point lies inside the current instance of %FloatRectangle, @n + * else @c false + * @param[in] point An instance of FloatPoint + */ + bool Contains(const FloatPoint& point) const; + + /** + * Checks whether the value of the current instance of %FloatRectangle equals the value of the specified instance of + * %FloatRectangle. + * + * @since 2.0 + * + * @return @c true if the value of the current instance of %FloatRectangle equals the value of the specified instance of %FloatRectangle, @n + * else @c false + * @param[in] rhs An instance of %FloatRectangle + * @remarks The %FloatRectangle class has a semantic value, which means that the Equals() method checks whether the + * two instances have the same location and size. + */ + virtual bool Equals(const Object& rhs) const; + + /** + * Gets the hash value of the current instance. + * + * @since 2.0 + * + * @return The hash value of the current instance + * @remarks Two equal instances must return the same hash value. For better performance, + * the used hash function must generate a random distribution for all inputs. + */ + virtual long GetHashCode(void) const; + + /** + * Gets the intersection of the current instance and the specified instance of %FloatRectangle. @n + * If the two instances of %FloatRectangle do not intersect, empty instance is returned. + * + * @since 2.0 + * + * @param[in] rect An instance of %FloatRectangle + */ + FloatRectangle GetIntersection(const FloatRectangle& rect) const; + + /** + * Checks whether the current instance of %FloatRectangle intersects with the specified instance of %FloatRectangle. + * + * @since 2.0 + * + * @return @c true if the current instance of %FloatRectangle intersects with the specified instance of %FloatRectangle, @n + * else @c false + * @param[in] rect An instance of %FloatRectangle + * + */ + bool IsIntersected(const FloatRectangle& rect) const; + + /** + * Gets the union of the current instance and the specified instance of %FloatRectangle. + * + * @since 2.0 + * + * @return An instance of %FloatRectangle containing the union of the two rectangles + * @param[in] rect An instance of %FloatRectangle + */ + FloatRectangle GetUnion(const FloatRectangle& rect) const; + + /** + * Gets the coordinates of the point at the bottom-right corner of the rectangle. + * + * @since 2.0 + * + * @return The coordinates of the point at the bottom-right corner of the rectangle + */ + FloatPoint GetBottomRight(void) const; + + /** + * Gets the coordinates of the point at the top-left corner of the rectangle. + * + * @since 2.0 + * + * @return The coordinates of the point at the top-left corner of the rectangle + */ + FloatPoint GetTopLeft(void) const; + + /** + * Checks whether this %FloatRectangle is empty. @n + * A %FloatRectangle is empty if its width or its height is less than or equal to @c 0. + * + * @since 2.0 + * + * @return @c true if this rectangle is empty, @n + * else @c false + */ + bool IsEmpty(void) const; + + /** + * Sets the size of this %FloatRectangle to match the specified FloatDimension. + * + * @since 2.0 + * + * @param[in] dim The new size for FloatDimension + */ + void SetSize(const FloatDimension& dim); + + /** + * Sets the size of this %FloatRectangle to match the specified dimension. + * + * @since 2.0 + * + * @param[in] width The new width + * @param[in] height The new height + */ + void SetSize(float width, float height); + + /** + * Sets the position of this %FloatRectangle to the specified point. + * + * @since 2.0 + * + * @param[in] point The new position + */ + void SetPosition(const FloatPoint& point); + + /** + * Sets the location of the current instance of %FloatRectangle with the specified values of the + * x and y coordinates of the top-left corner point. + * + * @since 2.0 + * + * @param[in] x The new x-coordinate + * @param[in] y The new y-coordinate + */ + void SetPosition(float x, float y); + + /** + * Sets the location and the dimensions of the current instance of %FloatRectangle with the specified x and y + * coordinates of the top-left corner point and the specified dimensions. + * + * @since 2.0 + * + * @param[in] x The new x-coordinate + * @param[in] y The new y-coordinate + * @param[in] width The new width + * @param[in] height The new height + */ + void SetBounds(float x, float y, float width, float height); + + /** + * Sets the location and the dimensions of the current instance of %FloatRectangle with the specified location and + * dimension. + * + * @since 2.0 + * + * @param[in] point An instance of FloatPoint + * @param[in] dim An instance of FloatDimension + */ + void SetBounds(const FloatPoint& point, const FloatDimension& dim); + + /** + * Translates this %FloatRectangle to the new point by the specified distance along the x-axis and y-axis. + * + * @since 2.0 + * + * @param[in] deltaX The distance to move this %FloatRectangle along the x-axis + * @param[in] deltaY The distance to move this %FloatRectangle along the y-axis + */ + void Translate(float deltaX, float deltaY); + +public: + /** + * The x-coordinate of the top-left corner of the rectangle. + * + * @since 2.0 + */ + float x; + + /** + * The y-coordinate of the top-left corner of the rectangle. + * + * @since 2.0 + */ + float y; + + /** + * The width of this rectangle. + * + * @since 2.0 + */ + float width; + + /** + * The height of this rectangle. + * + * @since 2.0 + */ + float height; + +private: + friend class _FloatRectangleImpl; + + // + // This variable is for internal use only. + // Using this variable can cause behavioral, security-related, and consistency-related issues in the application. + // + // @since 2.0 + // + class _FloatRectangleImpl* __pImpl; + +}; // FloatRectangle + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_GRAPHIC_FLOATRECTANGLE_H */ diff --git a/inc/engine/graphic/Grp_GL_macro.h b/inc/engine/graphic/Grp_GL_macro.h new file mode 100755 index 0000000..ffe5dbd --- /dev/null +++ b/inc/engine/graphic/Grp_GL_macro.h @@ -0,0 +1,266 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_GRAPHIC_GL_MACRO_H +#define HERE_GRAPHIC_GL_MACRO_H + +#include + +extern Evas_GL_API *__evas_gl_glapi; + +#ifndef _EVAS_GL_GLES2_HELPERS_H +#define glActiveTexture __evas_gl_glapi->glActiveTexture +#define glAttachShader __evas_gl_glapi->glAttachShader +#define glBindAttribLocation __evas_gl_glapi->glBindAttribLocation +#define glBindBuffer __evas_gl_glapi->glBindBuffer +#define glBindFramebuffer __evas_gl_glapi->glBindFramebuffer +#define glBindRenderbuffer __evas_gl_glapi->glBindRenderbuffer +#define glBindTexture __evas_gl_glapi->glBindTexture +#define glBlendColor __evas_gl_glapi->glBlendColor +#define glBlendEquation __evas_gl_glapi->glBlendEquation +#define glBlendEquationSeparate __evas_gl_glapi->glBlendEquationSeparate +#define glBlendFunc __evas_gl_glapi->glBlendFunc +#define glBlendFuncSeparate __evas_gl_glapi->glBlendFuncSeparate +#define glBufferData __evas_gl_glapi->glBufferData +#define glBufferSubData __evas_gl_glapi->glBufferSubData +#define glCheckFramebufferStatus __evas_gl_glapi->glCheckFramebufferStatus +#define glClear __evas_gl_glapi->glClear +#define glClearColor __evas_gl_glapi->glClearColor +#define glClearDepthf __evas_gl_glapi->glClearDepthf +#define glClearStencil __evas_gl_glapi->glClearStencil +#define glColorMask __evas_gl_glapi->glColorMask +#define glCompileShader __evas_gl_glapi->glCompileShader +#define glCompressedTexImage2D __evas_gl_glapi->glCompressedTexImage2D +#define glCompressedTexSubImage2D __evas_gl_glapi->glCompressedTexSubImage2D +#define glCopyTexImage2D __evas_gl_glapi->glCopyTexImage2D +#define glCopyTexSubImage2D __evas_gl_glapi->glCopyTexSubImage2D +#define glCreateProgram __evas_gl_glapi->glCreateProgram +#define glCreateShader __evas_gl_glapi->glCreateShader +#define glCullFace __evas_gl_glapi->glCullFace +#define glDeleteBuffers __evas_gl_glapi->glDeleteBuffers +#define glDeleteFramebuffers __evas_gl_glapi->glDeleteFramebuffers +#define glDeleteProgram __evas_gl_glapi->glDeleteProgram +#define glDeleteRenderbuffers __evas_gl_glapi->glDeleteRenderbuffers +#define glDeleteShader __evas_gl_glapi->glDeleteShader +#define glDeleteTextures __evas_gl_glapi->glDeleteTextures +#define glDepthFunc __evas_gl_glapi->glDepthFunc +#define glDepthMask __evas_gl_glapi->glDepthMask +#define glDepthRangef __evas_gl_glapi->glDepthRangef +#define glDetachShader __evas_gl_glapi->glDetachShader +#define glDisable __evas_gl_glapi->glDisable +#define glDisableVertexAttribArray __evas_gl_glapi->glDisableVertexAttribArray +#define glDrawArrays __evas_gl_glapi->glDrawArrays +#define glDrawElements __evas_gl_glapi->glDrawElements +#define glEnable __evas_gl_glapi->glEnable +#define glEnableVertexAttribArray __evas_gl_glapi->glEnableVertexAttribArray +#define glFinish __evas_gl_glapi->glFinish +#define glFlush __evas_gl_glapi->glFlush +#define glFramebufferRenderbuffer __evas_gl_glapi->glFramebufferRenderbuffer +#define glFramebufferTexture2D __evas_gl_glapi->glFramebufferTexture2D +#define glFrontFace __evas_gl_glapi->glFrontFace +#define glGenBuffers __evas_gl_glapi->glGenBuffers +#define glGenerateMipmap __evas_gl_glapi->glGenerateMipmap +#define glGenFramebuffers __evas_gl_glapi->glGenFramebuffers +#define glGenRenderbuffers __evas_gl_glapi->glGenRenderbuffers +#define glGenTextures __evas_gl_glapi->glGenTextures +#define glGetActiveAttrib __evas_gl_glapi->glGetActiveAttrib +#define glGetActiveUniform __evas_gl_glapi->glGetActiveUniform +#define glGetAttachedShaders __evas_gl_glapi->glGetAttachedShaders +#define glGetAttribLocation __evas_gl_glapi->glGetAttribLocation +#define glGetBooleanv __evas_gl_glapi->glGetBooleanv +#define glGetBufferParameteriv __evas_gl_glapi->glGetBufferParameteriv +#define glGetError __evas_gl_glapi->glGetError +#define glGetFloatv __evas_gl_glapi->glGetFloatv +#define glGetFramebufferAttachmentParameteriv __evas_gl_glapi->glGetFramebufferAttachmentParameteriv +#define glGetIntegerv __evas_gl_glapi->glGetIntegerv +#define glGetProgramiv __evas_gl_glapi->glGetProgramiv +#define glGetProgramInfoLog __evas_gl_glapi->glGetProgramInfoLog +#define glGetRenderbufferParameteriv __evas_gl_glapi->glGetRenderbufferParameteriv +#define glGetShaderiv __evas_gl_glapi->glGetShaderiv +#define glGetShaderInfoLog __evas_gl_glapi->glGetShaderInfoLog +#define glGetShaderPrecisionFormat __evas_gl_glapi->glGetShaderPrecisionFormat +#define glGetShaderSource __evas_gl_glapi->glGetShaderSource +#define glGetString __evas_gl_glapi->glGetString +#define glGetTexParameterfv __evas_gl_glapi->glGetTexParameterfv +#define glGetTexParameteriv __evas_gl_glapi->glGetTexParameteriv +#define glGetUniformfv __evas_gl_glapi->glGetUniformfv +#define glGetUniformiv __evas_gl_glapi->glGetUniformiv +#define glGetUniformLocation __evas_gl_glapi->glGetUniformLocation +#define glGetVertexAttribfv __evas_gl_glapi->glGetVertexAttribfv +#define glGetVertexAttribiv __evas_gl_glapi->glGetVertexAttribiv +#define glGetVertexAttribPointerv __evas_gl_glapi->glGetVertexAttribPointerv +#define glHint __evas_gl_glapi->glHint +#define glIsBuffer __evas_gl_glapi->glIsBuffer +#define glIsEnabled __evas_gl_glapi->glIsEnabled +#define glIsFramebuffer __evas_gl_glapi->glIsFramebuffer +#define glIsProgram __evas_gl_glapi->glIsProgram +#define glIsRenderbuffer __evas_gl_glapi->glIsRenderbuffer +#define glIsShader __evas_gl_glapi->glIsShader +#define glIsTexture __evas_gl_glapi->glIsTexture +#define glLineWidth __evas_gl_glapi->glLineWidth +#define glLinkProgram __evas_gl_glapi->glLinkProgram +#define glPixelStorei __evas_gl_glapi->glPixelStorei +#define glPolygonOffset __evas_gl_glapi->glPolygonOffset +#define glReadPixels __evas_gl_glapi->glReadPixels +#define glReleaseShaderCompiler __evas_gl_glapi->glReleaseShaderCompiler +#define glRenderbufferStorage __evas_gl_glapi->glRenderbufferStorage +#define glSampleCoverage __evas_gl_glapi->glSampleCoverage +#define glScissor __evas_gl_glapi->glScissor +#define glShaderBinary __evas_gl_glapi->glShaderBinary +#define glShaderSource __evas_gl_glapi->glShaderSource +#define glStencilFunc __evas_gl_glapi->glStencilFunc +#define glStencilFuncSeparate __evas_gl_glapi->glStencilFuncSeparate +#define glStencilMask __evas_gl_glapi->glStencilMask +#define glStencilMaskSeparate __evas_gl_glapi->glStencilMaskSeparate +#define glStencilOp __evas_gl_glapi->glStencilOp +#define glStencilOpSeparate __evas_gl_glapi->glStencilOpSeparate +#define glTexImage2D __evas_gl_glapi->glTexImage2D +#define glTexParameterf __evas_gl_glapi->glTexParameterf +#define glTexParameterfv __evas_gl_glapi->glTexParameterfv +#define glTexParameteri __evas_gl_glapi->glTexParameteri +#define glTexParameteriv __evas_gl_glapi->glTexParameteriv +#define glTexSubImage2D __evas_gl_glapi->glTexSubImage2D +#define glUniform1f __evas_gl_glapi->glUniform1f +#define glUniform1fv __evas_gl_glapi->glUniform1fv +#define glUniform1i __evas_gl_glapi->glUniform1i +#define glUniform1iv __evas_gl_glapi->glUniform1iv +#define glUniform2f __evas_gl_glapi->glUniform2f +#define glUniform2fv __evas_gl_glapi->glUniform2fv +#define glUniform2i __evas_gl_glapi->glUniform2i +#define glUniform2iv __evas_gl_glapi->glUniform2iv +#define glUniform3f __evas_gl_glapi->glUniform3f +#define glUniform3fv __evas_gl_glapi->glUniform3fv +#define glUniform3i __evas_gl_glapi->glUniform3i +#define glUniform3iv __evas_gl_glapi->glUniform3iv +#define glUniform4f __evas_gl_glapi->glUniform4f +#define glUniform4fv __evas_gl_glapi->glUniform4fv +#define glUniform4i __evas_gl_glapi->glUniform4i +#define glUniform4iv __evas_gl_glapi->glUniform4iv +#define glUniformMatrix2fv __evas_gl_glapi->glUniformMatrix2fv +#define glUniformMatrix3fv __evas_gl_glapi->glUniformMatrix3fv +#define glUniformMatrix4fv __evas_gl_glapi->glUniformMatrix4fv +#define glUseProgram __evas_gl_glapi->glUseProgram +#define glValidateProgram __evas_gl_glapi->glValidateProgram +#define glVertexAttrib1f __evas_gl_glapi->glVertexAttrib1f +#define glVertexAttrib1fv __evas_gl_glapi->glVertexAttrib1fv +#define glVertexAttrib2f __evas_gl_glapi->glVertexAttrib2f +#define glVertexAttrib2fv __evas_gl_glapi->glVertexAttrib2fv +#define glVertexAttrib3f __evas_gl_glapi->glVertexAttrib3f +#define glVertexAttrib3fv __evas_gl_glapi->glVertexAttrib3fv +#define glVertexAttrib4f __evas_gl_glapi->glVertexAttrib4f +#define glVertexAttrib4fv __evas_gl_glapi->glVertexAttrib4fv +#define glVertexAttribPointer __evas_gl_glapi->glVertexAttribPointer +#define glViewport __evas_gl_glapi->glViewport + +// GLES 2.0 extensions +#define glGetProgramBinaryOES __evas_gl_glapi->glGetProgramBinaryOES +#define glProgramBinaryOES __evas_gl_glapi->glProgramBinaryOES +#define glMapBufferOES __evas_gl_glapi->glMapBufferOES +#define glUnmapBufferOES __evas_gl_glapi->glUnmapBufferOES +#define glGetBufferPointervOES __evas_gl_glapi->glGetBufferPointervOES +#define glTexImage3DOES __evas_gl_glapi->glTexImage3DOES +#define glTexSubImage3DOES __evas_gl_glapi->glTexSubImage3DOES +#define glCopyTexSubImage3DOES __evas_gl_glapi->glCopyTexSubImage3DOES +#define glCompressedTexImage3DOES __evas_gl_glapi->glCompressedTexImage3DOES +#define glCompressedTexSubImage3DOES __evas_gl_glapi->glCompressedTexSubImage3DOES +#define glFramebufferTexture3DOES __evas_gl_glapi->glFramebufferTexture3DOES +#define glBindVertexArrayOES __evas_gl_glapi->glBindVertexArrayOES +#define glDeleteVertexArraysOES __evas_gl_glapi->glDeleteVertexArraysOES +#define glGenVertexArraysOES __evas_gl_glapi->glGenVertexArraysOES +#define glIsVertexArrayOES __evas_gl_glapi->glIsVertexArrayOES +#define glGetPerfMonitorGroupsAMD __evas_gl_glapi->glGetPerfMonitorGroupsAMD +#define glGetPerfMonitorCountersAMD __evas_gl_glapi->glGetPerfMonitorCountersAMD +#define glGetPerfMonitorGroupStringAMD __evas_gl_glapi->glGetPerfMonitorGroupStringAMD +#define glGetPerfMonitorCounterStringAMD __evas_gl_glapi->glGetPerfMonitorCounterStringAMD +#define glGetPerfMonitorCounterInfoAMD __evas_gl_glapi->glGetPerfMonitorCounterInfoAMD +#define glGenPerfMonitorsAMD __evas_gl_glapi->glGenPerfMonitorsAMD +#define glDeletePerfMonitorsAMD __evas_gl_glapi->glDeletePerfMonitorsAMD +#define glSelectPerfMonitorCountersAMD __evas_gl_glapi->glSelectPerfMonitorCountersAMD +#define glBeginPerfMonitorAMD __evas_gl_glapi->glBeginPerfMonitorAMD +#define glEndPerfMonitorAMD __evas_gl_glapi->glEndPerfMonitorAMD +#define glGetPerfMonitorCounterDataAMD __evas_gl_glapi->glGetPerfMonitorCounterDataAMD +#define glCopyTextureLevelsAPPLE __evas_gl_glapi->glCopyTextureLevelsAPPLE +#define glRenderbufferStorageMultisampleAPPLE __evas_gl_glapi->glRenderbufferStorageMultisampleAPPLE +#define glResolveMultisampleFramebufferAPPLE __evas_gl_glapi->glResolveMultisampleFramebufferAPPLE +#define glFenceSyncAPPLE __evas_gl_glapi->glFenceSyncAPPLE +#define glIsSyncAPPLE __evas_gl_glapi->glIsSyncAPPLE +#define glDeleteSyncAPPLE __evas_gl_glapi->glDeleteSyncAPPLE +#define glClientWaitSyncAPPLE __evas_gl_glapi->glClientWaitSyncAPPLE +#define glWaitSyncAPPLE __evas_gl_glapi->glWaitSyncAPPLE +#define glGetInteger64vAPPLE __evas_gl_glapi->glGetInteger64vAPPLE +#define glGetSyncivAPPLE __evas_gl_glapi->glGetSyncivAPPLE +#define glDiscardFramebufferEXT __evas_gl_glapi->glDiscardFramebufferEXT +#define glMapBufferRangeEXT __evas_gl_glapi->glMapBufferRangeEXT +#define glFlushMappedBufferRangeEXT __evas_gl_glapi->glFlushMappedBufferRangeEXT +#define glMultiDrawArraysEXT __evas_gl_glapi->glMultiDrawArraysEXT +#define glMultiDrawElementsEXT __evas_gl_glapi->glMultiDrawElementsEXT +#define glRenderbufferStorageMultisampleEXT __evas_gl_glapi->glRenderbufferStorageMultisampleEXT +#define glFramebufferTexture2DMultisampleEXT __evas_gl_glapi->glFramebufferTexture2DMultisampleEXT +#define glGetGraphicsResetStatusEXT __evas_gl_glapi->glGetGraphicsResetStatusEXT +#define glReadnPixelsEXT __evas_gl_glapi->glReadnPixelsEXT +#define glGetnUniformfvEXT __evas_gl_glapi->glGetnUniformfvEXT +#define glGetnUniformivEXT __evas_gl_glapi->glGetnUniformivEXT +#define glTexStorage1DEXT __evas_gl_glapi->glTexStorage1DEXT +#define glTexStorage2DEXT __evas_gl_glapi->glTexStorage2DEXT +#define glTexStorage3DEXT __evas_gl_glapi->glTexStorage3DEXT +#define glTextureStorage1DEXT __evas_gl_glapi->glTextureStorage1DEXT +#define glTextureStorage2DEXT __evas_gl_glapi->glTextureStorage2DEXT +#define glTextureStorage3DEXT __evas_gl_glapi->glTextureStorage3DEXT +#define glRenderbufferStorageMultisampleIMG __evas_gl_glapi->glRenderbufferStorageMultisampleIMG +#define glFramebufferTexture2DMultisampleIMG __evas_gl_glapi->glFramebufferTexture2DMultisampleIMG +#define glDeleteFencesNV __evas_gl_glapi->glDeleteFencesNV +#define glGenFencesNV __evas_gl_glapi->glGenFencesNV +#define glIsFenceNV __evas_gl_glapi->glIsFenceNV +#define glTestFenceNV __evas_gl_glapi->glTestFenceNV +#define glGetFenceivNV __evas_gl_glapi->glGetFenceivNV +#define glFinishFenceNV __evas_gl_glapi->glFinishFenceNV +#define glSetFenceNV __evas_gl_glapi->glSetFenceNV +#define glGetDriverControlsQCOM __evas_gl_glapi->glGetDriverControlsQCOM +#define glGetDriverControlStringQCOM __evas_gl_glapi->glGetDriverControlStringQCOM +#define glEnableDriverControlQCOM __evas_gl_glapi->glEnableDriverControlQCOM +#define glDisableDriverControlQCOM __evas_gl_glapi->glDisableDriverControlQCOM +#define glExtGetTexturesQCOM __evas_gl_glapi->glExtGetTexturesQCOM +#define glExtGetBuffersQCOM __evas_gl_glapi->glExtGetBuffersQCOM +#define glExtGetRenderbuffersQCOM __evas_gl_glapi->glExtGetRenderbuffersQCOM +#define glExtGetFramebuffersQCOM __evas_gl_glapi->glExtGetFramebuffersQCOM +#define glExtGetTexLevelParameterivQCOM __evas_gl_glapi->glExtGetTexLevelParameterivQCOM +#define glExtTexObjectStateOverrideiQCOM __evas_gl_glapi->glExtTexObjectStateOverrideiQCOM +#define glExtGetTexSubImageQCOM __evas_gl_glapi->glExtGetTexSubImageQCOM +#define glExtGetBufferPointervQCOM __evas_gl_glapi->glExtGetBufferPointervQCOM +#define glExtGetShadersQCOM __evas_gl_glapi->glExtGetShadersQCOM +#define glExtGetProgramsQCOM __evas_gl_glapi->glExtGetProgramsQCOM +#define glExtIsProgramBinaryQCOM __evas_gl_glapi->glExtIsProgramBinaryQCOM +#define glExtGetProgramBinarySourceQCOM __evas_gl_glapi->glExtGetProgramBinarySourceQCOM +#define glStartTilingQCOM __evas_gl_glapi->glStartTilingQCOM +#define glEndTilingQCOM __evas_gl_glapi->glEndTilingQCOM + +// glEvasGL functions +#define glEvasGLImageTargetTexture2DOES __evas_gl_glapi->glEvasGLImageTargetTexture2DOES +#define glEvasGLImageTargetRenderbufferStorageOES __evas_gl_glapi->glEvasGLImageTargetRenderbufferStorageOES + +// Evas GL glue layer +#define evasglCreateImage __evas_gl_glapi->evasglCreateImage +#define evasglCreateImageForContext __evas_gl_glapi->evasglCreateImageForContext +#define evasglDestroyImage __evas_gl_glapi->evasglDestroyImage +#define evasglCreateSync __evas_gl_glapi->evasglCreateSync +#define evasglDestroySync __evas_gl_glapi->evasglDestroySync +#define evasglClientWaitSync __evas_gl_glapi->evasglClientWaitSync +#define evasglSignalSync __evas_gl_glapi->evasglSignalSync +#define evasglGetSyncAttrib __evas_gl_glapi->evasglGetSyncAttrib +#define evasglWaitSync __evas_gl_glapi->evasglWaitSync +#endif + +#endif /* HERE_GRAPHIC_GL_MACRO_H */ diff --git a/inc/engine/graphic/Grp_Util.h b/inc/engine/graphic/Grp_Util.h new file mode 100755 index 0000000..b5e2e39 --- /dev/null +++ b/inc/engine/graphic/Grp_Util.h @@ -0,0 +1,69 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_GRAPHIC_UTIL_H +#define HERE_GRAPHIC_UTIL_H + +#include "common/HereMaps_global.h" +#include "graphic/Grp_UtilType.h" +#include "graphic/Bitmap.h" +#include "graphic/PngDecoder.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +namespace _Util + { + bool IntersectRect(Rectangle& outRect, + const Rectangle& srcRect1, + const Rectangle& srcRect2); + + bool IntersectRect(Rectangle& outRect, + const Rectangle& srcRect1, + const Rectangle& srcRect2); + + long GetHashCode(const char *string); + + EXPORT_API Bitmap* DecodePngToBmp(const byte* buffer, size_t size, + MediaPixelFormat pixelFormat=MEDIA_PIXEL_FORMAT_RGBA8888); + + EXPORT_API void ConvertRGBA2BGRA(void *data, unsigned int w, unsigned int h, + MediaPixelFormat format=MEDIA_PIXEL_FORMAT_RGBA8888); + + template + inline T + Abs(const T& t) + { + return (t >= 0) ? t : -t; + } + + template + inline T + Min(T a, T b) + { + return (a < b) ? a : b; + } + + template + inline T + Max(T a, T b) + { + return (a > b) ? a : b; + } +} // _Util + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_GRAPHIC_UTIL_H */ diff --git a/inc/engine/graphic/Grp_UtilType.h b/inc/engine/graphic/Grp_UtilType.h new file mode 100755 index 0000000..889f371 --- /dev/null +++ b/inc/engine/graphic/Grp_UtilType.h @@ -0,0 +1,314 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_GRAPHIC_UTILTYPE_H +#define HERE_GRAPHIC_UTILTYPE_H + +#include "common/HereMaps_global.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +namespace _Util +{ + +template +struct FixedPoint +{ + FixedPoint(void) + : __fixedPoint(0) + { + } + + FixedPoint(const FixedPoint& rhs) + : __fixedPoint(rhs.__fixedPoint) + { + } + + explicit FixedPoint(int value) + : __fixedPoint(value << SHIFT) + { + } + + explicit FixedPoint(long value) + : __fixedPoint(value << SHIFT) + { + } + + explicit FixedPoint(float value) + : __fixedPoint(value * ((1 << SHIFT) * 1.0f)) + { + } + + explicit FixedPoint(double value) + : __fixedPoint(value * ((1 << SHIFT) * 1.0)) + { + } + + inline int + ToInt() const + { + return (__fixedPoint >> SHIFT); + } + + inline float + ToFloat() const + { + return (__fixedPoint / ((1 << SHIFT) * 1.0f)); + } + + inline double + ToDouble() const + { + return (__fixedPoint / ((1 << SHIFT) * 1.0)); + } + + inline void + Reset(int fixedPointValue) + { + __fixedPoint = fixedPointValue; + } + + inline operator const int(void) + { + return __fixedPoint; + } + +// operator + + inline FixedPoint + operator +(const FixedPoint& rhs) const + { + FixedPoint tempFixed(0); + + tempFixed.__fixedPoint = __fixedPoint + rhs.__fixedPoint; + + return tempFixed; + } + +// operator - + inline FixedPoint + operator -(const FixedPoint& rhs) const + { + FixedPoint tempFixed(0); + + tempFixed.__fixedPoint = __fixedPoint - rhs.__fixedPoint; + + return tempFixed; + } + +// operator == + template + inline bool + operator ==(const T& rhs) const + { + return (ToFloat() == rhs); + } + + inline bool + operator ==(const FixedPoint& rhs) const + { + return (ToFloat() == rhs.ToFloat); + } + +// operator != + template + inline bool + operator !=(const T& rhs) const + { + return (ToFloat() != rhs); + } + + inline bool + operator !=(const FixedPoint& rhs) const + { + return (ToFloat() != rhs.ToFloat()); + } + +// operator <= + template + inline bool + operator <=(const T& rhs) const + { + return (ToFloat() <= rhs); + } + + inline bool + operator <=(const FixedPoint& rhs) const + { + return (ToFloat() <= rhs.ToFloat()); + } + +// operator >= + template + inline bool + operator >=(const T& rhs) const + { + return (ToFloat() >= rhs); + } + + inline bool + operator >=(const FixedPoint& rhs) const + { + return (ToFloat() >= rhs.ToFloat()); + } + +// operator > + template + inline bool + operator >(const T& rhs) const + { + return (ToFloat() > rhs); + } + + inline bool + operator >(const FixedPoint& rhs) const + { + return (ToFloat() > rhs.ToFloat()); + } + +// operator < + template + inline bool + operator <(const T& rhs) const + { + return (ToFloat() < rhs); + } + + inline bool + operator <(const FixedPoint& rhs) const + { + return (ToFloat() < rhs.ToFloat()); + } + + int __fixedPoint; + enum { SHIFT = postFixed }; +}; + +typedef FixedPoint<26, 6> FixedPoint26_6; +typedef FixedPoint<22, 10> FixedPoint22_10; + + +template +struct Point +{ + T x; + T y; +}; + +template +struct Dimension +{ + T w; + T h; +}; + +template +struct Rectangle +{ + T x; + T y; + T w; + T h; +}; + +template +inline bool +operator ==(const Rectangle& lhs, const Rectangle& rhs) +{ + return (lhs.x == rhs.x) && (lhs.y == rhs.y) && (lhs.w == rhs.w) && (lhs.h == rhs.h); +} + +template +inline bool +operator !=(const Rectangle& lhs, const Rectangle& rhs) +{ + return !(operator ==(lhs, rhs)); +} + +template +struct Bounds +{ + T x1; + T y1; + T x2; + T y2; + + bool IsInside(T x, T y) + { + return ((x >= x1) && (x < x2) && (y >= y1) && (y < y2)); + } + + bool IsInsideX(T x) + { + return ((x >= x1) && (x < x2)); + } +}; + +//////////////////////////////////////////////////////////////////////////////// +// String + +struct String +{ + const wchar_t* pStart; + int length; + + String(void) + : pStart(L"") + , length(0) + { + } + + String(const wchar_t* pInputString, int inputStringLength) + : pStart(pInputString) + , length(inputStringLength) + { + } + + String(const wchar_t* pInputString, int inputStringLength, int offset, int clippedLength) + { + const wchar_t* pInputStart = pInputString; + const wchar_t* pInputEnd = pInputStart + inputStringLength; + + const wchar_t* pRevisedStart = pInputString + offset; + const wchar_t* pRevisedEnd = pRevisedStart + clippedLength; + + const wchar_t* pClippedStart = (pInputStart > pRevisedStart) ? pInputStart : pRevisedStart; + const wchar_t* pClippedEnd = (pInputEnd < pRevisedEnd) ? pInputEnd : pRevisedEnd; + + if (pClippedEnd - pClippedStart > 0) + { + this->pStart = pClippedStart; + this->length = pClippedEnd - pClippedStart; + } + else + { + this->pStart = (pClippedStart == pInputString) ? pClippedStart : L""; + this->length = 0; + } + } + + operator const wchar_t*(void) + { + return pStart; + } +}; + +typedef std::wstring WString; + +} // _Util + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_GRAPHIC_UTILTYPE_H */ diff --git a/inc/engine/graphic/PngDecoder.h b/inc/engine/graphic/PngDecoder.h new file mode 100755 index 0000000..059005c --- /dev/null +++ b/inc/engine/graphic/PngDecoder.h @@ -0,0 +1,133 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef _PNG_DECODER_H_ +#define _PNG_DECODER_H_ + +#include +#include "common/HereMaps_global.h" + + +enum MediaPixelFormat +{ + MEDIA_PIXEL_FORMAT_NONE = 0x0000, /**< The undefined pixel format */ + MEDIA_PIXEL_FORMAT_RGB565LE = 0x0001, /**< The RGB565 little-endian format */ + MEDIA_PIXEL_FORMAT_RGB565BE, /**< The RGB565 big-endian format */ + MEDIA_PIXEL_FORMAT_RGB888 = 0x0100, /**< The RGB888 format */ + MEDIA_PIXEL_FORMAT_BGR888, /**< The BGR888 format */ + MEDIA_PIXEL_FORMAT_RGBA8888, /**< The RGBA8888 format */ + MEDIA_PIXEL_FORMAT_BGRA8888, /**< The BGRA8888 format */ + MEDIA_PIXEL_FORMAT_YUV420P = 0x0200, /**< The YUV420 Planar format */ + MEDIA_PIXEL_FORMAT_NV12, /**< The NV12 format */ + MEDIA_PIXEL_FORMAT_NV12_TILE, /**< The NV12 tiled format */ + MEDIA_PIXEL_FORMAT_NV21, /**< The NV21 format */ + MEDIA_PIXEL_FORMAT_YUV444P, /**< The YUV444 Planar format */ + MEDIA_PIXEL_FORMAT_YUYV422, /**< The YUYV422 format */ + MEDIA_PIXEL_FORMAT_UYVY422, /**< The UYVY422 format */ + MEDIA_PIXEL_FORMAT_GRAY, /**< The gray pixel format */ +}; + +TIZEN_MAPS_BEGIN_NAMESPACE + +class PngDecoder +{ +public: + + static const int MAX_WIDTH = 5000; + static const int MAX_HEIGHT = 5000; + static const int MAX_SIZE = 4096000; // 4Mbyte + + PngDecoder(void); + virtual ~PngDecoder(void); + + /** + * Constructs this instancce with given buffer and length. + * + * @return An error code + * @param[in] buffer The buffer that contains compressed data. + * @param[in] length The length of buffer. + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_ARG The input parameter is invalid. + */ + virtual result Construct(const byte* buffer, int length, MediaPixelFormat pixelFormat); + + /** + * Decodes current frame and returns decoded data. + * + * @return A buffer pointer of decoded data + * @param[out] outLength The length of outBuf. + * @exception E_SUCCESS The method is successful. + * @exception E_OUT_OF_MEMORY Memory is insufficient. + * @exception E_INVALID_DATA The data is invalid. + */ + virtual byte* DecodeN(int& outLength); + + /** + * Sets the decoding region. @n + * + * @return An error code + * @param[in] rect The decoding region. + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_ARG The input parameter is invalid. + * @exception E_UNSUPPORTED_OPERATION This method is unsupported. + */ + virtual result SetDecodingRegion(int x, int y, int width, int height); + + /** + * Gets current dimension of image. + * + * @return An error code + * @param[out] width The width of image. + * @param[out] height The height of image. + */ + virtual result GetDimension(int& width, int& height); + + /** + * Gets the output pixel format. + * + * @return The output pixel format. + */ + virtual MediaPixelFormat GetPixelFormat(void); + + void PngReadData(void *pngPtr, byte* data, int size); + + static void PngReadDataStatic(png_structp pngPtr, png_bytep data, png_size_t length); +protected: + + +private: + byte* __pBuf; + unsigned int __curPos; + unsigned int __bufSize; + + png_structp __pPng; + png_infop __pInfo; + + int __srcWidth; + int __srcHeight; + int __scale; + int __decodingRectX; + int __decodingRectY; + int __decodingRectWidth; + int __decodingRectHeight; + bool __isDecodeRegionEnabled; + MediaPixelFormat __format; + +}; // class PngDecoder + +TIZEN_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/graphic/Point.h b/inc/engine/graphic/Point.h new file mode 100755 index 0000000..0d00531 --- /dev/null +++ b/inc/engine/graphic/Point.h @@ -0,0 +1,217 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_GRAPHIC_POINT_H +#define HERE_GRAPHIC_POINT_H + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class Point; + +class EXPORT_API Point : public Object +{ +public: + /** + * This is the default constructor for this class. @n + * This initializes an instance of %Point with the values (0, 0). + * + * @since 2.0 + */ + Point(void); + + /** + * This is the copy constructor for the %Point class. + * + * @since 2.0 + * + * @param[in] rhs An instance of %Point + */ + Point(const Point& rhs); + + /** + * Initializes an instance of %Point with the specified location. + * + * @since 2.0 + * + * @param[in] x The x-coordinate + * @param[in] y The y-coordinate + */ + Point(int x, int y); + + /** + * This is the destructor for this class. + * + * @since 2.0 + */ + virtual ~Point(void); + + /** + * Assigns the value of the specified instance to the current instance of %Point. + * + * @since 2.0 + * + * @param[in] rhs An instance of %Point + */ + Point& operator =(const Point& rhs); + + /** + * Checks whether the current instance and the specified instance of %Point are equal. + * + * @since 2.0 + * + * @return @c true if the two instances of %Point are at the same location, @n + * else @c false + * @param[in] rhs An instance of %Point + */ + bool operator ==(const Point& rhs) const; + + /** + * Checks whether the current instance and the specified instance of %Point are not equal. + * + * @since 2.0 + * + * @return @c true if the two instances of %Point are at different locations, @n + * else @c false + * @param[in] rhs An instance of %Point + */ + bool operator !=(const Point& rhs) const; + + /** + * Adds the value of the specified instance of %Point and the current instance. + * + * @since 2.0 + * + * @return A new instance of %Point containing the resulting value of the operation + * @param[in] rhs An instance of %Point + */ + Point operator +(const Point& rhs) const; + + /** + * Subtracts the value of the specified instance of %Point from the current instance. + * + * @since 2.0 + * + * @return A new instance of %Point containing the resulting value of the operation + * @param[in] rhs An instance of %Point + */ + Point operator -(const Point& rhs) const; + + /** + * Adds the value of the specified instance of %Point to the current instance. + * + * @since 2.0 + * + * @param[in] point An instance of %Point + */ + Point& operator +=(const Point& point); + + /** + * Subtracts the value of the specified instance of %Point from the current instance. + * + * @since 2.0 + * + * @param[in] point An instance of %Point + */ + Point& operator -=(const Point& point); + + /** + * Checks whether the value of the specified instance of %Point equals the value of the current instance. + * + * @since 2.0 + * + * @return @c true if the value of the specified instance equals the value of the current instance, @n + * else @c false + * @param[in] rhs An instance of %Point + * @remarks The %Point class has a semantic value, which means that the + * Equals() method checks whether the two instances have the same + * location. + */ + virtual bool Equals(const Object& rhs) const; + + /** + * Gets the hash value of the current instance. + * + * @since 2.0 + * + * @return The hash value of the current instance + * @remarks Two equal instances must return the same hash value. @n For better performance, + * the used hash function must generate a random distribution for all inputs. + */ + virtual long GetHashCode(void) const; + + /** + * Sets the x and y coordinates for the current instance of %Point. + * + * @since 2.0 + * + * @param[in] x The new x-coordinate + * @param[in] y The new y-coordinate + */ + void SetPosition(int x, int y); + + /** + * Sets the current instance of %Point. + * + * @since 2.0 + * + * @param[in] point An instance of %Point + */ + void SetPosition(const Point& point); + + /** + * Translates this %Point to the indicated distance. + * + * @since 2.0 + * + * @param[in] deltaX The distance to move this point along the x-axis + * @param[in] deltaY The distance to move this point along the y-axis + */ + void Translate(int deltaX, int deltaY); + +public: + /** + * The x-coordinate of the point. + * + * @since 2.0 + */ + int x; + + /** + * The y-coordinate of the point. + * + * @since 2.0 + */ + int y; + +private: + friend class _PointImpl; + + // + // This variable is for internal use only. + // Using this variable can cause behavioral, security-related, and consistency-related issues in the application. + // + // @since 2.0 + // + class _PointImpl * __pImpl; + +}; // Point + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_GRAPHIC_POINT_H */ diff --git a/inc/engine/graphic/Rectangle.h b/inc/engine/graphic/Rectangle.h new file mode 100755 index 0000000..4d29ae0 --- /dev/null +++ b/inc/engine/graphic/Rectangle.h @@ -0,0 +1,327 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HERE_GRAPHIC_RECTANGLE_H +#define HERE_GRAPHIC_RECTANGLE_H + +#include "common/HereMaps_global.h" +#include "base/BaseObject.h" +#include "graphic/Point.h" +#include "graphic/Dimension.h" + +TIZEN_MAPS_BEGIN_NAMESPACE + +class Rectangle; + +class EXPORT_API Rectangle : public Object +{ +public: + /** + * This is the default constructor for this class. @n + * It initializes an instance of %Rectangle with all its attributes set to @c 0. + * + * @since 2.0 + * + * @remarks The attribute value is @c 0 when initialized. + */ + Rectangle(void); + + /** + * This is the copy constructor for the %Rectangle class. + * + * @since 2.0 + * + * @param[in] rhs An instance of %Rectangle + */ + Rectangle(const Rectangle& rhs); + + /** + * Initializes an instance of %Rectangle with the specified location and dimension. + * + * @since 2.0 + * + * @param[in] x The x-coordinate of the top-left corner of the rectangle + * @param[in] y The y-coordinate of the top-left corner of the rectangle + * @param[in] width The width of the rectangle + * @param[in] height The height of the rectangle + * + */ + Rectangle(int x, int y, int width, int height); + + /** + * Initializes an instance of %Rectangle at the location specified by @c point and + * with dimension specified by @c dim. + * + * @since 2.0 + * + * @param[in] point The location of the top-left corner of the rectangle + * @param[in] dim The width and height of the rectangle + */ + Rectangle(const Point& point, const Dimension& dim); + + /** + * This is the destructor for this class. + * + * @since 2.0 + */ + virtual ~Rectangle(void); + + /** + * Assigns the value of the specified instance to the current instance of %Rectangle. + * + * @since 2.0 + * + * @param[in] rhs An instance of %Rectangle + */ + Rectangle& operator =(const Rectangle& rhs); + + /** + * Checks whether the location and dimension of the current instance of %Rectangle match those of the + * specified instance of %Rectangle. + * + * @since 2.0 + * + * @return @c true if the location and dimension of the current instance match those of the specified instance, @n + * else @c false + * @param[in] rhs An instance of %Rectangle + */ + bool operator ==(const Rectangle& rhs) const; + + /** + * Checks whether the location and dimension of the current instance of %Rectangle do not match those of the + * specified instance of %Rectangle. + * + * @since 2.0 + * + * @return @c true if the location and dimension of the current instance do not match those of the specified instance, @n + * else @c false + * @param[in] rhs An instance of %Rectangle + */ + bool operator !=(const Rectangle& rhs) const; + + /** + * Checks whether the specified point lies inside the current instance of %Rectangle. + * + * @since 2.0 + * + * @return @c true if the location represented by the specified @c point lies inside the current instance of %Rectangle, @n + * else @c false + * @param[in] point An instance of %Point + */ + bool Contains(const Point& point) const; + + /** + * Checks whether the value of the current instance of %Rectangle equals the value of the specified instance of + * %Rectangle. + * + * @since 2.0 + * + * @return @c true if the value of the current instance of %Rectangle equals the value of the specified instance of %Rectangle, @n + * else @c false + * @param[in] rhs An instance of %Rectangle + * @remarks The %Rectangle class has a semantic value, which means that the Equals() method checks whether the + * two instances have the same location and size. + */ + virtual bool Equals(const Object& rhs) const; + + /** + * Gets the hash value of the current instance. + * + * @since 2.0 + * + * @return The hash value of the current instance + */ + virtual long GetHashCode(void) const; + + /** + * Gets the intersection of the current instance and the specified instance of %Rectangle. @n + * If the two instances of %Rectangle do not intersect, an empty instance is returned. + * + * @since 2.0 + * + * @param[in] rect An instance of %Rectangle + */ + Rectangle GetIntersection(const Rectangle& rect) const; + + /** + * Checks whether the current instance of %Rectangle intersects with the specified instance of %Rectangle. + * + * @since 2.0 + * + * @return @c true if the current instance of %Rectangle intersects with the specified instance of %Rectangle, @n + * else @c false + * @param[in] rect An instance of %Rectangle + * + */ + bool IsIntersected(const Rectangle& rect) const; + + /** + * Gets the union of the current instance and the specified instance of %Rectangle. + * + * @since 2.0 + * + * @return An instance of %Rectangle containing the union of the two rectangles + * @param[in] rect An instance of %Rectangle + */ + Rectangle GetUnion(const Rectangle& rect) const; + + /** + * Gets the coordinates of the point at the bottom-right corner of the rectangle. + * + * @since 2.0 + * + * @return The coordinates of the point at the bottom-right corner of the rectangle + */ + Point GetBottomRight(void) const; + + /** + * Gets the coordinates of the point at the top-left corner of the rectangle. + * + * @since 2.0 + * + * @return The coordinates of the point at the top-left corner of the rectangle + */ + Point GetTopLeft(void) const; + + /** + * Checks whether this %Rectangle is empty. @n + * A %Rectangle is empty if its width or its height is less than or equal to @c 0. + * + * @since 2.0 + * + * @return @c true if this rectangle is empty, @n + * else @c false + */ + bool IsEmpty(void) const; + + /** + * Sets the size of this %Rectangle to match the specified Dimension. + * + * @since 2.0 + * + * @param[in] dim The new size for the Dimension + */ + void SetSize(const Dimension& dim); + + /** + * Sets the size of this %Rectangle to match the specified dimension. + * + * @since 2.0 + * + * @param[in] width The new width + * @param[in] height The new height + */ + void SetSize(int width, int height); + + /** + * Sets the position of this %Rectangle to the specified point. + * + * @since 2.0 + * + * @param[in] point The new position + */ + void SetPosition(const Point& point); + + /** + * Sets the location of the current instance of %Rectangle with the specified values of the + * x and y coordinates of the top-left corner point. + * + * @since 2.0 + * + * @param[in] x The new x-coordinate + * @param[in] y The new y-coordinate + */ + void SetPosition(int x, int y); + + /** + * Sets the location and the dimensions of the current instance of %Rectangle with the specified x and y + * coordinates of the top-left corner point and the specified dimensions. + * + * @since 2.0 + * + * @param[in] x The new x coordinate + * @param[in] y The new y coordinate + * @param[in] width The new width + * @param[in] height The new height + */ + void SetBounds(int x, int y, int width, int height); + + /** + * Sets the location and the dimensions of the current instance of %Rectangle with the specified location and + * dimension. + * + * @since 2.0 + * + * @param[in] point An instance of Point + * @param[in] dim An instance of Dimension + */ + void SetBounds(const Point& point, const Dimension& dim); + + /** + * Translates this %Rectangle to the new point by the specified distance along the x-axis and y-axis. + * + * @since 2.0 + * + * @param[in] deltaX The distance to move this %Rectangle along the x-axis + * @param[in] deltaY The distance to move this %Rectangle along the y-axis + */ + void Translate(int deltaX, int deltaY); + +public: + /** + * The x-coordinate of the top-left corner of the rectangle. + * + * @since 2.0 + */ + int x; + + /** + * The y-coordinate of the top-left corner of the rectangle. + * + * @since 2.0 + */ + int y; + + /** + * The width of this rectangle. + * + * @since 2.0 + */ + int width; + + /** + * The height of this rectangle. + * + * @since 2.0 + */ + int height; + +private: + friend class _RectangleImpl; + + // + // This variable is for internal use only. + // Using this variable can cause behavioral, security-related, and consistency-related issues in the application. + // + // @since 2.0 + // + class _RectangleImpl * __pImpl; + +}; // Rectangle + +TIZEN_MAPS_END_NAMESPACE + +#endif /* HERE_GRAPHIC_RECTANGLE_H */ diff --git a/inc/engine/internal/Distance.h b/inc/engine/internal/Distance.h new file mode 100644 index 0000000..af5e76a --- /dev/null +++ b/inc/engine/internal/Distance.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef DISTANCE_H_ +#define DISTANCE_H_ + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class Distance +{ +public: + Distance(); + Distance(float f); + float Get() const; + bool IsValid() const; + +private: + float __internal; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // DISTANCE_H_ diff --git a/inc/engine/internal/DoublePoint.h b/inc/engine/internal/DoublePoint.h new file mode 100644 index 0000000..54f923e --- /dev/null +++ b/inc/engine/internal/DoublePoint.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef DOUBLEPOINT_H +#define DOUBLEPOINT_H + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class DoublePoint +{ +public: + DoublePoint(double _x, double _y) : x(_x), y(_y){} + + double x; + double y; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/internal/DoublePoint3.h b/inc/engine/internal/DoublePoint3.h new file mode 100644 index 0000000..ab21fe7 --- /dev/null +++ b/inc/engine/internal/DoublePoint3.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef DOUBLEPOINT3_H +#define DOUBLEPOINT3_H + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class DoublePoint3 +{ +public: + DoublePoint3() : x(0), y(0), z(0) {} + DoublePoint3(double _x, double _y, double _z) : x(_x), y(_y), z(_z){} + + double x; + double y; + double z; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/internal/EncodingConversion.h b/inc/engine/internal/EncodingConversion.h new file mode 100755 index 0000000..dbad832 --- /dev/null +++ b/inc/engine/internal/EncodingConversion.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef ENCODING_CONVERSION_H +#define ENCODING_CONVERSION_H + +#include "common/HereMaps_global.h" + +#include + +#ifndef TIZEN_MIGRATION +namespace Tizen{ namespace Base{ class ByteBuffer; } } +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class offers encoding conversion utilities between UTF-8 and platform + * default string encoding. + */ +class EncodingConversion +{ +public: + /** + * This method converts a platform string to UTF-8. + * + * @param sSrc A constant reference to a platform string to convert. + * + * @param sDst A reference to a string object holding the results of + * conversion to UTF-8. + * + * @return Always true. + */ + static bool ToUTF8(const WString& sSrc, std::string& sDst); + + + /** + * This method converts a UTF-8 string to a platform string. + * + * @param sSrc A constant reference to an unsigned character buffer + * containing the string to convert. + * + * @param uLen A value representing the length of the buffer containing the + * string to covert. + * + * @param sDst A reference to a string object holding the results of + * conversion from UTF-8. + * + * @return Always true. + */ + static bool FromUTF8(const char* pSrc, size_t uLen, WString& sDst); + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(EncodingConversion); +}; + + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/internal/FPSCounter.h b/inc/engine/internal/FPSCounter.h new file mode 100644 index 0000000..626cc2d --- /dev/null +++ b/inc/engine/internal/FPSCounter.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef FPSCOUNTER_H +#define FPSCOUNTER_H + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class FPSCounter +{ +public: + FPSCounter(unsigned int uNumAccumulateFrames); + void operator++(); + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(FPSCounter); + + long long m_lastTick; + unsigned int m_uNumFrames; + unsigned int m_uNumAccumulateFrames; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/internal/GeoMercatorProjection.h b/inc/engine/internal/GeoMercatorProjection.h new file mode 100755 index 0000000..9c30566 --- /dev/null +++ b/inc/engine/internal/GeoMercatorProjection.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOMERCATORPROJECTION_H +#define GEOMERCATORPROJECTION_H + +#include + +#ifdef TIZEN_OSP_BASED +#include +#endif + +#include "common/HereMaps_global.h" +#include "maps/GeoProjection.h" +#include "internal/DoublePoint.h" +#include "internal/DoublePoint3.h" + +HERE_MAPS_BEGIN_NAMESPACE + + +/** + * This class encapsulates the normalized mercator projection. In this + * projection, the map is represented by a grid of square tiles (bitmap + * images). The position of the tile in this grid depends on the map zoom level + * and is defined by the x and y coordinates. At the lowest zoom level, there is + * only one tile. At the next zoom level, the grid is 2 x 2. With each higher + * zoom level the x-size and the y-size of the grid increase by a power of two. + * + * \ingroup maps + */ + +class GeoMercatorProjection : public GeoProjection +{ +public: + GeoMercatorProjection(); + + virtual void setTileSize(const Tizen::Maps::Dimension& size); + virtual void setScreenSize(const Tizen::Maps::Dimension& size); + virtual void setLevel(double value); + virtual void setGeoCenter(const GeoCoordinates& value); + virtual void setHeading(double value); + virtual bool setGeoCenterInPx(const Tizen::Maps::Point& value); + virtual Tizen::Maps::Point geoToPixel(const GeoCoordinates& geo) const; + virtual GeoCoordinates pixelToGeo(const Tizen::Maps::Point &pixel) const; + virtual std::vector projectRoot(); + +protected: + virtual GeoProjectionNode* createNodeAt(double left_x, double bottom_y); + virtual void filter(GeoProjectionNode& transform,const std::vector& points); + virtual DoublePoint3 projectPoint(double x, double y, double z = 0.0) const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoMercatorProjection); + + void createProjection(); +}; + +HERE_MAPS_END_NAMESPACE + +#endif // GEOMERCATORPROJECTION_P_H diff --git a/inc/engine/internal/GeoOpenGlRenderer.h b/inc/engine/internal/GeoOpenGlRenderer.h new file mode 100755 index 0000000..1686353 --- /dev/null +++ b/inc/engine/internal/GeoOpenGlRenderer.h @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOOPENGLRENDERER_H +#define GEOOPENGLRENDERER_H + +#include "common/HereMaps_global.h" + +#include + +#ifdef TIZEN_MIGRATION +#include "graphic/FloatRectangle.h" +#include "graphic/Color.h" +#else +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class GlTexture; +class GeoTiledMap; +class GeoMapObjectMarker; +class GeoProjectionNode; +class DrawableBitmap; + +/** + * This class encapsulates an Open GL renderer used to render map tiles. + * + * \ingroup maps + */ +class GeoOpenGlRenderer +{ +public: + /** + * This method is the default constructor. + */ + GeoOpenGlRenderer(); + + /** + * This method is the default destructor. + */ + ~GeoOpenGlRenderer(); + + /** + * This method creates an EGL texture from the image associated with the + * caller-supplied bitmap drawable. + * + * @param rDrawableBitmap A reference to a bitmap object that contains the + * image to be drawn. + * + * @return true if the image has been made drawable, + * false if a texture could not be associated with the supplied + * bitmap object. + */ + bool MakeDrawable(DrawableBitmap& rDrawableBitmap); + + /** + * This method renders the image(s) provided by the caller. The caller can + * specify the size of the area to render (the visible map area). + * + * @param nodes A list of objects containing images to render. + * + * @param width A value indicating the width of the area to render. + * + * @param height A value indicating the height of the area to render. + */ + bool Render(const std::vector& nodes, + unsigned int width, + unsigned int height); + + /** + * This method renders a square, using the rectangle and texture specified + * by the caller. + * + * @param aRect A constant reference to the rectangle to render. + * + * @param rTexture A constant reference to the texture object to apply. + * + * @param sx0 A value providing the x coordinate of the top left corner of + * the rectangle in the tile grid. + * + * @param sy0 A value providing the y coordinate of the top left corner of + * the rectangle in the tile grid. + * + * @param sx1 A value providing the x coordinate of the bottom right corner of + * the rectangle in the tile grid. + * + * @param sy1 A value providing the y coordinate of the bottom right corner of + * the rectangle in the tile grid. + */ + bool RenderQuad(const Tizen::Maps::FloatRectangle& aRect, const GlTexture& rTexture, float sx0=0.f, float sy0=1.f, float sx1=1.f, float sy1=0.f); + + /** + * This method renders a square, using the rectangle and texture specified + * by the caller. + * + * @param aRect A constant reference to the rectangle to render. + * + * @param uTexture A value of the id of the texture object to apply. + * + * @param sx0 A value providing the x coordinate of the top left corner of + * the rectangle in the tile grid. + * + * @param sy0 A value providing the y coordinate of the top left corner of + * the rectangle in the tile grid. + * + * @param sx1 A value providing the x coordinate of the bottom right corner of + * the rectangle in the tile grid. + * + * @param sy1 A value providing the y coordinate of the bottom right corner of + * the rectangle in the tile grid. + */ + bool RenderQuad(const Tizen::Maps::FloatRectangle& aRect, unsigned int uTextureId, float sx0=0.f, float sy0=1.f, float sx1=1.f, float sy1=0.f); + + /** + * This method changes the color that will be used by the gl clear method. + */ + void SetClearColor(const Tizen::Maps::Color& color); + + /** + * This method clears the screen. + */ + void Clear(); + +private: + bool Initialize(); + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoOpenGlRenderer); + class GeoOpenGlRendererImpl; + GeoOpenGlRendererImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // GEOOPENGLRENDERER_P_H diff --git a/inc/engine/internal/HereLogo.h b/inc/engine/internal/HereLogo.h new file mode 100644 index 0000000..3a377b0 --- /dev/null +++ b/inc/engine/internal/HereLogo.h @@ -0,0 +1,4631 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +Byte byHERE_logo_blue_transparent_rgb_16px[3146] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, +0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, +0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, +0xf4, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, +0x73, 0x00, 0x00, 0x2e, 0x23, 0x00, 0x00, 0x2e, +0x23, 0x01, 0x78, 0xa5, 0x3f, 0x76, 0x00, 0x00, +0x0a, 0x4f, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, +0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x66, +0x69, 0x6c, 0x65, 0x00, 0x00, 0x78, 0xda, 0x9d, +0x53, 0x67, 0x54, 0x53, 0xe9, 0x16, 0x3d, 0xf7, +0xde, 0xf4, 0x42, 0x4b, 0x88, 0x80, 0x94, 0x4b, +0x6f, 0x52, 0x15, 0x08, 0x20, 0x52, 0x42, 0x8b, +0x80, 0x14, 0x91, 0x26, 0x2a, 0x21, 0x09, 0x10, +0x4a, 0x88, 0x21, 0xa1, 0xd9, 0x15, 0x51, 0xc1, +0x11, 0x45, 0x45, 0x04, 0x1b, 0xc8, 0xa0, 0x88, +0x03, 0x8e, 0x8e, 0x80, 0x8c, 0x15, 0x51, 0x2c, +0x0c, 0x8a, 0x0a, 0xd8, 0x07, 0xe4, 0x21, 0xa2, +0x8e, 0x83, 0xa3, 0x88, 0x8a, 0xca, 0xfb, 0xe1, +0x7b, 0xa3, 0x6b, 0xd6, 0xbc, 0xf7, 0xe6, 0xcd, +0xfe, 0xb5, 0xd7, 0x3e, 0xe7, 0xac, 0xf3, 0x9d, +0xb3, 0xcf, 0x07, 0xc0, 0x08, 0x0c, 0x96, 0x48, +0x33, 0x51, 0x35, 0x80, 0x0c, 0xa9, 0x42, 0x1e, +0x11, 0xe0, 0x83, 0xc7, 0xc4, 0xc6, 0xe1, 0xe4, +0x2e, 0x40, 0x81, 0x0a, 0x24, 0x70, 0x00, 0x10, +0x08, 0xb3, 0x64, 0x21, 0x73, 0xfd, 0x23, 0x01, +0x00, 0xf8, 0x7e, 0x3c, 0x3c, 0x2b, 0x22, 0xc0, +0x07, 0xbe, 0x00, 0x01, 0x78, 0xd3, 0x0b, 0x08, +0x00, 0xc0, 0x4d, 0x9b, 0xc0, 0x30, 0x1c, 0x87, +0xff, 0x0f, 0xea, 0x42, 0x99, 0x5c, 0x01, 0x80, +0x84, 0x01, 0xc0, 0x74, 0x91, 0x38, 0x4b, 0x08, +0x80, 0x14, 0x00, 0x40, 0x7a, 0x8e, 0x42, 0xa6, +0x00, 0x40, 0x46, 0x01, 0x80, 0x9d, 0x98, 0x26, +0x53, 0x00, 0xa0, 0x04, 0x00, 0x60, 0xcb, 0x63, +0x62, 0xe3, 0x00, 0x50, 0x2d, 0x00, 0x60, 0x27, +0x7f, 0xe6, 0xd3, 0x00, 0x80, 0x9d, 0xf8, 0x99, +0x7b, 0x01, 0x00, 0x5b, 0x94, 0x21, 0x15, 0x01, +0xa0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, +0x00, 0x68, 0x3b, 0x00, 0xac, 0xcf, 0x56, 0x8a, +0x45, 0x00, 0x58, 0x30, 0x00, 0x14, 0x66, 0x4b, +0xc4, 0x39, 0x00, 0xd8, 0x2d, 0x00, 0x30, 0x49, +0x57, 0x66, 0x48, 0x00, 0xb0, 0xb7, 0x00, 0xc0, +0xce, 0x10, 0x0b, 0xb2, 0x00, 0x08, 0x0c, 0x00, +0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7b, +0x00, 0x60, 0xc8, 0x23, 0x23, 0x78, 0x00, 0x84, +0x99, 0x00, 0x14, 0x46, 0xf2, 0x57, 0x3c, 0xf1, +0x2b, 0xae, 0x10, 0xe7, 0x2a, 0x00, 0x00, 0x78, +0x99, 0xb2, 0x3c, 0xb9, 0x24, 0x39, 0x45, 0x81, +0x5b, 0x08, 0x2d, 0x71, 0x07, 0x57, 0x57, 0x2e, +0x1e, 0x28, 0xce, 0x49, 0x17, 0x2b, 0x14, 0x36, +0x61, 0x02, 0x61, 0x9a, 0x40, 0x2e, 0xc2, 0x79, +0x99, 0x19, 0x32, 0x81, 0x34, 0x0f, 0xe0, 0xf3, +0xcc, 0x00, 0x00, 0xa0, 0x91, 0x15, 0x11, 0xe0, +0x83, 0xf3, 0xfd, 0x78, 0xce, 0x0e, 0xae, 0xce, +0xce, 0x36, 0x8e, 0xb6, 0x0e, 0x5f, 0x2d, 0xea, +0xbf, 0x06, 0xff, 0x22, 0x62, 0x62, 0xe3, 0xfe, +0xe5, 0xcf, 0xab, 0x70, 0x40, 0x00, 0x00, 0xe1, +0x74, 0x7e, 0xd1, 0xfe, 0x2c, 0x2f, 0xb3, 0x1a, +0x80, 0x3b, 0x06, 0x80, 0x6d, 0xfe, 0xa2, 0x25, +0xee, 0x04, 0x68, 0x5e, 0x0b, 0xa0, 0x75, 0xf7, +0x8b, 0x66, 0xb2, 0x0f, 0x40, 0xb5, 0x00, 0xa0, +0xe9, 0xda, 0x57, 0xf3, 0x70, 0xf8, 0x7e, 0x3c, +0x3c, 0x45, 0xa1, 0x90, 0xb9, 0xd9, 0xd9, 0xe5, +0xe4, 0xe4, 0xd8, 0x4a, 0xc4, 0x42, 0x5b, 0x61, +0xca, 0x57, 0x7d, 0xfe, 0x67, 0xc2, 0x5f, 0xc0, +0x57, 0xfd, 0x6c, 0xf9, 0x7e, 0x3c, 0xfc, 0xf7, +0xf5, 0xe0, 0xbe, 0xe2, 0x24, 0x81, 0x32, 0x5d, +0x81, 0x47, 0x04, 0xf8, 0xe0, 0xc2, 0xcc, 0xf4, +0x4c, 0xa5, 0x1c, 0xcf, 0x92, 0x09, 0x84, 0x62, +0xdc, 0xe6, 0x8f, 0x47, 0xfc, 0xb7, 0x0b, 0xff, +0xfc, 0x1d, 0xd3, 0x22, 0xc4, 0x49, 0x62, 0xb9, +0x58, 0x2a, 0x14, 0xe3, 0x51, 0x12, 0x71, 0x8e, +0x44, 0x9a, 0x8c, 0xf3, 0x32, 0xa5, 0x22, 0x89, +0x42, 0x92, 0x29, 0xc5, 0x25, 0xd2, 0xff, 0x64, +0xe2, 0xdf, 0x2c, 0xfb, 0x03, 0x3e, 0xdf, 0x35, +0x00, 0xb0, 0x6a, 0x3e, 0x01, 0x7b, 0x91, 0x2d, +0xa8, 0x5d, 0x63, 0x03, 0xf6, 0x4b, 0x27, 0x10, +0x58, 0x74, 0xc0, 0xe2, 0xf7, 0x00, 0x00, 0xf2, +0xbb, 0x6f, 0xc1, 0xd4, 0x28, 0x08, 0x03, 0x80, +0x68, 0x83, 0xe1, 0xcf, 0x77, 0xff, 0xef, 0x3f, +0xfd, 0x47, 0xa0, 0x25, 0x00, 0x80, 0x66, 0x49, +0x92, 0x71, 0x00, 0x00, 0x5e, 0x44, 0x24, 0x2e, +0x54, 0xca, 0xb3, 0x3f, 0xc7, 0x08, 0x00, 0x00, +0x44, 0xa0, 0x81, 0x2a, 0xb0, 0x41, 0x1b, 0xf4, +0xc1, 0x18, 0x2c, 0xc0, 0x06, 0x1c, 0xc1, 0x05, +0xdc, 0xc1, 0x0b, 0xfc, 0x60, 0x36, 0x84, 0x42, +0x24, 0xc4, 0xc2, 0x42, 0x10, 0x42, 0x0a, 0x64, +0x80, 0x1c, 0x72, 0x60, 0x29, 0xac, 0x82, 0x42, +0x28, 0x86, 0xcd, 0xb0, 0x1d, 0x2a, 0x60, 0x2f, +0xd4, 0x40, 0x1d, 0x34, 0xc0, 0x51, 0x68, 0x86, +0x93, 0x70, 0x0e, 0x2e, 0xc2, 0x55, 0xb8, 0x0e, +0x3d, 0x70, 0x0f, 0xfa, 0x61, 0x08, 0x9e, 0xc1, +0x28, 0xbc, 0x81, 0x09, 0x04, 0x41, 0xc8, 0x08, +0x13, 0x61, 0x21, 0xda, 0x88, 0x01, 0x62, 0x8a, +0x58, 0x23, 0x8e, 0x08, 0x17, 0x99, 0x85, 0xf8, +0x21, 0xc1, 0x48, 0x04, 0x12, 0x8b, 0x24, 0x20, +0xc9, 0x88, 0x14, 0x51, 0x22, 0x4b, 0x91, 0x35, +0x48, 0x31, 0x52, 0x8a, 0x54, 0x20, 0x55, 0x48, +0x1d, 0xf2, 0x3d, 0x72, 0x02, 0x39, 0x87, 0x5c, +0x46, 0xba, 0x91, 0x3b, 0xc8, 0x00, 0x32, 0x82, +0xfc, 0x86, 0xbc, 0x47, 0x31, 0x94, 0x81, 0xb2, +0x51, 0x3d, 0xd4, 0x0c, 0xb5, 0x43, 0xb9, 0xa8, +0x37, 0x1a, 0x84, 0x46, 0xa2, 0x0b, 0xd0, 0x64, +0x74, 0x31, 0x9a, 0x8f, 0x16, 0xa0, 0x9b, 0xd0, +0x72, 0xb4, 0x1a, 0x3d, 0x8c, 0x36, 0xa1, 0xe7, +0xd0, 0xab, 0x68, 0x0f, 0xda, 0x8f, 0x3e, 0x43, +0xc7, 0x30, 0xc0, 0xe8, 0x18, 0x07, 0x33, 0xc4, +0x6c, 0x30, 0x2e, 0xc6, 0xc3, 0x42, 0xb1, 0x38, +0x2c, 0x09, 0x93, 0x63, 0xcb, 0xb1, 0x22, 0xac, +0x0c, 0xab, 0xc6, 0x1a, 0xb0, 0x56, 0xac, 0x03, +0xbb, 0x89, 0xf5, 0x63, 0xcf, 0xb1, 0x77, 0x04, +0x12, 0x81, 0x45, 0xc0, 0x09, 0x36, 0x04, 0x77, +0x42, 0x20, 0x61, 0x1e, 0x41, 0x48, 0x58, 0x4c, +0x58, 0x4e, 0xd8, 0x48, 0xa8, 0x20, 0x1c, 0x24, +0x34, 0x11, 0xda, 0x09, 0x37, 0x09, 0x03, 0x84, +0x51, 0xc2, 0x27, 0x22, 0x93, 0xa8, 0x4b, 0xb4, +0x26, 0xba, 0x11, 0xf9, 0xc4, 0x18, 0x62, 0x32, +0x31, 0x87, 0x58, 0x48, 0x2c, 0x23, 0xd6, 0x12, +0x8f, 0x13, 0x2f, 0x10, 0x7b, 0x88, 0x43, 0xc4, +0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xb9, +0x90, 0x02, 0x49, 0xb1, 0xa4, 0x54, 0xd2, 0x12, +0xd2, 0x46, 0xd2, 0x6e, 0x52, 0x23, 0xe9, 0x2c, +0xa9, 0x9b, 0x34, 0x48, 0x1a, 0x23, 0x93, 0xc9, +0xda, 0x64, 0x6b, 0xb2, 0x07, 0x39, 0x94, 0x2c, +0x20, 0x2b, 0xc8, 0x85, 0xe4, 0x9d, 0xe4, 0xc3, +0xe4, 0x33, 0xe4, 0x1b, 0xe4, 0x21, 0xf2, 0x5b, +0x0a, 0x9d, 0x62, 0x40, 0x71, 0xa4, 0xf8, 0x53, +0xe2, 0x28, 0x52, 0xca, 0x6a, 0x4a, 0x19, 0xe5, +0x10, 0xe5, 0x34, 0xe5, 0x06, 0x65, 0x98, 0x32, +0x41, 0x55, 0xa3, 0x9a, 0x52, 0xdd, 0xa8, 0xa1, +0x54, 0x11, 0x35, 0x8f, 0x5a, 0x42, 0xad, 0xa1, +0xb6, 0x52, 0xaf, 0x51, 0x87, 0xa8, 0x13, 0x34, +0x75, 0x9a, 0x39, 0xcd, 0x83, 0x16, 0x49, 0x4b, +0xa5, 0xad, 0xa2, 0x95, 0xd3, 0x1a, 0x68, 0x17, +0x68, 0xf7, 0x69, 0xaf, 0xe8, 0x74, 0xba, 0x11, +0xdd, 0x95, 0x1e, 0x4e, 0x97, 0xd0, 0x57, 0xd2, +0xcb, 0xe9, 0x47, 0xe8, 0x97, 0xe8, 0x03, 0xf4, +0x77, 0x0c, 0x0d, 0x86, 0x15, 0x83, 0xc7, 0x88, +0x67, 0x28, 0x19, 0x9b, 0x18, 0x07, 0x18, 0x67, +0x19, 0x77, 0x18, 0xaf, 0x98, 0x4c, 0xa6, 0x19, +0xd3, 0x8b, 0x19, 0xc7, 0x54, 0x30, 0x37, 0x31, +0xeb, 0x98, 0xe7, 0x99, 0x0f, 0x99, 0x6f, 0x55, +0x58, 0x2a, 0xb6, 0x2a, 0x7c, 0x15, 0x91, 0xca, +0x0a, 0x95, 0x4a, 0x95, 0x26, 0x95, 0x1b, 0x2a, +0x2f, 0x54, 0xa9, 0xaa, 0xa6, 0xaa, 0xde, 0xaa, +0x0b, 0x55, 0xf3, 0x55, 0xcb, 0x54, 0x8f, 0xa9, +0x5e, 0x53, 0x7d, 0xae, 0x46, 0x55, 0x33, 0x53, +0xe3, 0xa9, 0x09, 0xd4, 0x96, 0xab, 0x55, 0xaa, +0x9d, 0x50, 0xeb, 0x53, 0x1b, 0x53, 0x67, 0xa9, +0x3b, 0xa8, 0x87, 0xaa, 0x67, 0xa8, 0x6f, 0x54, +0x3f, 0xa4, 0x7e, 0x59, 0xfd, 0x89, 0x06, 0x59, +0xc3, 0x4c, 0xc3, 0x4f, 0x43, 0xa4, 0x51, 0xa0, +0xb1, 0x5f, 0xe3, 0xbc, 0xc6, 0x20, 0x0b, 0x63, +0x19, 0xb3, 0x78, 0x2c, 0x21, 0x6b, 0x0d, 0xab, +0x86, 0x75, 0x81, 0x35, 0xc4, 0x26, 0xb1, 0xcd, +0xd9, 0x7c, 0x76, 0x2a, 0xbb, 0x98, 0xfd, 0x1d, +0xbb, 0x8b, 0x3d, 0xaa, 0xa9, 0xa1, 0x39, 0x43, +0x33, 0x4a, 0x33, 0x57, 0xb3, 0x52, 0xf3, 0x94, +0x66, 0x3f, 0x07, 0xe3, 0x98, 0x71, 0xf8, 0x9c, +0x74, 0x4e, 0x09, 0xe7, 0x28, 0xa7, 0x97, 0xf3, +0x7e, 0x8a, 0xde, 0x14, 0xef, 0x29, 0xe2, 0x29, +0x1b, 0xa6, 0x34, 0x4c, 0xb9, 0x31, 0x65, 0x5c, +0x6b, 0xaa, 0x96, 0x97, 0x96, 0x58, 0xab, 0x48, +0xab, 0x51, 0xab, 0x47, 0xeb, 0xbd, 0x36, 0xae, +0xed, 0xa7, 0x9d, 0xa6, 0xbd, 0x45, 0xbb, 0x59, +0xfb, 0x81, 0x0e, 0x41, 0xc7, 0x4a, 0x27, 0x5c, +0x27, 0x47, 0x67, 0x8f, 0xce, 0x05, 0x9d, 0xe7, +0x53, 0xd9, 0x53, 0xdd, 0xa7, 0x0a, 0xa7, 0x16, +0x4d, 0x3d, 0x3a, 0xf5, 0xae, 0x2e, 0xaa, 0x6b, +0xa5, 0x1b, 0xa1, 0xbb, 0x44, 0x77, 0xbf, 0x6e, +0xa7, 0xee, 0x98, 0x9e, 0xbe, 0x5e, 0x80, 0x9e, +0x4c, 0x6f, 0xa7, 0xde, 0x79, 0xbd, 0xe7, 0xfa, +0x1c, 0x7d, 0x2f, 0xfd, 0x54, 0xfd, 0x6d, 0xfa, +0xa7, 0xf5, 0x47, 0x0c, 0x58, 0x06, 0xb3, 0x0c, +0x24, 0x06, 0xdb, 0x0c, 0xce, 0x18, 0x3c, 0xc5, +0x35, 0x71, 0x6f, 0x3c, 0x1d, 0x2f, 0xc7, 0xdb, +0xf1, 0x51, 0x43, 0x5d, 0xc3, 0x40, 0x43, 0xa5, +0x61, 0x95, 0x61, 0x97, 0xe1, 0x84, 0x91, 0xb9, +0xd1, 0x3c, 0xa3, 0xd5, 0x46, 0x8d, 0x46, 0x0f, +0x8c, 0x69, 0xc6, 0x5c, 0xe3, 0x24, 0xe3, 0x6d, +0xc6, 0x6d, 0xc6, 0xa3, 0x26, 0x06, 0x26, 0x21, +0x26, 0x4b, 0x4d, 0xea, 0x4d, 0xee, 0x9a, 0x52, +0x4d, 0xb9, 0xa6, 0x29, 0xa6, 0x3b, 0x4c, 0x3b, +0x4c, 0xc7, 0xcd, 0xcc, 0xcd, 0xa2, 0xcd, 0xd6, +0x99, 0x35, 0x9b, 0x3d, 0x31, 0xd7, 0x32, 0xe7, +0x9b, 0xe7, 0x9b, 0xd7, 0x9b, 0xdf, 0xb7, 0x60, +0x5a, 0x78, 0x5a, 0x2c, 0xb6, 0xa8, 0xb6, 0xb8, +0x65, 0x49, 0xb2, 0xe4, 0x5a, 0xa6, 0x59, 0xee, +0xb6, 0xbc, 0x6e, 0x85, 0x5a, 0x39, 0x59, 0xa5, +0x58, 0x55, 0x5a, 0x5d, 0xb3, 0x46, 0xad, 0x9d, +0xad, 0x25, 0xd6, 0xbb, 0xad, 0xbb, 0xa7, 0x11, +0xa7, 0xb9, 0x4e, 0x93, 0x4e, 0xab, 0x9e, 0xd6, +0x67, 0xc3, 0xb0, 0xf1, 0xb6, 0xc9, 0xb6, 0xa9, +0xb7, 0x19, 0xb0, 0xe5, 0xd8, 0x06, 0xdb, 0xae, +0xb6, 0x6d, 0xb6, 0x7d, 0x61, 0x67, 0x62, 0x17, +0x67, 0xb7, 0xc5, 0xae, 0xc3, 0xee, 0x93, 0xbd, +0x93, 0x7d, 0xba, 0x7d, 0x8d, 0xfd, 0x3d, 0x07, +0x0d, 0x87, 0xd9, 0x0e, 0xab, 0x1d, 0x5a, 0x1d, +0x7e, 0x73, 0xb4, 0x72, 0x14, 0x3a, 0x56, 0x3a, +0xde, 0x9a, 0xce, 0x9c, 0xee, 0x3f, 0x7d, 0xc5, +0xf4, 0x96, 0xe9, 0x2f, 0x67, 0x58, 0xcf, 0x10, +0xcf, 0xd8, 0x33, 0xe3, 0xb6, 0x13, 0xcb, 0x29, +0xc4, 0x69, 0x9d, 0x53, 0x9b, 0xd3, 0x47, 0x67, +0x17, 0x67, 0xb9, 0x73, 0x83, 0xf3, 0x88, 0x8b, +0x89, 0x4b, 0x82, 0xcb, 0x2e, 0x97, 0x3e, 0x2e, +0x9b, 0x1b, 0xc6, 0xdd, 0xc8, 0xbd, 0xe4, 0x4a, +0x74, 0xf5, 0x71, 0x5d, 0xe1, 0x7a, 0xd2, 0xf5, +0x9d, 0x9b, 0xb3, 0x9b, 0xc2, 0xed, 0xa8, 0xdb, +0xaf, 0xee, 0x36, 0xee, 0x69, 0xee, 0x87, 0xdc, +0x9f, 0xcc, 0x34, 0x9f, 0x29, 0x9e, 0x59, 0x33, +0x73, 0xd0, 0xc3, 0xc8, 0x43, 0xe0, 0x51, 0xe5, +0xd1, 0x3f, 0x0b, 0x9f, 0x95, 0x30, 0x6b, 0xdf, +0xac, 0x7e, 0x4f, 0x43, 0x4f, 0x81, 0x67, 0xb5, +0xe7, 0x23, 0x2f, 0x63, 0x2f, 0x91, 0x57, 0xad, +0xd7, 0xb0, 0xb7, 0xa5, 0x77, 0xaa, 0xf7, 0x61, +0xef, 0x17, 0x3e, 0xf6, 0x3e, 0x72, 0x9f, 0xe3, +0x3e, 0xe3, 0x3c, 0x37, 0xde, 0x32, 0xde, 0x59, +0x5f, 0xcc, 0x37, 0xc0, 0xb7, 0xc8, 0xb7, 0xcb, +0x4f, 0xc3, 0x6f, 0x9e, 0x5f, 0x85, 0xdf, 0x43, +0x7f, 0x23, 0xff, 0x64, 0xff, 0x7a, 0xff, 0xd1, +0x00, 0xa7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, +0x81, 0x41, 0x81, 0x5b, 0x02, 0xfb, 0xf8, 0x7a, +0x7c, 0x21, 0xbf, 0x8e, 0x3f, 0x3a, 0xdb, 0x65, +0xf6, 0xb2, 0xd9, 0xed, 0x41, 0x8c, 0xa0, 0xb9, +0x41, 0x15, 0x41, 0x8f, 0x82, 0xad, 0x82, 0xe5, +0xc1, 0xad, 0x21, 0x68, 0xc8, 0xec, 0x90, 0xad, +0x21, 0xf7, 0xe7, 0x98, 0xce, 0x91, 0xce, 0x69, +0x0e, 0x85, 0x50, 0x7e, 0xe8, 0xd6, 0xd0, 0x07, +0x61, 0xe6, 0x61, 0x8b, 0xc3, 0x7e, 0x0c, 0x27, +0x85, 0x87, 0x85, 0x57, 0x86, 0x3f, 0x8e, 0x70, +0x88, 0x58, 0x1a, 0xd1, 0x31, 0x97, 0x35, 0x77, +0xd1, 0xdc, 0x43, 0x73, 0xdf, 0x44, 0xfa, 0x44, +0x96, 0x44, 0xde, 0x9b, 0x67, 0x31, 0x4f, 0x39, +0xaf, 0x2d, 0x4a, 0x35, 0x2a, 0x3e, 0xaa, 0x2e, +0x6a, 0x3c, 0xda, 0x37, 0xba, 0x34, 0xba, 0x3f, +0xc6, 0x2e, 0x66, 0x59, 0xcc, 0xd5, 0x58, 0x9d, +0x58, 0x49, 0x6c, 0x4b, 0x1c, 0x39, 0x2e, 0x2a, +0xae, 0x36, 0x6e, 0x6c, 0xbe, 0xdf, 0xfc, 0xed, +0xf3, 0x87, 0xe2, 0x9d, 0xe2, 0x0b, 0xe3, 0x7b, +0x17, 0x98, 0x2f, 0xc8, 0x5d, 0x70, 0x79, 0xa1, +0xce, 0xc2, 0xf4, 0x85, 0xa7, 0x16, 0xa9, 0x2e, +0x12, 0x2c, 0x3a, 0x96, 0x40, 0x4c, 0x88, 0x4e, +0x38, 0x94, 0xf0, 0x41, 0x10, 0x2a, 0xa8, 0x16, +0x8c, 0x25, 0xf2, 0x13, 0x77, 0x25, 0x8e, 0x0a, +0x79, 0xc2, 0x1d, 0xc2, 0x67, 0x22, 0x2f, 0xd1, +0x36, 0xd1, 0x88, 0xd8, 0x43, 0x5c, 0x2a, 0x1e, +0x4e, 0xf2, 0x48, 0x2a, 0x4d, 0x7a, 0x92, 0xec, +0x91, 0xbc, 0x35, 0x79, 0x24, 0xc5, 0x33, 0xa5, +0x2c, 0xe5, 0xb9, 0x84, 0x27, 0xa9, 0x90, 0xbc, +0x4c, 0x0d, 0x4c, 0xdd, 0x9b, 0x3a, 0x9e, 0x16, +0x9a, 0x76, 0x20, 0x6d, 0x32, 0x3d, 0x3a, 0xbd, +0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xaa, +0x21, 0x4d, 0x93, 0xb6, 0x67, 0xea, 0x67, 0xe6, +0x66, 0x76, 0xcb, 0xac, 0x65, 0x85, 0xb2, 0xfe, +0xc5, 0x6e, 0x8b, 0xb7, 0x2f, 0x1e, 0x95, 0x07, +0xc9, 0x6b, 0xb3, 0x90, 0xac, 0x05, 0x59, 0x2d, +0x0a, 0xb6, 0x42, 0xa6, 0xe8, 0x54, 0x5a, 0x28, +0xd7, 0x2a, 0x07, 0xb2, 0x67, 0x65, 0x57, 0x66, +0xbf, 0xcd, 0x89, 0xca, 0x39, 0x96, 0xab, 0x9e, +0x2b, 0xcd, 0xed, 0xcc, 0xb3, 0xca, 0xdb, 0x90, +0x37, 0x9c, 0xef, 0x9f, 0xff, 0xed, 0x12, 0xc2, +0x12, 0xe1, 0x92, 0xb6, 0xa5, 0x86, 0x4b, 0x57, +0x2d, 0x1d, 0x58, 0xe6, 0xbd, 0xac, 0x6a, 0x39, +0xb2, 0x3c, 0x71, 0x79, 0xdb, 0x0a, 0xe3, 0x15, +0x05, 0x2b, 0x86, 0x56, 0x06, 0xac, 0x3c, 0xb8, +0x8a, 0xb6, 0x2a, 0x6d, 0xd5, 0x4f, 0xab, 0xed, +0x57, 0x97, 0xae, 0x7e, 0xbd, 0x26, 0x7a, 0x4d, +0x6b, 0x81, 0x5e, 0xc1, 0xca, 0x82, 0xc1, 0xb5, +0x01, 0x6b, 0xeb, 0x0b, 0x55, 0x0a, 0xe5, 0x85, +0x7d, 0xeb, 0xdc, 0xd7, 0xed, 0x5d, 0x4f, 0x58, +0x2f, 0x59, 0xdf, 0xb5, 0x61, 0xfa, 0x86, 0x9d, +0x1b, 0x3e, 0x15, 0x89, 0x8a, 0xae, 0x14, 0xdb, +0x17, 0x97, 0x15, 0x7f, 0xd8, 0x28, 0xdc, 0x78, +0xe5, 0x1b, 0x87, 0x6f, 0xca, 0xbf, 0x99, 0xdc, +0x94, 0xb4, 0xa9, 0xab, 0xc4, 0xb9, 0x64, 0xcf, +0x66, 0xd2, 0x66, 0xe9, 0xe6, 0xde, 0x2d, 0x9e, +0x5b, 0x0e, 0x96, 0xaa, 0x97, 0xe6, 0x97, 0x0e, +0x6e, 0x0d, 0xd9, 0xda, 0xb4, 0x0d, 0xdf, 0x56, +0xb4, 0xed, 0xf5, 0xf6, 0x45, 0xdb, 0x2f, 0x97, +0xcd, 0x28, 0xdb, 0xbb, 0x83, 0xb6, 0x43, 0xb9, +0xa3, 0xbf, 0x3c, 0xb8, 0xbc, 0x65, 0xa7, 0xc9, +0xce, 0xcd, 0x3b, 0x3f, 0x54, 0xa4, 0x54, 0xf4, +0x54, 0xfa, 0x54, 0x36, 0xee, 0xd2, 0xdd, 0xb5, +0x61, 0xd7, 0xf8, 0x6e, 0xd1, 0xee, 0x1b, 0x7b, +0xbc, 0xf6, 0x34, 0xec, 0xd5, 0xdb, 0x5b, 0xbc, +0xf7, 0xfd, 0x3e, 0xc9, 0xbe, 0xdb, 0x55, 0x01, +0x55, 0x4d, 0xd5, 0x66, 0xd5, 0x65, 0xfb, 0x49, +0xfb, 0xb3, 0xf7, 0x3f, 0xae, 0x89, 0xaa, 0xe9, +0xf8, 0x96, 0xfb, 0x6d, 0x5d, 0xad, 0x4e, 0x6d, +0x71, 0xed, 0xc7, 0x03, 0xd2, 0x03, 0xfd, 0x07, +0x23, 0x0e, 0xb6, 0xd7, 0xb9, 0xd4, 0xd5, 0x1d, +0xd2, 0x3d, 0x54, 0x52, 0x8f, 0xd6, 0x2b, 0xeb, +0x47, 0x0e, 0xc7, 0x1f, 0xbe, 0xfe, 0x9d, 0xef, +0x77, 0x2d, 0x0d, 0x36, 0x0d, 0x55, 0x8d, 0x9c, +0xc6, 0xe2, 0x23, 0x70, 0x44, 0x79, 0xe4, 0xe9, +0xf7, 0x09, 0xdf, 0xf7, 0x1e, 0x0d, 0x3a, 0xda, +0x76, 0x8c, 0x7b, 0xac, 0xe1, 0x07, 0xd3, 0x1f, +0x76, 0x1d, 0x67, 0x1d, 0x2f, 0x6a, 0x42, 0x9a, +0xf2, 0x9a, 0x46, 0x9b, 0x53, 0x9a, 0xfb, 0x5b, +0x62, 0x5b, 0xba, 0x4f, 0xcc, 0x3e, 0xd1, 0xd6, +0xea, 0xde, 0x7a, 0xfc, 0x47, 0xdb, 0x1f, 0x0f, +0x9c, 0x34, 0x3c, 0x59, 0x79, 0x4a, 0xf3, 0x54, +0xc9, 0x69, 0xda, 0xe9, 0x82, 0xd3, 0x93, 0x67, +0xf2, 0xcf, 0x8c, 0x9d, 0x95, 0x9d, 0x7d, 0x7e, +0x2e, 0xf9, 0xdc, 0x60, 0xdb, 0xa2, 0xb6, 0x7b, +0xe7, 0x63, 0xce, 0xdf, 0x6a, 0x0f, 0x6f, 0xef, +0xba, 0x10, 0x74, 0xe1, 0xd2, 0x45, 0xff, 0x8b, +0xe7, 0x3b, 0xbc, 0x3b, 0xce, 0x5c, 0xf2, 0xb8, +0x74, 0xf2, 0xb2, 0xdb, 0xe5, 0x13, 0x57, 0xb8, +0x57, 0x9a, 0xaf, 0x3a, 0x5f, 0x6d, 0xea, 0x74, +0xea, 0x3c, 0xfe, 0x93, 0xd3, 0x4f, 0xc7, 0xbb, +0x9c, 0xbb, 0x9a, 0xae, 0xb9, 0x5c, 0x6b, 0xb9, +0xee, 0x7a, 0xbd, 0xb5, 0x7b, 0x66, 0xf7, 0xe9, +0x1b, 0x9e, 0x37, 0xce, 0xdd, 0xf4, 0xbd, 0x79, +0xf1, 0x16, 0xff, 0xd6, 0xd5, 0x9e, 0x39, 0x3d, +0xdd, 0xbd, 0xf3, 0x7a, 0x6f, 0xf7, 0xc5, 0xf7, +0xf5, 0xdf, 0x16, 0xdd, 0x7e, 0x72, 0x27, 0xfd, +0xce, 0xcb, 0xbb, 0xd9, 0x77, 0x27, 0xee, 0xad, +0xbc, 0x4f, 0xbc, 0x5f, 0xf4, 0x40, 0xed, 0x41, +0xd9, 0x43, 0xdd, 0x87, 0xd5, 0x3f, 0x5b, 0xfe, +0xdc, 0xd8, 0xef, 0xdc, 0x7f, 0x6a, 0xc0, 0x77, +0xa0, 0xf3, 0xd1, 0xdc, 0x47, 0xf7, 0x06, 0x85, +0x83, 0xcf, 0xfe, 0x91, 0xf5, 0x8f, 0x0f, 0x43, +0x05, 0x8f, 0x99, 0x8f, 0xcb, 0x86, 0x0d, 0x86, +0xeb, 0x9e, 0x38, 0x3e, 0x39, 0x39, 0xe2, 0x3f, +0x72, 0xfd, 0xe9, 0xfc, 0xa7, 0x43, 0xcf, 0x64, +0xcf, 0x26, 0x9e, 0x17, 0xfe, 0xa2, 0xfe, 0xcb, +0xae, 0x17, 0x16, 0x2f, 0x7e, 0xf8, 0xd5, 0xeb, +0xd7, 0xce, 0xd1, 0x98, 0xd1, 0xa1, 0x97, 0xf2, +0x97, 0x93, 0xbf, 0x6d, 0x7c, 0xa5, 0xfd, 0xea, +0xc0, 0xeb, 0x19, 0xaf, 0xdb, 0xc6, 0xc2, 0xc6, +0x1e, 0xbe, 0xc9, 0x78, 0x33, 0x31, 0x5e, 0xf4, +0x56, 0xfb, 0xed, 0xc1, 0x77, 0xdc, 0x77, 0x1d, +0xef, 0xa3, 0xdf, 0x0f, 0x4f, 0xe4, 0x7c, 0x20, +0x7f, 0x28, 0xff, 0x68, 0xf9, 0xb1, 0xf5, 0x53, +0xd0, 0xa7, 0xfb, 0x93, 0x19, 0x93, 0x93, 0xff, +0x04, 0x03, 0x98, 0xf3, 0xfc, 0x63, 0x33, 0x2d, +0xdb, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, +0x4d, 0x00, 0x00, 0x7a, 0x25, 0x00, 0x00, 0x80, +0x83, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0x80, +0xe9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, +0x60, 0x00, 0x00, 0x3a, 0x98, 0x00, 0x00, 0x17, +0x6f, 0x92, 0x5f, 0xc5, 0x46, 0x00, 0x00, 0x01, +0x75, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, +0x95, 0xbd, 0x4b, 0x03, 0x31, 0x1c, 0x86, 0x9f, +0x68, 0x29, 0x08, 0xa2, 0x0e, 0x8e, 0x72, 0x0e, +0xce, 0x82, 0x93, 0x8b, 0x28, 0x55, 0x63, 0xa1, +0x43, 0x37, 0x41, 0x10, 0xf5, 0x5f, 0x90, 0x08, +0xfe, 0x03, 0x0e, 0x82, 0x53, 0x5c, 0x9d, 0x04, +0x07, 0x11, 0x14, 0x11, 0x74, 0x33, 0x88, 0x74, +0x73, 0x10, 0x07, 0x27, 0x41, 0xc1, 0xc6, 0x8f, +0xc5, 0x49, 0x97, 0x82, 0x50, 0xce, 0x25, 0x95, +0x70, 0x9c, 0x6d, 0xa1, 0x07, 0x1d, 0xcc, 0xbb, +0xdd, 0xef, 0xbd, 0xbb, 0x3c, 0xfc, 0xbe, 0x22, +0xe2, 0x38, 0xa6, 0x9b, 0xea, 0xa1, 0xcb, 0x0a, +0x00, 0x01, 0x20, 0x00, 0x04, 0x80, 0x00, 0xd0, +0x75, 0x80, 0x5c, 0x33, 0x53, 0x08, 0x01, 0x40, +0x24, 0x75, 0x01, 0xb8, 0xb3, 0x46, 0x7d, 0xfa, +0x7e, 0x24, 0xf5, 0x00, 0x30, 0x01, 0x54, 0xad, +0x51, 0xd5, 0xb4, 0x7f, 0xb4, 0xba, 0xec, 0x44, +0xb3, 0x17, 0x84, 0x10, 0x44, 0x52, 0xcf, 0x01, +0x17, 0xc0, 0x3d, 0x50, 0x6c, 0x40, 0x38, 0xa8, +0x63, 0x60, 0x18, 0x88, 0x81, 0x3d, 0x60, 0xdd, +0x1a, 0xf5, 0x9d, 0x19, 0xc0, 0xe8, 0xc2, 0xee, +0x14, 0x70, 0x09, 0xf4, 0xb9, 0x50, 0x05, 0x28, +0x01, 0xfd, 0xc0, 0x03, 0x30, 0x94, 0xf8, 0xe4, +0x1c, 0x58, 0xf4, 0x21, 0x5a, 0x01, 0xb4, 0xea, +0x81, 0x27, 0xe0, 0xdd, 0x7b, 0x9e, 0x71, 0xd9, +0x58, 0x4a, 0x39, 0x1c, 0xa0, 0x0c, 0x9c, 0x44, +0x52, 0xe7, 0xda, 0xed, 0x81, 0x76, 0x4a, 0x30, +0x02, 0x5c, 0x03, 0x63, 0x9e, 0x55, 0x73, 0x59, +0x79, 0x06, 0xf6, 0x81, 0x0d, 0x60, 0xd0, 0xf3, +0x0f, 0x81, 0x35, 0x6b, 0x54, 0xbd, 0xd3, 0x0c, +0x60, 0x8d, 0x7a, 0x05, 0x66, 0x81, 0x37, 0x2f, +0xdc, 0x28, 0xc9, 0xb6, 0x35, 0x6a, 0x0b, 0x98, +0x07, 0xbe, 0x3c, 0x7f, 0x19, 0x38, 0x88, 0xa4, +0xee, 0xcd, 0x64, 0x0c, 0xad, 0x51, 0x2f, 0x40, +0x21, 0x01, 0x01, 0xb0, 0x1a, 0x49, 0x9d, 0xb7, +0x46, 0xdd, 0x02, 0xc5, 0x14, 0x88, 0x72, 0x66, +0x7b, 0xc0, 0x1a, 0xf5, 0xe8, 0x20, 0x3e, 0xbc, +0xf0, 0xb4, 0xab, 0x79, 0xde, 0x1a, 0x75, 0xe3, +0x1a, 0xb4, 0xe6, 0xbc, 0x1d, 0x6b, 0xd4, 0x59, +0xc7, 0x3d, 0x90, 0x54, 0x24, 0xf5, 0x38, 0x70, +0xe5, 0xc6, 0xaf, 0xa1, 0x23, 0x60, 0xc5, 0x1a, +0x55, 0x77, 0x63, 0x5b, 0xb2, 0x46, 0x6d, 0x66, +0xb2, 0x07, 0xd2, 0xe4, 0x20, 0x2a, 0x89, 0x49, +0xf8, 0x6d, 0xbc, 0x4c, 0x17, 0xd1, 0x5f, 0x8a, +0xa4, 0x9e, 0x74, 0x75, 0xf6, 0x75, 0x6a, 0x8d, +0xaa, 0x64, 0x06, 0x10, 0x6e, 0xc3, 0x00, 0x10, +0x00, 0xfe, 0x05, 0xc0, 0xcf, 0x00, 0x15, 0x33, +0x91, 0x07, 0x5a, 0x84, 0x75, 0x7e, 0x00, 0x00, +0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, +0x60, 0x82, +}; + +Byte byHERE_logo_blue_transparent_rgb_32px[3589] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, +0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, +0x08, 0x06, 0x00, 0x00, 0x00, 0xaa, 0x69, 0x71, +0xde, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, +0x73, 0x00, 0x00, 0x2e, 0x23, 0x00, 0x00, 0x2e, +0x23, 0x01, 0x78, 0xa5, 0x3f, 0x76, 0x00, 0x00, +0x0a, 0x4f, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, +0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x66, +0x69, 0x6c, 0x65, 0x00, 0x00, 0x78, 0xda, 0x9d, +0x53, 0x67, 0x54, 0x53, 0xe9, 0x16, 0x3d, 0xf7, +0xde, 0xf4, 0x42, 0x4b, 0x88, 0x80, 0x94, 0x4b, +0x6f, 0x52, 0x15, 0x08, 0x20, 0x52, 0x42, 0x8b, +0x80, 0x14, 0x91, 0x26, 0x2a, 0x21, 0x09, 0x10, +0x4a, 0x88, 0x21, 0xa1, 0xd9, 0x15, 0x51, 0xc1, +0x11, 0x45, 0x45, 0x04, 0x1b, 0xc8, 0xa0, 0x88, +0x03, 0x8e, 0x8e, 0x80, 0x8c, 0x15, 0x51, 0x2c, +0x0c, 0x8a, 0x0a, 0xd8, 0x07, 0xe4, 0x21, 0xa2, +0x8e, 0x83, 0xa3, 0x88, 0x8a, 0xca, 0xfb, 0xe1, +0x7b, 0xa3, 0x6b, 0xd6, 0xbc, 0xf7, 0xe6, 0xcd, +0xfe, 0xb5, 0xd7, 0x3e, 0xe7, 0xac, 0xf3, 0x9d, +0xb3, 0xcf, 0x07, 0xc0, 0x08, 0x0c, 0x96, 0x48, +0x33, 0x51, 0x35, 0x80, 0x0c, 0xa9, 0x42, 0x1e, +0x11, 0xe0, 0x83, 0xc7, 0xc4, 0xc6, 0xe1, 0xe4, +0x2e, 0x40, 0x81, 0x0a, 0x24, 0x70, 0x00, 0x10, +0x08, 0xb3, 0x64, 0x21, 0x73, 0xfd, 0x23, 0x01, +0x00, 0xf8, 0x7e, 0x3c, 0x3c, 0x2b, 0x22, 0xc0, +0x07, 0xbe, 0x00, 0x01, 0x78, 0xd3, 0x0b, 0x08, +0x00, 0xc0, 0x4d, 0x9b, 0xc0, 0x30, 0x1c, 0x87, +0xff, 0x0f, 0xea, 0x42, 0x99, 0x5c, 0x01, 0x80, +0x84, 0x01, 0xc0, 0x74, 0x91, 0x38, 0x4b, 0x08, +0x80, 0x14, 0x00, 0x40, 0x7a, 0x8e, 0x42, 0xa6, +0x00, 0x40, 0x46, 0x01, 0x80, 0x9d, 0x98, 0x26, +0x53, 0x00, 0xa0, 0x04, 0x00, 0x60, 0xcb, 0x63, +0x62, 0xe3, 0x00, 0x50, 0x2d, 0x00, 0x60, 0x27, +0x7f, 0xe6, 0xd3, 0x00, 0x80, 0x9d, 0xf8, 0x99, +0x7b, 0x01, 0x00, 0x5b, 0x94, 0x21, 0x15, 0x01, +0xa0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, +0x00, 0x68, 0x3b, 0x00, 0xac, 0xcf, 0x56, 0x8a, +0x45, 0x00, 0x58, 0x30, 0x00, 0x14, 0x66, 0x4b, +0xc4, 0x39, 0x00, 0xd8, 0x2d, 0x00, 0x30, 0x49, +0x57, 0x66, 0x48, 0x00, 0xb0, 0xb7, 0x00, 0xc0, +0xce, 0x10, 0x0b, 0xb2, 0x00, 0x08, 0x0c, 0x00, +0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7b, +0x00, 0x60, 0xc8, 0x23, 0x23, 0x78, 0x00, 0x84, +0x99, 0x00, 0x14, 0x46, 0xf2, 0x57, 0x3c, 0xf1, +0x2b, 0xae, 0x10, 0xe7, 0x2a, 0x00, 0x00, 0x78, +0x99, 0xb2, 0x3c, 0xb9, 0x24, 0x39, 0x45, 0x81, +0x5b, 0x08, 0x2d, 0x71, 0x07, 0x57, 0x57, 0x2e, +0x1e, 0x28, 0xce, 0x49, 0x17, 0x2b, 0x14, 0x36, +0x61, 0x02, 0x61, 0x9a, 0x40, 0x2e, 0xc2, 0x79, +0x99, 0x19, 0x32, 0x81, 0x34, 0x0f, 0xe0, 0xf3, +0xcc, 0x00, 0x00, 0xa0, 0x91, 0x15, 0x11, 0xe0, +0x83, 0xf3, 0xfd, 0x78, 0xce, 0x0e, 0xae, 0xce, +0xce, 0x36, 0x8e, 0xb6, 0x0e, 0x5f, 0x2d, 0xea, +0xbf, 0x06, 0xff, 0x22, 0x62, 0x62, 0xe3, 0xfe, +0xe5, 0xcf, 0xab, 0x70, 0x40, 0x00, 0x00, 0xe1, +0x74, 0x7e, 0xd1, 0xfe, 0x2c, 0x2f, 0xb3, 0x1a, +0x80, 0x3b, 0x06, 0x80, 0x6d, 0xfe, 0xa2, 0x25, +0xee, 0x04, 0x68, 0x5e, 0x0b, 0xa0, 0x75, 0xf7, +0x8b, 0x66, 0xb2, 0x0f, 0x40, 0xb5, 0x00, 0xa0, +0xe9, 0xda, 0x57, 0xf3, 0x70, 0xf8, 0x7e, 0x3c, +0x3c, 0x45, 0xa1, 0x90, 0xb9, 0xd9, 0xd9, 0xe5, +0xe4, 0xe4, 0xd8, 0x4a, 0xc4, 0x42, 0x5b, 0x61, +0xca, 0x57, 0x7d, 0xfe, 0x67, 0xc2, 0x5f, 0xc0, +0x57, 0xfd, 0x6c, 0xf9, 0x7e, 0x3c, 0xfc, 0xf7, +0xf5, 0xe0, 0xbe, 0xe2, 0x24, 0x81, 0x32, 0x5d, +0x81, 0x47, 0x04, 0xf8, 0xe0, 0xc2, 0xcc, 0xf4, +0x4c, 0xa5, 0x1c, 0xcf, 0x92, 0x09, 0x84, 0x62, +0xdc, 0xe6, 0x8f, 0x47, 0xfc, 0xb7, 0x0b, 0xff, +0xfc, 0x1d, 0xd3, 0x22, 0xc4, 0x49, 0x62, 0xb9, +0x58, 0x2a, 0x14, 0xe3, 0x51, 0x12, 0x71, 0x8e, +0x44, 0x9a, 0x8c, 0xf3, 0x32, 0xa5, 0x22, 0x89, +0x42, 0x92, 0x29, 0xc5, 0x25, 0xd2, 0xff, 0x64, +0xe2, 0xdf, 0x2c, 0xfb, 0x03, 0x3e, 0xdf, 0x35, +0x00, 0xb0, 0x6a, 0x3e, 0x01, 0x7b, 0x91, 0x2d, +0xa8, 0x5d, 0x63, 0x03, 0xf6, 0x4b, 0x27, 0x10, +0x58, 0x74, 0xc0, 0xe2, 0xf7, 0x00, 0x00, 0xf2, +0xbb, 0x6f, 0xc1, 0xd4, 0x28, 0x08, 0x03, 0x80, +0x68, 0x83, 0xe1, 0xcf, 0x77, 0xff, 0xef, 0x3f, +0xfd, 0x47, 0xa0, 0x25, 0x00, 0x80, 0x66, 0x49, +0x92, 0x71, 0x00, 0x00, 0x5e, 0x44, 0x24, 0x2e, +0x54, 0xca, 0xb3, 0x3f, 0xc7, 0x08, 0x00, 0x00, +0x44, 0xa0, 0x81, 0x2a, 0xb0, 0x41, 0x1b, 0xf4, +0xc1, 0x18, 0x2c, 0xc0, 0x06, 0x1c, 0xc1, 0x05, +0xdc, 0xc1, 0x0b, 0xfc, 0x60, 0x36, 0x84, 0x42, +0x24, 0xc4, 0xc2, 0x42, 0x10, 0x42, 0x0a, 0x64, +0x80, 0x1c, 0x72, 0x60, 0x29, 0xac, 0x82, 0x42, +0x28, 0x86, 0xcd, 0xb0, 0x1d, 0x2a, 0x60, 0x2f, +0xd4, 0x40, 0x1d, 0x34, 0xc0, 0x51, 0x68, 0x86, +0x93, 0x70, 0x0e, 0x2e, 0xc2, 0x55, 0xb8, 0x0e, +0x3d, 0x70, 0x0f, 0xfa, 0x61, 0x08, 0x9e, 0xc1, +0x28, 0xbc, 0x81, 0x09, 0x04, 0x41, 0xc8, 0x08, +0x13, 0x61, 0x21, 0xda, 0x88, 0x01, 0x62, 0x8a, +0x58, 0x23, 0x8e, 0x08, 0x17, 0x99, 0x85, 0xf8, +0x21, 0xc1, 0x48, 0x04, 0x12, 0x8b, 0x24, 0x20, +0xc9, 0x88, 0x14, 0x51, 0x22, 0x4b, 0x91, 0x35, +0x48, 0x31, 0x52, 0x8a, 0x54, 0x20, 0x55, 0x48, +0x1d, 0xf2, 0x3d, 0x72, 0x02, 0x39, 0x87, 0x5c, +0x46, 0xba, 0x91, 0x3b, 0xc8, 0x00, 0x32, 0x82, +0xfc, 0x86, 0xbc, 0x47, 0x31, 0x94, 0x81, 0xb2, +0x51, 0x3d, 0xd4, 0x0c, 0xb5, 0x43, 0xb9, 0xa8, +0x37, 0x1a, 0x84, 0x46, 0xa2, 0x0b, 0xd0, 0x64, +0x74, 0x31, 0x9a, 0x8f, 0x16, 0xa0, 0x9b, 0xd0, +0x72, 0xb4, 0x1a, 0x3d, 0x8c, 0x36, 0xa1, 0xe7, +0xd0, 0xab, 0x68, 0x0f, 0xda, 0x8f, 0x3e, 0x43, +0xc7, 0x30, 0xc0, 0xe8, 0x18, 0x07, 0x33, 0xc4, +0x6c, 0x30, 0x2e, 0xc6, 0xc3, 0x42, 0xb1, 0x38, +0x2c, 0x09, 0x93, 0x63, 0xcb, 0xb1, 0x22, 0xac, +0x0c, 0xab, 0xc6, 0x1a, 0xb0, 0x56, 0xac, 0x03, +0xbb, 0x89, 0xf5, 0x63, 0xcf, 0xb1, 0x77, 0x04, +0x12, 0x81, 0x45, 0xc0, 0x09, 0x36, 0x04, 0x77, +0x42, 0x20, 0x61, 0x1e, 0x41, 0x48, 0x58, 0x4c, +0x58, 0x4e, 0xd8, 0x48, 0xa8, 0x20, 0x1c, 0x24, +0x34, 0x11, 0xda, 0x09, 0x37, 0x09, 0x03, 0x84, +0x51, 0xc2, 0x27, 0x22, 0x93, 0xa8, 0x4b, 0xb4, +0x26, 0xba, 0x11, 0xf9, 0xc4, 0x18, 0x62, 0x32, +0x31, 0x87, 0x58, 0x48, 0x2c, 0x23, 0xd6, 0x12, +0x8f, 0x13, 0x2f, 0x10, 0x7b, 0x88, 0x43, 0xc4, +0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xb9, +0x90, 0x02, 0x49, 0xb1, 0xa4, 0x54, 0xd2, 0x12, +0xd2, 0x46, 0xd2, 0x6e, 0x52, 0x23, 0xe9, 0x2c, +0xa9, 0x9b, 0x34, 0x48, 0x1a, 0x23, 0x93, 0xc9, +0xda, 0x64, 0x6b, 0xb2, 0x07, 0x39, 0x94, 0x2c, +0x20, 0x2b, 0xc8, 0x85, 0xe4, 0x9d, 0xe4, 0xc3, +0xe4, 0x33, 0xe4, 0x1b, 0xe4, 0x21, 0xf2, 0x5b, +0x0a, 0x9d, 0x62, 0x40, 0x71, 0xa4, 0xf8, 0x53, +0xe2, 0x28, 0x52, 0xca, 0x6a, 0x4a, 0x19, 0xe5, +0x10, 0xe5, 0x34, 0xe5, 0x06, 0x65, 0x98, 0x32, +0x41, 0x55, 0xa3, 0x9a, 0x52, 0xdd, 0xa8, 0xa1, +0x54, 0x11, 0x35, 0x8f, 0x5a, 0x42, 0xad, 0xa1, +0xb6, 0x52, 0xaf, 0x51, 0x87, 0xa8, 0x13, 0x34, +0x75, 0x9a, 0x39, 0xcd, 0x83, 0x16, 0x49, 0x4b, +0xa5, 0xad, 0xa2, 0x95, 0xd3, 0x1a, 0x68, 0x17, +0x68, 0xf7, 0x69, 0xaf, 0xe8, 0x74, 0xba, 0x11, +0xdd, 0x95, 0x1e, 0x4e, 0x97, 0xd0, 0x57, 0xd2, +0xcb, 0xe9, 0x47, 0xe8, 0x97, 0xe8, 0x03, 0xf4, +0x77, 0x0c, 0x0d, 0x86, 0x15, 0x83, 0xc7, 0x88, +0x67, 0x28, 0x19, 0x9b, 0x18, 0x07, 0x18, 0x67, +0x19, 0x77, 0x18, 0xaf, 0x98, 0x4c, 0xa6, 0x19, +0xd3, 0x8b, 0x19, 0xc7, 0x54, 0x30, 0x37, 0x31, +0xeb, 0x98, 0xe7, 0x99, 0x0f, 0x99, 0x6f, 0x55, +0x58, 0x2a, 0xb6, 0x2a, 0x7c, 0x15, 0x91, 0xca, +0x0a, 0x95, 0x4a, 0x95, 0x26, 0x95, 0x1b, 0x2a, +0x2f, 0x54, 0xa9, 0xaa, 0xa6, 0xaa, 0xde, 0xaa, +0x0b, 0x55, 0xf3, 0x55, 0xcb, 0x54, 0x8f, 0xa9, +0x5e, 0x53, 0x7d, 0xae, 0x46, 0x55, 0x33, 0x53, +0xe3, 0xa9, 0x09, 0xd4, 0x96, 0xab, 0x55, 0xaa, +0x9d, 0x50, 0xeb, 0x53, 0x1b, 0x53, 0x67, 0xa9, +0x3b, 0xa8, 0x87, 0xaa, 0x67, 0xa8, 0x6f, 0x54, +0x3f, 0xa4, 0x7e, 0x59, 0xfd, 0x89, 0x06, 0x59, +0xc3, 0x4c, 0xc3, 0x4f, 0x43, 0xa4, 0x51, 0xa0, +0xb1, 0x5f, 0xe3, 0xbc, 0xc6, 0x20, 0x0b, 0x63, +0x19, 0xb3, 0x78, 0x2c, 0x21, 0x6b, 0x0d, 0xab, +0x86, 0x75, 0x81, 0x35, 0xc4, 0x26, 0xb1, 0xcd, +0xd9, 0x7c, 0x76, 0x2a, 0xbb, 0x98, 0xfd, 0x1d, +0xbb, 0x8b, 0x3d, 0xaa, 0xa9, 0xa1, 0x39, 0x43, +0x33, 0x4a, 0x33, 0x57, 0xb3, 0x52, 0xf3, 0x94, +0x66, 0x3f, 0x07, 0xe3, 0x98, 0x71, 0xf8, 0x9c, +0x74, 0x4e, 0x09, 0xe7, 0x28, 0xa7, 0x97, 0xf3, +0x7e, 0x8a, 0xde, 0x14, 0xef, 0x29, 0xe2, 0x29, +0x1b, 0xa6, 0x34, 0x4c, 0xb9, 0x31, 0x65, 0x5c, +0x6b, 0xaa, 0x96, 0x97, 0x96, 0x58, 0xab, 0x48, +0xab, 0x51, 0xab, 0x47, 0xeb, 0xbd, 0x36, 0xae, +0xed, 0xa7, 0x9d, 0xa6, 0xbd, 0x45, 0xbb, 0x59, +0xfb, 0x81, 0x0e, 0x41, 0xc7, 0x4a, 0x27, 0x5c, +0x27, 0x47, 0x67, 0x8f, 0xce, 0x05, 0x9d, 0xe7, +0x53, 0xd9, 0x53, 0xdd, 0xa7, 0x0a, 0xa7, 0x16, +0x4d, 0x3d, 0x3a, 0xf5, 0xae, 0x2e, 0xaa, 0x6b, +0xa5, 0x1b, 0xa1, 0xbb, 0x44, 0x77, 0xbf, 0x6e, +0xa7, 0xee, 0x98, 0x9e, 0xbe, 0x5e, 0x80, 0x9e, +0x4c, 0x6f, 0xa7, 0xde, 0x79, 0xbd, 0xe7, 0xfa, +0x1c, 0x7d, 0x2f, 0xfd, 0x54, 0xfd, 0x6d, 0xfa, +0xa7, 0xf5, 0x47, 0x0c, 0x58, 0x06, 0xb3, 0x0c, +0x24, 0x06, 0xdb, 0x0c, 0xce, 0x18, 0x3c, 0xc5, +0x35, 0x71, 0x6f, 0x3c, 0x1d, 0x2f, 0xc7, 0xdb, +0xf1, 0x51, 0x43, 0x5d, 0xc3, 0x40, 0x43, 0xa5, +0x61, 0x95, 0x61, 0x97, 0xe1, 0x84, 0x91, 0xb9, +0xd1, 0x3c, 0xa3, 0xd5, 0x46, 0x8d, 0x46, 0x0f, +0x8c, 0x69, 0xc6, 0x5c, 0xe3, 0x24, 0xe3, 0x6d, +0xc6, 0x6d, 0xc6, 0xa3, 0x26, 0x06, 0x26, 0x21, +0x26, 0x4b, 0x4d, 0xea, 0x4d, 0xee, 0x9a, 0x52, +0x4d, 0xb9, 0xa6, 0x29, 0xa6, 0x3b, 0x4c, 0x3b, +0x4c, 0xc7, 0xcd, 0xcc, 0xcd, 0xa2, 0xcd, 0xd6, +0x99, 0x35, 0x9b, 0x3d, 0x31, 0xd7, 0x32, 0xe7, +0x9b, 0xe7, 0x9b, 0xd7, 0x9b, 0xdf, 0xb7, 0x60, +0x5a, 0x78, 0x5a, 0x2c, 0xb6, 0xa8, 0xb6, 0xb8, +0x65, 0x49, 0xb2, 0xe4, 0x5a, 0xa6, 0x59, 0xee, +0xb6, 0xbc, 0x6e, 0x85, 0x5a, 0x39, 0x59, 0xa5, +0x58, 0x55, 0x5a, 0x5d, 0xb3, 0x46, 0xad, 0x9d, +0xad, 0x25, 0xd6, 0xbb, 0xad, 0xbb, 0xa7, 0x11, +0xa7, 0xb9, 0x4e, 0x93, 0x4e, 0xab, 0x9e, 0xd6, +0x67, 0xc3, 0xb0, 0xf1, 0xb6, 0xc9, 0xb6, 0xa9, +0xb7, 0x19, 0xb0, 0xe5, 0xd8, 0x06, 0xdb, 0xae, +0xb6, 0x6d, 0xb6, 0x7d, 0x61, 0x67, 0x62, 0x17, +0x67, 0xb7, 0xc5, 0xae, 0xc3, 0xee, 0x93, 0xbd, +0x93, 0x7d, 0xba, 0x7d, 0x8d, 0xfd, 0x3d, 0x07, +0x0d, 0x87, 0xd9, 0x0e, 0xab, 0x1d, 0x5a, 0x1d, +0x7e, 0x73, 0xb4, 0x72, 0x14, 0x3a, 0x56, 0x3a, +0xde, 0x9a, 0xce, 0x9c, 0xee, 0x3f, 0x7d, 0xc5, +0xf4, 0x96, 0xe9, 0x2f, 0x67, 0x58, 0xcf, 0x10, +0xcf, 0xd8, 0x33, 0xe3, 0xb6, 0x13, 0xcb, 0x29, +0xc4, 0x69, 0x9d, 0x53, 0x9b, 0xd3, 0x47, 0x67, +0x17, 0x67, 0xb9, 0x73, 0x83, 0xf3, 0x88, 0x8b, +0x89, 0x4b, 0x82, 0xcb, 0x2e, 0x97, 0x3e, 0x2e, +0x9b, 0x1b, 0xc6, 0xdd, 0xc8, 0xbd, 0xe4, 0x4a, +0x74, 0xf5, 0x71, 0x5d, 0xe1, 0x7a, 0xd2, 0xf5, +0x9d, 0x9b, 0xb3, 0x9b, 0xc2, 0xed, 0xa8, 0xdb, +0xaf, 0xee, 0x36, 0xee, 0x69, 0xee, 0x87, 0xdc, +0x9f, 0xcc, 0x34, 0x9f, 0x29, 0x9e, 0x59, 0x33, +0x73, 0xd0, 0xc3, 0xc8, 0x43, 0xe0, 0x51, 0xe5, +0xd1, 0x3f, 0x0b, 0x9f, 0x95, 0x30, 0x6b, 0xdf, +0xac, 0x7e, 0x4f, 0x43, 0x4f, 0x81, 0x67, 0xb5, +0xe7, 0x23, 0x2f, 0x63, 0x2f, 0x91, 0x57, 0xad, +0xd7, 0xb0, 0xb7, 0xa5, 0x77, 0xaa, 0xf7, 0x61, +0xef, 0x17, 0x3e, 0xf6, 0x3e, 0x72, 0x9f, 0xe3, +0x3e, 0xe3, 0x3c, 0x37, 0xde, 0x32, 0xde, 0x59, +0x5f, 0xcc, 0x37, 0xc0, 0xb7, 0xc8, 0xb7, 0xcb, +0x4f, 0xc3, 0x6f, 0x9e, 0x5f, 0x85, 0xdf, 0x43, +0x7f, 0x23, 0xff, 0x64, 0xff, 0x7a, 0xff, 0xd1, +0x00, 0xa7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, +0x81, 0x41, 0x81, 0x5b, 0x02, 0xfb, 0xf8, 0x7a, +0x7c, 0x21, 0xbf, 0x8e, 0x3f, 0x3a, 0xdb, 0x65, +0xf6, 0xb2, 0xd9, 0xed, 0x41, 0x8c, 0xa0, 0xb9, +0x41, 0x15, 0x41, 0x8f, 0x82, 0xad, 0x82, 0xe5, +0xc1, 0xad, 0x21, 0x68, 0xc8, 0xec, 0x90, 0xad, +0x21, 0xf7, 0xe7, 0x98, 0xce, 0x91, 0xce, 0x69, +0x0e, 0x85, 0x50, 0x7e, 0xe8, 0xd6, 0xd0, 0x07, +0x61, 0xe6, 0x61, 0x8b, 0xc3, 0x7e, 0x0c, 0x27, +0x85, 0x87, 0x85, 0x57, 0x86, 0x3f, 0x8e, 0x70, +0x88, 0x58, 0x1a, 0xd1, 0x31, 0x97, 0x35, 0x77, +0xd1, 0xdc, 0x43, 0x73, 0xdf, 0x44, 0xfa, 0x44, +0x96, 0x44, 0xde, 0x9b, 0x67, 0x31, 0x4f, 0x39, +0xaf, 0x2d, 0x4a, 0x35, 0x2a, 0x3e, 0xaa, 0x2e, +0x6a, 0x3c, 0xda, 0x37, 0xba, 0x34, 0xba, 0x3f, +0xc6, 0x2e, 0x66, 0x59, 0xcc, 0xd5, 0x58, 0x9d, +0x58, 0x49, 0x6c, 0x4b, 0x1c, 0x39, 0x2e, 0x2a, +0xae, 0x36, 0x6e, 0x6c, 0xbe, 0xdf, 0xfc, 0xed, +0xf3, 0x87, 0xe2, 0x9d, 0xe2, 0x0b, 0xe3, 0x7b, +0x17, 0x98, 0x2f, 0xc8, 0x5d, 0x70, 0x79, 0xa1, +0xce, 0xc2, 0xf4, 0x85, 0xa7, 0x16, 0xa9, 0x2e, +0x12, 0x2c, 0x3a, 0x96, 0x40, 0x4c, 0x88, 0x4e, +0x38, 0x94, 0xf0, 0x41, 0x10, 0x2a, 0xa8, 0x16, +0x8c, 0x25, 0xf2, 0x13, 0x77, 0x25, 0x8e, 0x0a, +0x79, 0xc2, 0x1d, 0xc2, 0x67, 0x22, 0x2f, 0xd1, +0x36, 0xd1, 0x88, 0xd8, 0x43, 0x5c, 0x2a, 0x1e, +0x4e, 0xf2, 0x48, 0x2a, 0x4d, 0x7a, 0x92, 0xec, +0x91, 0xbc, 0x35, 0x79, 0x24, 0xc5, 0x33, 0xa5, +0x2c, 0xe5, 0xb9, 0x84, 0x27, 0xa9, 0x90, 0xbc, +0x4c, 0x0d, 0x4c, 0xdd, 0x9b, 0x3a, 0x9e, 0x16, +0x9a, 0x76, 0x20, 0x6d, 0x32, 0x3d, 0x3a, 0xbd, +0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xaa, +0x21, 0x4d, 0x93, 0xb6, 0x67, 0xea, 0x67, 0xe6, +0x66, 0x76, 0xcb, 0xac, 0x65, 0x85, 0xb2, 0xfe, +0xc5, 0x6e, 0x8b, 0xb7, 0x2f, 0x1e, 0x95, 0x07, +0xc9, 0x6b, 0xb3, 0x90, 0xac, 0x05, 0x59, 0x2d, +0x0a, 0xb6, 0x42, 0xa6, 0xe8, 0x54, 0x5a, 0x28, +0xd7, 0x2a, 0x07, 0xb2, 0x67, 0x65, 0x57, 0x66, +0xbf, 0xcd, 0x89, 0xca, 0x39, 0x96, 0xab, 0x9e, +0x2b, 0xcd, 0xed, 0xcc, 0xb3, 0xca, 0xdb, 0x90, +0x37, 0x9c, 0xef, 0x9f, 0xff, 0xed, 0x12, 0xc2, +0x12, 0xe1, 0x92, 0xb6, 0xa5, 0x86, 0x4b, 0x57, +0x2d, 0x1d, 0x58, 0xe6, 0xbd, 0xac, 0x6a, 0x39, +0xb2, 0x3c, 0x71, 0x79, 0xdb, 0x0a, 0xe3, 0x15, +0x05, 0x2b, 0x86, 0x56, 0x06, 0xac, 0x3c, 0xb8, +0x8a, 0xb6, 0x2a, 0x6d, 0xd5, 0x4f, 0xab, 0xed, +0x57, 0x97, 0xae, 0x7e, 0xbd, 0x26, 0x7a, 0x4d, +0x6b, 0x81, 0x5e, 0xc1, 0xca, 0x82, 0xc1, 0xb5, +0x01, 0x6b, 0xeb, 0x0b, 0x55, 0x0a, 0xe5, 0x85, +0x7d, 0xeb, 0xdc, 0xd7, 0xed, 0x5d, 0x4f, 0x58, +0x2f, 0x59, 0xdf, 0xb5, 0x61, 0xfa, 0x86, 0x9d, +0x1b, 0x3e, 0x15, 0x89, 0x8a, 0xae, 0x14, 0xdb, +0x17, 0x97, 0x15, 0x7f, 0xd8, 0x28, 0xdc, 0x78, +0xe5, 0x1b, 0x87, 0x6f, 0xca, 0xbf, 0x99, 0xdc, +0x94, 0xb4, 0xa9, 0xab, 0xc4, 0xb9, 0x64, 0xcf, +0x66, 0xd2, 0x66, 0xe9, 0xe6, 0xde, 0x2d, 0x9e, +0x5b, 0x0e, 0x96, 0xaa, 0x97, 0xe6, 0x97, 0x0e, +0x6e, 0x0d, 0xd9, 0xda, 0xb4, 0x0d, 0xdf, 0x56, +0xb4, 0xed, 0xf5, 0xf6, 0x45, 0xdb, 0x2f, 0x97, +0xcd, 0x28, 0xdb, 0xbb, 0x83, 0xb6, 0x43, 0xb9, +0xa3, 0xbf, 0x3c, 0xb8, 0xbc, 0x65, 0xa7, 0xc9, +0xce, 0xcd, 0x3b, 0x3f, 0x54, 0xa4, 0x54, 0xf4, +0x54, 0xfa, 0x54, 0x36, 0xee, 0xd2, 0xdd, 0xb5, +0x61, 0xd7, 0xf8, 0x6e, 0xd1, 0xee, 0x1b, 0x7b, +0xbc, 0xf6, 0x34, 0xec, 0xd5, 0xdb, 0x5b, 0xbc, +0xf7, 0xfd, 0x3e, 0xc9, 0xbe, 0xdb, 0x55, 0x01, +0x55, 0x4d, 0xd5, 0x66, 0xd5, 0x65, 0xfb, 0x49, +0xfb, 0xb3, 0xf7, 0x3f, 0xae, 0x89, 0xaa, 0xe9, +0xf8, 0x96, 0xfb, 0x6d, 0x5d, 0xad, 0x4e, 0x6d, +0x71, 0xed, 0xc7, 0x03, 0xd2, 0x03, 0xfd, 0x07, +0x23, 0x0e, 0xb6, 0xd7, 0xb9, 0xd4, 0xd5, 0x1d, +0xd2, 0x3d, 0x54, 0x52, 0x8f, 0xd6, 0x2b, 0xeb, +0x47, 0x0e, 0xc7, 0x1f, 0xbe, 0xfe, 0x9d, 0xef, +0x77, 0x2d, 0x0d, 0x36, 0x0d, 0x55, 0x8d, 0x9c, +0xc6, 0xe2, 0x23, 0x70, 0x44, 0x79, 0xe4, 0xe9, +0xf7, 0x09, 0xdf, 0xf7, 0x1e, 0x0d, 0x3a, 0xda, +0x76, 0x8c, 0x7b, 0xac, 0xe1, 0x07, 0xd3, 0x1f, +0x76, 0x1d, 0x67, 0x1d, 0x2f, 0x6a, 0x42, 0x9a, +0xf2, 0x9a, 0x46, 0x9b, 0x53, 0x9a, 0xfb, 0x5b, +0x62, 0x5b, 0xba, 0x4f, 0xcc, 0x3e, 0xd1, 0xd6, +0xea, 0xde, 0x7a, 0xfc, 0x47, 0xdb, 0x1f, 0x0f, +0x9c, 0x34, 0x3c, 0x59, 0x79, 0x4a, 0xf3, 0x54, +0xc9, 0x69, 0xda, 0xe9, 0x82, 0xd3, 0x93, 0x67, +0xf2, 0xcf, 0x8c, 0x9d, 0x95, 0x9d, 0x7d, 0x7e, +0x2e, 0xf9, 0xdc, 0x60, 0xdb, 0xa2, 0xb6, 0x7b, +0xe7, 0x63, 0xce, 0xdf, 0x6a, 0x0f, 0x6f, 0xef, +0xba, 0x10, 0x74, 0xe1, 0xd2, 0x45, 0xff, 0x8b, +0xe7, 0x3b, 0xbc, 0x3b, 0xce, 0x5c, 0xf2, 0xb8, +0x74, 0xf2, 0xb2, 0xdb, 0xe5, 0x13, 0x57, 0xb8, +0x57, 0x9a, 0xaf, 0x3a, 0x5f, 0x6d, 0xea, 0x74, +0xea, 0x3c, 0xfe, 0x93, 0xd3, 0x4f, 0xc7, 0xbb, +0x9c, 0xbb, 0x9a, 0xae, 0xb9, 0x5c, 0x6b, 0xb9, +0xee, 0x7a, 0xbd, 0xb5, 0x7b, 0x66, 0xf7, 0xe9, +0x1b, 0x9e, 0x37, 0xce, 0xdd, 0xf4, 0xbd, 0x79, +0xf1, 0x16, 0xff, 0xd6, 0xd5, 0x9e, 0x39, 0x3d, +0xdd, 0xbd, 0xf3, 0x7a, 0x6f, 0xf7, 0xc5, 0xf7, +0xf5, 0xdf, 0x16, 0xdd, 0x7e, 0x72, 0x27, 0xfd, +0xce, 0xcb, 0xbb, 0xd9, 0x77, 0x27, 0xee, 0xad, +0xbc, 0x4f, 0xbc, 0x5f, 0xf4, 0x40, 0xed, 0x41, +0xd9, 0x43, 0xdd, 0x87, 0xd5, 0x3f, 0x5b, 0xfe, +0xdc, 0xd8, 0xef, 0xdc, 0x7f, 0x6a, 0xc0, 0x77, +0xa0, 0xf3, 0xd1, 0xdc, 0x47, 0xf7, 0x06, 0x85, +0x83, 0xcf, 0xfe, 0x91, 0xf5, 0x8f, 0x0f, 0x43, +0x05, 0x8f, 0x99, 0x8f, 0xcb, 0x86, 0x0d, 0x86, +0xeb, 0x9e, 0x38, 0x3e, 0x39, 0x39, 0xe2, 0x3f, +0x72, 0xfd, 0xe9, 0xfc, 0xa7, 0x43, 0xcf, 0x64, +0xcf, 0x26, 0x9e, 0x17, 0xfe, 0xa2, 0xfe, 0xcb, +0xae, 0x17, 0x16, 0x2f, 0x7e, 0xf8, 0xd5, 0xeb, +0xd7, 0xce, 0xd1, 0x98, 0xd1, 0xa1, 0x97, 0xf2, +0x97, 0x93, 0xbf, 0x6d, 0x7c, 0xa5, 0xfd, 0xea, +0xc0, 0xeb, 0x19, 0xaf, 0xdb, 0xc6, 0xc2, 0xc6, +0x1e, 0xbe, 0xc9, 0x78, 0x33, 0x31, 0x5e, 0xf4, +0x56, 0xfb, 0xed, 0xc1, 0x77, 0xdc, 0x77, 0x1d, +0xef, 0xa3, 0xdf, 0x0f, 0x4f, 0xe4, 0x7c, 0x20, +0x7f, 0x28, 0xff, 0x68, 0xf9, 0xb1, 0xf5, 0x53, +0xd0, 0xa7, 0xfb, 0x93, 0x19, 0x93, 0x93, 0xff, +0x04, 0x03, 0x98, 0xf3, 0xfc, 0x63, 0x33, 0x2d, +0xdb, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, +0x4d, 0x00, 0x00, 0x7a, 0x25, 0x00, 0x00, 0x80, +0x83, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0x80, +0xe9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, +0x60, 0x00, 0x00, 0x3a, 0x98, 0x00, 0x00, 0x17, +0x6f, 0x92, 0x5f, 0xc5, 0x46, 0x00, 0x00, 0x03, +0x30, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, +0xdb, 0x4f, 0x68, 0x1d, 0x55, 0x14, 0xc7, 0xf1, +0xcf, 0x2b, 0x56, 0xac, 0xa2, 0xb5, 0x63, 0x25, +0xfe, 0xad, 0xa2, 0x48, 0xcd, 0xc2, 0xea, 0x4a, +0xc4, 0x4d, 0x9d, 0xa2, 0x82, 0x21, 0x88, 0x48, +0xe9, 0x22, 0x62, 0xed, 0xc2, 0x85, 0x2d, 0xb4, +0x53, 0x14, 0x75, 0x53, 0x37, 0x2e, 0xc4, 0x85, +0x88, 0x53, 0x41, 0x4a, 0x41, 0x45, 0x91, 0xe2, +0xc2, 0xe0, 0xa2, 0x0a, 0x56, 0xa1, 0x77, 0x61, +0x75, 0x21, 0x28, 0x5a, 0x05, 0x15, 0x51, 0x0b, +0xfe, 0x29, 0x52, 0x19, 0xad, 0x9a, 0xa2, 0x29, +0x18, 0x37, 0x37, 0x70, 0x79, 0x34, 0x69, 0xe2, +0x4b, 0xd2, 0xf7, 0xe7, 0x1e, 0x78, 0x0c, 0x73, +0xce, 0xdc, 0x3b, 0x73, 0xbe, 0x73, 0xef, 0x3d, +0xbf, 0x3b, 0xf0, 0x5a, 0x53, 0x53, 0x53, 0x06, +0xd9, 0x96, 0x19, 0x70, 0xcb, 0x00, 0x32, 0x80, +0x0c, 0x20, 0x03, 0xc8, 0x00, 0x32, 0x80, 0x0c, +0x20, 0x03, 0xc8, 0x00, 0x32, 0x80, 0x0c, 0x20, +0x03, 0xc8, 0x00, 0x32, 0x80, 0x0c, 0x20, 0x03, +0xc8, 0x00, 0x32, 0x80, 0x0c, 0x60, 0xb0, 0xec, +0xac, 0x4e, 0x1a, 0xb7, 0x5a, 0xad, 0x45, 0x7f, +0xc0, 0xa2, 0xac, 0x2f, 0xc1, 0x5a, 0x7c, 0xdb, +0x84, 0xea, 0xc7, 0xf6, 0x78, 0xa7, 0x5f, 0xb5, +0x5b, 0x9d, 0x74, 0xb0, 0x98, 0x00, 0x8a, 0xb2, +0x3e, 0x1f, 0x2f, 0xe0, 0x3e, 0x4c, 0xdf, 0xe8, +0x6d, 0x6c, 0x6d, 0x42, 0xf5, 0x43, 0x5f, 0x03, +0x28, 0xca, 0x7a, 0x05, 0x0e, 0xe2, 0x96, 0x53, +0x84, 0x8f, 0xe1, 0xf6, 0x26, 0x54, 0x87, 0x17, +0x02, 0x40, 0xb7, 0xae, 0x01, 0x8f, 0x26, 0xc9, +0x7f, 0x8c, 0xe7, 0x31, 0x11, 0xcf, 0x2f, 0xc6, +0xb6, 0x85, 0xba, 0x51, 0x57, 0x8d, 0x80, 0xa2, +0xac, 0xcf, 0xc6, 0x08, 0x9e, 0xc2, 0x30, 0x8e, +0xe2, 0x5a, 0xdc, 0x81, 0x37, 0xb0, 0x1c, 0xfb, +0xb0, 0x03, 0x7f, 0x37, 0xa1, 0x9a, 0xe8, 0xb7, +0x11, 0xf0, 0x32, 0xde, 0xc4, 0xf5, 0xd3, 0x53, +0x3c, 0x02, 0x49, 0x93, 0xdf, 0x8c, 0x67, 0xf0, +0x4d, 0x51, 0xd6, 0x0f, 0xf6, 0x4d, 0x19, 0x2c, +0xca, 0xfa, 0x4a, 0x8c, 0x4d, 0x0f, 0xae, 0x78, +0xbc, 0xec, 0x14, 0xc9, 0x8f, 0x61, 0x0b, 0x2e, +0xc5, 0xc6, 0xbe, 0x00, 0x50, 0x94, 0xf5, 0x93, +0xd8, 0x99, 0xb8, 0xf6, 0xb5, 0x5d, 0x32, 0x81, +0x03, 0x78, 0x0e, 0xaf, 0x46, 0xdf, 0x3f, 0x78, +0xb8, 0xe7, 0xd7, 0x80, 0xa2, 0xac, 0x9f, 0xc6, +0xe3, 0x89, 0xeb, 0x8f, 0x26, 0x54, 0x2b, 0x8b, +0xb2, 0xde, 0x8d, 0xed, 0x33, 0x34, 0xfb, 0x17, +0x9b, 0x9a, 0x50, 0x8d, 0xf7, 0x74, 0x19, 0x2c, +0xca, 0x7a, 0x35, 0x3e, 0xc5, 0xe5, 0x6d, 0xa1, +0x9b, 0x70, 0x18, 0xbb, 0xf0, 0x44, 0x9c, 0x02, +0xd3, 0x76, 0x14, 0x5b, 0x9a, 0x50, 0xbd, 0xdb, +0xd3, 0x3a, 0xa0, 0x28, 0xeb, 0x6b, 0x70, 0x35, +0xce, 0xc1, 0xde, 0x36, 0x08, 0x9f, 0x61, 0x7d, +0x13, 0xaa, 0xe3, 0x45, 0x59, 0x5f, 0x81, 0xd1, +0x58, 0xfe, 0xbe, 0xc6, 0x5b, 0x4d, 0xa8, 0x4e, +0xf4, 0xac, 0x10, 0x2a, 0xca, 0x7a, 0x15, 0x5e, +0xc2, 0x3d, 0x89, 0xfb, 0x17, 0x0c, 0xb5, 0x5d, +0xfa, 0x21, 0x46, 0x9a, 0x50, 0x1d, 0x9f, 0xad, +0xbf, 0x9e, 0x02, 0x10, 0xe5, 0xed, 0x21, 0xac, +0x9b, 0x63, 0x93, 0x8f, 0x70, 0xe7, 0x6c, 0x10, +0x7a, 0x4d, 0x07, 0xec, 0x4a, 0x92, 0xff, 0x00, +0xcf, 0xe2, 0x44, 0x12, 0x7f, 0x0d, 0x3f, 0x25, +0xe7, 0x37, 0xc7, 0x95, 0xbf, 0x6f, 0xb6, 0xc3, +0x9b, 0xe2, 0xf1, 0x08, 0x36, 0xe0, 0x93, 0xb8, +0x06, 0xc0, 0x9e, 0x58, 0xd6, 0x46, 0x13, 0x08, +0x5f, 0xe0, 0xb1, 0xae, 0xdd, 0x0e, 0xff, 0x0f, +0xbb, 0x20, 0x11, 0x3a, 0x63, 0x78, 0x31, 0xbe, +0x84, 0x3d, 0x51, 0xdf, 0xbf, 0x8e, 0xf5, 0x78, +0x25, 0x8e, 0x94, 0xcd, 0x4d, 0xa8, 0x8e, 0x75, +0x3d, 0x80, 0xa2, 0xac, 0x6f, 0xc0, 0x56, 0xec, +0x6c, 0x42, 0x35, 0x99, 0xf8, 0x57, 0xe2, 0xa1, +0xb8, 0xc2, 0xbf, 0x17, 0x4b, 0xdb, 0x6d, 0xb8, +0x2a, 0xca, 0x5e, 0x49, 0xf2, 0xdb, 0x92, 0x11, +0xb2, 0xb6, 0x09, 0xd5, 0x5d, 0x4b, 0xf1, 0x46, +0x3a, 0x5e, 0x04, 0x63, 0xf2, 0x07, 0xb1, 0x1a, +0xfb, 0xb1, 0xb1, 0x09, 0xd5, 0x64, 0x51, 0xd6, +0x43, 0x78, 0x1f, 0xd7, 0x25, 0x4d, 0x7e, 0xc7, +0x85, 0xc9, 0xf9, 0x9f, 0x78, 0x04, 0xb7, 0x46, +0x79, 0x0b, 0x7f, 0x61, 0x5d, 0x13, 0xaa, 0xef, +0xe7, 0xf2, 0x0c, 0x67, 0xb4, 0x0a, 0x5c, 0xb4, +0x61, 0xf7, 0xb2, 0x38, 0x4f, 0x87, 0x13, 0xf7, +0xfe, 0xa8, 0xd1, 0xf7, 0xe2, 0x81, 0x79, 0x76, +0x79, 0x12, 0x77, 0x37, 0xa1, 0x7a, 0x67, 0xae, +0x0d, 0xce, 0x78, 0x19, 0x6c, 0x1b, 0x01, 0x29, +0x84, 0x1b, 0xb1, 0x66, 0x1e, 0xdd, 0x1d, 0xc1, +0xfd, 0x4d, 0xa8, 0x0e, 0xcd, 0xe7, 0x19, 0xba, +0x42, 0x07, 0xcc, 0x00, 0x61, 0xda, 0x46, 0xe2, +0x66, 0x66, 0xbc, 0x2d, 0xfe, 0x55, 0xfc, 0xe4, +0xb5, 0x02, 0x5f, 0xe2, 0x40, 0xba, 0x7e, 0xf4, +0x14, 0x80, 0x59, 0x20, 0x9c, 0xc4, 0x50, 0x13, +0xaa, 0xdf, 0x66, 0x88, 0x07, 0x8c, 0xa6, 0xd2, +0x76, 0xa9, 0x01, 0x2c, 0x98, 0x0e, 0x68, 0x42, +0xf5, 0x79, 0xac, 0xed, 0xbf, 0x26, 0xee, 0xe5, +0x18, 0x2f, 0xca, 0xfa, 0xdc, 0x19, 0xe2, 0xe7, +0xb5, 0x6d, 0x74, 0x96, 0xdc, 0x16, 0x5c, 0x0a, +0x9f, 0xee, 0x4d, 0x27, 0xf1, 0xef, 0x4e, 0x27, +0x73, 0x7b, 0x6a, 0x0a, 0xcc, 0x13, 0xc2, 0x30, +0x7e, 0xee, 0x34, 0xf9, 0xae, 0xde, 0x0c, 0x2d, +0xd6, 0x9c, 0xef, 0x99, 0xcd, 0x50, 0x9c, 0xf3, +0x6b, 0xb0, 0x2a, 0xf9, 0xdd, 0x8b, 0x49, 0x5d, +0x64, 0xad, 0xfc, 0x87, 0x89, 0x01, 0xb7, 0x0c, +0x20, 0x03, 0xc8, 0x00, 0x32, 0x80, 0x0c, 0x20, +0x03, 0xc8, 0x00, 0x32, 0x80, 0x0c, 0x20, 0x03, +0xc8, 0x00, 0x32, 0x80, 0x81, 0xb4, 0xff, 0x06, +0x00, 0xa5, 0x46, 0x44, 0x0a, 0xcc, 0xb9, 0x9e, +0x9a, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, +0x44, 0xae, 0x42, 0x60, 0x82, +}; + +Byte byHERE_logo_blue_transparent_rgb_24px[3358] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, +0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, +0x87, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, +0x73, 0x00, 0x00, 0x2e, 0x23, 0x00, 0x00, 0x2e, +0x23, 0x01, 0x78, 0xa5, 0x3f, 0x76, 0x00, 0x00, +0x0a, 0x4f, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, +0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x66, +0x69, 0x6c, 0x65, 0x00, 0x00, 0x78, 0xda, 0x9d, +0x53, 0x67, 0x54, 0x53, 0xe9, 0x16, 0x3d, 0xf7, +0xde, 0xf4, 0x42, 0x4b, 0x88, 0x80, 0x94, 0x4b, +0x6f, 0x52, 0x15, 0x08, 0x20, 0x52, 0x42, 0x8b, +0x80, 0x14, 0x91, 0x26, 0x2a, 0x21, 0x09, 0x10, +0x4a, 0x88, 0x21, 0xa1, 0xd9, 0x15, 0x51, 0xc1, +0x11, 0x45, 0x45, 0x04, 0x1b, 0xc8, 0xa0, 0x88, +0x03, 0x8e, 0x8e, 0x80, 0x8c, 0x15, 0x51, 0x2c, +0x0c, 0x8a, 0x0a, 0xd8, 0x07, 0xe4, 0x21, 0xa2, +0x8e, 0x83, 0xa3, 0x88, 0x8a, 0xca, 0xfb, 0xe1, +0x7b, 0xa3, 0x6b, 0xd6, 0xbc, 0xf7, 0xe6, 0xcd, +0xfe, 0xb5, 0xd7, 0x3e, 0xe7, 0xac, 0xf3, 0x9d, +0xb3, 0xcf, 0x07, 0xc0, 0x08, 0x0c, 0x96, 0x48, +0x33, 0x51, 0x35, 0x80, 0x0c, 0xa9, 0x42, 0x1e, +0x11, 0xe0, 0x83, 0xc7, 0xc4, 0xc6, 0xe1, 0xe4, +0x2e, 0x40, 0x81, 0x0a, 0x24, 0x70, 0x00, 0x10, +0x08, 0xb3, 0x64, 0x21, 0x73, 0xfd, 0x23, 0x01, +0x00, 0xf8, 0x7e, 0x3c, 0x3c, 0x2b, 0x22, 0xc0, +0x07, 0xbe, 0x00, 0x01, 0x78, 0xd3, 0x0b, 0x08, +0x00, 0xc0, 0x4d, 0x9b, 0xc0, 0x30, 0x1c, 0x87, +0xff, 0x0f, 0xea, 0x42, 0x99, 0x5c, 0x01, 0x80, +0x84, 0x01, 0xc0, 0x74, 0x91, 0x38, 0x4b, 0x08, +0x80, 0x14, 0x00, 0x40, 0x7a, 0x8e, 0x42, 0xa6, +0x00, 0x40, 0x46, 0x01, 0x80, 0x9d, 0x98, 0x26, +0x53, 0x00, 0xa0, 0x04, 0x00, 0x60, 0xcb, 0x63, +0x62, 0xe3, 0x00, 0x50, 0x2d, 0x00, 0x60, 0x27, +0x7f, 0xe6, 0xd3, 0x00, 0x80, 0x9d, 0xf8, 0x99, +0x7b, 0x01, 0x00, 0x5b, 0x94, 0x21, 0x15, 0x01, +0xa0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, +0x00, 0x68, 0x3b, 0x00, 0xac, 0xcf, 0x56, 0x8a, +0x45, 0x00, 0x58, 0x30, 0x00, 0x14, 0x66, 0x4b, +0xc4, 0x39, 0x00, 0xd8, 0x2d, 0x00, 0x30, 0x49, +0x57, 0x66, 0x48, 0x00, 0xb0, 0xb7, 0x00, 0xc0, +0xce, 0x10, 0x0b, 0xb2, 0x00, 0x08, 0x0c, 0x00, +0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7b, +0x00, 0x60, 0xc8, 0x23, 0x23, 0x78, 0x00, 0x84, +0x99, 0x00, 0x14, 0x46, 0xf2, 0x57, 0x3c, 0xf1, +0x2b, 0xae, 0x10, 0xe7, 0x2a, 0x00, 0x00, 0x78, +0x99, 0xb2, 0x3c, 0xb9, 0x24, 0x39, 0x45, 0x81, +0x5b, 0x08, 0x2d, 0x71, 0x07, 0x57, 0x57, 0x2e, +0x1e, 0x28, 0xce, 0x49, 0x17, 0x2b, 0x14, 0x36, +0x61, 0x02, 0x61, 0x9a, 0x40, 0x2e, 0xc2, 0x79, +0x99, 0x19, 0x32, 0x81, 0x34, 0x0f, 0xe0, 0xf3, +0xcc, 0x00, 0x00, 0xa0, 0x91, 0x15, 0x11, 0xe0, +0x83, 0xf3, 0xfd, 0x78, 0xce, 0x0e, 0xae, 0xce, +0xce, 0x36, 0x8e, 0xb6, 0x0e, 0x5f, 0x2d, 0xea, +0xbf, 0x06, 0xff, 0x22, 0x62, 0x62, 0xe3, 0xfe, +0xe5, 0xcf, 0xab, 0x70, 0x40, 0x00, 0x00, 0xe1, +0x74, 0x7e, 0xd1, 0xfe, 0x2c, 0x2f, 0xb3, 0x1a, +0x80, 0x3b, 0x06, 0x80, 0x6d, 0xfe, 0xa2, 0x25, +0xee, 0x04, 0x68, 0x5e, 0x0b, 0xa0, 0x75, 0xf7, +0x8b, 0x66, 0xb2, 0x0f, 0x40, 0xb5, 0x00, 0xa0, +0xe9, 0xda, 0x57, 0xf3, 0x70, 0xf8, 0x7e, 0x3c, +0x3c, 0x45, 0xa1, 0x90, 0xb9, 0xd9, 0xd9, 0xe5, +0xe4, 0xe4, 0xd8, 0x4a, 0xc4, 0x42, 0x5b, 0x61, +0xca, 0x57, 0x7d, 0xfe, 0x67, 0xc2, 0x5f, 0xc0, +0x57, 0xfd, 0x6c, 0xf9, 0x7e, 0x3c, 0xfc, 0xf7, +0xf5, 0xe0, 0xbe, 0xe2, 0x24, 0x81, 0x32, 0x5d, +0x81, 0x47, 0x04, 0xf8, 0xe0, 0xc2, 0xcc, 0xf4, +0x4c, 0xa5, 0x1c, 0xcf, 0x92, 0x09, 0x84, 0x62, +0xdc, 0xe6, 0x8f, 0x47, 0xfc, 0xb7, 0x0b, 0xff, +0xfc, 0x1d, 0xd3, 0x22, 0xc4, 0x49, 0x62, 0xb9, +0x58, 0x2a, 0x14, 0xe3, 0x51, 0x12, 0x71, 0x8e, +0x44, 0x9a, 0x8c, 0xf3, 0x32, 0xa5, 0x22, 0x89, +0x42, 0x92, 0x29, 0xc5, 0x25, 0xd2, 0xff, 0x64, +0xe2, 0xdf, 0x2c, 0xfb, 0x03, 0x3e, 0xdf, 0x35, +0x00, 0xb0, 0x6a, 0x3e, 0x01, 0x7b, 0x91, 0x2d, +0xa8, 0x5d, 0x63, 0x03, 0xf6, 0x4b, 0x27, 0x10, +0x58, 0x74, 0xc0, 0xe2, 0xf7, 0x00, 0x00, 0xf2, +0xbb, 0x6f, 0xc1, 0xd4, 0x28, 0x08, 0x03, 0x80, +0x68, 0x83, 0xe1, 0xcf, 0x77, 0xff, 0xef, 0x3f, +0xfd, 0x47, 0xa0, 0x25, 0x00, 0x80, 0x66, 0x49, +0x92, 0x71, 0x00, 0x00, 0x5e, 0x44, 0x24, 0x2e, +0x54, 0xca, 0xb3, 0x3f, 0xc7, 0x08, 0x00, 0x00, +0x44, 0xa0, 0x81, 0x2a, 0xb0, 0x41, 0x1b, 0xf4, +0xc1, 0x18, 0x2c, 0xc0, 0x06, 0x1c, 0xc1, 0x05, +0xdc, 0xc1, 0x0b, 0xfc, 0x60, 0x36, 0x84, 0x42, +0x24, 0xc4, 0xc2, 0x42, 0x10, 0x42, 0x0a, 0x64, +0x80, 0x1c, 0x72, 0x60, 0x29, 0xac, 0x82, 0x42, +0x28, 0x86, 0xcd, 0xb0, 0x1d, 0x2a, 0x60, 0x2f, +0xd4, 0x40, 0x1d, 0x34, 0xc0, 0x51, 0x68, 0x86, +0x93, 0x70, 0x0e, 0x2e, 0xc2, 0x55, 0xb8, 0x0e, +0x3d, 0x70, 0x0f, 0xfa, 0x61, 0x08, 0x9e, 0xc1, +0x28, 0xbc, 0x81, 0x09, 0x04, 0x41, 0xc8, 0x08, +0x13, 0x61, 0x21, 0xda, 0x88, 0x01, 0x62, 0x8a, +0x58, 0x23, 0x8e, 0x08, 0x17, 0x99, 0x85, 0xf8, +0x21, 0xc1, 0x48, 0x04, 0x12, 0x8b, 0x24, 0x20, +0xc9, 0x88, 0x14, 0x51, 0x22, 0x4b, 0x91, 0x35, +0x48, 0x31, 0x52, 0x8a, 0x54, 0x20, 0x55, 0x48, +0x1d, 0xf2, 0x3d, 0x72, 0x02, 0x39, 0x87, 0x5c, +0x46, 0xba, 0x91, 0x3b, 0xc8, 0x00, 0x32, 0x82, +0xfc, 0x86, 0xbc, 0x47, 0x31, 0x94, 0x81, 0xb2, +0x51, 0x3d, 0xd4, 0x0c, 0xb5, 0x43, 0xb9, 0xa8, +0x37, 0x1a, 0x84, 0x46, 0xa2, 0x0b, 0xd0, 0x64, +0x74, 0x31, 0x9a, 0x8f, 0x16, 0xa0, 0x9b, 0xd0, +0x72, 0xb4, 0x1a, 0x3d, 0x8c, 0x36, 0xa1, 0xe7, +0xd0, 0xab, 0x68, 0x0f, 0xda, 0x8f, 0x3e, 0x43, +0xc7, 0x30, 0xc0, 0xe8, 0x18, 0x07, 0x33, 0xc4, +0x6c, 0x30, 0x2e, 0xc6, 0xc3, 0x42, 0xb1, 0x38, +0x2c, 0x09, 0x93, 0x63, 0xcb, 0xb1, 0x22, 0xac, +0x0c, 0xab, 0xc6, 0x1a, 0xb0, 0x56, 0xac, 0x03, +0xbb, 0x89, 0xf5, 0x63, 0xcf, 0xb1, 0x77, 0x04, +0x12, 0x81, 0x45, 0xc0, 0x09, 0x36, 0x04, 0x77, +0x42, 0x20, 0x61, 0x1e, 0x41, 0x48, 0x58, 0x4c, +0x58, 0x4e, 0xd8, 0x48, 0xa8, 0x20, 0x1c, 0x24, +0x34, 0x11, 0xda, 0x09, 0x37, 0x09, 0x03, 0x84, +0x51, 0xc2, 0x27, 0x22, 0x93, 0xa8, 0x4b, 0xb4, +0x26, 0xba, 0x11, 0xf9, 0xc4, 0x18, 0x62, 0x32, +0x31, 0x87, 0x58, 0x48, 0x2c, 0x23, 0xd6, 0x12, +0x8f, 0x13, 0x2f, 0x10, 0x7b, 0x88, 0x43, 0xc4, +0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xb9, +0x90, 0x02, 0x49, 0xb1, 0xa4, 0x54, 0xd2, 0x12, +0xd2, 0x46, 0xd2, 0x6e, 0x52, 0x23, 0xe9, 0x2c, +0xa9, 0x9b, 0x34, 0x48, 0x1a, 0x23, 0x93, 0xc9, +0xda, 0x64, 0x6b, 0xb2, 0x07, 0x39, 0x94, 0x2c, +0x20, 0x2b, 0xc8, 0x85, 0xe4, 0x9d, 0xe4, 0xc3, +0xe4, 0x33, 0xe4, 0x1b, 0xe4, 0x21, 0xf2, 0x5b, +0x0a, 0x9d, 0x62, 0x40, 0x71, 0xa4, 0xf8, 0x53, +0xe2, 0x28, 0x52, 0xca, 0x6a, 0x4a, 0x19, 0xe5, +0x10, 0xe5, 0x34, 0xe5, 0x06, 0x65, 0x98, 0x32, +0x41, 0x55, 0xa3, 0x9a, 0x52, 0xdd, 0xa8, 0xa1, +0x54, 0x11, 0x35, 0x8f, 0x5a, 0x42, 0xad, 0xa1, +0xb6, 0x52, 0xaf, 0x51, 0x87, 0xa8, 0x13, 0x34, +0x75, 0x9a, 0x39, 0xcd, 0x83, 0x16, 0x49, 0x4b, +0xa5, 0xad, 0xa2, 0x95, 0xd3, 0x1a, 0x68, 0x17, +0x68, 0xf7, 0x69, 0xaf, 0xe8, 0x74, 0xba, 0x11, +0xdd, 0x95, 0x1e, 0x4e, 0x97, 0xd0, 0x57, 0xd2, +0xcb, 0xe9, 0x47, 0xe8, 0x97, 0xe8, 0x03, 0xf4, +0x77, 0x0c, 0x0d, 0x86, 0x15, 0x83, 0xc7, 0x88, +0x67, 0x28, 0x19, 0x9b, 0x18, 0x07, 0x18, 0x67, +0x19, 0x77, 0x18, 0xaf, 0x98, 0x4c, 0xa6, 0x19, +0xd3, 0x8b, 0x19, 0xc7, 0x54, 0x30, 0x37, 0x31, +0xeb, 0x98, 0xe7, 0x99, 0x0f, 0x99, 0x6f, 0x55, +0x58, 0x2a, 0xb6, 0x2a, 0x7c, 0x15, 0x91, 0xca, +0x0a, 0x95, 0x4a, 0x95, 0x26, 0x95, 0x1b, 0x2a, +0x2f, 0x54, 0xa9, 0xaa, 0xa6, 0xaa, 0xde, 0xaa, +0x0b, 0x55, 0xf3, 0x55, 0xcb, 0x54, 0x8f, 0xa9, +0x5e, 0x53, 0x7d, 0xae, 0x46, 0x55, 0x33, 0x53, +0xe3, 0xa9, 0x09, 0xd4, 0x96, 0xab, 0x55, 0xaa, +0x9d, 0x50, 0xeb, 0x53, 0x1b, 0x53, 0x67, 0xa9, +0x3b, 0xa8, 0x87, 0xaa, 0x67, 0xa8, 0x6f, 0x54, +0x3f, 0xa4, 0x7e, 0x59, 0xfd, 0x89, 0x06, 0x59, +0xc3, 0x4c, 0xc3, 0x4f, 0x43, 0xa4, 0x51, 0xa0, +0xb1, 0x5f, 0xe3, 0xbc, 0xc6, 0x20, 0x0b, 0x63, +0x19, 0xb3, 0x78, 0x2c, 0x21, 0x6b, 0x0d, 0xab, +0x86, 0x75, 0x81, 0x35, 0xc4, 0x26, 0xb1, 0xcd, +0xd9, 0x7c, 0x76, 0x2a, 0xbb, 0x98, 0xfd, 0x1d, +0xbb, 0x8b, 0x3d, 0xaa, 0xa9, 0xa1, 0x39, 0x43, +0x33, 0x4a, 0x33, 0x57, 0xb3, 0x52, 0xf3, 0x94, +0x66, 0x3f, 0x07, 0xe3, 0x98, 0x71, 0xf8, 0x9c, +0x74, 0x4e, 0x09, 0xe7, 0x28, 0xa7, 0x97, 0xf3, +0x7e, 0x8a, 0xde, 0x14, 0xef, 0x29, 0xe2, 0x29, +0x1b, 0xa6, 0x34, 0x4c, 0xb9, 0x31, 0x65, 0x5c, +0x6b, 0xaa, 0x96, 0x97, 0x96, 0x58, 0xab, 0x48, +0xab, 0x51, 0xab, 0x47, 0xeb, 0xbd, 0x36, 0xae, +0xed, 0xa7, 0x9d, 0xa6, 0xbd, 0x45, 0xbb, 0x59, +0xfb, 0x81, 0x0e, 0x41, 0xc7, 0x4a, 0x27, 0x5c, +0x27, 0x47, 0x67, 0x8f, 0xce, 0x05, 0x9d, 0xe7, +0x53, 0xd9, 0x53, 0xdd, 0xa7, 0x0a, 0xa7, 0x16, +0x4d, 0x3d, 0x3a, 0xf5, 0xae, 0x2e, 0xaa, 0x6b, +0xa5, 0x1b, 0xa1, 0xbb, 0x44, 0x77, 0xbf, 0x6e, +0xa7, 0xee, 0x98, 0x9e, 0xbe, 0x5e, 0x80, 0x9e, +0x4c, 0x6f, 0xa7, 0xde, 0x79, 0xbd, 0xe7, 0xfa, +0x1c, 0x7d, 0x2f, 0xfd, 0x54, 0xfd, 0x6d, 0xfa, +0xa7, 0xf5, 0x47, 0x0c, 0x58, 0x06, 0xb3, 0x0c, +0x24, 0x06, 0xdb, 0x0c, 0xce, 0x18, 0x3c, 0xc5, +0x35, 0x71, 0x6f, 0x3c, 0x1d, 0x2f, 0xc7, 0xdb, +0xf1, 0x51, 0x43, 0x5d, 0xc3, 0x40, 0x43, 0xa5, +0x61, 0x95, 0x61, 0x97, 0xe1, 0x84, 0x91, 0xb9, +0xd1, 0x3c, 0xa3, 0xd5, 0x46, 0x8d, 0x46, 0x0f, +0x8c, 0x69, 0xc6, 0x5c, 0xe3, 0x24, 0xe3, 0x6d, +0xc6, 0x6d, 0xc6, 0xa3, 0x26, 0x06, 0x26, 0x21, +0x26, 0x4b, 0x4d, 0xea, 0x4d, 0xee, 0x9a, 0x52, +0x4d, 0xb9, 0xa6, 0x29, 0xa6, 0x3b, 0x4c, 0x3b, +0x4c, 0xc7, 0xcd, 0xcc, 0xcd, 0xa2, 0xcd, 0xd6, +0x99, 0x35, 0x9b, 0x3d, 0x31, 0xd7, 0x32, 0xe7, +0x9b, 0xe7, 0x9b, 0xd7, 0x9b, 0xdf, 0xb7, 0x60, +0x5a, 0x78, 0x5a, 0x2c, 0xb6, 0xa8, 0xb6, 0xb8, +0x65, 0x49, 0xb2, 0xe4, 0x5a, 0xa6, 0x59, 0xee, +0xb6, 0xbc, 0x6e, 0x85, 0x5a, 0x39, 0x59, 0xa5, +0x58, 0x55, 0x5a, 0x5d, 0xb3, 0x46, 0xad, 0x9d, +0xad, 0x25, 0xd6, 0xbb, 0xad, 0xbb, 0xa7, 0x11, +0xa7, 0xb9, 0x4e, 0x93, 0x4e, 0xab, 0x9e, 0xd6, +0x67, 0xc3, 0xb0, 0xf1, 0xb6, 0xc9, 0xb6, 0xa9, +0xb7, 0x19, 0xb0, 0xe5, 0xd8, 0x06, 0xdb, 0xae, +0xb6, 0x6d, 0xb6, 0x7d, 0x61, 0x67, 0x62, 0x17, +0x67, 0xb7, 0xc5, 0xae, 0xc3, 0xee, 0x93, 0xbd, +0x93, 0x7d, 0xba, 0x7d, 0x8d, 0xfd, 0x3d, 0x07, +0x0d, 0x87, 0xd9, 0x0e, 0xab, 0x1d, 0x5a, 0x1d, +0x7e, 0x73, 0xb4, 0x72, 0x14, 0x3a, 0x56, 0x3a, +0xde, 0x9a, 0xce, 0x9c, 0xee, 0x3f, 0x7d, 0xc5, +0xf4, 0x96, 0xe9, 0x2f, 0x67, 0x58, 0xcf, 0x10, +0xcf, 0xd8, 0x33, 0xe3, 0xb6, 0x13, 0xcb, 0x29, +0xc4, 0x69, 0x9d, 0x53, 0x9b, 0xd3, 0x47, 0x67, +0x17, 0x67, 0xb9, 0x73, 0x83, 0xf3, 0x88, 0x8b, +0x89, 0x4b, 0x82, 0xcb, 0x2e, 0x97, 0x3e, 0x2e, +0x9b, 0x1b, 0xc6, 0xdd, 0xc8, 0xbd, 0xe4, 0x4a, +0x74, 0xf5, 0x71, 0x5d, 0xe1, 0x7a, 0xd2, 0xf5, +0x9d, 0x9b, 0xb3, 0x9b, 0xc2, 0xed, 0xa8, 0xdb, +0xaf, 0xee, 0x36, 0xee, 0x69, 0xee, 0x87, 0xdc, +0x9f, 0xcc, 0x34, 0x9f, 0x29, 0x9e, 0x59, 0x33, +0x73, 0xd0, 0xc3, 0xc8, 0x43, 0xe0, 0x51, 0xe5, +0xd1, 0x3f, 0x0b, 0x9f, 0x95, 0x30, 0x6b, 0xdf, +0xac, 0x7e, 0x4f, 0x43, 0x4f, 0x81, 0x67, 0xb5, +0xe7, 0x23, 0x2f, 0x63, 0x2f, 0x91, 0x57, 0xad, +0xd7, 0xb0, 0xb7, 0xa5, 0x77, 0xaa, 0xf7, 0x61, +0xef, 0x17, 0x3e, 0xf6, 0x3e, 0x72, 0x9f, 0xe3, +0x3e, 0xe3, 0x3c, 0x37, 0xde, 0x32, 0xde, 0x59, +0x5f, 0xcc, 0x37, 0xc0, 0xb7, 0xc8, 0xb7, 0xcb, +0x4f, 0xc3, 0x6f, 0x9e, 0x5f, 0x85, 0xdf, 0x43, +0x7f, 0x23, 0xff, 0x64, 0xff, 0x7a, 0xff, 0xd1, +0x00, 0xa7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, +0x81, 0x41, 0x81, 0x5b, 0x02, 0xfb, 0xf8, 0x7a, +0x7c, 0x21, 0xbf, 0x8e, 0x3f, 0x3a, 0xdb, 0x65, +0xf6, 0xb2, 0xd9, 0xed, 0x41, 0x8c, 0xa0, 0xb9, +0x41, 0x15, 0x41, 0x8f, 0x82, 0xad, 0x82, 0xe5, +0xc1, 0xad, 0x21, 0x68, 0xc8, 0xec, 0x90, 0xad, +0x21, 0xf7, 0xe7, 0x98, 0xce, 0x91, 0xce, 0x69, +0x0e, 0x85, 0x50, 0x7e, 0xe8, 0xd6, 0xd0, 0x07, +0x61, 0xe6, 0x61, 0x8b, 0xc3, 0x7e, 0x0c, 0x27, +0x85, 0x87, 0x85, 0x57, 0x86, 0x3f, 0x8e, 0x70, +0x88, 0x58, 0x1a, 0xd1, 0x31, 0x97, 0x35, 0x77, +0xd1, 0xdc, 0x43, 0x73, 0xdf, 0x44, 0xfa, 0x44, +0x96, 0x44, 0xde, 0x9b, 0x67, 0x31, 0x4f, 0x39, +0xaf, 0x2d, 0x4a, 0x35, 0x2a, 0x3e, 0xaa, 0x2e, +0x6a, 0x3c, 0xda, 0x37, 0xba, 0x34, 0xba, 0x3f, +0xc6, 0x2e, 0x66, 0x59, 0xcc, 0xd5, 0x58, 0x9d, +0x58, 0x49, 0x6c, 0x4b, 0x1c, 0x39, 0x2e, 0x2a, +0xae, 0x36, 0x6e, 0x6c, 0xbe, 0xdf, 0xfc, 0xed, +0xf3, 0x87, 0xe2, 0x9d, 0xe2, 0x0b, 0xe3, 0x7b, +0x17, 0x98, 0x2f, 0xc8, 0x5d, 0x70, 0x79, 0xa1, +0xce, 0xc2, 0xf4, 0x85, 0xa7, 0x16, 0xa9, 0x2e, +0x12, 0x2c, 0x3a, 0x96, 0x40, 0x4c, 0x88, 0x4e, +0x38, 0x94, 0xf0, 0x41, 0x10, 0x2a, 0xa8, 0x16, +0x8c, 0x25, 0xf2, 0x13, 0x77, 0x25, 0x8e, 0x0a, +0x79, 0xc2, 0x1d, 0xc2, 0x67, 0x22, 0x2f, 0xd1, +0x36, 0xd1, 0x88, 0xd8, 0x43, 0x5c, 0x2a, 0x1e, +0x4e, 0xf2, 0x48, 0x2a, 0x4d, 0x7a, 0x92, 0xec, +0x91, 0xbc, 0x35, 0x79, 0x24, 0xc5, 0x33, 0xa5, +0x2c, 0xe5, 0xb9, 0x84, 0x27, 0xa9, 0x90, 0xbc, +0x4c, 0x0d, 0x4c, 0xdd, 0x9b, 0x3a, 0x9e, 0x16, +0x9a, 0x76, 0x20, 0x6d, 0x32, 0x3d, 0x3a, 0xbd, +0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xaa, +0x21, 0x4d, 0x93, 0xb6, 0x67, 0xea, 0x67, 0xe6, +0x66, 0x76, 0xcb, 0xac, 0x65, 0x85, 0xb2, 0xfe, +0xc5, 0x6e, 0x8b, 0xb7, 0x2f, 0x1e, 0x95, 0x07, +0xc9, 0x6b, 0xb3, 0x90, 0xac, 0x05, 0x59, 0x2d, +0x0a, 0xb6, 0x42, 0xa6, 0xe8, 0x54, 0x5a, 0x28, +0xd7, 0x2a, 0x07, 0xb2, 0x67, 0x65, 0x57, 0x66, +0xbf, 0xcd, 0x89, 0xca, 0x39, 0x96, 0xab, 0x9e, +0x2b, 0xcd, 0xed, 0xcc, 0xb3, 0xca, 0xdb, 0x90, +0x37, 0x9c, 0xef, 0x9f, 0xff, 0xed, 0x12, 0xc2, +0x12, 0xe1, 0x92, 0xb6, 0xa5, 0x86, 0x4b, 0x57, +0x2d, 0x1d, 0x58, 0xe6, 0xbd, 0xac, 0x6a, 0x39, +0xb2, 0x3c, 0x71, 0x79, 0xdb, 0x0a, 0xe3, 0x15, +0x05, 0x2b, 0x86, 0x56, 0x06, 0xac, 0x3c, 0xb8, +0x8a, 0xb6, 0x2a, 0x6d, 0xd5, 0x4f, 0xab, 0xed, +0x57, 0x97, 0xae, 0x7e, 0xbd, 0x26, 0x7a, 0x4d, +0x6b, 0x81, 0x5e, 0xc1, 0xca, 0x82, 0xc1, 0xb5, +0x01, 0x6b, 0xeb, 0x0b, 0x55, 0x0a, 0xe5, 0x85, +0x7d, 0xeb, 0xdc, 0xd7, 0xed, 0x5d, 0x4f, 0x58, +0x2f, 0x59, 0xdf, 0xb5, 0x61, 0xfa, 0x86, 0x9d, +0x1b, 0x3e, 0x15, 0x89, 0x8a, 0xae, 0x14, 0xdb, +0x17, 0x97, 0x15, 0x7f, 0xd8, 0x28, 0xdc, 0x78, +0xe5, 0x1b, 0x87, 0x6f, 0xca, 0xbf, 0x99, 0xdc, +0x94, 0xb4, 0xa9, 0xab, 0xc4, 0xb9, 0x64, 0xcf, +0x66, 0xd2, 0x66, 0xe9, 0xe6, 0xde, 0x2d, 0x9e, +0x5b, 0x0e, 0x96, 0xaa, 0x97, 0xe6, 0x97, 0x0e, +0x6e, 0x0d, 0xd9, 0xda, 0xb4, 0x0d, 0xdf, 0x56, +0xb4, 0xed, 0xf5, 0xf6, 0x45, 0xdb, 0x2f, 0x97, +0xcd, 0x28, 0xdb, 0xbb, 0x83, 0xb6, 0x43, 0xb9, +0xa3, 0xbf, 0x3c, 0xb8, 0xbc, 0x65, 0xa7, 0xc9, +0xce, 0xcd, 0x3b, 0x3f, 0x54, 0xa4, 0x54, 0xf4, +0x54, 0xfa, 0x54, 0x36, 0xee, 0xd2, 0xdd, 0xb5, +0x61, 0xd7, 0xf8, 0x6e, 0xd1, 0xee, 0x1b, 0x7b, +0xbc, 0xf6, 0x34, 0xec, 0xd5, 0xdb, 0x5b, 0xbc, +0xf7, 0xfd, 0x3e, 0xc9, 0xbe, 0xdb, 0x55, 0x01, +0x55, 0x4d, 0xd5, 0x66, 0xd5, 0x65, 0xfb, 0x49, +0xfb, 0xb3, 0xf7, 0x3f, 0xae, 0x89, 0xaa, 0xe9, +0xf8, 0x96, 0xfb, 0x6d, 0x5d, 0xad, 0x4e, 0x6d, +0x71, 0xed, 0xc7, 0x03, 0xd2, 0x03, 0xfd, 0x07, +0x23, 0x0e, 0xb6, 0xd7, 0xb9, 0xd4, 0xd5, 0x1d, +0xd2, 0x3d, 0x54, 0x52, 0x8f, 0xd6, 0x2b, 0xeb, +0x47, 0x0e, 0xc7, 0x1f, 0xbe, 0xfe, 0x9d, 0xef, +0x77, 0x2d, 0x0d, 0x36, 0x0d, 0x55, 0x8d, 0x9c, +0xc6, 0xe2, 0x23, 0x70, 0x44, 0x79, 0xe4, 0xe9, +0xf7, 0x09, 0xdf, 0xf7, 0x1e, 0x0d, 0x3a, 0xda, +0x76, 0x8c, 0x7b, 0xac, 0xe1, 0x07, 0xd3, 0x1f, +0x76, 0x1d, 0x67, 0x1d, 0x2f, 0x6a, 0x42, 0x9a, +0xf2, 0x9a, 0x46, 0x9b, 0x53, 0x9a, 0xfb, 0x5b, +0x62, 0x5b, 0xba, 0x4f, 0xcc, 0x3e, 0xd1, 0xd6, +0xea, 0xde, 0x7a, 0xfc, 0x47, 0xdb, 0x1f, 0x0f, +0x9c, 0x34, 0x3c, 0x59, 0x79, 0x4a, 0xf3, 0x54, +0xc9, 0x69, 0xda, 0xe9, 0x82, 0xd3, 0x93, 0x67, +0xf2, 0xcf, 0x8c, 0x9d, 0x95, 0x9d, 0x7d, 0x7e, +0x2e, 0xf9, 0xdc, 0x60, 0xdb, 0xa2, 0xb6, 0x7b, +0xe7, 0x63, 0xce, 0xdf, 0x6a, 0x0f, 0x6f, 0xef, +0xba, 0x10, 0x74, 0xe1, 0xd2, 0x45, 0xff, 0x8b, +0xe7, 0x3b, 0xbc, 0x3b, 0xce, 0x5c, 0xf2, 0xb8, +0x74, 0xf2, 0xb2, 0xdb, 0xe5, 0x13, 0x57, 0xb8, +0x57, 0x9a, 0xaf, 0x3a, 0x5f, 0x6d, 0xea, 0x74, +0xea, 0x3c, 0xfe, 0x93, 0xd3, 0x4f, 0xc7, 0xbb, +0x9c, 0xbb, 0x9a, 0xae, 0xb9, 0x5c, 0x6b, 0xb9, +0xee, 0x7a, 0xbd, 0xb5, 0x7b, 0x66, 0xf7, 0xe9, +0x1b, 0x9e, 0x37, 0xce, 0xdd, 0xf4, 0xbd, 0x79, +0xf1, 0x16, 0xff, 0xd6, 0xd5, 0x9e, 0x39, 0x3d, +0xdd, 0xbd, 0xf3, 0x7a, 0x6f, 0xf7, 0xc5, 0xf7, +0xf5, 0xdf, 0x16, 0xdd, 0x7e, 0x72, 0x27, 0xfd, +0xce, 0xcb, 0xbb, 0xd9, 0x77, 0x27, 0xee, 0xad, +0xbc, 0x4f, 0xbc, 0x5f, 0xf4, 0x40, 0xed, 0x41, +0xd9, 0x43, 0xdd, 0x87, 0xd5, 0x3f, 0x5b, 0xfe, +0xdc, 0xd8, 0xef, 0xdc, 0x7f, 0x6a, 0xc0, 0x77, +0xa0, 0xf3, 0xd1, 0xdc, 0x47, 0xf7, 0x06, 0x85, +0x83, 0xcf, 0xfe, 0x91, 0xf5, 0x8f, 0x0f, 0x43, +0x05, 0x8f, 0x99, 0x8f, 0xcb, 0x86, 0x0d, 0x86, +0xeb, 0x9e, 0x38, 0x3e, 0x39, 0x39, 0xe2, 0x3f, +0x72, 0xfd, 0xe9, 0xfc, 0xa7, 0x43, 0xcf, 0x64, +0xcf, 0x26, 0x9e, 0x17, 0xfe, 0xa2, 0xfe, 0xcb, +0xae, 0x17, 0x16, 0x2f, 0x7e, 0xf8, 0xd5, 0xeb, +0xd7, 0xce, 0xd1, 0x98, 0xd1, 0xa1, 0x97, 0xf2, +0x97, 0x93, 0xbf, 0x6d, 0x7c, 0xa5, 0xfd, 0xea, +0xc0, 0xeb, 0x19, 0xaf, 0xdb, 0xc6, 0xc2, 0xc6, +0x1e, 0xbe, 0xc9, 0x78, 0x33, 0x31, 0x5e, 0xf4, +0x56, 0xfb, 0xed, 0xc1, 0x77, 0xdc, 0x77, 0x1d, +0xef, 0xa3, 0xdf, 0x0f, 0x4f, 0xe4, 0x7c, 0x20, +0x7f, 0x28, 0xff, 0x68, 0xf9, 0xb1, 0xf5, 0x53, +0xd0, 0xa7, 0xfb, 0x93, 0x19, 0x93, 0x93, 0xff, +0x04, 0x03, 0x98, 0xf3, 0xfc, 0x63, 0x33, 0x2d, +0xdb, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, +0x4d, 0x00, 0x00, 0x7a, 0x25, 0x00, 0x00, 0x80, +0x83, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0x80, +0xe9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, +0x60, 0x00, 0x00, 0x3a, 0x98, 0x00, 0x00, 0x17, +0x6f, 0x92, 0x5f, 0xc5, 0x46, 0x00, 0x00, 0x02, +0x49, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, +0xd9, 0x4b, 0xa8, 0x4d, 0x51, 0x1c, 0xc7, 0xf1, +0xcf, 0xb9, 0x88, 0xf2, 0xde, 0x94, 0x42, 0x06, +0x24, 0x45, 0x77, 0x62, 0x60, 0x20, 0xc9, 0xbe, +0x23, 0xe5, 0x31, 0xc2, 0x48, 0x37, 0x03, 0x49, +0x26, 0xbb, 0xe4, 0x75, 0x07, 0x22, 0x49, 0x61, +0x62, 0xcb, 0x4c, 0x49, 0xc8, 0x48, 0x52, 0x06, +0x26, 0x6a, 0x9b, 0x92, 0xd7, 0x84, 0x99, 0x47, +0x61, 0x22, 0xf6, 0x40, 0x21, 0xaf, 0xae, 0xc9, +0x5f, 0x9d, 0xae, 0xeb, 0x71, 0x6e, 0xf7, 0x9c, +0x7b, 0x6e, 0xad, 0x7f, 0x9d, 0xce, 0xe9, 0xb7, +0xd6, 0x3e, 0x6b, 0x7d, 0xd7, 0xff, 0xb1, 0xfe, +0xa7, 0xd3, 0x18, 0x1c, 0x1c, 0x34, 0x9e, 0xad, +0xc7, 0x38, 0xb7, 0x04, 0x90, 0x00, 0x12, 0x40, +0x02, 0x48, 0x00, 0x09, 0x20, 0x01, 0x24, 0x80, +0x04, 0x90, 0x00, 0x12, 0xc0, 0x88, 0x6d, 0x62, +0x2b, 0x93, 0x1b, 0x8d, 0xc6, 0xa8, 0x2c, 0x9a, +0xe5, 0xe5, 0x2e, 0x1c, 0xc0, 0x74, 0xdc, 0xc0, +0x40, 0x5d, 0x15, 0x35, 0xb4, 0xfa, 0x03, 0xab, +0xd1, 0xca, 0x03, 0xa3, 0x01, 0x90, 0xe5, 0xe5, +0x00, 0x4e, 0x0c, 0x91, 0x9f, 0x61, 0x5d, 0x5d, +0x15, 0xaf, 0x5b, 0x05, 0xe8, 0x68, 0x08, 0x65, +0x79, 0x39, 0x1f, 0x47, 0xf0, 0x1d, 0x5b, 0x71, +0x29, 0x86, 0x3e, 0xe3, 0x4b, 0x57, 0xe7, 0x40, +0x84, 0xcd, 0x53, 0x4c, 0xc6, 0x7b, 0x4c, 0xc5, +0x76, 0x3c, 0xc4, 0x06, 0x5c, 0xcb, 0xf2, 0x72, +0x47, 0x57, 0x02, 0x64, 0x79, 0x39, 0x05, 0x07, +0x31, 0x33, 0xa4, 0x79, 0xb8, 0x88, 0xfb, 0x58, +0x8f, 0xd3, 0x58, 0x1b, 0x40, 0xdd, 0x05, 0x90, +0xe5, 0xe5, 0x66, 0xbc, 0xc4, 0x02, 0x3c, 0xc1, +0xd1, 0xa6, 0xe1, 0x79, 0xb8, 0x87, 0x6d, 0xa8, +0xb1, 0xbb, 0xd5, 0xef, 0x6f, 0x6b, 0x12, 0x67, +0x79, 0x39, 0x0d, 0x2f, 0x30, 0x37, 0xa4, 0xe7, +0x58, 0x86, 0xe3, 0xd8, 0xdf, 0x74, 0x80, 0xcf, +0xb1, 0xa5, 0xae, 0x8a, 0x47, 0x5d, 0x93, 0xc4, +0x59, 0x5e, 0xae, 0xc2, 0x2e, 0x9c, 0xc7, 0xa7, +0x90, 0x17, 0xe3, 0x78, 0x5d, 0x15, 0x87, 0xb0, +0x14, 0xfd, 0x11, 0xff, 0xcb, 0xeb, 0xaa, 0x78, +0x34, 0x92, 0x75, 0xda, 0xe2, 0x81, 0x2c, 0x2f, +0x4f, 0xc5, 0x09, 0xff, 0xc9, 0x4e, 0x06, 0xc4, +0x6f, 0x36, 0xe6, 0x1e, 0xc8, 0xf2, 0x72, 0x5b, +0x6c, 0xfe, 0x23, 0xae, 0xe3, 0x5b, 0x0c, 0x3d, +0xc6, 0x87, 0xf8, 0x7c, 0x30, 0xcb, 0xcb, 0x9d, +0xdd, 0xda, 0x4a, 0x6c, 0x8d, 0xf7, 0x7d, 0xb8, +0x8d, 0x49, 0x91, 0xa8, 0x3b, 0xb1, 0x37, 0x20, +0x2a, 0x5c, 0xed, 0x78, 0x2b, 0xd1, 0x74, 0xca, +0xbd, 0x78, 0x5a, 0x57, 0xc5, 0x8f, 0x26, 0x6d, +0x71, 0x5c, 0x46, 0xbf, 0x62, 0x60, 0x0f, 0x7a, +0x63, 0xf3, 0x1b, 0xc3, 0x1b, 0xab, 0x71, 0x18, +0x67, 0xea, 0xaa, 0xf8, 0x34, 0x26, 0x1e, 0xc8, +0xf2, 0xb2, 0x0f, 0x77, 0x71, 0x29, 0xcb, 0xcb, +0x09, 0xa1, 0x9d, 0x8b, 0x76, 0xe0, 0x15, 0x56, +0xc6, 0xd4, 0x5e, 0x7c, 0xc5, 0x39, 0x5c, 0xc1, +0x9a, 0x28, 0xa7, 0xe5, 0x68, 0x6d, 0xbe, 0xe5, +0x24, 0x9e, 0xd3, 0x77, 0xb6, 0x27, 0x62, 0xb9, +0x37, 0xa4, 0xab, 0xb8, 0x8c, 0x5b, 0xff, 0xf1, +0xf8, 0x5b, 0xf4, 0xd5, 0x55, 0xf1, 0xe4, 0x6f, +0x93, 0xda, 0xde, 0xcc, 0x65, 0x79, 0xb9, 0x10, +0x77, 0xb0, 0x24, 0xe4, 0x77, 0x51, 0xe7, 0x6f, +0xc4, 0xe9, 0x2f, 0x0a, 0xfd, 0x07, 0x1e, 0x60, +0x56, 0xcc, 0x3f, 0x56, 0x57, 0xc5, 0x9b, 0x7f, +0xad, 0xd1, 0x91, 0x6e, 0x74, 0x18, 0x88, 0xc1, +0xd8, 0xe8, 0x8c, 0x21, 0xfa, 0xcd, 0xb8, 0xa0, +0xbe, 0xfe, 0xef, 0x1a, 0x1d, 0x29, 0xa3, 0x75, +0x55, 0xbc, 0xc6, 0xba, 0x88, 0x7b, 0x68, 0x44, +0x9c, 0xbf, 0x1d, 0xa2, 0x4f, 0x1b, 0x69, 0xa1, +0x68, 0x7b, 0x19, 0x1d, 0x06, 0x62, 0x13, 0xae, +0x35, 0x41, 0x5c, 0xc0, 0xc6, 0xd1, 0x4c, 0xd8, +0xb6, 0xdc, 0xc4, 0xc3, 0x84, 0x53, 0xcb, 0x61, +0x33, 0xa6, 0x37, 0x71, 0x78, 0x62, 0x05, 0x66, +0xc7, 0xab, 0x3f, 0x12, 0xb8, 0x23, 0xd6, 0x48, +0x7f, 0xf2, 0x25, 0x80, 0x04, 0x90, 0x00, 0x12, +0x40, 0x02, 0x48, 0x00, 0x09, 0x60, 0xe4, 0xf6, +0x73, 0x00, 0x83, 0x0c, 0xcc, 0x82, 0x48, 0x2a, +0xcd, 0xea, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, +0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; + +Byte byHERE_logo_blue_transparent_rgb_48px[4042] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, +0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, +0x08, 0x06, 0x00, 0x00, 0x00, 0xe2, 0x98, 0x77, +0x38, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, +0x73, 0x00, 0x00, 0x2e, 0x23, 0x00, 0x00, 0x2e, +0x23, 0x01, 0x78, 0xa5, 0x3f, 0x76, 0x00, 0x00, +0x0a, 0x4f, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, +0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x66, +0x69, 0x6c, 0x65, 0x00, 0x00, 0x78, 0xda, 0x9d, +0x53, 0x67, 0x54, 0x53, 0xe9, 0x16, 0x3d, 0xf7, +0xde, 0xf4, 0x42, 0x4b, 0x88, 0x80, 0x94, 0x4b, +0x6f, 0x52, 0x15, 0x08, 0x20, 0x52, 0x42, 0x8b, +0x80, 0x14, 0x91, 0x26, 0x2a, 0x21, 0x09, 0x10, +0x4a, 0x88, 0x21, 0xa1, 0xd9, 0x15, 0x51, 0xc1, +0x11, 0x45, 0x45, 0x04, 0x1b, 0xc8, 0xa0, 0x88, +0x03, 0x8e, 0x8e, 0x80, 0x8c, 0x15, 0x51, 0x2c, +0x0c, 0x8a, 0x0a, 0xd8, 0x07, 0xe4, 0x21, 0xa2, +0x8e, 0x83, 0xa3, 0x88, 0x8a, 0xca, 0xfb, 0xe1, +0x7b, 0xa3, 0x6b, 0xd6, 0xbc, 0xf7, 0xe6, 0xcd, +0xfe, 0xb5, 0xd7, 0x3e, 0xe7, 0xac, 0xf3, 0x9d, +0xb3, 0xcf, 0x07, 0xc0, 0x08, 0x0c, 0x96, 0x48, +0x33, 0x51, 0x35, 0x80, 0x0c, 0xa9, 0x42, 0x1e, +0x11, 0xe0, 0x83, 0xc7, 0xc4, 0xc6, 0xe1, 0xe4, +0x2e, 0x40, 0x81, 0x0a, 0x24, 0x70, 0x00, 0x10, +0x08, 0xb3, 0x64, 0x21, 0x73, 0xfd, 0x23, 0x01, +0x00, 0xf8, 0x7e, 0x3c, 0x3c, 0x2b, 0x22, 0xc0, +0x07, 0xbe, 0x00, 0x01, 0x78, 0xd3, 0x0b, 0x08, +0x00, 0xc0, 0x4d, 0x9b, 0xc0, 0x30, 0x1c, 0x87, +0xff, 0x0f, 0xea, 0x42, 0x99, 0x5c, 0x01, 0x80, +0x84, 0x01, 0xc0, 0x74, 0x91, 0x38, 0x4b, 0x08, +0x80, 0x14, 0x00, 0x40, 0x7a, 0x8e, 0x42, 0xa6, +0x00, 0x40, 0x46, 0x01, 0x80, 0x9d, 0x98, 0x26, +0x53, 0x00, 0xa0, 0x04, 0x00, 0x60, 0xcb, 0x63, +0x62, 0xe3, 0x00, 0x50, 0x2d, 0x00, 0x60, 0x27, +0x7f, 0xe6, 0xd3, 0x00, 0x80, 0x9d, 0xf8, 0x99, +0x7b, 0x01, 0x00, 0x5b, 0x94, 0x21, 0x15, 0x01, +0xa0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, +0x00, 0x68, 0x3b, 0x00, 0xac, 0xcf, 0x56, 0x8a, +0x45, 0x00, 0x58, 0x30, 0x00, 0x14, 0x66, 0x4b, +0xc4, 0x39, 0x00, 0xd8, 0x2d, 0x00, 0x30, 0x49, +0x57, 0x66, 0x48, 0x00, 0xb0, 0xb7, 0x00, 0xc0, +0xce, 0x10, 0x0b, 0xb2, 0x00, 0x08, 0x0c, 0x00, +0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7b, +0x00, 0x60, 0xc8, 0x23, 0x23, 0x78, 0x00, 0x84, +0x99, 0x00, 0x14, 0x46, 0xf2, 0x57, 0x3c, 0xf1, +0x2b, 0xae, 0x10, 0xe7, 0x2a, 0x00, 0x00, 0x78, +0x99, 0xb2, 0x3c, 0xb9, 0x24, 0x39, 0x45, 0x81, +0x5b, 0x08, 0x2d, 0x71, 0x07, 0x57, 0x57, 0x2e, +0x1e, 0x28, 0xce, 0x49, 0x17, 0x2b, 0x14, 0x36, +0x61, 0x02, 0x61, 0x9a, 0x40, 0x2e, 0xc2, 0x79, +0x99, 0x19, 0x32, 0x81, 0x34, 0x0f, 0xe0, 0xf3, +0xcc, 0x00, 0x00, 0xa0, 0x91, 0x15, 0x11, 0xe0, +0x83, 0xf3, 0xfd, 0x78, 0xce, 0x0e, 0xae, 0xce, +0xce, 0x36, 0x8e, 0xb6, 0x0e, 0x5f, 0x2d, 0xea, +0xbf, 0x06, 0xff, 0x22, 0x62, 0x62, 0xe3, 0xfe, +0xe5, 0xcf, 0xab, 0x70, 0x40, 0x00, 0x00, 0xe1, +0x74, 0x7e, 0xd1, 0xfe, 0x2c, 0x2f, 0xb3, 0x1a, +0x80, 0x3b, 0x06, 0x80, 0x6d, 0xfe, 0xa2, 0x25, +0xee, 0x04, 0x68, 0x5e, 0x0b, 0xa0, 0x75, 0xf7, +0x8b, 0x66, 0xb2, 0x0f, 0x40, 0xb5, 0x00, 0xa0, +0xe9, 0xda, 0x57, 0xf3, 0x70, 0xf8, 0x7e, 0x3c, +0x3c, 0x45, 0xa1, 0x90, 0xb9, 0xd9, 0xd9, 0xe5, +0xe4, 0xe4, 0xd8, 0x4a, 0xc4, 0x42, 0x5b, 0x61, +0xca, 0x57, 0x7d, 0xfe, 0x67, 0xc2, 0x5f, 0xc0, +0x57, 0xfd, 0x6c, 0xf9, 0x7e, 0x3c, 0xfc, 0xf7, +0xf5, 0xe0, 0xbe, 0xe2, 0x24, 0x81, 0x32, 0x5d, +0x81, 0x47, 0x04, 0xf8, 0xe0, 0xc2, 0xcc, 0xf4, +0x4c, 0xa5, 0x1c, 0xcf, 0x92, 0x09, 0x84, 0x62, +0xdc, 0xe6, 0x8f, 0x47, 0xfc, 0xb7, 0x0b, 0xff, +0xfc, 0x1d, 0xd3, 0x22, 0xc4, 0x49, 0x62, 0xb9, +0x58, 0x2a, 0x14, 0xe3, 0x51, 0x12, 0x71, 0x8e, +0x44, 0x9a, 0x8c, 0xf3, 0x32, 0xa5, 0x22, 0x89, +0x42, 0x92, 0x29, 0xc5, 0x25, 0xd2, 0xff, 0x64, +0xe2, 0xdf, 0x2c, 0xfb, 0x03, 0x3e, 0xdf, 0x35, +0x00, 0xb0, 0x6a, 0x3e, 0x01, 0x7b, 0x91, 0x2d, +0xa8, 0x5d, 0x63, 0x03, 0xf6, 0x4b, 0x27, 0x10, +0x58, 0x74, 0xc0, 0xe2, 0xf7, 0x00, 0x00, 0xf2, +0xbb, 0x6f, 0xc1, 0xd4, 0x28, 0x08, 0x03, 0x80, +0x68, 0x83, 0xe1, 0xcf, 0x77, 0xff, 0xef, 0x3f, +0xfd, 0x47, 0xa0, 0x25, 0x00, 0x80, 0x66, 0x49, +0x92, 0x71, 0x00, 0x00, 0x5e, 0x44, 0x24, 0x2e, +0x54, 0xca, 0xb3, 0x3f, 0xc7, 0x08, 0x00, 0x00, +0x44, 0xa0, 0x81, 0x2a, 0xb0, 0x41, 0x1b, 0xf4, +0xc1, 0x18, 0x2c, 0xc0, 0x06, 0x1c, 0xc1, 0x05, +0xdc, 0xc1, 0x0b, 0xfc, 0x60, 0x36, 0x84, 0x42, +0x24, 0xc4, 0xc2, 0x42, 0x10, 0x42, 0x0a, 0x64, +0x80, 0x1c, 0x72, 0x60, 0x29, 0xac, 0x82, 0x42, +0x28, 0x86, 0xcd, 0xb0, 0x1d, 0x2a, 0x60, 0x2f, +0xd4, 0x40, 0x1d, 0x34, 0xc0, 0x51, 0x68, 0x86, +0x93, 0x70, 0x0e, 0x2e, 0xc2, 0x55, 0xb8, 0x0e, +0x3d, 0x70, 0x0f, 0xfa, 0x61, 0x08, 0x9e, 0xc1, +0x28, 0xbc, 0x81, 0x09, 0x04, 0x41, 0xc8, 0x08, +0x13, 0x61, 0x21, 0xda, 0x88, 0x01, 0x62, 0x8a, +0x58, 0x23, 0x8e, 0x08, 0x17, 0x99, 0x85, 0xf8, +0x21, 0xc1, 0x48, 0x04, 0x12, 0x8b, 0x24, 0x20, +0xc9, 0x88, 0x14, 0x51, 0x22, 0x4b, 0x91, 0x35, +0x48, 0x31, 0x52, 0x8a, 0x54, 0x20, 0x55, 0x48, +0x1d, 0xf2, 0x3d, 0x72, 0x02, 0x39, 0x87, 0x5c, +0x46, 0xba, 0x91, 0x3b, 0xc8, 0x00, 0x32, 0x82, +0xfc, 0x86, 0xbc, 0x47, 0x31, 0x94, 0x81, 0xb2, +0x51, 0x3d, 0xd4, 0x0c, 0xb5, 0x43, 0xb9, 0xa8, +0x37, 0x1a, 0x84, 0x46, 0xa2, 0x0b, 0xd0, 0x64, +0x74, 0x31, 0x9a, 0x8f, 0x16, 0xa0, 0x9b, 0xd0, +0x72, 0xb4, 0x1a, 0x3d, 0x8c, 0x36, 0xa1, 0xe7, +0xd0, 0xab, 0x68, 0x0f, 0xda, 0x8f, 0x3e, 0x43, +0xc7, 0x30, 0xc0, 0xe8, 0x18, 0x07, 0x33, 0xc4, +0x6c, 0x30, 0x2e, 0xc6, 0xc3, 0x42, 0xb1, 0x38, +0x2c, 0x09, 0x93, 0x63, 0xcb, 0xb1, 0x22, 0xac, +0x0c, 0xab, 0xc6, 0x1a, 0xb0, 0x56, 0xac, 0x03, +0xbb, 0x89, 0xf5, 0x63, 0xcf, 0xb1, 0x77, 0x04, +0x12, 0x81, 0x45, 0xc0, 0x09, 0x36, 0x04, 0x77, +0x42, 0x20, 0x61, 0x1e, 0x41, 0x48, 0x58, 0x4c, +0x58, 0x4e, 0xd8, 0x48, 0xa8, 0x20, 0x1c, 0x24, +0x34, 0x11, 0xda, 0x09, 0x37, 0x09, 0x03, 0x84, +0x51, 0xc2, 0x27, 0x22, 0x93, 0xa8, 0x4b, 0xb4, +0x26, 0xba, 0x11, 0xf9, 0xc4, 0x18, 0x62, 0x32, +0x31, 0x87, 0x58, 0x48, 0x2c, 0x23, 0xd6, 0x12, +0x8f, 0x13, 0x2f, 0x10, 0x7b, 0x88, 0x43, 0xc4, +0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xb9, +0x90, 0x02, 0x49, 0xb1, 0xa4, 0x54, 0xd2, 0x12, +0xd2, 0x46, 0xd2, 0x6e, 0x52, 0x23, 0xe9, 0x2c, +0xa9, 0x9b, 0x34, 0x48, 0x1a, 0x23, 0x93, 0xc9, +0xda, 0x64, 0x6b, 0xb2, 0x07, 0x39, 0x94, 0x2c, +0x20, 0x2b, 0xc8, 0x85, 0xe4, 0x9d, 0xe4, 0xc3, +0xe4, 0x33, 0xe4, 0x1b, 0xe4, 0x21, 0xf2, 0x5b, +0x0a, 0x9d, 0x62, 0x40, 0x71, 0xa4, 0xf8, 0x53, +0xe2, 0x28, 0x52, 0xca, 0x6a, 0x4a, 0x19, 0xe5, +0x10, 0xe5, 0x34, 0xe5, 0x06, 0x65, 0x98, 0x32, +0x41, 0x55, 0xa3, 0x9a, 0x52, 0xdd, 0xa8, 0xa1, +0x54, 0x11, 0x35, 0x8f, 0x5a, 0x42, 0xad, 0xa1, +0xb6, 0x52, 0xaf, 0x51, 0x87, 0xa8, 0x13, 0x34, +0x75, 0x9a, 0x39, 0xcd, 0x83, 0x16, 0x49, 0x4b, +0xa5, 0xad, 0xa2, 0x95, 0xd3, 0x1a, 0x68, 0x17, +0x68, 0xf7, 0x69, 0xaf, 0xe8, 0x74, 0xba, 0x11, +0xdd, 0x95, 0x1e, 0x4e, 0x97, 0xd0, 0x57, 0xd2, +0xcb, 0xe9, 0x47, 0xe8, 0x97, 0xe8, 0x03, 0xf4, +0x77, 0x0c, 0x0d, 0x86, 0x15, 0x83, 0xc7, 0x88, +0x67, 0x28, 0x19, 0x9b, 0x18, 0x07, 0x18, 0x67, +0x19, 0x77, 0x18, 0xaf, 0x98, 0x4c, 0xa6, 0x19, +0xd3, 0x8b, 0x19, 0xc7, 0x54, 0x30, 0x37, 0x31, +0xeb, 0x98, 0xe7, 0x99, 0x0f, 0x99, 0x6f, 0x55, +0x58, 0x2a, 0xb6, 0x2a, 0x7c, 0x15, 0x91, 0xca, +0x0a, 0x95, 0x4a, 0x95, 0x26, 0x95, 0x1b, 0x2a, +0x2f, 0x54, 0xa9, 0xaa, 0xa6, 0xaa, 0xde, 0xaa, +0x0b, 0x55, 0xf3, 0x55, 0xcb, 0x54, 0x8f, 0xa9, +0x5e, 0x53, 0x7d, 0xae, 0x46, 0x55, 0x33, 0x53, +0xe3, 0xa9, 0x09, 0xd4, 0x96, 0xab, 0x55, 0xaa, +0x9d, 0x50, 0xeb, 0x53, 0x1b, 0x53, 0x67, 0xa9, +0x3b, 0xa8, 0x87, 0xaa, 0x67, 0xa8, 0x6f, 0x54, +0x3f, 0xa4, 0x7e, 0x59, 0xfd, 0x89, 0x06, 0x59, +0xc3, 0x4c, 0xc3, 0x4f, 0x43, 0xa4, 0x51, 0xa0, +0xb1, 0x5f, 0xe3, 0xbc, 0xc6, 0x20, 0x0b, 0x63, +0x19, 0xb3, 0x78, 0x2c, 0x21, 0x6b, 0x0d, 0xab, +0x86, 0x75, 0x81, 0x35, 0xc4, 0x26, 0xb1, 0xcd, +0xd9, 0x7c, 0x76, 0x2a, 0xbb, 0x98, 0xfd, 0x1d, +0xbb, 0x8b, 0x3d, 0xaa, 0xa9, 0xa1, 0x39, 0x43, +0x33, 0x4a, 0x33, 0x57, 0xb3, 0x52, 0xf3, 0x94, +0x66, 0x3f, 0x07, 0xe3, 0x98, 0x71, 0xf8, 0x9c, +0x74, 0x4e, 0x09, 0xe7, 0x28, 0xa7, 0x97, 0xf3, +0x7e, 0x8a, 0xde, 0x14, 0xef, 0x29, 0xe2, 0x29, +0x1b, 0xa6, 0x34, 0x4c, 0xb9, 0x31, 0x65, 0x5c, +0x6b, 0xaa, 0x96, 0x97, 0x96, 0x58, 0xab, 0x48, +0xab, 0x51, 0xab, 0x47, 0xeb, 0xbd, 0x36, 0xae, +0xed, 0xa7, 0x9d, 0xa6, 0xbd, 0x45, 0xbb, 0x59, +0xfb, 0x81, 0x0e, 0x41, 0xc7, 0x4a, 0x27, 0x5c, +0x27, 0x47, 0x67, 0x8f, 0xce, 0x05, 0x9d, 0xe7, +0x53, 0xd9, 0x53, 0xdd, 0xa7, 0x0a, 0xa7, 0x16, +0x4d, 0x3d, 0x3a, 0xf5, 0xae, 0x2e, 0xaa, 0x6b, +0xa5, 0x1b, 0xa1, 0xbb, 0x44, 0x77, 0xbf, 0x6e, +0xa7, 0xee, 0x98, 0x9e, 0xbe, 0x5e, 0x80, 0x9e, +0x4c, 0x6f, 0xa7, 0xde, 0x79, 0xbd, 0xe7, 0xfa, +0x1c, 0x7d, 0x2f, 0xfd, 0x54, 0xfd, 0x6d, 0xfa, +0xa7, 0xf5, 0x47, 0x0c, 0x58, 0x06, 0xb3, 0x0c, +0x24, 0x06, 0xdb, 0x0c, 0xce, 0x18, 0x3c, 0xc5, +0x35, 0x71, 0x6f, 0x3c, 0x1d, 0x2f, 0xc7, 0xdb, +0xf1, 0x51, 0x43, 0x5d, 0xc3, 0x40, 0x43, 0xa5, +0x61, 0x95, 0x61, 0x97, 0xe1, 0x84, 0x91, 0xb9, +0xd1, 0x3c, 0xa3, 0xd5, 0x46, 0x8d, 0x46, 0x0f, +0x8c, 0x69, 0xc6, 0x5c, 0xe3, 0x24, 0xe3, 0x6d, +0xc6, 0x6d, 0xc6, 0xa3, 0x26, 0x06, 0x26, 0x21, +0x26, 0x4b, 0x4d, 0xea, 0x4d, 0xee, 0x9a, 0x52, +0x4d, 0xb9, 0xa6, 0x29, 0xa6, 0x3b, 0x4c, 0x3b, +0x4c, 0xc7, 0xcd, 0xcc, 0xcd, 0xa2, 0xcd, 0xd6, +0x99, 0x35, 0x9b, 0x3d, 0x31, 0xd7, 0x32, 0xe7, +0x9b, 0xe7, 0x9b, 0xd7, 0x9b, 0xdf, 0xb7, 0x60, +0x5a, 0x78, 0x5a, 0x2c, 0xb6, 0xa8, 0xb6, 0xb8, +0x65, 0x49, 0xb2, 0xe4, 0x5a, 0xa6, 0x59, 0xee, +0xb6, 0xbc, 0x6e, 0x85, 0x5a, 0x39, 0x59, 0xa5, +0x58, 0x55, 0x5a, 0x5d, 0xb3, 0x46, 0xad, 0x9d, +0xad, 0x25, 0xd6, 0xbb, 0xad, 0xbb, 0xa7, 0x11, +0xa7, 0xb9, 0x4e, 0x93, 0x4e, 0xab, 0x9e, 0xd6, +0x67, 0xc3, 0xb0, 0xf1, 0xb6, 0xc9, 0xb6, 0xa9, +0xb7, 0x19, 0xb0, 0xe5, 0xd8, 0x06, 0xdb, 0xae, +0xb6, 0x6d, 0xb6, 0x7d, 0x61, 0x67, 0x62, 0x17, +0x67, 0xb7, 0xc5, 0xae, 0xc3, 0xee, 0x93, 0xbd, +0x93, 0x7d, 0xba, 0x7d, 0x8d, 0xfd, 0x3d, 0x07, +0x0d, 0x87, 0xd9, 0x0e, 0xab, 0x1d, 0x5a, 0x1d, +0x7e, 0x73, 0xb4, 0x72, 0x14, 0x3a, 0x56, 0x3a, +0xde, 0x9a, 0xce, 0x9c, 0xee, 0x3f, 0x7d, 0xc5, +0xf4, 0x96, 0xe9, 0x2f, 0x67, 0x58, 0xcf, 0x10, +0xcf, 0xd8, 0x33, 0xe3, 0xb6, 0x13, 0xcb, 0x29, +0xc4, 0x69, 0x9d, 0x53, 0x9b, 0xd3, 0x47, 0x67, +0x17, 0x67, 0xb9, 0x73, 0x83, 0xf3, 0x88, 0x8b, +0x89, 0x4b, 0x82, 0xcb, 0x2e, 0x97, 0x3e, 0x2e, +0x9b, 0x1b, 0xc6, 0xdd, 0xc8, 0xbd, 0xe4, 0x4a, +0x74, 0xf5, 0x71, 0x5d, 0xe1, 0x7a, 0xd2, 0xf5, +0x9d, 0x9b, 0xb3, 0x9b, 0xc2, 0xed, 0xa8, 0xdb, +0xaf, 0xee, 0x36, 0xee, 0x69, 0xee, 0x87, 0xdc, +0x9f, 0xcc, 0x34, 0x9f, 0x29, 0x9e, 0x59, 0x33, +0x73, 0xd0, 0xc3, 0xc8, 0x43, 0xe0, 0x51, 0xe5, +0xd1, 0x3f, 0x0b, 0x9f, 0x95, 0x30, 0x6b, 0xdf, +0xac, 0x7e, 0x4f, 0x43, 0x4f, 0x81, 0x67, 0xb5, +0xe7, 0x23, 0x2f, 0x63, 0x2f, 0x91, 0x57, 0xad, +0xd7, 0xb0, 0xb7, 0xa5, 0x77, 0xaa, 0xf7, 0x61, +0xef, 0x17, 0x3e, 0xf6, 0x3e, 0x72, 0x9f, 0xe3, +0x3e, 0xe3, 0x3c, 0x37, 0xde, 0x32, 0xde, 0x59, +0x5f, 0xcc, 0x37, 0xc0, 0xb7, 0xc8, 0xb7, 0xcb, +0x4f, 0xc3, 0x6f, 0x9e, 0x5f, 0x85, 0xdf, 0x43, +0x7f, 0x23, 0xff, 0x64, 0xff, 0x7a, 0xff, 0xd1, +0x00, 0xa7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, +0x81, 0x41, 0x81, 0x5b, 0x02, 0xfb, 0xf8, 0x7a, +0x7c, 0x21, 0xbf, 0x8e, 0x3f, 0x3a, 0xdb, 0x65, +0xf6, 0xb2, 0xd9, 0xed, 0x41, 0x8c, 0xa0, 0xb9, +0x41, 0x15, 0x41, 0x8f, 0x82, 0xad, 0x82, 0xe5, +0xc1, 0xad, 0x21, 0x68, 0xc8, 0xec, 0x90, 0xad, +0x21, 0xf7, 0xe7, 0x98, 0xce, 0x91, 0xce, 0x69, +0x0e, 0x85, 0x50, 0x7e, 0xe8, 0xd6, 0xd0, 0x07, +0x61, 0xe6, 0x61, 0x8b, 0xc3, 0x7e, 0x0c, 0x27, +0x85, 0x87, 0x85, 0x57, 0x86, 0x3f, 0x8e, 0x70, +0x88, 0x58, 0x1a, 0xd1, 0x31, 0x97, 0x35, 0x77, +0xd1, 0xdc, 0x43, 0x73, 0xdf, 0x44, 0xfa, 0x44, +0x96, 0x44, 0xde, 0x9b, 0x67, 0x31, 0x4f, 0x39, +0xaf, 0x2d, 0x4a, 0x35, 0x2a, 0x3e, 0xaa, 0x2e, +0x6a, 0x3c, 0xda, 0x37, 0xba, 0x34, 0xba, 0x3f, +0xc6, 0x2e, 0x66, 0x59, 0xcc, 0xd5, 0x58, 0x9d, +0x58, 0x49, 0x6c, 0x4b, 0x1c, 0x39, 0x2e, 0x2a, +0xae, 0x36, 0x6e, 0x6c, 0xbe, 0xdf, 0xfc, 0xed, +0xf3, 0x87, 0xe2, 0x9d, 0xe2, 0x0b, 0xe3, 0x7b, +0x17, 0x98, 0x2f, 0xc8, 0x5d, 0x70, 0x79, 0xa1, +0xce, 0xc2, 0xf4, 0x85, 0xa7, 0x16, 0xa9, 0x2e, +0x12, 0x2c, 0x3a, 0x96, 0x40, 0x4c, 0x88, 0x4e, +0x38, 0x94, 0xf0, 0x41, 0x10, 0x2a, 0xa8, 0x16, +0x8c, 0x25, 0xf2, 0x13, 0x77, 0x25, 0x8e, 0x0a, +0x79, 0xc2, 0x1d, 0xc2, 0x67, 0x22, 0x2f, 0xd1, +0x36, 0xd1, 0x88, 0xd8, 0x43, 0x5c, 0x2a, 0x1e, +0x4e, 0xf2, 0x48, 0x2a, 0x4d, 0x7a, 0x92, 0xec, +0x91, 0xbc, 0x35, 0x79, 0x24, 0xc5, 0x33, 0xa5, +0x2c, 0xe5, 0xb9, 0x84, 0x27, 0xa9, 0x90, 0xbc, +0x4c, 0x0d, 0x4c, 0xdd, 0x9b, 0x3a, 0x9e, 0x16, +0x9a, 0x76, 0x20, 0x6d, 0x32, 0x3d, 0x3a, 0xbd, +0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xaa, +0x21, 0x4d, 0x93, 0xb6, 0x67, 0xea, 0x67, 0xe6, +0x66, 0x76, 0xcb, 0xac, 0x65, 0x85, 0xb2, 0xfe, +0xc5, 0x6e, 0x8b, 0xb7, 0x2f, 0x1e, 0x95, 0x07, +0xc9, 0x6b, 0xb3, 0x90, 0xac, 0x05, 0x59, 0x2d, +0x0a, 0xb6, 0x42, 0xa6, 0xe8, 0x54, 0x5a, 0x28, +0xd7, 0x2a, 0x07, 0xb2, 0x67, 0x65, 0x57, 0x66, +0xbf, 0xcd, 0x89, 0xca, 0x39, 0x96, 0xab, 0x9e, +0x2b, 0xcd, 0xed, 0xcc, 0xb3, 0xca, 0xdb, 0x90, +0x37, 0x9c, 0xef, 0x9f, 0xff, 0xed, 0x12, 0xc2, +0x12, 0xe1, 0x92, 0xb6, 0xa5, 0x86, 0x4b, 0x57, +0x2d, 0x1d, 0x58, 0xe6, 0xbd, 0xac, 0x6a, 0x39, +0xb2, 0x3c, 0x71, 0x79, 0xdb, 0x0a, 0xe3, 0x15, +0x05, 0x2b, 0x86, 0x56, 0x06, 0xac, 0x3c, 0xb8, +0x8a, 0xb6, 0x2a, 0x6d, 0xd5, 0x4f, 0xab, 0xed, +0x57, 0x97, 0xae, 0x7e, 0xbd, 0x26, 0x7a, 0x4d, +0x6b, 0x81, 0x5e, 0xc1, 0xca, 0x82, 0xc1, 0xb5, +0x01, 0x6b, 0xeb, 0x0b, 0x55, 0x0a, 0xe5, 0x85, +0x7d, 0xeb, 0xdc, 0xd7, 0xed, 0x5d, 0x4f, 0x58, +0x2f, 0x59, 0xdf, 0xb5, 0x61, 0xfa, 0x86, 0x9d, +0x1b, 0x3e, 0x15, 0x89, 0x8a, 0xae, 0x14, 0xdb, +0x17, 0x97, 0x15, 0x7f, 0xd8, 0x28, 0xdc, 0x78, +0xe5, 0x1b, 0x87, 0x6f, 0xca, 0xbf, 0x99, 0xdc, +0x94, 0xb4, 0xa9, 0xab, 0xc4, 0xb9, 0x64, 0xcf, +0x66, 0xd2, 0x66, 0xe9, 0xe6, 0xde, 0x2d, 0x9e, +0x5b, 0x0e, 0x96, 0xaa, 0x97, 0xe6, 0x97, 0x0e, +0x6e, 0x0d, 0xd9, 0xda, 0xb4, 0x0d, 0xdf, 0x56, +0xb4, 0xed, 0xf5, 0xf6, 0x45, 0xdb, 0x2f, 0x97, +0xcd, 0x28, 0xdb, 0xbb, 0x83, 0xb6, 0x43, 0xb9, +0xa3, 0xbf, 0x3c, 0xb8, 0xbc, 0x65, 0xa7, 0xc9, +0xce, 0xcd, 0x3b, 0x3f, 0x54, 0xa4, 0x54, 0xf4, +0x54, 0xfa, 0x54, 0x36, 0xee, 0xd2, 0xdd, 0xb5, +0x61, 0xd7, 0xf8, 0x6e, 0xd1, 0xee, 0x1b, 0x7b, +0xbc, 0xf6, 0x34, 0xec, 0xd5, 0xdb, 0x5b, 0xbc, +0xf7, 0xfd, 0x3e, 0xc9, 0xbe, 0xdb, 0x55, 0x01, +0x55, 0x4d, 0xd5, 0x66, 0xd5, 0x65, 0xfb, 0x49, +0xfb, 0xb3, 0xf7, 0x3f, 0xae, 0x89, 0xaa, 0xe9, +0xf8, 0x96, 0xfb, 0x6d, 0x5d, 0xad, 0x4e, 0x6d, +0x71, 0xed, 0xc7, 0x03, 0xd2, 0x03, 0xfd, 0x07, +0x23, 0x0e, 0xb6, 0xd7, 0xb9, 0xd4, 0xd5, 0x1d, +0xd2, 0x3d, 0x54, 0x52, 0x8f, 0xd6, 0x2b, 0xeb, +0x47, 0x0e, 0xc7, 0x1f, 0xbe, 0xfe, 0x9d, 0xef, +0x77, 0x2d, 0x0d, 0x36, 0x0d, 0x55, 0x8d, 0x9c, +0xc6, 0xe2, 0x23, 0x70, 0x44, 0x79, 0xe4, 0xe9, +0xf7, 0x09, 0xdf, 0xf7, 0x1e, 0x0d, 0x3a, 0xda, +0x76, 0x8c, 0x7b, 0xac, 0xe1, 0x07, 0xd3, 0x1f, +0x76, 0x1d, 0x67, 0x1d, 0x2f, 0x6a, 0x42, 0x9a, +0xf2, 0x9a, 0x46, 0x9b, 0x53, 0x9a, 0xfb, 0x5b, +0x62, 0x5b, 0xba, 0x4f, 0xcc, 0x3e, 0xd1, 0xd6, +0xea, 0xde, 0x7a, 0xfc, 0x47, 0xdb, 0x1f, 0x0f, +0x9c, 0x34, 0x3c, 0x59, 0x79, 0x4a, 0xf3, 0x54, +0xc9, 0x69, 0xda, 0xe9, 0x82, 0xd3, 0x93, 0x67, +0xf2, 0xcf, 0x8c, 0x9d, 0x95, 0x9d, 0x7d, 0x7e, +0x2e, 0xf9, 0xdc, 0x60, 0xdb, 0xa2, 0xb6, 0x7b, +0xe7, 0x63, 0xce, 0xdf, 0x6a, 0x0f, 0x6f, 0xef, +0xba, 0x10, 0x74, 0xe1, 0xd2, 0x45, 0xff, 0x8b, +0xe7, 0x3b, 0xbc, 0x3b, 0xce, 0x5c, 0xf2, 0xb8, +0x74, 0xf2, 0xb2, 0xdb, 0xe5, 0x13, 0x57, 0xb8, +0x57, 0x9a, 0xaf, 0x3a, 0x5f, 0x6d, 0xea, 0x74, +0xea, 0x3c, 0xfe, 0x93, 0xd3, 0x4f, 0xc7, 0xbb, +0x9c, 0xbb, 0x9a, 0xae, 0xb9, 0x5c, 0x6b, 0xb9, +0xee, 0x7a, 0xbd, 0xb5, 0x7b, 0x66, 0xf7, 0xe9, +0x1b, 0x9e, 0x37, 0xce, 0xdd, 0xf4, 0xbd, 0x79, +0xf1, 0x16, 0xff, 0xd6, 0xd5, 0x9e, 0x39, 0x3d, +0xdd, 0xbd, 0xf3, 0x7a, 0x6f, 0xf7, 0xc5, 0xf7, +0xf5, 0xdf, 0x16, 0xdd, 0x7e, 0x72, 0x27, 0xfd, +0xce, 0xcb, 0xbb, 0xd9, 0x77, 0x27, 0xee, 0xad, +0xbc, 0x4f, 0xbc, 0x5f, 0xf4, 0x40, 0xed, 0x41, +0xd9, 0x43, 0xdd, 0x87, 0xd5, 0x3f, 0x5b, 0xfe, +0xdc, 0xd8, 0xef, 0xdc, 0x7f, 0x6a, 0xc0, 0x77, +0xa0, 0xf3, 0xd1, 0xdc, 0x47, 0xf7, 0x06, 0x85, +0x83, 0xcf, 0xfe, 0x91, 0xf5, 0x8f, 0x0f, 0x43, +0x05, 0x8f, 0x99, 0x8f, 0xcb, 0x86, 0x0d, 0x86, +0xeb, 0x9e, 0x38, 0x3e, 0x39, 0x39, 0xe2, 0x3f, +0x72, 0xfd, 0xe9, 0xfc, 0xa7, 0x43, 0xcf, 0x64, +0xcf, 0x26, 0x9e, 0x17, 0xfe, 0xa2, 0xfe, 0xcb, +0xae, 0x17, 0x16, 0x2f, 0x7e, 0xf8, 0xd5, 0xeb, +0xd7, 0xce, 0xd1, 0x98, 0xd1, 0xa1, 0x97, 0xf2, +0x97, 0x93, 0xbf, 0x6d, 0x7c, 0xa5, 0xfd, 0xea, +0xc0, 0xeb, 0x19, 0xaf, 0xdb, 0xc6, 0xc2, 0xc6, +0x1e, 0xbe, 0xc9, 0x78, 0x33, 0x31, 0x5e, 0xf4, +0x56, 0xfb, 0xed, 0xc1, 0x77, 0xdc, 0x77, 0x1d, +0xef, 0xa3, 0xdf, 0x0f, 0x4f, 0xe4, 0x7c, 0x20, +0x7f, 0x28, 0xff, 0x68, 0xf9, 0xb1, 0xf5, 0x53, +0xd0, 0xa7, 0xfb, 0x93, 0x19, 0x93, 0x93, 0xff, +0x04, 0x03, 0x98, 0xf3, 0xfc, 0x63, 0x33, 0x2d, +0xdb, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, +0x4d, 0x00, 0x00, 0x7a, 0x25, 0x00, 0x00, 0x80, +0x83, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0x80, +0xe9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, +0x60, 0x00, 0x00, 0x3a, 0x98, 0x00, 0x00, 0x17, +0x6f, 0x92, 0x5f, 0xc5, 0x46, 0x00, 0x00, 0x04, +0xf5, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, +0x9b, 0x5d, 0x6c, 0x54, 0x45, 0x18, 0x86, 0x9f, +0xb5, 0x20, 0x4a, 0x00, 0xf1, 0x14, 0x24, 0x41, +0x34, 0x1a, 0xb5, 0x9a, 0xc8, 0x85, 0xc1, 0xa4, +0x18, 0x63, 0x4c, 0x4f, 0x2f, 0x88, 0x31, 0x95, +0x0b, 0x12, 0x8d, 0xca, 0x8f, 0xa0, 0x31, 0xf1, +0x0f, 0x26, 0xa1, 0x46, 0x45, 0x13, 0x8b, 0x1a, +0x7f, 0xa3, 0xe0, 0x41, 0x11, 0x13, 0x2f, 0x94, +0x46, 0x24, 0x12, 0x04, 0x12, 0xb9, 0xb1, 0xc4, +0x0e, 0x89, 0xd4, 0xa4, 0x5e, 0xa8, 0x51, 0x2e, +0x8c, 0x11, 0x8d, 0x3f, 0x90, 0xd8, 0xc2, 0xc4, +0xaa, 0x54, 0x4b, 0xac, 0xf5, 0xe2, 0x4c, 0xcd, +0x7a, 0xdc, 0xd3, 0x9e, 0xb6, 0xbb, 0xcb, 0xee, +0xf6, 0x7d, 0x6f, 0x9a, 0xee, 0xcc, 0xec, 0xd9, +0x79, 0x9f, 0xce, 0xcc, 0xf7, 0x7d, 0xb3, 0xcd, +0x0d, 0x0d, 0x0d, 0x21, 0x9d, 0x3e, 0x9d, 0x21, +0x0b, 0x04, 0x40, 0x00, 0x24, 0x01, 0x10, 0x00, +0x49, 0x00, 0x04, 0x40, 0x12, 0x00, 0x01, 0x90, +0x04, 0x40, 0x00, 0x24, 0x01, 0x10, 0x00, 0x49, +0x00, 0x04, 0x40, 0x12, 0x00, 0x01, 0x90, 0x04, +0x40, 0x00, 0x24, 0x01, 0x10, 0x00, 0x49, 0x00, +0x04, 0x40, 0x12, 0x00, 0x01, 0x90, 0x04, 0x40, +0x00, 0x24, 0x01, 0x10, 0x00, 0x49, 0x00, 0x04, +0x40, 0x12, 0x00, 0x01, 0x90, 0x26, 0xa6, 0x29, +0xa5, 0x7c, 0xf3, 0x5c, 0x2e, 0x57, 0x51, 0x93, +0x0d, 0xc2, 0xe8, 0x22, 0xe0, 0x7e, 0xa0, 0x09, +0x98, 0x0d, 0x7c, 0x0b, 0xec, 0x06, 0xda, 0x9d, +0x35, 0x03, 0x85, 0xc6, 0x94, 0xfa, 0x3f, 0x88, +0x72, 0xa5, 0x7c, 0x40, 0x25, 0x01, 0x08, 0xc2, +0xe8, 0x1e, 0x60, 0x33, 0x70, 0x56, 0x81, 0xe6, +0xef, 0x80, 0x55, 0xce, 0x9a, 0x43, 0xe5, 0x06, +0x30, 0x29, 0xb6, 0xa0, 0x20, 0x8c, 0x36, 0x02, +0xdb, 0x52, 0xcc, 0x07, 0xb8, 0x18, 0x38, 0x18, +0x84, 0xd1, 0xdd, 0xe5, 0xfe, 0x6c, 0x35, 0xbf, +0x02, 0x82, 0x30, 0x6a, 0x01, 0xde, 0x1f, 0xc3, +0x90, 0x7b, 0x9d, 0x35, 0xaf, 0x6b, 0x05, 0x14, +0xc7, 0xfc, 0x1c, 0xf0, 0x62, 0xe2, 0xe5, 0xcf, +0x81, 0x9b, 0x81, 0xd5, 0xc0, 0x0f, 0x89, 0xb6, +0x3f, 0x80, 0xaf, 0x15, 0x05, 0x15, 0xc7, 0xfc, +0x05, 0xc0, 0x22, 0xe0, 0xf2, 0xbc, 0x97, 0x8f, +0x01, 0x4d, 0xce, 0x9a, 0xdd, 0xc0, 0x57, 0xfe, +0x20, 0xce, 0x37, 0xbf, 0xc5, 0x59, 0xd3, 0x59, +0x33, 0x51, 0xd0, 0x69, 0x34, 0x7f, 0x39, 0xf0, +0x26, 0xf0, 0x41, 0xa2, 0xe9, 0x90, 0xb3, 0xa6, +0x2f, 0x08, 0xa3, 0xc5, 0x40, 0x07, 0x30, 0x2b, +0x69, 0x7e, 0x10, 0x46, 0x06, 0x38, 0x0f, 0x78, +0xc1, 0x59, 0xd3, 0xa7, 0x33, 0x60, 0xec, 0xe6, +0x2f, 0x04, 0x3e, 0x05, 0xa6, 0x16, 0x68, 0x3e, +0x06, 0xac, 0x00, 0xf6, 0xe5, 0x99, 0xff, 0x2b, +0x70, 0xa3, 0xb3, 0xa6, 0x2b, 0x08, 0xa3, 0xf9, +0x7e, 0x65, 0xcc, 0x04, 0x8e, 0x03, 0x1b, 0x4f, +0x74, 0xae, 0xdb, 0xaa, 0x2d, 0x68, 0x6c, 0xba, +0x2f, 0xc5, 0x7c, 0x80, 0xf9, 0x40, 0x67, 0xc2, +0xfc, 0x25, 0xde, 0xfc, 0x33, 0x81, 0x9d, 0xde, +0x7c, 0x80, 0x39, 0x40, 0xb3, 0xb6, 0xa0, 0xec, +0x7f, 0xf9, 0xf3, 0x80, 0x1e, 0xe0, 0xea, 0x8c, +0x43, 0x86, 0xcd, 0xef, 0x0e, 0xc2, 0x68, 0x86, +0x37, 0xff, 0xfa, 0xbc, 0xf6, 0x41, 0xe0, 0x09, +0x6d, 0x41, 0xd9, 0xcc, 0xbf, 0x14, 0x38, 0x08, +0x74, 0x03, 0x0d, 0xc0, 0x42, 0xdf, 0xf4, 0x05, +0xd0, 0x06, 0xec, 0x2d, 0x30, 0xec, 0x67, 0xe0, +0x2d, 0xe0, 0x2f, 0xe0, 0x0e, 0x60, 0x41, 0xa2, +0xfd, 0x71, 0x67, 0xcd, 0x53, 0x0a, 0x43, 0xb3, +0x9b, 0x7f, 0x3e, 0xb0, 0x2c, 0xcf, 0x7c, 0x80, +0x57, 0x9c, 0x35, 0xfb, 0x80, 0x4d, 0x05, 0x86, +0xce, 0x03, 0x1e, 0x06, 0x1e, 0x2b, 0x60, 0xfe, +0x2e, 0xe0, 0x69, 0x85, 0xa1, 0xd9, 0x6a, 0x3b, +0xc3, 0xe6, 0x17, 0xd2, 0xb9, 0xfe, 0xe7, 0x43, +0xfe, 0xaf, 0x3d, 0x8b, 0xde, 0x05, 0x56, 0x3a, +0x6b, 0xfe, 0x16, 0x80, 0xd1, 0xd5, 0x33, 0x4a, +0xe2, 0x74, 0x57, 0x10, 0x46, 0xd3, 0x9c, 0x35, +0x83, 0xce, 0x9a, 0x35, 0xc0, 0x5a, 0xe0, 0xf7, +0x94, 0xbe, 0xbf, 0x01, 0xeb, 0x81, 0xdb, 0x9c, +0x35, 0xa7, 0x54, 0x8a, 0xc8, 0xbe, 0x0a, 0xa6, +0x03, 0xfb, 0x81, 0x30, 0xa5, 0xcb, 0x66, 0x67, +0xcd, 0xfa, 0xbc, 0xfe, 0x73, 0xfc, 0x56, 0x15, +0x02, 0x73, 0x3d, 0xc4, 0x8f, 0x81, 0x9d, 0xce, +0x9a, 0x13, 0xc9, 0xc1, 0xaa, 0x86, 0xfe, 0xdf, +0xf0, 0x2b, 0x81, 0x75, 0xc4, 0x25, 0xe5, 0xe9, +0xc0, 0xf7, 0xc0, 0x87, 0xc0, 0x52, 0xe0, 0xaa, +0x94, 0x61, 0xad, 0xce, 0x9a, 0x4d, 0xe3, 0x79, +0x9e, 0x00, 0xfc, 0xd7, 0xfc, 0x47, 0x81, 0x27, +0x81, 0xba, 0x02, 0xcd, 0x03, 0xc0, 0xb4, 0x11, +0x86, 0x6f, 0x70, 0xd6, 0x3c, 0x27, 0x00, 0xe3, +0x37, 0x7f, 0xab, 0x4f, 0xb2, 0x26, 0xa2, 0x31, +0x43, 0x10, 0x80, 0xd8, 0xfc, 0x95, 0x40, 0x7b, +0x91, 0x3e, 0xd6, 0x98, 0x20, 0x4c, 0xfa, 0x3c, +0x20, 0x08, 0xa3, 0x29, 0xc0, 0x33, 0x89, 0x97, +0x3f, 0x02, 0x96, 0x00, 0xb7, 0x03, 0x47, 0x13, +0x6d, 0xc7, 0x81, 0x6b, 0x00, 0x9b, 0xf2, 0x96, +0x0f, 0x04, 0x61, 0x34, 0xbb, 0x52, 0xe6, 0x57, +0x0d, 0x61, 0xe8, 0xb5, 0x89, 0x44, 0xe9, 0x08, +0x70, 0x83, 0xb3, 0xe6, 0x00, 0x70, 0x92, 0xb8, +0x72, 0x99, 0x6f, 0x7e, 0xb3, 0xb3, 0xa6, 0x1b, +0x68, 0x29, 0x00, 0xe1, 0x28, 0x71, 0x39, 0xfa, +0x97, 0x4a, 0x99, 0x5c, 0x35, 0xd4, 0x82, 0x2e, +0x49, 0xfc, 0xde, 0xe5, 0xac, 0xe9, 0x0f, 0xc2, +0x68, 0x29, 0xf1, 0x85, 0xfa, 0xd4, 0x84, 0xf9, +0x5f, 0x06, 0x61, 0xd4, 0x46, 0x5c, 0x54, 0x5b, +0x01, 0xbc, 0xed, 0x43, 0xce, 0x61, 0xf3, 0xbf, +0xa9, 0xa4, 0xc9, 0x55, 0x63, 0x22, 0xd6, 0x14, +0x84, 0xd1, 0x2d, 0x23, 0x98, 0x7f, 0x19, 0xb0, +0x01, 0x68, 0x05, 0x0e, 0x03, 0x07, 0x80, 0x1d, +0x95, 0x68, 0x7e, 0x59, 0x0f, 0xe1, 0x20, 0x8c, +0xce, 0x01, 0x1e, 0x01, 0xda, 0x46, 0xca, 0x34, +0x83, 0x30, 0xba, 0x10, 0xb8, 0x0e, 0x38, 0xe5, +0xb7, 0x90, 0x0b, 0x80, 0xcf, 0x46, 0x78, 0x4c, +0xbe, 0xf9, 0x33, 0xfc, 0xf9, 0x90, 0x9f, 0x0f, +0x6c, 0x77, 0xd6, 0xac, 0x1e, 0xef, 0x1c, 0x4a, +0x7d, 0x08, 0x97, 0x65, 0x0b, 0xf2, 0xe6, 0x77, +0x00, 0x8d, 0x40, 0x63, 0x10, 0x46, 0x37, 0x39, +0x6b, 0xfa, 0x13, 0x7d, 0xea, 0xfc, 0x61, 0xdb, +0x9a, 0x17, 0xe7, 0x0f, 0x00, 0x2f, 0xfb, 0x72, +0x43, 0xc3, 0x28, 0xe6, 0xd7, 0x03, 0x7b, 0x12, +0xe6, 0xff, 0xe9, 0xf3, 0x86, 0x8a, 0x55, 0xc9, +0x57, 0x40, 0xc2, 0xfc, 0x61, 0x59, 0xe2, 0x2b, +0xc0, 0x7e, 0x6f, 0x7e, 0x0e, 0x78, 0x07, 0xb8, +0x35, 0xe5, 0xad, 0x06, 0x53, 0x92, 0xaf, 0x5e, +0xe2, 0x3a, 0xfe, 0x90, 0xdf, 0xef, 0xeb, 0x13, +0xed, 0x6b, 0x9d, 0x35, 0xaf, 0x4e, 0x64, 0x0e, +0x55, 0x9d, 0x07, 0xd4, 0x37, 0x6f, 0xa9, 0x03, +0xba, 0x80, 0xc5, 0x05, 0x9a, 0xff, 0x85, 0x10, +0x84, 0xd1, 0x32, 0xe0, 0xbd, 0x22, 0x3f, 0x7e, +0x9b, 0xb3, 0x66, 0xa2, 0x89, 0x5b, 0x75, 0xe7, +0x01, 0xce, 0x9a, 0x41, 0x60, 0x7b, 0x4a, 0x73, +0x08, 0xec, 0xf7, 0xc5, 0xb4, 0xe5, 0x45, 0x7e, +0xf4, 0x6b, 0xc4, 0x95, 0xcf, 0x8a, 0x57, 0x59, +0x0e, 0xe1, 0x20, 0x8c, 0xee, 0x04, 0xde, 0x48, +0x01, 0x6e, 0x89, 0xeb, 0xf9, 0x0d, 0x45, 0x78, +0x64, 0x2f, 0xf0, 0xa0, 0xb3, 0xa6, 0x58, 0x59, +0x73, 0xed, 0x94, 0x22, 0xfc, 0x57, 0x45, 0xda, +0x33, 0xac, 0xba, 0x97, 0x80, 0xe7, 0x81, 0x35, +0xc0, 0xb3, 0x29, 0xfd, 0x7f, 0x04, 0xb6, 0x00, +0x57, 0x10, 0x5f, 0x9e, 0xf7, 0xf8, 0xe8, 0x67, +0x8f, 0xb3, 0xe6, 0x64, 0x31, 0xe7, 0x50, 0x53, +0xb5, 0xa0, 0x0c, 0x10, 0xfa, 0x80, 0x60, 0xf8, +0x36, 0x6a, 0x94, 0xfe, 0x87, 0x7d, 0x04, 0xd4, +0x5b, 0x4a, 0x83, 0x6a, 0xaa, 0x16, 0xe4, 0xac, +0xd9, 0x01, 0xac, 0x02, 0xd2, 0xae, 0xfb, 0x66, +0x11, 0x7f, 0x51, 0x36, 0x4b, 0xff, 0x85, 0x40, +0x67, 0x10, 0x46, 0x73, 0xa9, 0x62, 0x95, 0x3d, +0x13, 0x1e, 0xc5, 0xd4, 0x1c, 0xb0, 0xcb, 0x87, +0xae, 0x59, 0xfa, 0x9f, 0xcd, 0xc8, 0x77, 0x00, +0x02, 0x30, 0x0e, 0x08, 0x8b, 0x80, 0x8e, 0x0c, +0x10, 0x8e, 0xf8, 0xf2, 0xc2, 0x4f, 0x02, 0x50, +0x7c, 0x08, 0x8d, 0x1e, 0x42, 0x7d, 0x4a, 0xff, +0x9a, 0x30, 0xbf, 0xec, 0x87, 0x70, 0x4a, 0x99, +0x62, 0x4c, 0x07, 0xad, 0x4f, 0xda, 0x3e, 0x29, +0x97, 0xf9, 0x93, 0xe2, 0x46, 0xac, 0x12, 0xa2, +0x9d, 0x49, 0x11, 0x05, 0x8d, 0x73, 0x3b, 0xaa, +0x89, 0x68, 0xa7, 0xa2, 0x57, 0x40, 0xde, 0x4a, +0x98, 0x49, 0xe1, 0xa2, 0x1b, 0x40, 0x7f, 0x39, +0xbf, 0x30, 0x55, 0x13, 0x5b, 0x90, 0x54, 0x25, +0x5b, 0x90, 0x00, 0x48, 0x02, 0x20, 0x00, 0x92, +0x00, 0x08, 0x80, 0x24, 0x00, 0x02, 0x20, 0x09, +0x80, 0x00, 0x48, 0x02, 0x20, 0x00, 0x92, 0x00, +0x08, 0x80, 0x24, 0x00, 0x02, 0x20, 0x09, 0x80, +0x00, 0x48, 0x02, 0x20, 0x00, 0x92, 0x00, 0x08, +0x80, 0x54, 0x74, 0xfd, 0x33, 0x00, 0xac, 0x57, +0xf9, 0x90, 0x3b, 0x12, 0x4b, 0x91, 0x00, 0x00, +0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, +0x60, 0x82, +}; + +Byte byHERE_logo_blue_transparent_rgb_64px[4455] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, +0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, +0x08, 0x06, 0x00, 0x00, 0x00, 0xc3, 0x3e, 0x61, +0xcb, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, +0x73, 0x00, 0x00, 0x2e, 0x23, 0x00, 0x00, 0x2e, +0x23, 0x01, 0x78, 0xa5, 0x3f, 0x76, 0x00, 0x00, +0x0a, 0x4f, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, +0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x66, +0x69, 0x6c, 0x65, 0x00, 0x00, 0x78, 0xda, 0x9d, +0x53, 0x67, 0x54, 0x53, 0xe9, 0x16, 0x3d, 0xf7, +0xde, 0xf4, 0x42, 0x4b, 0x88, 0x80, 0x94, 0x4b, +0x6f, 0x52, 0x15, 0x08, 0x20, 0x52, 0x42, 0x8b, +0x80, 0x14, 0x91, 0x26, 0x2a, 0x21, 0x09, 0x10, +0x4a, 0x88, 0x21, 0xa1, 0xd9, 0x15, 0x51, 0xc1, +0x11, 0x45, 0x45, 0x04, 0x1b, 0xc8, 0xa0, 0x88, +0x03, 0x8e, 0x8e, 0x80, 0x8c, 0x15, 0x51, 0x2c, +0x0c, 0x8a, 0x0a, 0xd8, 0x07, 0xe4, 0x21, 0xa2, +0x8e, 0x83, 0xa3, 0x88, 0x8a, 0xca, 0xfb, 0xe1, +0x7b, 0xa3, 0x6b, 0xd6, 0xbc, 0xf7, 0xe6, 0xcd, +0xfe, 0xb5, 0xd7, 0x3e, 0xe7, 0xac, 0xf3, 0x9d, +0xb3, 0xcf, 0x07, 0xc0, 0x08, 0x0c, 0x96, 0x48, +0x33, 0x51, 0x35, 0x80, 0x0c, 0xa9, 0x42, 0x1e, +0x11, 0xe0, 0x83, 0xc7, 0xc4, 0xc6, 0xe1, 0xe4, +0x2e, 0x40, 0x81, 0x0a, 0x24, 0x70, 0x00, 0x10, +0x08, 0xb3, 0x64, 0x21, 0x73, 0xfd, 0x23, 0x01, +0x00, 0xf8, 0x7e, 0x3c, 0x3c, 0x2b, 0x22, 0xc0, +0x07, 0xbe, 0x00, 0x01, 0x78, 0xd3, 0x0b, 0x08, +0x00, 0xc0, 0x4d, 0x9b, 0xc0, 0x30, 0x1c, 0x87, +0xff, 0x0f, 0xea, 0x42, 0x99, 0x5c, 0x01, 0x80, +0x84, 0x01, 0xc0, 0x74, 0x91, 0x38, 0x4b, 0x08, +0x80, 0x14, 0x00, 0x40, 0x7a, 0x8e, 0x42, 0xa6, +0x00, 0x40, 0x46, 0x01, 0x80, 0x9d, 0x98, 0x26, +0x53, 0x00, 0xa0, 0x04, 0x00, 0x60, 0xcb, 0x63, +0x62, 0xe3, 0x00, 0x50, 0x2d, 0x00, 0x60, 0x27, +0x7f, 0xe6, 0xd3, 0x00, 0x80, 0x9d, 0xf8, 0x99, +0x7b, 0x01, 0x00, 0x5b, 0x94, 0x21, 0x15, 0x01, +0xa0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, +0x00, 0x68, 0x3b, 0x00, 0xac, 0xcf, 0x56, 0x8a, +0x45, 0x00, 0x58, 0x30, 0x00, 0x14, 0x66, 0x4b, +0xc4, 0x39, 0x00, 0xd8, 0x2d, 0x00, 0x30, 0x49, +0x57, 0x66, 0x48, 0x00, 0xb0, 0xb7, 0x00, 0xc0, +0xce, 0x10, 0x0b, 0xb2, 0x00, 0x08, 0x0c, 0x00, +0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7b, +0x00, 0x60, 0xc8, 0x23, 0x23, 0x78, 0x00, 0x84, +0x99, 0x00, 0x14, 0x46, 0xf2, 0x57, 0x3c, 0xf1, +0x2b, 0xae, 0x10, 0xe7, 0x2a, 0x00, 0x00, 0x78, +0x99, 0xb2, 0x3c, 0xb9, 0x24, 0x39, 0x45, 0x81, +0x5b, 0x08, 0x2d, 0x71, 0x07, 0x57, 0x57, 0x2e, +0x1e, 0x28, 0xce, 0x49, 0x17, 0x2b, 0x14, 0x36, +0x61, 0x02, 0x61, 0x9a, 0x40, 0x2e, 0xc2, 0x79, +0x99, 0x19, 0x32, 0x81, 0x34, 0x0f, 0xe0, 0xf3, +0xcc, 0x00, 0x00, 0xa0, 0x91, 0x15, 0x11, 0xe0, +0x83, 0xf3, 0xfd, 0x78, 0xce, 0x0e, 0xae, 0xce, +0xce, 0x36, 0x8e, 0xb6, 0x0e, 0x5f, 0x2d, 0xea, +0xbf, 0x06, 0xff, 0x22, 0x62, 0x62, 0xe3, 0xfe, +0xe5, 0xcf, 0xab, 0x70, 0x40, 0x00, 0x00, 0xe1, +0x74, 0x7e, 0xd1, 0xfe, 0x2c, 0x2f, 0xb3, 0x1a, +0x80, 0x3b, 0x06, 0x80, 0x6d, 0xfe, 0xa2, 0x25, +0xee, 0x04, 0x68, 0x5e, 0x0b, 0xa0, 0x75, 0xf7, +0x8b, 0x66, 0xb2, 0x0f, 0x40, 0xb5, 0x00, 0xa0, +0xe9, 0xda, 0x57, 0xf3, 0x70, 0xf8, 0x7e, 0x3c, +0x3c, 0x45, 0xa1, 0x90, 0xb9, 0xd9, 0xd9, 0xe5, +0xe4, 0xe4, 0xd8, 0x4a, 0xc4, 0x42, 0x5b, 0x61, +0xca, 0x57, 0x7d, 0xfe, 0x67, 0xc2, 0x5f, 0xc0, +0x57, 0xfd, 0x6c, 0xf9, 0x7e, 0x3c, 0xfc, 0xf7, +0xf5, 0xe0, 0xbe, 0xe2, 0x24, 0x81, 0x32, 0x5d, +0x81, 0x47, 0x04, 0xf8, 0xe0, 0xc2, 0xcc, 0xf4, +0x4c, 0xa5, 0x1c, 0xcf, 0x92, 0x09, 0x84, 0x62, +0xdc, 0xe6, 0x8f, 0x47, 0xfc, 0xb7, 0x0b, 0xff, +0xfc, 0x1d, 0xd3, 0x22, 0xc4, 0x49, 0x62, 0xb9, +0x58, 0x2a, 0x14, 0xe3, 0x51, 0x12, 0x71, 0x8e, +0x44, 0x9a, 0x8c, 0xf3, 0x32, 0xa5, 0x22, 0x89, +0x42, 0x92, 0x29, 0xc5, 0x25, 0xd2, 0xff, 0x64, +0xe2, 0xdf, 0x2c, 0xfb, 0x03, 0x3e, 0xdf, 0x35, +0x00, 0xb0, 0x6a, 0x3e, 0x01, 0x7b, 0x91, 0x2d, +0xa8, 0x5d, 0x63, 0x03, 0xf6, 0x4b, 0x27, 0x10, +0x58, 0x74, 0xc0, 0xe2, 0xf7, 0x00, 0x00, 0xf2, +0xbb, 0x6f, 0xc1, 0xd4, 0x28, 0x08, 0x03, 0x80, +0x68, 0x83, 0xe1, 0xcf, 0x77, 0xff, 0xef, 0x3f, +0xfd, 0x47, 0xa0, 0x25, 0x00, 0x80, 0x66, 0x49, +0x92, 0x71, 0x00, 0x00, 0x5e, 0x44, 0x24, 0x2e, +0x54, 0xca, 0xb3, 0x3f, 0xc7, 0x08, 0x00, 0x00, +0x44, 0xa0, 0x81, 0x2a, 0xb0, 0x41, 0x1b, 0xf4, +0xc1, 0x18, 0x2c, 0xc0, 0x06, 0x1c, 0xc1, 0x05, +0xdc, 0xc1, 0x0b, 0xfc, 0x60, 0x36, 0x84, 0x42, +0x24, 0xc4, 0xc2, 0x42, 0x10, 0x42, 0x0a, 0x64, +0x80, 0x1c, 0x72, 0x60, 0x29, 0xac, 0x82, 0x42, +0x28, 0x86, 0xcd, 0xb0, 0x1d, 0x2a, 0x60, 0x2f, +0xd4, 0x40, 0x1d, 0x34, 0xc0, 0x51, 0x68, 0x86, +0x93, 0x70, 0x0e, 0x2e, 0xc2, 0x55, 0xb8, 0x0e, +0x3d, 0x70, 0x0f, 0xfa, 0x61, 0x08, 0x9e, 0xc1, +0x28, 0xbc, 0x81, 0x09, 0x04, 0x41, 0xc8, 0x08, +0x13, 0x61, 0x21, 0xda, 0x88, 0x01, 0x62, 0x8a, +0x58, 0x23, 0x8e, 0x08, 0x17, 0x99, 0x85, 0xf8, +0x21, 0xc1, 0x48, 0x04, 0x12, 0x8b, 0x24, 0x20, +0xc9, 0x88, 0x14, 0x51, 0x22, 0x4b, 0x91, 0x35, +0x48, 0x31, 0x52, 0x8a, 0x54, 0x20, 0x55, 0x48, +0x1d, 0xf2, 0x3d, 0x72, 0x02, 0x39, 0x87, 0x5c, +0x46, 0xba, 0x91, 0x3b, 0xc8, 0x00, 0x32, 0x82, +0xfc, 0x86, 0xbc, 0x47, 0x31, 0x94, 0x81, 0xb2, +0x51, 0x3d, 0xd4, 0x0c, 0xb5, 0x43, 0xb9, 0xa8, +0x37, 0x1a, 0x84, 0x46, 0xa2, 0x0b, 0xd0, 0x64, +0x74, 0x31, 0x9a, 0x8f, 0x16, 0xa0, 0x9b, 0xd0, +0x72, 0xb4, 0x1a, 0x3d, 0x8c, 0x36, 0xa1, 0xe7, +0xd0, 0xab, 0x68, 0x0f, 0xda, 0x8f, 0x3e, 0x43, +0xc7, 0x30, 0xc0, 0xe8, 0x18, 0x07, 0x33, 0xc4, +0x6c, 0x30, 0x2e, 0xc6, 0xc3, 0x42, 0xb1, 0x38, +0x2c, 0x09, 0x93, 0x63, 0xcb, 0xb1, 0x22, 0xac, +0x0c, 0xab, 0xc6, 0x1a, 0xb0, 0x56, 0xac, 0x03, +0xbb, 0x89, 0xf5, 0x63, 0xcf, 0xb1, 0x77, 0x04, +0x12, 0x81, 0x45, 0xc0, 0x09, 0x36, 0x04, 0x77, +0x42, 0x20, 0x61, 0x1e, 0x41, 0x48, 0x58, 0x4c, +0x58, 0x4e, 0xd8, 0x48, 0xa8, 0x20, 0x1c, 0x24, +0x34, 0x11, 0xda, 0x09, 0x37, 0x09, 0x03, 0x84, +0x51, 0xc2, 0x27, 0x22, 0x93, 0xa8, 0x4b, 0xb4, +0x26, 0xba, 0x11, 0xf9, 0xc4, 0x18, 0x62, 0x32, +0x31, 0x87, 0x58, 0x48, 0x2c, 0x23, 0xd6, 0x12, +0x8f, 0x13, 0x2f, 0x10, 0x7b, 0x88, 0x43, 0xc4, +0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xb9, +0x90, 0x02, 0x49, 0xb1, 0xa4, 0x54, 0xd2, 0x12, +0xd2, 0x46, 0xd2, 0x6e, 0x52, 0x23, 0xe9, 0x2c, +0xa9, 0x9b, 0x34, 0x48, 0x1a, 0x23, 0x93, 0xc9, +0xda, 0x64, 0x6b, 0xb2, 0x07, 0x39, 0x94, 0x2c, +0x20, 0x2b, 0xc8, 0x85, 0xe4, 0x9d, 0xe4, 0xc3, +0xe4, 0x33, 0xe4, 0x1b, 0xe4, 0x21, 0xf2, 0x5b, +0x0a, 0x9d, 0x62, 0x40, 0x71, 0xa4, 0xf8, 0x53, +0xe2, 0x28, 0x52, 0xca, 0x6a, 0x4a, 0x19, 0xe5, +0x10, 0xe5, 0x34, 0xe5, 0x06, 0x65, 0x98, 0x32, +0x41, 0x55, 0xa3, 0x9a, 0x52, 0xdd, 0xa8, 0xa1, +0x54, 0x11, 0x35, 0x8f, 0x5a, 0x42, 0xad, 0xa1, +0xb6, 0x52, 0xaf, 0x51, 0x87, 0xa8, 0x13, 0x34, +0x75, 0x9a, 0x39, 0xcd, 0x83, 0x16, 0x49, 0x4b, +0xa5, 0xad, 0xa2, 0x95, 0xd3, 0x1a, 0x68, 0x17, +0x68, 0xf7, 0x69, 0xaf, 0xe8, 0x74, 0xba, 0x11, +0xdd, 0x95, 0x1e, 0x4e, 0x97, 0xd0, 0x57, 0xd2, +0xcb, 0xe9, 0x47, 0xe8, 0x97, 0xe8, 0x03, 0xf4, +0x77, 0x0c, 0x0d, 0x86, 0x15, 0x83, 0xc7, 0x88, +0x67, 0x28, 0x19, 0x9b, 0x18, 0x07, 0x18, 0x67, +0x19, 0x77, 0x18, 0xaf, 0x98, 0x4c, 0xa6, 0x19, +0xd3, 0x8b, 0x19, 0xc7, 0x54, 0x30, 0x37, 0x31, +0xeb, 0x98, 0xe7, 0x99, 0x0f, 0x99, 0x6f, 0x55, +0x58, 0x2a, 0xb6, 0x2a, 0x7c, 0x15, 0x91, 0xca, +0x0a, 0x95, 0x4a, 0x95, 0x26, 0x95, 0x1b, 0x2a, +0x2f, 0x54, 0xa9, 0xaa, 0xa6, 0xaa, 0xde, 0xaa, +0x0b, 0x55, 0xf3, 0x55, 0xcb, 0x54, 0x8f, 0xa9, +0x5e, 0x53, 0x7d, 0xae, 0x46, 0x55, 0x33, 0x53, +0xe3, 0xa9, 0x09, 0xd4, 0x96, 0xab, 0x55, 0xaa, +0x9d, 0x50, 0xeb, 0x53, 0x1b, 0x53, 0x67, 0xa9, +0x3b, 0xa8, 0x87, 0xaa, 0x67, 0xa8, 0x6f, 0x54, +0x3f, 0xa4, 0x7e, 0x59, 0xfd, 0x89, 0x06, 0x59, +0xc3, 0x4c, 0xc3, 0x4f, 0x43, 0xa4, 0x51, 0xa0, +0xb1, 0x5f, 0xe3, 0xbc, 0xc6, 0x20, 0x0b, 0x63, +0x19, 0xb3, 0x78, 0x2c, 0x21, 0x6b, 0x0d, 0xab, +0x86, 0x75, 0x81, 0x35, 0xc4, 0x26, 0xb1, 0xcd, +0xd9, 0x7c, 0x76, 0x2a, 0xbb, 0x98, 0xfd, 0x1d, +0xbb, 0x8b, 0x3d, 0xaa, 0xa9, 0xa1, 0x39, 0x43, +0x33, 0x4a, 0x33, 0x57, 0xb3, 0x52, 0xf3, 0x94, +0x66, 0x3f, 0x07, 0xe3, 0x98, 0x71, 0xf8, 0x9c, +0x74, 0x4e, 0x09, 0xe7, 0x28, 0xa7, 0x97, 0xf3, +0x7e, 0x8a, 0xde, 0x14, 0xef, 0x29, 0xe2, 0x29, +0x1b, 0xa6, 0x34, 0x4c, 0xb9, 0x31, 0x65, 0x5c, +0x6b, 0xaa, 0x96, 0x97, 0x96, 0x58, 0xab, 0x48, +0xab, 0x51, 0xab, 0x47, 0xeb, 0xbd, 0x36, 0xae, +0xed, 0xa7, 0x9d, 0xa6, 0xbd, 0x45, 0xbb, 0x59, +0xfb, 0x81, 0x0e, 0x41, 0xc7, 0x4a, 0x27, 0x5c, +0x27, 0x47, 0x67, 0x8f, 0xce, 0x05, 0x9d, 0xe7, +0x53, 0xd9, 0x53, 0xdd, 0xa7, 0x0a, 0xa7, 0x16, +0x4d, 0x3d, 0x3a, 0xf5, 0xae, 0x2e, 0xaa, 0x6b, +0xa5, 0x1b, 0xa1, 0xbb, 0x44, 0x77, 0xbf, 0x6e, +0xa7, 0xee, 0x98, 0x9e, 0xbe, 0x5e, 0x80, 0x9e, +0x4c, 0x6f, 0xa7, 0xde, 0x79, 0xbd, 0xe7, 0xfa, +0x1c, 0x7d, 0x2f, 0xfd, 0x54, 0xfd, 0x6d, 0xfa, +0xa7, 0xf5, 0x47, 0x0c, 0x58, 0x06, 0xb3, 0x0c, +0x24, 0x06, 0xdb, 0x0c, 0xce, 0x18, 0x3c, 0xc5, +0x35, 0x71, 0x6f, 0x3c, 0x1d, 0x2f, 0xc7, 0xdb, +0xf1, 0x51, 0x43, 0x5d, 0xc3, 0x40, 0x43, 0xa5, +0x61, 0x95, 0x61, 0x97, 0xe1, 0x84, 0x91, 0xb9, +0xd1, 0x3c, 0xa3, 0xd5, 0x46, 0x8d, 0x46, 0x0f, +0x8c, 0x69, 0xc6, 0x5c, 0xe3, 0x24, 0xe3, 0x6d, +0xc6, 0x6d, 0xc6, 0xa3, 0x26, 0x06, 0x26, 0x21, +0x26, 0x4b, 0x4d, 0xea, 0x4d, 0xee, 0x9a, 0x52, +0x4d, 0xb9, 0xa6, 0x29, 0xa6, 0x3b, 0x4c, 0x3b, +0x4c, 0xc7, 0xcd, 0xcc, 0xcd, 0xa2, 0xcd, 0xd6, +0x99, 0x35, 0x9b, 0x3d, 0x31, 0xd7, 0x32, 0xe7, +0x9b, 0xe7, 0x9b, 0xd7, 0x9b, 0xdf, 0xb7, 0x60, +0x5a, 0x78, 0x5a, 0x2c, 0xb6, 0xa8, 0xb6, 0xb8, +0x65, 0x49, 0xb2, 0xe4, 0x5a, 0xa6, 0x59, 0xee, +0xb6, 0xbc, 0x6e, 0x85, 0x5a, 0x39, 0x59, 0xa5, +0x58, 0x55, 0x5a, 0x5d, 0xb3, 0x46, 0xad, 0x9d, +0xad, 0x25, 0xd6, 0xbb, 0xad, 0xbb, 0xa7, 0x11, +0xa7, 0xb9, 0x4e, 0x93, 0x4e, 0xab, 0x9e, 0xd6, +0x67, 0xc3, 0xb0, 0xf1, 0xb6, 0xc9, 0xb6, 0xa9, +0xb7, 0x19, 0xb0, 0xe5, 0xd8, 0x06, 0xdb, 0xae, +0xb6, 0x6d, 0xb6, 0x7d, 0x61, 0x67, 0x62, 0x17, +0x67, 0xb7, 0xc5, 0xae, 0xc3, 0xee, 0x93, 0xbd, +0x93, 0x7d, 0xba, 0x7d, 0x8d, 0xfd, 0x3d, 0x07, +0x0d, 0x87, 0xd9, 0x0e, 0xab, 0x1d, 0x5a, 0x1d, +0x7e, 0x73, 0xb4, 0x72, 0x14, 0x3a, 0x56, 0x3a, +0xde, 0x9a, 0xce, 0x9c, 0xee, 0x3f, 0x7d, 0xc5, +0xf4, 0x96, 0xe9, 0x2f, 0x67, 0x58, 0xcf, 0x10, +0xcf, 0xd8, 0x33, 0xe3, 0xb6, 0x13, 0xcb, 0x29, +0xc4, 0x69, 0x9d, 0x53, 0x9b, 0xd3, 0x47, 0x67, +0x17, 0x67, 0xb9, 0x73, 0x83, 0xf3, 0x88, 0x8b, +0x89, 0x4b, 0x82, 0xcb, 0x2e, 0x97, 0x3e, 0x2e, +0x9b, 0x1b, 0xc6, 0xdd, 0xc8, 0xbd, 0xe4, 0x4a, +0x74, 0xf5, 0x71, 0x5d, 0xe1, 0x7a, 0xd2, 0xf5, +0x9d, 0x9b, 0xb3, 0x9b, 0xc2, 0xed, 0xa8, 0xdb, +0xaf, 0xee, 0x36, 0xee, 0x69, 0xee, 0x87, 0xdc, +0x9f, 0xcc, 0x34, 0x9f, 0x29, 0x9e, 0x59, 0x33, +0x73, 0xd0, 0xc3, 0xc8, 0x43, 0xe0, 0x51, 0xe5, +0xd1, 0x3f, 0x0b, 0x9f, 0x95, 0x30, 0x6b, 0xdf, +0xac, 0x7e, 0x4f, 0x43, 0x4f, 0x81, 0x67, 0xb5, +0xe7, 0x23, 0x2f, 0x63, 0x2f, 0x91, 0x57, 0xad, +0xd7, 0xb0, 0xb7, 0xa5, 0x77, 0xaa, 0xf7, 0x61, +0xef, 0x17, 0x3e, 0xf6, 0x3e, 0x72, 0x9f, 0xe3, +0x3e, 0xe3, 0x3c, 0x37, 0xde, 0x32, 0xde, 0x59, +0x5f, 0xcc, 0x37, 0xc0, 0xb7, 0xc8, 0xb7, 0xcb, +0x4f, 0xc3, 0x6f, 0x9e, 0x5f, 0x85, 0xdf, 0x43, +0x7f, 0x23, 0xff, 0x64, 0xff, 0x7a, 0xff, 0xd1, +0x00, 0xa7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, +0x81, 0x41, 0x81, 0x5b, 0x02, 0xfb, 0xf8, 0x7a, +0x7c, 0x21, 0xbf, 0x8e, 0x3f, 0x3a, 0xdb, 0x65, +0xf6, 0xb2, 0xd9, 0xed, 0x41, 0x8c, 0xa0, 0xb9, +0x41, 0x15, 0x41, 0x8f, 0x82, 0xad, 0x82, 0xe5, +0xc1, 0xad, 0x21, 0x68, 0xc8, 0xec, 0x90, 0xad, +0x21, 0xf7, 0xe7, 0x98, 0xce, 0x91, 0xce, 0x69, +0x0e, 0x85, 0x50, 0x7e, 0xe8, 0xd6, 0xd0, 0x07, +0x61, 0xe6, 0x61, 0x8b, 0xc3, 0x7e, 0x0c, 0x27, +0x85, 0x87, 0x85, 0x57, 0x86, 0x3f, 0x8e, 0x70, +0x88, 0x58, 0x1a, 0xd1, 0x31, 0x97, 0x35, 0x77, +0xd1, 0xdc, 0x43, 0x73, 0xdf, 0x44, 0xfa, 0x44, +0x96, 0x44, 0xde, 0x9b, 0x67, 0x31, 0x4f, 0x39, +0xaf, 0x2d, 0x4a, 0x35, 0x2a, 0x3e, 0xaa, 0x2e, +0x6a, 0x3c, 0xda, 0x37, 0xba, 0x34, 0xba, 0x3f, +0xc6, 0x2e, 0x66, 0x59, 0xcc, 0xd5, 0x58, 0x9d, +0x58, 0x49, 0x6c, 0x4b, 0x1c, 0x39, 0x2e, 0x2a, +0xae, 0x36, 0x6e, 0x6c, 0xbe, 0xdf, 0xfc, 0xed, +0xf3, 0x87, 0xe2, 0x9d, 0xe2, 0x0b, 0xe3, 0x7b, +0x17, 0x98, 0x2f, 0xc8, 0x5d, 0x70, 0x79, 0xa1, +0xce, 0xc2, 0xf4, 0x85, 0xa7, 0x16, 0xa9, 0x2e, +0x12, 0x2c, 0x3a, 0x96, 0x40, 0x4c, 0x88, 0x4e, +0x38, 0x94, 0xf0, 0x41, 0x10, 0x2a, 0xa8, 0x16, +0x8c, 0x25, 0xf2, 0x13, 0x77, 0x25, 0x8e, 0x0a, +0x79, 0xc2, 0x1d, 0xc2, 0x67, 0x22, 0x2f, 0xd1, +0x36, 0xd1, 0x88, 0xd8, 0x43, 0x5c, 0x2a, 0x1e, +0x4e, 0xf2, 0x48, 0x2a, 0x4d, 0x7a, 0x92, 0xec, +0x91, 0xbc, 0x35, 0x79, 0x24, 0xc5, 0x33, 0xa5, +0x2c, 0xe5, 0xb9, 0x84, 0x27, 0xa9, 0x90, 0xbc, +0x4c, 0x0d, 0x4c, 0xdd, 0x9b, 0x3a, 0x9e, 0x16, +0x9a, 0x76, 0x20, 0x6d, 0x32, 0x3d, 0x3a, 0xbd, +0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xaa, +0x21, 0x4d, 0x93, 0xb6, 0x67, 0xea, 0x67, 0xe6, +0x66, 0x76, 0xcb, 0xac, 0x65, 0x85, 0xb2, 0xfe, +0xc5, 0x6e, 0x8b, 0xb7, 0x2f, 0x1e, 0x95, 0x07, +0xc9, 0x6b, 0xb3, 0x90, 0xac, 0x05, 0x59, 0x2d, +0x0a, 0xb6, 0x42, 0xa6, 0xe8, 0x54, 0x5a, 0x28, +0xd7, 0x2a, 0x07, 0xb2, 0x67, 0x65, 0x57, 0x66, +0xbf, 0xcd, 0x89, 0xca, 0x39, 0x96, 0xab, 0x9e, +0x2b, 0xcd, 0xed, 0xcc, 0xb3, 0xca, 0xdb, 0x90, +0x37, 0x9c, 0xef, 0x9f, 0xff, 0xed, 0x12, 0xc2, +0x12, 0xe1, 0x92, 0xb6, 0xa5, 0x86, 0x4b, 0x57, +0x2d, 0x1d, 0x58, 0xe6, 0xbd, 0xac, 0x6a, 0x39, +0xb2, 0x3c, 0x71, 0x79, 0xdb, 0x0a, 0xe3, 0x15, +0x05, 0x2b, 0x86, 0x56, 0x06, 0xac, 0x3c, 0xb8, +0x8a, 0xb6, 0x2a, 0x6d, 0xd5, 0x4f, 0xab, 0xed, +0x57, 0x97, 0xae, 0x7e, 0xbd, 0x26, 0x7a, 0x4d, +0x6b, 0x81, 0x5e, 0xc1, 0xca, 0x82, 0xc1, 0xb5, +0x01, 0x6b, 0xeb, 0x0b, 0x55, 0x0a, 0xe5, 0x85, +0x7d, 0xeb, 0xdc, 0xd7, 0xed, 0x5d, 0x4f, 0x58, +0x2f, 0x59, 0xdf, 0xb5, 0x61, 0xfa, 0x86, 0x9d, +0x1b, 0x3e, 0x15, 0x89, 0x8a, 0xae, 0x14, 0xdb, +0x17, 0x97, 0x15, 0x7f, 0xd8, 0x28, 0xdc, 0x78, +0xe5, 0x1b, 0x87, 0x6f, 0xca, 0xbf, 0x99, 0xdc, +0x94, 0xb4, 0xa9, 0xab, 0xc4, 0xb9, 0x64, 0xcf, +0x66, 0xd2, 0x66, 0xe9, 0xe6, 0xde, 0x2d, 0x9e, +0x5b, 0x0e, 0x96, 0xaa, 0x97, 0xe6, 0x97, 0x0e, +0x6e, 0x0d, 0xd9, 0xda, 0xb4, 0x0d, 0xdf, 0x56, +0xb4, 0xed, 0xf5, 0xf6, 0x45, 0xdb, 0x2f, 0x97, +0xcd, 0x28, 0xdb, 0xbb, 0x83, 0xb6, 0x43, 0xb9, +0xa3, 0xbf, 0x3c, 0xb8, 0xbc, 0x65, 0xa7, 0xc9, +0xce, 0xcd, 0x3b, 0x3f, 0x54, 0xa4, 0x54, 0xf4, +0x54, 0xfa, 0x54, 0x36, 0xee, 0xd2, 0xdd, 0xb5, +0x61, 0xd7, 0xf8, 0x6e, 0xd1, 0xee, 0x1b, 0x7b, +0xbc, 0xf6, 0x34, 0xec, 0xd5, 0xdb, 0x5b, 0xbc, +0xf7, 0xfd, 0x3e, 0xc9, 0xbe, 0xdb, 0x55, 0x01, +0x55, 0x4d, 0xd5, 0x66, 0xd5, 0x65, 0xfb, 0x49, +0xfb, 0xb3, 0xf7, 0x3f, 0xae, 0x89, 0xaa, 0xe9, +0xf8, 0x96, 0xfb, 0x6d, 0x5d, 0xad, 0x4e, 0x6d, +0x71, 0xed, 0xc7, 0x03, 0xd2, 0x03, 0xfd, 0x07, +0x23, 0x0e, 0xb6, 0xd7, 0xb9, 0xd4, 0xd5, 0x1d, +0xd2, 0x3d, 0x54, 0x52, 0x8f, 0xd6, 0x2b, 0xeb, +0x47, 0x0e, 0xc7, 0x1f, 0xbe, 0xfe, 0x9d, 0xef, +0x77, 0x2d, 0x0d, 0x36, 0x0d, 0x55, 0x8d, 0x9c, +0xc6, 0xe2, 0x23, 0x70, 0x44, 0x79, 0xe4, 0xe9, +0xf7, 0x09, 0xdf, 0xf7, 0x1e, 0x0d, 0x3a, 0xda, +0x76, 0x8c, 0x7b, 0xac, 0xe1, 0x07, 0xd3, 0x1f, +0x76, 0x1d, 0x67, 0x1d, 0x2f, 0x6a, 0x42, 0x9a, +0xf2, 0x9a, 0x46, 0x9b, 0x53, 0x9a, 0xfb, 0x5b, +0x62, 0x5b, 0xba, 0x4f, 0xcc, 0x3e, 0xd1, 0xd6, +0xea, 0xde, 0x7a, 0xfc, 0x47, 0xdb, 0x1f, 0x0f, +0x9c, 0x34, 0x3c, 0x59, 0x79, 0x4a, 0xf3, 0x54, +0xc9, 0x69, 0xda, 0xe9, 0x82, 0xd3, 0x93, 0x67, +0xf2, 0xcf, 0x8c, 0x9d, 0x95, 0x9d, 0x7d, 0x7e, +0x2e, 0xf9, 0xdc, 0x60, 0xdb, 0xa2, 0xb6, 0x7b, +0xe7, 0x63, 0xce, 0xdf, 0x6a, 0x0f, 0x6f, 0xef, +0xba, 0x10, 0x74, 0xe1, 0xd2, 0x45, 0xff, 0x8b, +0xe7, 0x3b, 0xbc, 0x3b, 0xce, 0x5c, 0xf2, 0xb8, +0x74, 0xf2, 0xb2, 0xdb, 0xe5, 0x13, 0x57, 0xb8, +0x57, 0x9a, 0xaf, 0x3a, 0x5f, 0x6d, 0xea, 0x74, +0xea, 0x3c, 0xfe, 0x93, 0xd3, 0x4f, 0xc7, 0xbb, +0x9c, 0xbb, 0x9a, 0xae, 0xb9, 0x5c, 0x6b, 0xb9, +0xee, 0x7a, 0xbd, 0xb5, 0x7b, 0x66, 0xf7, 0xe9, +0x1b, 0x9e, 0x37, 0xce, 0xdd, 0xf4, 0xbd, 0x79, +0xf1, 0x16, 0xff, 0xd6, 0xd5, 0x9e, 0x39, 0x3d, +0xdd, 0xbd, 0xf3, 0x7a, 0x6f, 0xf7, 0xc5, 0xf7, +0xf5, 0xdf, 0x16, 0xdd, 0x7e, 0x72, 0x27, 0xfd, +0xce, 0xcb, 0xbb, 0xd9, 0x77, 0x27, 0xee, 0xad, +0xbc, 0x4f, 0xbc, 0x5f, 0xf4, 0x40, 0xed, 0x41, +0xd9, 0x43, 0xdd, 0x87, 0xd5, 0x3f, 0x5b, 0xfe, +0xdc, 0xd8, 0xef, 0xdc, 0x7f, 0x6a, 0xc0, 0x77, +0xa0, 0xf3, 0xd1, 0xdc, 0x47, 0xf7, 0x06, 0x85, +0x83, 0xcf, 0xfe, 0x91, 0xf5, 0x8f, 0x0f, 0x43, +0x05, 0x8f, 0x99, 0x8f, 0xcb, 0x86, 0x0d, 0x86, +0xeb, 0x9e, 0x38, 0x3e, 0x39, 0x39, 0xe2, 0x3f, +0x72, 0xfd, 0xe9, 0xfc, 0xa7, 0x43, 0xcf, 0x64, +0xcf, 0x26, 0x9e, 0x17, 0xfe, 0xa2, 0xfe, 0xcb, +0xae, 0x17, 0x16, 0x2f, 0x7e, 0xf8, 0xd5, 0xeb, +0xd7, 0xce, 0xd1, 0x98, 0xd1, 0xa1, 0x97, 0xf2, +0x97, 0x93, 0xbf, 0x6d, 0x7c, 0xa5, 0xfd, 0xea, +0xc0, 0xeb, 0x19, 0xaf, 0xdb, 0xc6, 0xc2, 0xc6, +0x1e, 0xbe, 0xc9, 0x78, 0x33, 0x31, 0x5e, 0xf4, +0x56, 0xfb, 0xed, 0xc1, 0x77, 0xdc, 0x77, 0x1d, +0xef, 0xa3, 0xdf, 0x0f, 0x4f, 0xe4, 0x7c, 0x20, +0x7f, 0x28, 0xff, 0x68, 0xf9, 0xb1, 0xf5, 0x53, +0xd0, 0xa7, 0xfb, 0x93, 0x19, 0x93, 0x93, 0xff, +0x04, 0x03, 0x98, 0xf3, 0xfc, 0x63, 0x33, 0x2d, +0xdb, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, +0x4d, 0x00, 0x00, 0x7a, 0x25, 0x00, 0x00, 0x80, +0x83, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0x80, +0xe9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, +0x60, 0x00, 0x00, 0x3a, 0x98, 0x00, 0x00, 0x17, +0x6f, 0x92, 0x5f, 0xc5, 0x46, 0x00, 0x00, 0x06, +0x92, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, +0x9c, 0x7b, 0x88, 0x54, 0x55, 0x1c, 0xc7, 0x3f, +0x9b, 0x9a, 0x89, 0xa5, 0x78, 0xd5, 0x12, 0xcd, +0x8d, 0x74, 0xc9, 0x08, 0xc4, 0xf2, 0x49, 0x99, +0xe4, 0x5d, 0xc5, 0x07, 0x24, 0x96, 0x46, 0x96, +0xa9, 0xf4, 0x8f, 0x19, 0x5b, 0x72, 0x90, 0x10, +0x93, 0x5e, 0x04, 0x45, 0xf6, 0x80, 0xbc, 0x52, +0x12, 0x22, 0x41, 0x56, 0xd2, 0xe3, 0x0f, 0x89, +0x1e, 0x96, 0xa5, 0x67, 0x4b, 0xac, 0x94, 0x20, +0xa2, 0x87, 0x46, 0x6c, 0x49, 0x66, 0x82, 0xe8, +0x09, 0xa1, 0x74, 0xb1, 0x7d, 0xf4, 0xc7, 0x9c, +0xb1, 0x75, 0xbc, 0x33, 0x73, 0x67, 0x1d, 0x77, +0xef, 0xcc, 0x7e, 0x3f, 0xff, 0xed, 0xcc, 0xb9, +0x77, 0x66, 0xe7, 0xfb, 0xb9, 0xbf, 0xf3, 0x98, +0x73, 0xa7, 0xa6, 0xbd, 0xbd, 0x1d, 0xd1, 0x73, +0xb9, 0x48, 0x1f, 0x81, 0x04, 0x10, 0x12, 0x40, +0x48, 0x00, 0x21, 0x01, 0x84, 0x04, 0x10, 0x12, +0x40, 0x48, 0x00, 0x21, 0x01, 0x84, 0x04, 0x10, +0x12, 0x40, 0x48, 0x00, 0x21, 0x01, 0x84, 0x04, +0x10, 0x12, 0x40, 0x48, 0x00, 0x21, 0x01, 0x84, +0x04, 0x10, 0x12, 0x40, 0x48, 0x00, 0x21, 0x01, +0x84, 0x04, 0x10, 0x12, 0x40, 0x48, 0x00, 0x21, +0x01, 0x84, 0x04, 0x10, 0x12, 0x40, 0x48, 0x00, +0x21, 0x01, 0x84, 0x04, 0x10, 0x12, 0x40, 0x48, +0x00, 0x21, 0x01, 0x84, 0x04, 0x10, 0x12, 0x40, +0x48, 0x00, 0x21, 0x01, 0x84, 0x04, 0x10, 0x12, +0x40, 0x48, 0x00, 0x21, 0x01, 0x84, 0x04, 0x10, +0x12, 0x40, 0x48, 0x00, 0xd1, 0xad, 0xf4, 0xee, +0xce, 0x17, 0xaf, 0xa9, 0xa9, 0xa9, 0xf8, 0x0f, +0x30, 0x08, 0xa3, 0x01, 0xc0, 0x4c, 0x60, 0x0c, +0x50, 0x03, 0x1c, 0x00, 0x1a, 0x9d, 0x35, 0x2e, +0xc9, 0xf1, 0xdd, 0xfd, 0x63, 0xdd, 0x35, 0xdd, +0xf9, 0x06, 0x2a, 0x59, 0x00, 0x1f, 0xfc, 0x93, +0xc0, 0x0a, 0xa0, 0x5f, 0xce, 0xd3, 0xa7, 0x81, +0xb7, 0x80, 0xc7, 0x9c, 0x35, 0xbf, 0x4b, 0x80, +0x2a, 0x13, 0x20, 0x08, 0xa3, 0xf1, 0xc0, 0x36, +0xa0, 0xb6, 0x48, 0xd3, 0x66, 0xc0, 0x38, 0x6b, +0x36, 0x49, 0x80, 0x2a, 0x11, 0x20, 0x08, 0xa3, +0x29, 0xc0, 0x0e, 0x60, 0x40, 0x09, 0x87, 0xbd, +0x0a, 0xac, 0x70, 0xd6, 0xb4, 0x48, 0x80, 0x0a, +0x16, 0x20, 0x08, 0xa3, 0x5a, 0xe0, 0x5b, 0x20, +0xe8, 0xc4, 0xe1, 0xef, 0x03, 0x77, 0x38, 0x6b, +0x4e, 0xa7, 0x49, 0x00, 0xcd, 0x02, 0x4a, 0x63, +0x53, 0x81, 0xf0, 0x5b, 0x8a, 0x1c, 0x3b, 0x0f, +0x58, 0xab, 0x69, 0x60, 0xe5, 0x0e, 0xfa, 0xa6, +0x00, 0xb3, 0x63, 0x9e, 0xfa, 0x19, 0x98, 0xea, +0xac, 0xe9, 0x03, 0x5c, 0x07, 0x7c, 0x5e, 0xa0, +0x02, 0x3c, 0x27, 0x01, 0x2a, 0x2f, 0xf8, 0xec, +0x67, 0xb4, 0x30, 0xe6, 0xe9, 0xe3, 0x40, 0xe8, +0xac, 0xf9, 0xd2, 0xff, 0xfd, 0x2f, 0x50, 0x57, +0xa0, 0xfc, 0x9f, 0x92, 0x00, 0x95, 0x15, 0xfe, +0x50, 0x60, 0x67, 0x10, 0x46, 0xcb, 0x81, 0x49, +0x31, 0x4d, 0x5e, 0x77, 0xd6, 0x1c, 0xf1, 0x6d, +0xeb, 0x80, 0x46, 0x60, 0x44, 0xbe, 0xbe, 0x3f, +0x08, 0xa3, 0xc9, 0x41, 0x18, 0x8d, 0x4a, 0xd3, +0xff, 0xd8, 0x5b, 0x31, 0xe7, 0x0d, 0x3f, 0x00, +0xbe, 0x00, 0xae, 0x05, 0x6e, 0x02, 0xfe, 0xc9, +0x77, 0x01, 0x25, 0x0c, 0xbf, 0x2f, 0xb0, 0x15, +0xa8, 0x0d, 0xc2, 0xe8, 0x25, 0xe0, 0x69, 0x67, +0xcd, 0x71, 0x55, 0x80, 0xf4, 0xf2, 0xa2, 0x0f, +0x1f, 0xe0, 0x62, 0x60, 0x50, 0x4c, 0x9b, 0x3b, +0x83, 0x30, 0xba, 0xbe, 0x58, 0xf8, 0xfe, 0xef, +0xd5, 0xc0, 0x68, 0xa0, 0x0f, 0xb0, 0x0a, 0x68, +0x0a, 0xc2, 0x68, 0x95, 0x2a, 0x40, 0x3a, 0xaf, +0xfe, 0x61, 0xc0, 0x3d, 0x09, 0x9a, 0x0e, 0x03, +0xbe, 0x01, 0x7a, 0x15, 0x0a, 0x3f, 0x08, 0xa3, +0xa9, 0xc0, 0x13, 0x39, 0x6d, 0x06, 0x02, 0xe3, +0x54, 0x01, 0xd2, 0xc9, 0x8d, 0x31, 0xa1, 0xe6, +0xa3, 0x58, 0xf8, 0x63, 0x81, 0xf7, 0x62, 0x2e, +0xb6, 0x56, 0x60, 0x9d, 0x04, 0x48, 0xd7, 0x95, +0xbf, 0x3c, 0x08, 0xa3, 0xab, 0x80, 0xe1, 0x31, +0x4f, 0x9f, 0x02, 0x0e, 0x15, 0x39, 0x45, 0x63, +0x4e, 0xf8, 0xf3, 0x81, 0xdd, 0xc0, 0xe0, 0x98, +0xb6, 0x1b, 0x9c, 0x35, 0x07, 0xba, 0xfb, 0x7f, +0xd6, 0x4a, 0xe0, 0xff, 0xe1, 0xaf, 0x03, 0xd6, +0x00, 0x47, 0x81, 0xb7, 0x81, 0x95, 0x39, 0x4d, +0x6e, 0xf3, 0x12, 0x7c, 0x52, 0xe0, 0x34, 0x2d, +0xfe, 0xf9, 0x83, 0x7e, 0xe0, 0x78, 0x43, 0x9e, +0x76, 0x3f, 0x00, 0x93, 0x9c, 0x35, 0xcd, 0x5a, +0x0a, 0x4e, 0x57, 0xf8, 0xf9, 0x68, 0x72, 0xd6, +0xd4, 0xf9, 0xb6, 0xeb, 0x01, 0x73, 0x1e, 0x2f, +0x77, 0x18, 0xb8, 0xd9, 0x59, 0x73, 0x10, 0xb4, +0x14, 0x5c, 0x09, 0xe1, 0x93, 0x33, 0x05, 0x7c, +0xc8, 0x4f, 0xe7, 0x3a, 0xc3, 0x31, 0x60, 0x6e, +0x36, 0xfc, 0x34, 0xd0, 0xa3, 0x2b, 0x40, 0x10, +0x46, 0x73, 0x80, 0xed, 0x09, 0x9a, 0xb6, 0x02, +0x23, 0x3b, 0x2c, 0xfa, 0xf4, 0x02, 0x36, 0x00, +0x0d, 0x25, 0xbc, 0xdc, 0x2f, 0xc0, 0x7c, 0x67, +0xcd, 0xfe, 0x8e, 0x0f, 0xaa, 0x02, 0x74, 0x23, +0xce, 0x9a, 0x8f, 0x81, 0x67, 0x13, 0x8e, 0xf4, +0xd7, 0x74, 0x38, 0xae, 0xd5, 0x59, 0xf3, 0x00, +0xb0, 0x08, 0x38, 0x92, 0x40, 0x9e, 0x8d, 0xc0, +0x84, 0xdc, 0xf0, 0x55, 0x01, 0x2a, 0x67, 0x0c, +0x00, 0xd0, 0x0e, 0xd4, 0x3b, 0x6b, 0x1a, 0x73, +0x8e, 0xed, 0x07, 0xdc, 0x0d, 0x2c, 0x00, 0x26, +0xf8, 0xb5, 0x81, 0x93, 0xc0, 0x7e, 0xe0, 0x53, +0x60, 0x93, 0xb3, 0xe6, 0xb7, 0xbc, 0x27, 0xd5, +0x20, 0xb0, 0xcb, 0xc3, 0x1e, 0x41, 0xe6, 0x5b, +0xbd, 0x31, 0x40, 0x9b, 0x2f, 0xcd, 0xbb, 0x80, +0xfb, 0x13, 0x48, 0x70, 0x02, 0x98, 0xe6, 0xac, +0xf9, 0xbe, 0x5c, 0xef, 0x47, 0x02, 0x74, 0x5d, +0xf0, 0xc3, 0x81, 0x17, 0x7c, 0xd9, 0x8e, 0xeb, +0xfa, 0x3e, 0x03, 0xfa, 0x02, 0xd3, 0x12, 0x8c, +0xe2, 0x67, 0x3b, 0x6b, 0x7e, 0x94, 0x00, 0x15, +0x22, 0x40, 0x10, 0x46, 0x33, 0x80, 0x77, 0xe8, +0xdc, 0x4e, 0x9e, 0x7c, 0xa3, 0xf9, 0xfa, 0x72, +0x54, 0x02, 0x0d, 0x02, 0x2f, 0x7c, 0xf8, 0xb7, +0xfa, 0x91, 0x7e, 0x50, 0xc6, 0xd3, 0x0e, 0x01, +0x76, 0xf9, 0x65, 0xde, 0x8a, 0xa6, 0xaa, 0x2b, +0x80, 0x0f, 0x68, 0x2f, 0xe7, 0x6e, 0xdb, 0x26, +0x2d, 0x95, 0x40, 0x15, 0xe0, 0xc2, 0x85, 0x5f, +0x43, 0x66, 0x37, 0x6e, 0xbe, 0xf0, 0xff, 0x4a, +0x70, 0x9a, 0xfd, 0xd5, 0x5e, 0x09, 0xaa, 0xb9, +0x0b, 0x98, 0x0b, 0x4c, 0x8c, 0x79, 0xfc, 0x6b, +0x60, 0x8c, 0xb3, 0x26, 0x00, 0x46, 0x01, 0x7b, +0xf2, 0x1c, 0xbf, 0x15, 0x18, 0x9b, 0x60, 0x9d, +0xa0, 0xbf, 0x17, 0xa1, 0x22, 0xa9, 0xe6, 0xfd, +0x00, 0x77, 0xc5, 0x3c, 0x76, 0x10, 0x98, 0xe3, +0xac, 0x39, 0xe1, 0xff, 0xbe, 0xdc, 0x87, 0x1c, +0x17, 0xfe, 0x32, 0x67, 0x4d, 0x2b, 0xf0, 0x70, +0x10, 0x46, 0x2d, 0xc0, 0x23, 0x31, 0xed, 0x4e, +0x01, 0xb7, 0x3a, 0x6b, 0xac, 0x2a, 0x40, 0xfa, +0x18, 0x1f, 0xf3, 0xd8, 0x6b, 0xd9, 0xf0, 0x0b, +0xdc, 0xe0, 0x71, 0x26, 0xfc, 0x20, 0x8c, 0x66, +0x05, 0x61, 0x74, 0x8d, 0xb3, 0xe6, 0x51, 0xce, +0xdd, 0xd2, 0x9d, 0x0d, 0x7f, 0x57, 0x25, 0x7f, +0x48, 0xd5, 0x2c, 0xc0, 0xa5, 0x31, 0x8f, 0xf5, +0x29, 0x12, 0xfe, 0x2b, 0xc0, 0x12, 0x1f, 0xfe, +0x40, 0xe0, 0x0d, 0xe0, 0xa7, 0x20, 0x8c, 0x5e, +0xf6, 0xe3, 0x89, 0xb5, 0xd5, 0x14, 0x7e, 0xb5, +0x0b, 0x10, 0xb7, 0xe1, 0x72, 0x69, 0x10, 0x46, +0xf5, 0x05, 0xc2, 0x6f, 0x70, 0xd6, 0x64, 0x87, +0xe5, 0x4f, 0x01, 0x43, 0xc9, 0x7c, 0x0f, 0xd0, +0x00, 0x34, 0x91, 0xf9, 0xbe, 0x7f, 0x75, 0xb5, +0x84, 0x9f, 0xba, 0x31, 0x80, 0x1f, 0xb9, 0xaf, +0x04, 0x36, 0x3b, 0x6b, 0x4e, 0x96, 0x70, 0xdc, +0x20, 0xe0, 0x0a, 0xe0, 0x68, 0x87, 0xdb, 0xb2, +0xbf, 0x8b, 0xe9, 0x06, 0x46, 0x02, 0x3b, 0x63, +0x4e, 0x71, 0x56, 0xf8, 0x7e, 0x27, 0xcf, 0x83, +0x31, 0x15, 0x65, 0xa4, 0xb3, 0xc6, 0x54, 0xd3, +0x55, 0x92, 0x9a, 0x75, 0x00, 0x1f, 0xfe, 0x46, +0x32, 0x6b, 0xf2, 0xbb, 0x81, 0x79, 0x1d, 0x06, +0x6b, 0xf9, 0x82, 0x1f, 0x47, 0xe6, 0x6e, 0x9b, +0x99, 0x1d, 0xaa, 0xd9, 0x5e, 0xe0, 0x79, 0x5f, +0xa6, 0x3f, 0x4c, 0xf0, 0x36, 0x72, 0xc3, 0x9f, +0x0e, 0x7c, 0x14, 0x33, 0x7d, 0x6c, 0x06, 0xea, +0x9c, 0x35, 0x87, 0xcb, 0xf9, 0x19, 0x68, 0x29, +0xf8, 0xdc, 0xf0, 0xb3, 0xec, 0x03, 0x66, 0xe5, +0x93, 0x20, 0x08, 0xa3, 0x65, 0xc0, 0xe6, 0x6c, +0xbf, 0x1e, 0xc3, 0x07, 0x64, 0x36, 0x77, 0x0e, +0x2e, 0xf0, 0x16, 0xb6, 0x01, 0x0b, 0x9d, 0x35, +0xed, 0xfe, 0x0e, 0xa0, 0xfb, 0xc8, 0x6c, 0x07, +0xbf, 0x24, 0xa6, 0xed, 0x1a, 0x67, 0x4d, 0xd9, +0x6f, 0xed, 0xea, 0xf1, 0x02, 0xf8, 0xcd, 0x15, +0x9b, 0x81, 0x7b, 0x63, 0x9a, 0xc4, 0x4a, 0x10, +0x84, 0xd1, 0x22, 0x32, 0x3f, 0xc0, 0x70, 0xbe, +0xb4, 0x91, 0xb9, 0x97, 0xef, 0x4f, 0x32, 0x7b, +0xf8, 0xae, 0xce, 0xd3, 0xae, 0x11, 0x98, 0xe1, +0xac, 0x69, 0x93, 0x00, 0x65, 0x64, 0x70, 0xfd, +0x86, 0x5e, 0xc0, 0x16, 0x60, 0x71, 0x81, 0x66, +0x67, 0x49, 0x10, 0x84, 0xd1, 0x10, 0xe0, 0x57, +0xe0, 0xb2, 0x2e, 0x7a, 0x9b, 0x07, 0xc8, 0x7c, +0x05, 0x7c, 0xec, 0x42, 0x9c, 0x5c, 0x4b, 0xc1, +0xc5, 0x99, 0x0c, 0xec, 0xf0, 0xd3, 0x32, 0x80, +0x25, 0x5d, 0x18, 0xfe, 0x41, 0x2f, 0xdf, 0x31, +0xaa, 0x94, 0xb4, 0x74, 0x01, 0xc5, 0xaa, 0xc0, +0x99, 0x4a, 0xe0, 0xc7, 0x0a, 0x8b, 0xbb, 0xe0, +0xed, 0xed, 0x03, 0x16, 0x94, 0x7b, 0xd0, 0xa7, +0x0a, 0x90, 0x83, 0x5f, 0x6e, 0x5d, 0x46, 0xf1, +0x9d, 0xb6, 0x93, 0xfd, 0xfc, 0x7d, 0xf8, 0x79, +0xbe, 0x64, 0xb1, 0x5b, 0xb4, 0x4f, 0x02, 0x8f, +0x93, 0xd9, 0xba, 0x7d, 0x98, 0x2a, 0x27, 0x4d, +0xd3, 0xc0, 0xa4, 0x95, 0x20, 0x97, 0x3d, 0x5e, +0xa0, 0x16, 0x60, 0x3d, 0x70, 0x7b, 0x91, 0xf6, +0x87, 0xc8, 0xec, 0xe8, 0x9d, 0x48, 0x66, 0x0f, +0xdf, 0x50, 0xe0, 0x6f, 0x32, 0xdf, 0xfc, 0x6d, +0x07, 0xb6, 0x74, 0x65, 0xc9, 0xd7, 0x34, 0xf0, +0xec, 0xd1, 0x7d, 0xa9, 0x12, 0x9c, 0x02, 0x6a, +0xb3, 0x81, 0xe5, 0x99, 0x4e, 0xc6, 0xd1, 0x04, +0x4c, 0x77, 0xd6, 0xfc, 0xd1, 0xdd, 0x57, 0xa0, +0x06, 0x81, 0x9d, 0xeb, 0x0e, 0xb2, 0x1c, 0xee, +0x78, 0xb5, 0xfa, 0xc5, 0x9c, 0x06, 0xbf, 0xb8, +0x53, 0x88, 0xd1, 0x40, 0x63, 0x10, 0x46, 0x57, +0xd2, 0xc3, 0x49, 0xdd, 0x2c, 0xc0, 0x4b, 0xb0, +0x34, 0x41, 0x88, 0x00, 0x75, 0xfe, 0x37, 0xfb, +0xe8, 0xa4, 0x04, 0x5f, 0xf9, 0x1f, 0x77, 0x90, +0x00, 0x29, 0x93, 0xa0, 0x2d, 0x61, 0x88, 0x00, +0xef, 0xe6, 0x5e, 0xc9, 0x25, 0x48, 0xd0, 0x9f, +0xf2, 0xee, 0x15, 0x94, 0x00, 0x65, 0x94, 0x20, +0x69, 0x88, 0xa3, 0xe2, 0xca, 0x79, 0x82, 0xe3, +0x8f, 0x01, 0xb7, 0x38, 0x6b, 0xf6, 0x49, 0x80, +0xca, 0x97, 0x60, 0x74, 0x89, 0x12, 0x94, 0x6d, +0x5b, 0xb7, 0x04, 0xa8, 0x3c, 0x09, 0x14, 0x7e, +0x5a, 0xa7, 0x81, 0x85, 0x38, 0xdf, 0x29, 0x9e, +0x3f, 0xfe, 0x19, 0xe0, 0xcd, 0x34, 0x85, 0xaf, +0x75, 0x80, 0x12, 0x28, 0x51, 0x82, 0xd0, 0x59, +0x73, 0x28, 0xed, 0x57, 0xa0, 0xd6, 0x01, 0x2e, +0x5c, 0x77, 0xd0, 0xe3, 0xa7, 0x78, 0x55, 0x27, +0x40, 0x89, 0x12, 0x8c, 0xf0, 0x63, 0x02, 0x49, +0x50, 0x2d, 0x5d, 0x40, 0x4c, 0x77, 0x30, 0x30, +0x41, 0xd3, 0x66, 0x67, 0x4d, 0xb3, 0xba, 0x80, +0x14, 0x0a, 0x20, 0xd4, 0x05, 0x08, 0x09, 0x20, +0x24, 0x80, 0x90, 0x00, 0x42, 0x02, 0x08, 0x09, +0x20, 0x24, 0x80, 0x90, 0x00, 0x42, 0x02, 0x08, +0x09, 0x20, 0x24, 0x80, 0x90, 0x00, 0x42, 0x02, +0x08, 0x09, 0x20, 0x24, 0x80, 0x90, 0x00, 0x42, +0x02, 0x08, 0x09, 0x20, 0x24, 0x80, 0x90, 0x00, +0x42, 0x02, 0x08, 0x09, 0x20, 0x24, 0x80, 0x90, +0x00, 0x42, 0x02, 0x08, 0x09, 0x20, 0x24, 0x80, +0x90, 0x00, 0x42, 0x02, 0x08, 0x09, 0x20, 0x92, +0xf2, 0xdf, 0x00, 0x13, 0x6e, 0xb4, 0xce, 0x04, +0xe4, 0x5d, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x49, +0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; + +Byte byHERE_logo_white_transparent_rgb_16px[3066] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, +0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, +0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, +0xf4, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, +0x73, 0x00, 0x00, 0x2e, 0x23, 0x00, 0x00, 0x2e, +0x23, 0x01, 0x78, 0xa5, 0x3f, 0x76, 0x00, 0x00, +0x0a, 0x4f, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, +0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x66, +0x69, 0x6c, 0x65, 0x00, 0x00, 0x78, 0xda, 0x9d, +0x53, 0x67, 0x54, 0x53, 0xe9, 0x16, 0x3d, 0xf7, +0xde, 0xf4, 0x42, 0x4b, 0x88, 0x80, 0x94, 0x4b, +0x6f, 0x52, 0x15, 0x08, 0x20, 0x52, 0x42, 0x8b, +0x80, 0x14, 0x91, 0x26, 0x2a, 0x21, 0x09, 0x10, +0x4a, 0x88, 0x21, 0xa1, 0xd9, 0x15, 0x51, 0xc1, +0x11, 0x45, 0x45, 0x04, 0x1b, 0xc8, 0xa0, 0x88, +0x03, 0x8e, 0x8e, 0x80, 0x8c, 0x15, 0x51, 0x2c, +0x0c, 0x8a, 0x0a, 0xd8, 0x07, 0xe4, 0x21, 0xa2, +0x8e, 0x83, 0xa3, 0x88, 0x8a, 0xca, 0xfb, 0xe1, +0x7b, 0xa3, 0x6b, 0xd6, 0xbc, 0xf7, 0xe6, 0xcd, +0xfe, 0xb5, 0xd7, 0x3e, 0xe7, 0xac, 0xf3, 0x9d, +0xb3, 0xcf, 0x07, 0xc0, 0x08, 0x0c, 0x96, 0x48, +0x33, 0x51, 0x35, 0x80, 0x0c, 0xa9, 0x42, 0x1e, +0x11, 0xe0, 0x83, 0xc7, 0xc4, 0xc6, 0xe1, 0xe4, +0x2e, 0x40, 0x81, 0x0a, 0x24, 0x70, 0x00, 0x10, +0x08, 0xb3, 0x64, 0x21, 0x73, 0xfd, 0x23, 0x01, +0x00, 0xf8, 0x7e, 0x3c, 0x3c, 0x2b, 0x22, 0xc0, +0x07, 0xbe, 0x00, 0x01, 0x78, 0xd3, 0x0b, 0x08, +0x00, 0xc0, 0x4d, 0x9b, 0xc0, 0x30, 0x1c, 0x87, +0xff, 0x0f, 0xea, 0x42, 0x99, 0x5c, 0x01, 0x80, +0x84, 0x01, 0xc0, 0x74, 0x91, 0x38, 0x4b, 0x08, +0x80, 0x14, 0x00, 0x40, 0x7a, 0x8e, 0x42, 0xa6, +0x00, 0x40, 0x46, 0x01, 0x80, 0x9d, 0x98, 0x26, +0x53, 0x00, 0xa0, 0x04, 0x00, 0x60, 0xcb, 0x63, +0x62, 0xe3, 0x00, 0x50, 0x2d, 0x00, 0x60, 0x27, +0x7f, 0xe6, 0xd3, 0x00, 0x80, 0x9d, 0xf8, 0x99, +0x7b, 0x01, 0x00, 0x5b, 0x94, 0x21, 0x15, 0x01, +0xa0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, +0x00, 0x68, 0x3b, 0x00, 0xac, 0xcf, 0x56, 0x8a, +0x45, 0x00, 0x58, 0x30, 0x00, 0x14, 0x66, 0x4b, +0xc4, 0x39, 0x00, 0xd8, 0x2d, 0x00, 0x30, 0x49, +0x57, 0x66, 0x48, 0x00, 0xb0, 0xb7, 0x00, 0xc0, +0xce, 0x10, 0x0b, 0xb2, 0x00, 0x08, 0x0c, 0x00, +0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7b, +0x00, 0x60, 0xc8, 0x23, 0x23, 0x78, 0x00, 0x84, +0x99, 0x00, 0x14, 0x46, 0xf2, 0x57, 0x3c, 0xf1, +0x2b, 0xae, 0x10, 0xe7, 0x2a, 0x00, 0x00, 0x78, +0x99, 0xb2, 0x3c, 0xb9, 0x24, 0x39, 0x45, 0x81, +0x5b, 0x08, 0x2d, 0x71, 0x07, 0x57, 0x57, 0x2e, +0x1e, 0x28, 0xce, 0x49, 0x17, 0x2b, 0x14, 0x36, +0x61, 0x02, 0x61, 0x9a, 0x40, 0x2e, 0xc2, 0x79, +0x99, 0x19, 0x32, 0x81, 0x34, 0x0f, 0xe0, 0xf3, +0xcc, 0x00, 0x00, 0xa0, 0x91, 0x15, 0x11, 0xe0, +0x83, 0xf3, 0xfd, 0x78, 0xce, 0x0e, 0xae, 0xce, +0xce, 0x36, 0x8e, 0xb6, 0x0e, 0x5f, 0x2d, 0xea, +0xbf, 0x06, 0xff, 0x22, 0x62, 0x62, 0xe3, 0xfe, +0xe5, 0xcf, 0xab, 0x70, 0x40, 0x00, 0x00, 0xe1, +0x74, 0x7e, 0xd1, 0xfe, 0x2c, 0x2f, 0xb3, 0x1a, +0x80, 0x3b, 0x06, 0x80, 0x6d, 0xfe, 0xa2, 0x25, +0xee, 0x04, 0x68, 0x5e, 0x0b, 0xa0, 0x75, 0xf7, +0x8b, 0x66, 0xb2, 0x0f, 0x40, 0xb5, 0x00, 0xa0, +0xe9, 0xda, 0x57, 0xf3, 0x70, 0xf8, 0x7e, 0x3c, +0x3c, 0x45, 0xa1, 0x90, 0xb9, 0xd9, 0xd9, 0xe5, +0xe4, 0xe4, 0xd8, 0x4a, 0xc4, 0x42, 0x5b, 0x61, +0xca, 0x57, 0x7d, 0xfe, 0x67, 0xc2, 0x5f, 0xc0, +0x57, 0xfd, 0x6c, 0xf9, 0x7e, 0x3c, 0xfc, 0xf7, +0xf5, 0xe0, 0xbe, 0xe2, 0x24, 0x81, 0x32, 0x5d, +0x81, 0x47, 0x04, 0xf8, 0xe0, 0xc2, 0xcc, 0xf4, +0x4c, 0xa5, 0x1c, 0xcf, 0x92, 0x09, 0x84, 0x62, +0xdc, 0xe6, 0x8f, 0x47, 0xfc, 0xb7, 0x0b, 0xff, +0xfc, 0x1d, 0xd3, 0x22, 0xc4, 0x49, 0x62, 0xb9, +0x58, 0x2a, 0x14, 0xe3, 0x51, 0x12, 0x71, 0x8e, +0x44, 0x9a, 0x8c, 0xf3, 0x32, 0xa5, 0x22, 0x89, +0x42, 0x92, 0x29, 0xc5, 0x25, 0xd2, 0xff, 0x64, +0xe2, 0xdf, 0x2c, 0xfb, 0x03, 0x3e, 0xdf, 0x35, +0x00, 0xb0, 0x6a, 0x3e, 0x01, 0x7b, 0x91, 0x2d, +0xa8, 0x5d, 0x63, 0x03, 0xf6, 0x4b, 0x27, 0x10, +0x58, 0x74, 0xc0, 0xe2, 0xf7, 0x00, 0x00, 0xf2, +0xbb, 0x6f, 0xc1, 0xd4, 0x28, 0x08, 0x03, 0x80, +0x68, 0x83, 0xe1, 0xcf, 0x77, 0xff, 0xef, 0x3f, +0xfd, 0x47, 0xa0, 0x25, 0x00, 0x80, 0x66, 0x49, +0x92, 0x71, 0x00, 0x00, 0x5e, 0x44, 0x24, 0x2e, +0x54, 0xca, 0xb3, 0x3f, 0xc7, 0x08, 0x00, 0x00, +0x44, 0xa0, 0x81, 0x2a, 0xb0, 0x41, 0x1b, 0xf4, +0xc1, 0x18, 0x2c, 0xc0, 0x06, 0x1c, 0xc1, 0x05, +0xdc, 0xc1, 0x0b, 0xfc, 0x60, 0x36, 0x84, 0x42, +0x24, 0xc4, 0xc2, 0x42, 0x10, 0x42, 0x0a, 0x64, +0x80, 0x1c, 0x72, 0x60, 0x29, 0xac, 0x82, 0x42, +0x28, 0x86, 0xcd, 0xb0, 0x1d, 0x2a, 0x60, 0x2f, +0xd4, 0x40, 0x1d, 0x34, 0xc0, 0x51, 0x68, 0x86, +0x93, 0x70, 0x0e, 0x2e, 0xc2, 0x55, 0xb8, 0x0e, +0x3d, 0x70, 0x0f, 0xfa, 0x61, 0x08, 0x9e, 0xc1, +0x28, 0xbc, 0x81, 0x09, 0x04, 0x41, 0xc8, 0x08, +0x13, 0x61, 0x21, 0xda, 0x88, 0x01, 0x62, 0x8a, +0x58, 0x23, 0x8e, 0x08, 0x17, 0x99, 0x85, 0xf8, +0x21, 0xc1, 0x48, 0x04, 0x12, 0x8b, 0x24, 0x20, +0xc9, 0x88, 0x14, 0x51, 0x22, 0x4b, 0x91, 0x35, +0x48, 0x31, 0x52, 0x8a, 0x54, 0x20, 0x55, 0x48, +0x1d, 0xf2, 0x3d, 0x72, 0x02, 0x39, 0x87, 0x5c, +0x46, 0xba, 0x91, 0x3b, 0xc8, 0x00, 0x32, 0x82, +0xfc, 0x86, 0xbc, 0x47, 0x31, 0x94, 0x81, 0xb2, +0x51, 0x3d, 0xd4, 0x0c, 0xb5, 0x43, 0xb9, 0xa8, +0x37, 0x1a, 0x84, 0x46, 0xa2, 0x0b, 0xd0, 0x64, +0x74, 0x31, 0x9a, 0x8f, 0x16, 0xa0, 0x9b, 0xd0, +0x72, 0xb4, 0x1a, 0x3d, 0x8c, 0x36, 0xa1, 0xe7, +0xd0, 0xab, 0x68, 0x0f, 0xda, 0x8f, 0x3e, 0x43, +0xc7, 0x30, 0xc0, 0xe8, 0x18, 0x07, 0x33, 0xc4, +0x6c, 0x30, 0x2e, 0xc6, 0xc3, 0x42, 0xb1, 0x38, +0x2c, 0x09, 0x93, 0x63, 0xcb, 0xb1, 0x22, 0xac, +0x0c, 0xab, 0xc6, 0x1a, 0xb0, 0x56, 0xac, 0x03, +0xbb, 0x89, 0xf5, 0x63, 0xcf, 0xb1, 0x77, 0x04, +0x12, 0x81, 0x45, 0xc0, 0x09, 0x36, 0x04, 0x77, +0x42, 0x20, 0x61, 0x1e, 0x41, 0x48, 0x58, 0x4c, +0x58, 0x4e, 0xd8, 0x48, 0xa8, 0x20, 0x1c, 0x24, +0x34, 0x11, 0xda, 0x09, 0x37, 0x09, 0x03, 0x84, +0x51, 0xc2, 0x27, 0x22, 0x93, 0xa8, 0x4b, 0xb4, +0x26, 0xba, 0x11, 0xf9, 0xc4, 0x18, 0x62, 0x32, +0x31, 0x87, 0x58, 0x48, 0x2c, 0x23, 0xd6, 0x12, +0x8f, 0x13, 0x2f, 0x10, 0x7b, 0x88, 0x43, 0xc4, +0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xb9, +0x90, 0x02, 0x49, 0xb1, 0xa4, 0x54, 0xd2, 0x12, +0xd2, 0x46, 0xd2, 0x6e, 0x52, 0x23, 0xe9, 0x2c, +0xa9, 0x9b, 0x34, 0x48, 0x1a, 0x23, 0x93, 0xc9, +0xda, 0x64, 0x6b, 0xb2, 0x07, 0x39, 0x94, 0x2c, +0x20, 0x2b, 0xc8, 0x85, 0xe4, 0x9d, 0xe4, 0xc3, +0xe4, 0x33, 0xe4, 0x1b, 0xe4, 0x21, 0xf2, 0x5b, +0x0a, 0x9d, 0x62, 0x40, 0x71, 0xa4, 0xf8, 0x53, +0xe2, 0x28, 0x52, 0xca, 0x6a, 0x4a, 0x19, 0xe5, +0x10, 0xe5, 0x34, 0xe5, 0x06, 0x65, 0x98, 0x32, +0x41, 0x55, 0xa3, 0x9a, 0x52, 0xdd, 0xa8, 0xa1, +0x54, 0x11, 0x35, 0x8f, 0x5a, 0x42, 0xad, 0xa1, +0xb6, 0x52, 0xaf, 0x51, 0x87, 0xa8, 0x13, 0x34, +0x75, 0x9a, 0x39, 0xcd, 0x83, 0x16, 0x49, 0x4b, +0xa5, 0xad, 0xa2, 0x95, 0xd3, 0x1a, 0x68, 0x17, +0x68, 0xf7, 0x69, 0xaf, 0xe8, 0x74, 0xba, 0x11, +0xdd, 0x95, 0x1e, 0x4e, 0x97, 0xd0, 0x57, 0xd2, +0xcb, 0xe9, 0x47, 0xe8, 0x97, 0xe8, 0x03, 0xf4, +0x77, 0x0c, 0x0d, 0x86, 0x15, 0x83, 0xc7, 0x88, +0x67, 0x28, 0x19, 0x9b, 0x18, 0x07, 0x18, 0x67, +0x19, 0x77, 0x18, 0xaf, 0x98, 0x4c, 0xa6, 0x19, +0xd3, 0x8b, 0x19, 0xc7, 0x54, 0x30, 0x37, 0x31, +0xeb, 0x98, 0xe7, 0x99, 0x0f, 0x99, 0x6f, 0x55, +0x58, 0x2a, 0xb6, 0x2a, 0x7c, 0x15, 0x91, 0xca, +0x0a, 0x95, 0x4a, 0x95, 0x26, 0x95, 0x1b, 0x2a, +0x2f, 0x54, 0xa9, 0xaa, 0xa6, 0xaa, 0xde, 0xaa, +0x0b, 0x55, 0xf3, 0x55, 0xcb, 0x54, 0x8f, 0xa9, +0x5e, 0x53, 0x7d, 0xae, 0x46, 0x55, 0x33, 0x53, +0xe3, 0xa9, 0x09, 0xd4, 0x96, 0xab, 0x55, 0xaa, +0x9d, 0x50, 0xeb, 0x53, 0x1b, 0x53, 0x67, 0xa9, +0x3b, 0xa8, 0x87, 0xaa, 0x67, 0xa8, 0x6f, 0x54, +0x3f, 0xa4, 0x7e, 0x59, 0xfd, 0x89, 0x06, 0x59, +0xc3, 0x4c, 0xc3, 0x4f, 0x43, 0xa4, 0x51, 0xa0, +0xb1, 0x5f, 0xe3, 0xbc, 0xc6, 0x20, 0x0b, 0x63, +0x19, 0xb3, 0x78, 0x2c, 0x21, 0x6b, 0x0d, 0xab, +0x86, 0x75, 0x81, 0x35, 0xc4, 0x26, 0xb1, 0xcd, +0xd9, 0x7c, 0x76, 0x2a, 0xbb, 0x98, 0xfd, 0x1d, +0xbb, 0x8b, 0x3d, 0xaa, 0xa9, 0xa1, 0x39, 0x43, +0x33, 0x4a, 0x33, 0x57, 0xb3, 0x52, 0xf3, 0x94, +0x66, 0x3f, 0x07, 0xe3, 0x98, 0x71, 0xf8, 0x9c, +0x74, 0x4e, 0x09, 0xe7, 0x28, 0xa7, 0x97, 0xf3, +0x7e, 0x8a, 0xde, 0x14, 0xef, 0x29, 0xe2, 0x29, +0x1b, 0xa6, 0x34, 0x4c, 0xb9, 0x31, 0x65, 0x5c, +0x6b, 0xaa, 0x96, 0x97, 0x96, 0x58, 0xab, 0x48, +0xab, 0x51, 0xab, 0x47, 0xeb, 0xbd, 0x36, 0xae, +0xed, 0xa7, 0x9d, 0xa6, 0xbd, 0x45, 0xbb, 0x59, +0xfb, 0x81, 0x0e, 0x41, 0xc7, 0x4a, 0x27, 0x5c, +0x27, 0x47, 0x67, 0x8f, 0xce, 0x05, 0x9d, 0xe7, +0x53, 0xd9, 0x53, 0xdd, 0xa7, 0x0a, 0xa7, 0x16, +0x4d, 0x3d, 0x3a, 0xf5, 0xae, 0x2e, 0xaa, 0x6b, +0xa5, 0x1b, 0xa1, 0xbb, 0x44, 0x77, 0xbf, 0x6e, +0xa7, 0xee, 0x98, 0x9e, 0xbe, 0x5e, 0x80, 0x9e, +0x4c, 0x6f, 0xa7, 0xde, 0x79, 0xbd, 0xe7, 0xfa, +0x1c, 0x7d, 0x2f, 0xfd, 0x54, 0xfd, 0x6d, 0xfa, +0xa7, 0xf5, 0x47, 0x0c, 0x58, 0x06, 0xb3, 0x0c, +0x24, 0x06, 0xdb, 0x0c, 0xce, 0x18, 0x3c, 0xc5, +0x35, 0x71, 0x6f, 0x3c, 0x1d, 0x2f, 0xc7, 0xdb, +0xf1, 0x51, 0x43, 0x5d, 0xc3, 0x40, 0x43, 0xa5, +0x61, 0x95, 0x61, 0x97, 0xe1, 0x84, 0x91, 0xb9, +0xd1, 0x3c, 0xa3, 0xd5, 0x46, 0x8d, 0x46, 0x0f, +0x8c, 0x69, 0xc6, 0x5c, 0xe3, 0x24, 0xe3, 0x6d, +0xc6, 0x6d, 0xc6, 0xa3, 0x26, 0x06, 0x26, 0x21, +0x26, 0x4b, 0x4d, 0xea, 0x4d, 0xee, 0x9a, 0x52, +0x4d, 0xb9, 0xa6, 0x29, 0xa6, 0x3b, 0x4c, 0x3b, +0x4c, 0xc7, 0xcd, 0xcc, 0xcd, 0xa2, 0xcd, 0xd6, +0x99, 0x35, 0x9b, 0x3d, 0x31, 0xd7, 0x32, 0xe7, +0x9b, 0xe7, 0x9b, 0xd7, 0x9b, 0xdf, 0xb7, 0x60, +0x5a, 0x78, 0x5a, 0x2c, 0xb6, 0xa8, 0xb6, 0xb8, +0x65, 0x49, 0xb2, 0xe4, 0x5a, 0xa6, 0x59, 0xee, +0xb6, 0xbc, 0x6e, 0x85, 0x5a, 0x39, 0x59, 0xa5, +0x58, 0x55, 0x5a, 0x5d, 0xb3, 0x46, 0xad, 0x9d, +0xad, 0x25, 0xd6, 0xbb, 0xad, 0xbb, 0xa7, 0x11, +0xa7, 0xb9, 0x4e, 0x93, 0x4e, 0xab, 0x9e, 0xd6, +0x67, 0xc3, 0xb0, 0xf1, 0xb6, 0xc9, 0xb6, 0xa9, +0xb7, 0x19, 0xb0, 0xe5, 0xd8, 0x06, 0xdb, 0xae, +0xb6, 0x6d, 0xb6, 0x7d, 0x61, 0x67, 0x62, 0x17, +0x67, 0xb7, 0xc5, 0xae, 0xc3, 0xee, 0x93, 0xbd, +0x93, 0x7d, 0xba, 0x7d, 0x8d, 0xfd, 0x3d, 0x07, +0x0d, 0x87, 0xd9, 0x0e, 0xab, 0x1d, 0x5a, 0x1d, +0x7e, 0x73, 0xb4, 0x72, 0x14, 0x3a, 0x56, 0x3a, +0xde, 0x9a, 0xce, 0x9c, 0xee, 0x3f, 0x7d, 0xc5, +0xf4, 0x96, 0xe9, 0x2f, 0x67, 0x58, 0xcf, 0x10, +0xcf, 0xd8, 0x33, 0xe3, 0xb6, 0x13, 0xcb, 0x29, +0xc4, 0x69, 0x9d, 0x53, 0x9b, 0xd3, 0x47, 0x67, +0x17, 0x67, 0xb9, 0x73, 0x83, 0xf3, 0x88, 0x8b, +0x89, 0x4b, 0x82, 0xcb, 0x2e, 0x97, 0x3e, 0x2e, +0x9b, 0x1b, 0xc6, 0xdd, 0xc8, 0xbd, 0xe4, 0x4a, +0x74, 0xf5, 0x71, 0x5d, 0xe1, 0x7a, 0xd2, 0xf5, +0x9d, 0x9b, 0xb3, 0x9b, 0xc2, 0xed, 0xa8, 0xdb, +0xaf, 0xee, 0x36, 0xee, 0x69, 0xee, 0x87, 0xdc, +0x9f, 0xcc, 0x34, 0x9f, 0x29, 0x9e, 0x59, 0x33, +0x73, 0xd0, 0xc3, 0xc8, 0x43, 0xe0, 0x51, 0xe5, +0xd1, 0x3f, 0x0b, 0x9f, 0x95, 0x30, 0x6b, 0xdf, +0xac, 0x7e, 0x4f, 0x43, 0x4f, 0x81, 0x67, 0xb5, +0xe7, 0x23, 0x2f, 0x63, 0x2f, 0x91, 0x57, 0xad, +0xd7, 0xb0, 0xb7, 0xa5, 0x77, 0xaa, 0xf7, 0x61, +0xef, 0x17, 0x3e, 0xf6, 0x3e, 0x72, 0x9f, 0xe3, +0x3e, 0xe3, 0x3c, 0x37, 0xde, 0x32, 0xde, 0x59, +0x5f, 0xcc, 0x37, 0xc0, 0xb7, 0xc8, 0xb7, 0xcb, +0x4f, 0xc3, 0x6f, 0x9e, 0x5f, 0x85, 0xdf, 0x43, +0x7f, 0x23, 0xff, 0x64, 0xff, 0x7a, 0xff, 0xd1, +0x00, 0xa7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, +0x81, 0x41, 0x81, 0x5b, 0x02, 0xfb, 0xf8, 0x7a, +0x7c, 0x21, 0xbf, 0x8e, 0x3f, 0x3a, 0xdb, 0x65, +0xf6, 0xb2, 0xd9, 0xed, 0x41, 0x8c, 0xa0, 0xb9, +0x41, 0x15, 0x41, 0x8f, 0x82, 0xad, 0x82, 0xe5, +0xc1, 0xad, 0x21, 0x68, 0xc8, 0xec, 0x90, 0xad, +0x21, 0xf7, 0xe7, 0x98, 0xce, 0x91, 0xce, 0x69, +0x0e, 0x85, 0x50, 0x7e, 0xe8, 0xd6, 0xd0, 0x07, +0x61, 0xe6, 0x61, 0x8b, 0xc3, 0x7e, 0x0c, 0x27, +0x85, 0x87, 0x85, 0x57, 0x86, 0x3f, 0x8e, 0x70, +0x88, 0x58, 0x1a, 0xd1, 0x31, 0x97, 0x35, 0x77, +0xd1, 0xdc, 0x43, 0x73, 0xdf, 0x44, 0xfa, 0x44, +0x96, 0x44, 0xde, 0x9b, 0x67, 0x31, 0x4f, 0x39, +0xaf, 0x2d, 0x4a, 0x35, 0x2a, 0x3e, 0xaa, 0x2e, +0x6a, 0x3c, 0xda, 0x37, 0xba, 0x34, 0xba, 0x3f, +0xc6, 0x2e, 0x66, 0x59, 0xcc, 0xd5, 0x58, 0x9d, +0x58, 0x49, 0x6c, 0x4b, 0x1c, 0x39, 0x2e, 0x2a, +0xae, 0x36, 0x6e, 0x6c, 0xbe, 0xdf, 0xfc, 0xed, +0xf3, 0x87, 0xe2, 0x9d, 0xe2, 0x0b, 0xe3, 0x7b, +0x17, 0x98, 0x2f, 0xc8, 0x5d, 0x70, 0x79, 0xa1, +0xce, 0xc2, 0xf4, 0x85, 0xa7, 0x16, 0xa9, 0x2e, +0x12, 0x2c, 0x3a, 0x96, 0x40, 0x4c, 0x88, 0x4e, +0x38, 0x94, 0xf0, 0x41, 0x10, 0x2a, 0xa8, 0x16, +0x8c, 0x25, 0xf2, 0x13, 0x77, 0x25, 0x8e, 0x0a, +0x79, 0xc2, 0x1d, 0xc2, 0x67, 0x22, 0x2f, 0xd1, +0x36, 0xd1, 0x88, 0xd8, 0x43, 0x5c, 0x2a, 0x1e, +0x4e, 0xf2, 0x48, 0x2a, 0x4d, 0x7a, 0x92, 0xec, +0x91, 0xbc, 0x35, 0x79, 0x24, 0xc5, 0x33, 0xa5, +0x2c, 0xe5, 0xb9, 0x84, 0x27, 0xa9, 0x90, 0xbc, +0x4c, 0x0d, 0x4c, 0xdd, 0x9b, 0x3a, 0x9e, 0x16, +0x9a, 0x76, 0x20, 0x6d, 0x32, 0x3d, 0x3a, 0xbd, +0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xaa, +0x21, 0x4d, 0x93, 0xb6, 0x67, 0xea, 0x67, 0xe6, +0x66, 0x76, 0xcb, 0xac, 0x65, 0x85, 0xb2, 0xfe, +0xc5, 0x6e, 0x8b, 0xb7, 0x2f, 0x1e, 0x95, 0x07, +0xc9, 0x6b, 0xb3, 0x90, 0xac, 0x05, 0x59, 0x2d, +0x0a, 0xb6, 0x42, 0xa6, 0xe8, 0x54, 0x5a, 0x28, +0xd7, 0x2a, 0x07, 0xb2, 0x67, 0x65, 0x57, 0x66, +0xbf, 0xcd, 0x89, 0xca, 0x39, 0x96, 0xab, 0x9e, +0x2b, 0xcd, 0xed, 0xcc, 0xb3, 0xca, 0xdb, 0x90, +0x37, 0x9c, 0xef, 0x9f, 0xff, 0xed, 0x12, 0xc2, +0x12, 0xe1, 0x92, 0xb6, 0xa5, 0x86, 0x4b, 0x57, +0x2d, 0x1d, 0x58, 0xe6, 0xbd, 0xac, 0x6a, 0x39, +0xb2, 0x3c, 0x71, 0x79, 0xdb, 0x0a, 0xe3, 0x15, +0x05, 0x2b, 0x86, 0x56, 0x06, 0xac, 0x3c, 0xb8, +0x8a, 0xb6, 0x2a, 0x6d, 0xd5, 0x4f, 0xab, 0xed, +0x57, 0x97, 0xae, 0x7e, 0xbd, 0x26, 0x7a, 0x4d, +0x6b, 0x81, 0x5e, 0xc1, 0xca, 0x82, 0xc1, 0xb5, +0x01, 0x6b, 0xeb, 0x0b, 0x55, 0x0a, 0xe5, 0x85, +0x7d, 0xeb, 0xdc, 0xd7, 0xed, 0x5d, 0x4f, 0x58, +0x2f, 0x59, 0xdf, 0xb5, 0x61, 0xfa, 0x86, 0x9d, +0x1b, 0x3e, 0x15, 0x89, 0x8a, 0xae, 0x14, 0xdb, +0x17, 0x97, 0x15, 0x7f, 0xd8, 0x28, 0xdc, 0x78, +0xe5, 0x1b, 0x87, 0x6f, 0xca, 0xbf, 0x99, 0xdc, +0x94, 0xb4, 0xa9, 0xab, 0xc4, 0xb9, 0x64, 0xcf, +0x66, 0xd2, 0x66, 0xe9, 0xe6, 0xde, 0x2d, 0x9e, +0x5b, 0x0e, 0x96, 0xaa, 0x97, 0xe6, 0x97, 0x0e, +0x6e, 0x0d, 0xd9, 0xda, 0xb4, 0x0d, 0xdf, 0x56, +0xb4, 0xed, 0xf5, 0xf6, 0x45, 0xdb, 0x2f, 0x97, +0xcd, 0x28, 0xdb, 0xbb, 0x83, 0xb6, 0x43, 0xb9, +0xa3, 0xbf, 0x3c, 0xb8, 0xbc, 0x65, 0xa7, 0xc9, +0xce, 0xcd, 0x3b, 0x3f, 0x54, 0xa4, 0x54, 0xf4, +0x54, 0xfa, 0x54, 0x36, 0xee, 0xd2, 0xdd, 0xb5, +0x61, 0xd7, 0xf8, 0x6e, 0xd1, 0xee, 0x1b, 0x7b, +0xbc, 0xf6, 0x34, 0xec, 0xd5, 0xdb, 0x5b, 0xbc, +0xf7, 0xfd, 0x3e, 0xc9, 0xbe, 0xdb, 0x55, 0x01, +0x55, 0x4d, 0xd5, 0x66, 0xd5, 0x65, 0xfb, 0x49, +0xfb, 0xb3, 0xf7, 0x3f, 0xae, 0x89, 0xaa, 0xe9, +0xf8, 0x96, 0xfb, 0x6d, 0x5d, 0xad, 0x4e, 0x6d, +0x71, 0xed, 0xc7, 0x03, 0xd2, 0x03, 0xfd, 0x07, +0x23, 0x0e, 0xb6, 0xd7, 0xb9, 0xd4, 0xd5, 0x1d, +0xd2, 0x3d, 0x54, 0x52, 0x8f, 0xd6, 0x2b, 0xeb, +0x47, 0x0e, 0xc7, 0x1f, 0xbe, 0xfe, 0x9d, 0xef, +0x77, 0x2d, 0x0d, 0x36, 0x0d, 0x55, 0x8d, 0x9c, +0xc6, 0xe2, 0x23, 0x70, 0x44, 0x79, 0xe4, 0xe9, +0xf7, 0x09, 0xdf, 0xf7, 0x1e, 0x0d, 0x3a, 0xda, +0x76, 0x8c, 0x7b, 0xac, 0xe1, 0x07, 0xd3, 0x1f, +0x76, 0x1d, 0x67, 0x1d, 0x2f, 0x6a, 0x42, 0x9a, +0xf2, 0x9a, 0x46, 0x9b, 0x53, 0x9a, 0xfb, 0x5b, +0x62, 0x5b, 0xba, 0x4f, 0xcc, 0x3e, 0xd1, 0xd6, +0xea, 0xde, 0x7a, 0xfc, 0x47, 0xdb, 0x1f, 0x0f, +0x9c, 0x34, 0x3c, 0x59, 0x79, 0x4a, 0xf3, 0x54, +0xc9, 0x69, 0xda, 0xe9, 0x82, 0xd3, 0x93, 0x67, +0xf2, 0xcf, 0x8c, 0x9d, 0x95, 0x9d, 0x7d, 0x7e, +0x2e, 0xf9, 0xdc, 0x60, 0xdb, 0xa2, 0xb6, 0x7b, +0xe7, 0x63, 0xce, 0xdf, 0x6a, 0x0f, 0x6f, 0xef, +0xba, 0x10, 0x74, 0xe1, 0xd2, 0x45, 0xff, 0x8b, +0xe7, 0x3b, 0xbc, 0x3b, 0xce, 0x5c, 0xf2, 0xb8, +0x74, 0xf2, 0xb2, 0xdb, 0xe5, 0x13, 0x57, 0xb8, +0x57, 0x9a, 0xaf, 0x3a, 0x5f, 0x6d, 0xea, 0x74, +0xea, 0x3c, 0xfe, 0x93, 0xd3, 0x4f, 0xc7, 0xbb, +0x9c, 0xbb, 0x9a, 0xae, 0xb9, 0x5c, 0x6b, 0xb9, +0xee, 0x7a, 0xbd, 0xb5, 0x7b, 0x66, 0xf7, 0xe9, +0x1b, 0x9e, 0x37, 0xce, 0xdd, 0xf4, 0xbd, 0x79, +0xf1, 0x16, 0xff, 0xd6, 0xd5, 0x9e, 0x39, 0x3d, +0xdd, 0xbd, 0xf3, 0x7a, 0x6f, 0xf7, 0xc5, 0xf7, +0xf5, 0xdf, 0x16, 0xdd, 0x7e, 0x72, 0x27, 0xfd, +0xce, 0xcb, 0xbb, 0xd9, 0x77, 0x27, 0xee, 0xad, +0xbc, 0x4f, 0xbc, 0x5f, 0xf4, 0x40, 0xed, 0x41, +0xd9, 0x43, 0xdd, 0x87, 0xd5, 0x3f, 0x5b, 0xfe, +0xdc, 0xd8, 0xef, 0xdc, 0x7f, 0x6a, 0xc0, 0x77, +0xa0, 0xf3, 0xd1, 0xdc, 0x47, 0xf7, 0x06, 0x85, +0x83, 0xcf, 0xfe, 0x91, 0xf5, 0x8f, 0x0f, 0x43, +0x05, 0x8f, 0x99, 0x8f, 0xcb, 0x86, 0x0d, 0x86, +0xeb, 0x9e, 0x38, 0x3e, 0x39, 0x39, 0xe2, 0x3f, +0x72, 0xfd, 0xe9, 0xfc, 0xa7, 0x43, 0xcf, 0x64, +0xcf, 0x26, 0x9e, 0x17, 0xfe, 0xa2, 0xfe, 0xcb, +0xae, 0x17, 0x16, 0x2f, 0x7e, 0xf8, 0xd5, 0xeb, +0xd7, 0xce, 0xd1, 0x98, 0xd1, 0xa1, 0x97, 0xf2, +0x97, 0x93, 0xbf, 0x6d, 0x7c, 0xa5, 0xfd, 0xea, +0xc0, 0xeb, 0x19, 0xaf, 0xdb, 0xc6, 0xc2, 0xc6, +0x1e, 0xbe, 0xc9, 0x78, 0x33, 0x31, 0x5e, 0xf4, +0x56, 0xfb, 0xed, 0xc1, 0x77, 0xdc, 0x77, 0x1d, +0xef, 0xa3, 0xdf, 0x0f, 0x4f, 0xe4, 0x7c, 0x20, +0x7f, 0x28, 0xff, 0x68, 0xf9, 0xb1, 0xf5, 0x53, +0xd0, 0xa7, 0xfb, 0x93, 0x19, 0x93, 0x93, 0xff, +0x04, 0x03, 0x98, 0xf3, 0xfc, 0x63, 0x33, 0x2d, +0xdb, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, +0x4d, 0x00, 0x00, 0x7a, 0x25, 0x00, 0x00, 0x80, +0x83, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0x80, +0xe9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, +0x60, 0x00, 0x00, 0x3a, 0x98, 0x00, 0x00, 0x17, +0x6f, 0x92, 0x5f, 0xc5, 0x46, 0x00, 0x00, 0x01, +0x25, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, +0x97, 0xb1, 0x4a, 0x04, 0x31, 0x14, 0x45, 0xdf, +0x8c, 0x62, 0x61, 0xb1, 0x6b, 0x65, 0xa5, 0xd8, +0xd8, 0x5a, 0x09, 0x0a, 0x0a, 0xcb, 0x62, 0x2f, +0xd8, 0x09, 0xf6, 0xfe, 0x86, 0xb5, 0xe0, 0x07, +0xf8, 0x05, 0x62, 0xb3, 0x58, 0x88, 0x3f, 0xe0, +0x76, 0xfe, 0x83, 0x62, 0x23, 0x16, 0x5a, 0xac, +0x36, 0x76, 0xe7, 0x3e, 0x9b, 0x09, 0x84, 0x30, +0x3a, 0xee, 0x38, 0xb0, 0x88, 0x09, 0xdc, 0x22, +0x2f, 0x21, 0x39, 0x79, 0x37, 0x0f, 0x92, 0xc2, +0xdd, 0x6d, 0x96, 0xad, 0xb4, 0x19, 0xb7, 0x0c, +0x90, 0x01, 0x32, 0x40, 0x06, 0xc8, 0x00, 0x7f, +0x03, 0xc0, 0xa5, 0xa1, 0x4b, 0xfd, 0x9a, 0x78, +0xcf, 0xa5, 0x81, 0x4b, 0x6b, 0xad, 0x09, 0xdc, +0xfd, 0x5b, 0x09, 0xf6, 0x04, 0x1f, 0x82, 0x3b, +0x41, 0x3f, 0x8a, 0x0f, 0x05, 0xaf, 0x02, 0x17, +0x48, 0x70, 0x2e, 0x58, 0x68, 0x5a, 0x2f, 0x55, +0xd3, 0xe6, 0xbb, 0xd5, 0xe6, 0x5e, 0xe9, 0x56, +0xb0, 0x28, 0x58, 0x16, 0x4c, 0xa2, 0x78, 0xd0, +0xf5, 0xb4, 0x10, 0x4d, 0x16, 0x3c, 0x98, 0xd9, +0x73, 0xd4, 0x1f, 0x98, 0xd9, 0x8d, 0x99, 0x1d, +0x9a, 0xd9, 0x52, 0xcd, 0xfc, 0x7d, 0x33, 0x1b, +0xb9, 0x34, 0xdf, 0xa5, 0x05, 0x2b, 0x82, 0xfb, +0xe4, 0xa4, 0x21, 0x2b, 0x8f, 0x82, 0x13, 0xc1, +0x5b, 0x32, 0x7e, 0x21, 0x98, 0xfb, 0xb5, 0x05, +0x11, 0xc4, 0xaa, 0xe0, 0xa9, 0x26, 0xe5, 0xc7, +0xd5, 0xf8, 0xa6, 0xe0, 0xbd, 0x0d, 0xc4, 0x8f, +0xbd, 0x12, 0xac, 0xd7, 0x40, 0x8c, 0x83, 0xe7, +0x82, 0xed, 0x1a, 0x88, 0x83, 0xce, 0x00, 0x22, +0x88, 0x97, 0xaf, 0x2e, 0x9e, 0x60, 0x27, 0xb2, +0xe7, 0xb4, 0x33, 0x0b, 0x12, 0x88, 0x8d, 0xa8, +0xfc, 0x82, 0x2e, 0x43, 0xba, 0xab, 0xb2, 0x3d, +0xeb, 0xa4, 0x0c, 0x1b, 0x20, 0x26, 0x6d, 0x2f, +0x5e, 0xac, 0xa2, 0xed, 0xb3, 0xdc, 0xa5, 0x2d, +0x33, 0x3b, 0x4a, 0xc2, 0x57, 0x45, 0x59, 0x8e, +0xa7, 0x59, 0xa7, 0xc8, 0xff, 0x82, 0x0c, 0x90, +0x01, 0xfe, 0x3d, 0xc0, 0xe7, 0x00, 0xd8, 0xf7, +0x60, 0xce, 0x4d, 0x78, 0xb9, 0xef, 0x00, 0x00, +0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, +0x60, 0x82, +}; + +Byte byHERE_logo_white_transparent_rgb_32px[3475] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, +0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, +0x08, 0x06, 0x00, 0x00, 0x00, 0xaa, 0x69, 0x71, +0xde, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, +0x73, 0x00, 0x00, 0x2e, 0x23, 0x00, 0x00, 0x2e, +0x23, 0x01, 0x78, 0xa5, 0x3f, 0x76, 0x00, 0x00, +0x0a, 0x4f, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, +0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x66, +0x69, 0x6c, 0x65, 0x00, 0x00, 0x78, 0xda, 0x9d, +0x53, 0x67, 0x54, 0x53, 0xe9, 0x16, 0x3d, 0xf7, +0xde, 0xf4, 0x42, 0x4b, 0x88, 0x80, 0x94, 0x4b, +0x6f, 0x52, 0x15, 0x08, 0x20, 0x52, 0x42, 0x8b, +0x80, 0x14, 0x91, 0x26, 0x2a, 0x21, 0x09, 0x10, +0x4a, 0x88, 0x21, 0xa1, 0xd9, 0x15, 0x51, 0xc1, +0x11, 0x45, 0x45, 0x04, 0x1b, 0xc8, 0xa0, 0x88, +0x03, 0x8e, 0x8e, 0x80, 0x8c, 0x15, 0x51, 0x2c, +0x0c, 0x8a, 0x0a, 0xd8, 0x07, 0xe4, 0x21, 0xa2, +0x8e, 0x83, 0xa3, 0x88, 0x8a, 0xca, 0xfb, 0xe1, +0x7b, 0xa3, 0x6b, 0xd6, 0xbc, 0xf7, 0xe6, 0xcd, +0xfe, 0xb5, 0xd7, 0x3e, 0xe7, 0xac, 0xf3, 0x9d, +0xb3, 0xcf, 0x07, 0xc0, 0x08, 0x0c, 0x96, 0x48, +0x33, 0x51, 0x35, 0x80, 0x0c, 0xa9, 0x42, 0x1e, +0x11, 0xe0, 0x83, 0xc7, 0xc4, 0xc6, 0xe1, 0xe4, +0x2e, 0x40, 0x81, 0x0a, 0x24, 0x70, 0x00, 0x10, +0x08, 0xb3, 0x64, 0x21, 0x73, 0xfd, 0x23, 0x01, +0x00, 0xf8, 0x7e, 0x3c, 0x3c, 0x2b, 0x22, 0xc0, +0x07, 0xbe, 0x00, 0x01, 0x78, 0xd3, 0x0b, 0x08, +0x00, 0xc0, 0x4d, 0x9b, 0xc0, 0x30, 0x1c, 0x87, +0xff, 0x0f, 0xea, 0x42, 0x99, 0x5c, 0x01, 0x80, +0x84, 0x01, 0xc0, 0x74, 0x91, 0x38, 0x4b, 0x08, +0x80, 0x14, 0x00, 0x40, 0x7a, 0x8e, 0x42, 0xa6, +0x00, 0x40, 0x46, 0x01, 0x80, 0x9d, 0x98, 0x26, +0x53, 0x00, 0xa0, 0x04, 0x00, 0x60, 0xcb, 0x63, +0x62, 0xe3, 0x00, 0x50, 0x2d, 0x00, 0x60, 0x27, +0x7f, 0xe6, 0xd3, 0x00, 0x80, 0x9d, 0xf8, 0x99, +0x7b, 0x01, 0x00, 0x5b, 0x94, 0x21, 0x15, 0x01, +0xa0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, +0x00, 0x68, 0x3b, 0x00, 0xac, 0xcf, 0x56, 0x8a, +0x45, 0x00, 0x58, 0x30, 0x00, 0x14, 0x66, 0x4b, +0xc4, 0x39, 0x00, 0xd8, 0x2d, 0x00, 0x30, 0x49, +0x57, 0x66, 0x48, 0x00, 0xb0, 0xb7, 0x00, 0xc0, +0xce, 0x10, 0x0b, 0xb2, 0x00, 0x08, 0x0c, 0x00, +0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7b, +0x00, 0x60, 0xc8, 0x23, 0x23, 0x78, 0x00, 0x84, +0x99, 0x00, 0x14, 0x46, 0xf2, 0x57, 0x3c, 0xf1, +0x2b, 0xae, 0x10, 0xe7, 0x2a, 0x00, 0x00, 0x78, +0x99, 0xb2, 0x3c, 0xb9, 0x24, 0x39, 0x45, 0x81, +0x5b, 0x08, 0x2d, 0x71, 0x07, 0x57, 0x57, 0x2e, +0x1e, 0x28, 0xce, 0x49, 0x17, 0x2b, 0x14, 0x36, +0x61, 0x02, 0x61, 0x9a, 0x40, 0x2e, 0xc2, 0x79, +0x99, 0x19, 0x32, 0x81, 0x34, 0x0f, 0xe0, 0xf3, +0xcc, 0x00, 0x00, 0xa0, 0x91, 0x15, 0x11, 0xe0, +0x83, 0xf3, 0xfd, 0x78, 0xce, 0x0e, 0xae, 0xce, +0xce, 0x36, 0x8e, 0xb6, 0x0e, 0x5f, 0x2d, 0xea, +0xbf, 0x06, 0xff, 0x22, 0x62, 0x62, 0xe3, 0xfe, +0xe5, 0xcf, 0xab, 0x70, 0x40, 0x00, 0x00, 0xe1, +0x74, 0x7e, 0xd1, 0xfe, 0x2c, 0x2f, 0xb3, 0x1a, +0x80, 0x3b, 0x06, 0x80, 0x6d, 0xfe, 0xa2, 0x25, +0xee, 0x04, 0x68, 0x5e, 0x0b, 0xa0, 0x75, 0xf7, +0x8b, 0x66, 0xb2, 0x0f, 0x40, 0xb5, 0x00, 0xa0, +0xe9, 0xda, 0x57, 0xf3, 0x70, 0xf8, 0x7e, 0x3c, +0x3c, 0x45, 0xa1, 0x90, 0xb9, 0xd9, 0xd9, 0xe5, +0xe4, 0xe4, 0xd8, 0x4a, 0xc4, 0x42, 0x5b, 0x61, +0xca, 0x57, 0x7d, 0xfe, 0x67, 0xc2, 0x5f, 0xc0, +0x57, 0xfd, 0x6c, 0xf9, 0x7e, 0x3c, 0xfc, 0xf7, +0xf5, 0xe0, 0xbe, 0xe2, 0x24, 0x81, 0x32, 0x5d, +0x81, 0x47, 0x04, 0xf8, 0xe0, 0xc2, 0xcc, 0xf4, +0x4c, 0xa5, 0x1c, 0xcf, 0x92, 0x09, 0x84, 0x62, +0xdc, 0xe6, 0x8f, 0x47, 0xfc, 0xb7, 0x0b, 0xff, +0xfc, 0x1d, 0xd3, 0x22, 0xc4, 0x49, 0x62, 0xb9, +0x58, 0x2a, 0x14, 0xe3, 0x51, 0x12, 0x71, 0x8e, +0x44, 0x9a, 0x8c, 0xf3, 0x32, 0xa5, 0x22, 0x89, +0x42, 0x92, 0x29, 0xc5, 0x25, 0xd2, 0xff, 0x64, +0xe2, 0xdf, 0x2c, 0xfb, 0x03, 0x3e, 0xdf, 0x35, +0x00, 0xb0, 0x6a, 0x3e, 0x01, 0x7b, 0x91, 0x2d, +0xa8, 0x5d, 0x63, 0x03, 0xf6, 0x4b, 0x27, 0x10, +0x58, 0x74, 0xc0, 0xe2, 0xf7, 0x00, 0x00, 0xf2, +0xbb, 0x6f, 0xc1, 0xd4, 0x28, 0x08, 0x03, 0x80, +0x68, 0x83, 0xe1, 0xcf, 0x77, 0xff, 0xef, 0x3f, +0xfd, 0x47, 0xa0, 0x25, 0x00, 0x80, 0x66, 0x49, +0x92, 0x71, 0x00, 0x00, 0x5e, 0x44, 0x24, 0x2e, +0x54, 0xca, 0xb3, 0x3f, 0xc7, 0x08, 0x00, 0x00, +0x44, 0xa0, 0x81, 0x2a, 0xb0, 0x41, 0x1b, 0xf4, +0xc1, 0x18, 0x2c, 0xc0, 0x06, 0x1c, 0xc1, 0x05, +0xdc, 0xc1, 0x0b, 0xfc, 0x60, 0x36, 0x84, 0x42, +0x24, 0xc4, 0xc2, 0x42, 0x10, 0x42, 0x0a, 0x64, +0x80, 0x1c, 0x72, 0x60, 0x29, 0xac, 0x82, 0x42, +0x28, 0x86, 0xcd, 0xb0, 0x1d, 0x2a, 0x60, 0x2f, +0xd4, 0x40, 0x1d, 0x34, 0xc0, 0x51, 0x68, 0x86, +0x93, 0x70, 0x0e, 0x2e, 0xc2, 0x55, 0xb8, 0x0e, +0x3d, 0x70, 0x0f, 0xfa, 0x61, 0x08, 0x9e, 0xc1, +0x28, 0xbc, 0x81, 0x09, 0x04, 0x41, 0xc8, 0x08, +0x13, 0x61, 0x21, 0xda, 0x88, 0x01, 0x62, 0x8a, +0x58, 0x23, 0x8e, 0x08, 0x17, 0x99, 0x85, 0xf8, +0x21, 0xc1, 0x48, 0x04, 0x12, 0x8b, 0x24, 0x20, +0xc9, 0x88, 0x14, 0x51, 0x22, 0x4b, 0x91, 0x35, +0x48, 0x31, 0x52, 0x8a, 0x54, 0x20, 0x55, 0x48, +0x1d, 0xf2, 0x3d, 0x72, 0x02, 0x39, 0x87, 0x5c, +0x46, 0xba, 0x91, 0x3b, 0xc8, 0x00, 0x32, 0x82, +0xfc, 0x86, 0xbc, 0x47, 0x31, 0x94, 0x81, 0xb2, +0x51, 0x3d, 0xd4, 0x0c, 0xb5, 0x43, 0xb9, 0xa8, +0x37, 0x1a, 0x84, 0x46, 0xa2, 0x0b, 0xd0, 0x64, +0x74, 0x31, 0x9a, 0x8f, 0x16, 0xa0, 0x9b, 0xd0, +0x72, 0xb4, 0x1a, 0x3d, 0x8c, 0x36, 0xa1, 0xe7, +0xd0, 0xab, 0x68, 0x0f, 0xda, 0x8f, 0x3e, 0x43, +0xc7, 0x30, 0xc0, 0xe8, 0x18, 0x07, 0x33, 0xc4, +0x6c, 0x30, 0x2e, 0xc6, 0xc3, 0x42, 0xb1, 0x38, +0x2c, 0x09, 0x93, 0x63, 0xcb, 0xb1, 0x22, 0xac, +0x0c, 0xab, 0xc6, 0x1a, 0xb0, 0x56, 0xac, 0x03, +0xbb, 0x89, 0xf5, 0x63, 0xcf, 0xb1, 0x77, 0x04, +0x12, 0x81, 0x45, 0xc0, 0x09, 0x36, 0x04, 0x77, +0x42, 0x20, 0x61, 0x1e, 0x41, 0x48, 0x58, 0x4c, +0x58, 0x4e, 0xd8, 0x48, 0xa8, 0x20, 0x1c, 0x24, +0x34, 0x11, 0xda, 0x09, 0x37, 0x09, 0x03, 0x84, +0x51, 0xc2, 0x27, 0x22, 0x93, 0xa8, 0x4b, 0xb4, +0x26, 0xba, 0x11, 0xf9, 0xc4, 0x18, 0x62, 0x32, +0x31, 0x87, 0x58, 0x48, 0x2c, 0x23, 0xd6, 0x12, +0x8f, 0x13, 0x2f, 0x10, 0x7b, 0x88, 0x43, 0xc4, +0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xb9, +0x90, 0x02, 0x49, 0xb1, 0xa4, 0x54, 0xd2, 0x12, +0xd2, 0x46, 0xd2, 0x6e, 0x52, 0x23, 0xe9, 0x2c, +0xa9, 0x9b, 0x34, 0x48, 0x1a, 0x23, 0x93, 0xc9, +0xda, 0x64, 0x6b, 0xb2, 0x07, 0x39, 0x94, 0x2c, +0x20, 0x2b, 0xc8, 0x85, 0xe4, 0x9d, 0xe4, 0xc3, +0xe4, 0x33, 0xe4, 0x1b, 0xe4, 0x21, 0xf2, 0x5b, +0x0a, 0x9d, 0x62, 0x40, 0x71, 0xa4, 0xf8, 0x53, +0xe2, 0x28, 0x52, 0xca, 0x6a, 0x4a, 0x19, 0xe5, +0x10, 0xe5, 0x34, 0xe5, 0x06, 0x65, 0x98, 0x32, +0x41, 0x55, 0xa3, 0x9a, 0x52, 0xdd, 0xa8, 0xa1, +0x54, 0x11, 0x35, 0x8f, 0x5a, 0x42, 0xad, 0xa1, +0xb6, 0x52, 0xaf, 0x51, 0x87, 0xa8, 0x13, 0x34, +0x75, 0x9a, 0x39, 0xcd, 0x83, 0x16, 0x49, 0x4b, +0xa5, 0xad, 0xa2, 0x95, 0xd3, 0x1a, 0x68, 0x17, +0x68, 0xf7, 0x69, 0xaf, 0xe8, 0x74, 0xba, 0x11, +0xdd, 0x95, 0x1e, 0x4e, 0x97, 0xd0, 0x57, 0xd2, +0xcb, 0xe9, 0x47, 0xe8, 0x97, 0xe8, 0x03, 0xf4, +0x77, 0x0c, 0x0d, 0x86, 0x15, 0x83, 0xc7, 0x88, +0x67, 0x28, 0x19, 0x9b, 0x18, 0x07, 0x18, 0x67, +0x19, 0x77, 0x18, 0xaf, 0x98, 0x4c, 0xa6, 0x19, +0xd3, 0x8b, 0x19, 0xc7, 0x54, 0x30, 0x37, 0x31, +0xeb, 0x98, 0xe7, 0x99, 0x0f, 0x99, 0x6f, 0x55, +0x58, 0x2a, 0xb6, 0x2a, 0x7c, 0x15, 0x91, 0xca, +0x0a, 0x95, 0x4a, 0x95, 0x26, 0x95, 0x1b, 0x2a, +0x2f, 0x54, 0xa9, 0xaa, 0xa6, 0xaa, 0xde, 0xaa, +0x0b, 0x55, 0xf3, 0x55, 0xcb, 0x54, 0x8f, 0xa9, +0x5e, 0x53, 0x7d, 0xae, 0x46, 0x55, 0x33, 0x53, +0xe3, 0xa9, 0x09, 0xd4, 0x96, 0xab, 0x55, 0xaa, +0x9d, 0x50, 0xeb, 0x53, 0x1b, 0x53, 0x67, 0xa9, +0x3b, 0xa8, 0x87, 0xaa, 0x67, 0xa8, 0x6f, 0x54, +0x3f, 0xa4, 0x7e, 0x59, 0xfd, 0x89, 0x06, 0x59, +0xc3, 0x4c, 0xc3, 0x4f, 0x43, 0xa4, 0x51, 0xa0, +0xb1, 0x5f, 0xe3, 0xbc, 0xc6, 0x20, 0x0b, 0x63, +0x19, 0xb3, 0x78, 0x2c, 0x21, 0x6b, 0x0d, 0xab, +0x86, 0x75, 0x81, 0x35, 0xc4, 0x26, 0xb1, 0xcd, +0xd9, 0x7c, 0x76, 0x2a, 0xbb, 0x98, 0xfd, 0x1d, +0xbb, 0x8b, 0x3d, 0xaa, 0xa9, 0xa1, 0x39, 0x43, +0x33, 0x4a, 0x33, 0x57, 0xb3, 0x52, 0xf3, 0x94, +0x66, 0x3f, 0x07, 0xe3, 0x98, 0x71, 0xf8, 0x9c, +0x74, 0x4e, 0x09, 0xe7, 0x28, 0xa7, 0x97, 0xf3, +0x7e, 0x8a, 0xde, 0x14, 0xef, 0x29, 0xe2, 0x29, +0x1b, 0xa6, 0x34, 0x4c, 0xb9, 0x31, 0x65, 0x5c, +0x6b, 0xaa, 0x96, 0x97, 0x96, 0x58, 0xab, 0x48, +0xab, 0x51, 0xab, 0x47, 0xeb, 0xbd, 0x36, 0xae, +0xed, 0xa7, 0x9d, 0xa6, 0xbd, 0x45, 0xbb, 0x59, +0xfb, 0x81, 0x0e, 0x41, 0xc7, 0x4a, 0x27, 0x5c, +0x27, 0x47, 0x67, 0x8f, 0xce, 0x05, 0x9d, 0xe7, +0x53, 0xd9, 0x53, 0xdd, 0xa7, 0x0a, 0xa7, 0x16, +0x4d, 0x3d, 0x3a, 0xf5, 0xae, 0x2e, 0xaa, 0x6b, +0xa5, 0x1b, 0xa1, 0xbb, 0x44, 0x77, 0xbf, 0x6e, +0xa7, 0xee, 0x98, 0x9e, 0xbe, 0x5e, 0x80, 0x9e, +0x4c, 0x6f, 0xa7, 0xde, 0x79, 0xbd, 0xe7, 0xfa, +0x1c, 0x7d, 0x2f, 0xfd, 0x54, 0xfd, 0x6d, 0xfa, +0xa7, 0xf5, 0x47, 0x0c, 0x58, 0x06, 0xb3, 0x0c, +0x24, 0x06, 0xdb, 0x0c, 0xce, 0x18, 0x3c, 0xc5, +0x35, 0x71, 0x6f, 0x3c, 0x1d, 0x2f, 0xc7, 0xdb, +0xf1, 0x51, 0x43, 0x5d, 0xc3, 0x40, 0x43, 0xa5, +0x61, 0x95, 0x61, 0x97, 0xe1, 0x84, 0x91, 0xb9, +0xd1, 0x3c, 0xa3, 0xd5, 0x46, 0x8d, 0x46, 0x0f, +0x8c, 0x69, 0xc6, 0x5c, 0xe3, 0x24, 0xe3, 0x6d, +0xc6, 0x6d, 0xc6, 0xa3, 0x26, 0x06, 0x26, 0x21, +0x26, 0x4b, 0x4d, 0xea, 0x4d, 0xee, 0x9a, 0x52, +0x4d, 0xb9, 0xa6, 0x29, 0xa6, 0x3b, 0x4c, 0x3b, +0x4c, 0xc7, 0xcd, 0xcc, 0xcd, 0xa2, 0xcd, 0xd6, +0x99, 0x35, 0x9b, 0x3d, 0x31, 0xd7, 0x32, 0xe7, +0x9b, 0xe7, 0x9b, 0xd7, 0x9b, 0xdf, 0xb7, 0x60, +0x5a, 0x78, 0x5a, 0x2c, 0xb6, 0xa8, 0xb6, 0xb8, +0x65, 0x49, 0xb2, 0xe4, 0x5a, 0xa6, 0x59, 0xee, +0xb6, 0xbc, 0x6e, 0x85, 0x5a, 0x39, 0x59, 0xa5, +0x58, 0x55, 0x5a, 0x5d, 0xb3, 0x46, 0xad, 0x9d, +0xad, 0x25, 0xd6, 0xbb, 0xad, 0xbb, 0xa7, 0x11, +0xa7, 0xb9, 0x4e, 0x93, 0x4e, 0xab, 0x9e, 0xd6, +0x67, 0xc3, 0xb0, 0xf1, 0xb6, 0xc9, 0xb6, 0xa9, +0xb7, 0x19, 0xb0, 0xe5, 0xd8, 0x06, 0xdb, 0xae, +0xb6, 0x6d, 0xb6, 0x7d, 0x61, 0x67, 0x62, 0x17, +0x67, 0xb7, 0xc5, 0xae, 0xc3, 0xee, 0x93, 0xbd, +0x93, 0x7d, 0xba, 0x7d, 0x8d, 0xfd, 0x3d, 0x07, +0x0d, 0x87, 0xd9, 0x0e, 0xab, 0x1d, 0x5a, 0x1d, +0x7e, 0x73, 0xb4, 0x72, 0x14, 0x3a, 0x56, 0x3a, +0xde, 0x9a, 0xce, 0x9c, 0xee, 0x3f, 0x7d, 0xc5, +0xf4, 0x96, 0xe9, 0x2f, 0x67, 0x58, 0xcf, 0x10, +0xcf, 0xd8, 0x33, 0xe3, 0xb6, 0x13, 0xcb, 0x29, +0xc4, 0x69, 0x9d, 0x53, 0x9b, 0xd3, 0x47, 0x67, +0x17, 0x67, 0xb9, 0x73, 0x83, 0xf3, 0x88, 0x8b, +0x89, 0x4b, 0x82, 0xcb, 0x2e, 0x97, 0x3e, 0x2e, +0x9b, 0x1b, 0xc6, 0xdd, 0xc8, 0xbd, 0xe4, 0x4a, +0x74, 0xf5, 0x71, 0x5d, 0xe1, 0x7a, 0xd2, 0xf5, +0x9d, 0x9b, 0xb3, 0x9b, 0xc2, 0xed, 0xa8, 0xdb, +0xaf, 0xee, 0x36, 0xee, 0x69, 0xee, 0x87, 0xdc, +0x9f, 0xcc, 0x34, 0x9f, 0x29, 0x9e, 0x59, 0x33, +0x73, 0xd0, 0xc3, 0xc8, 0x43, 0xe0, 0x51, 0xe5, +0xd1, 0x3f, 0x0b, 0x9f, 0x95, 0x30, 0x6b, 0xdf, +0xac, 0x7e, 0x4f, 0x43, 0x4f, 0x81, 0x67, 0xb5, +0xe7, 0x23, 0x2f, 0x63, 0x2f, 0x91, 0x57, 0xad, +0xd7, 0xb0, 0xb7, 0xa5, 0x77, 0xaa, 0xf7, 0x61, +0xef, 0x17, 0x3e, 0xf6, 0x3e, 0x72, 0x9f, 0xe3, +0x3e, 0xe3, 0x3c, 0x37, 0xde, 0x32, 0xde, 0x59, +0x5f, 0xcc, 0x37, 0xc0, 0xb7, 0xc8, 0xb7, 0xcb, +0x4f, 0xc3, 0x6f, 0x9e, 0x5f, 0x85, 0xdf, 0x43, +0x7f, 0x23, 0xff, 0x64, 0xff, 0x7a, 0xff, 0xd1, +0x00, 0xa7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, +0x81, 0x41, 0x81, 0x5b, 0x02, 0xfb, 0xf8, 0x7a, +0x7c, 0x21, 0xbf, 0x8e, 0x3f, 0x3a, 0xdb, 0x65, +0xf6, 0xb2, 0xd9, 0xed, 0x41, 0x8c, 0xa0, 0xb9, +0x41, 0x15, 0x41, 0x8f, 0x82, 0xad, 0x82, 0xe5, +0xc1, 0xad, 0x21, 0x68, 0xc8, 0xec, 0x90, 0xad, +0x21, 0xf7, 0xe7, 0x98, 0xce, 0x91, 0xce, 0x69, +0x0e, 0x85, 0x50, 0x7e, 0xe8, 0xd6, 0xd0, 0x07, +0x61, 0xe6, 0x61, 0x8b, 0xc3, 0x7e, 0x0c, 0x27, +0x85, 0x87, 0x85, 0x57, 0x86, 0x3f, 0x8e, 0x70, +0x88, 0x58, 0x1a, 0xd1, 0x31, 0x97, 0x35, 0x77, +0xd1, 0xdc, 0x43, 0x73, 0xdf, 0x44, 0xfa, 0x44, +0x96, 0x44, 0xde, 0x9b, 0x67, 0x31, 0x4f, 0x39, +0xaf, 0x2d, 0x4a, 0x35, 0x2a, 0x3e, 0xaa, 0x2e, +0x6a, 0x3c, 0xda, 0x37, 0xba, 0x34, 0xba, 0x3f, +0xc6, 0x2e, 0x66, 0x59, 0xcc, 0xd5, 0x58, 0x9d, +0x58, 0x49, 0x6c, 0x4b, 0x1c, 0x39, 0x2e, 0x2a, +0xae, 0x36, 0x6e, 0x6c, 0xbe, 0xdf, 0xfc, 0xed, +0xf3, 0x87, 0xe2, 0x9d, 0xe2, 0x0b, 0xe3, 0x7b, +0x17, 0x98, 0x2f, 0xc8, 0x5d, 0x70, 0x79, 0xa1, +0xce, 0xc2, 0xf4, 0x85, 0xa7, 0x16, 0xa9, 0x2e, +0x12, 0x2c, 0x3a, 0x96, 0x40, 0x4c, 0x88, 0x4e, +0x38, 0x94, 0xf0, 0x41, 0x10, 0x2a, 0xa8, 0x16, +0x8c, 0x25, 0xf2, 0x13, 0x77, 0x25, 0x8e, 0x0a, +0x79, 0xc2, 0x1d, 0xc2, 0x67, 0x22, 0x2f, 0xd1, +0x36, 0xd1, 0x88, 0xd8, 0x43, 0x5c, 0x2a, 0x1e, +0x4e, 0xf2, 0x48, 0x2a, 0x4d, 0x7a, 0x92, 0xec, +0x91, 0xbc, 0x35, 0x79, 0x24, 0xc5, 0x33, 0xa5, +0x2c, 0xe5, 0xb9, 0x84, 0x27, 0xa9, 0x90, 0xbc, +0x4c, 0x0d, 0x4c, 0xdd, 0x9b, 0x3a, 0x9e, 0x16, +0x9a, 0x76, 0x20, 0x6d, 0x32, 0x3d, 0x3a, 0xbd, +0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xaa, +0x21, 0x4d, 0x93, 0xb6, 0x67, 0xea, 0x67, 0xe6, +0x66, 0x76, 0xcb, 0xac, 0x65, 0x85, 0xb2, 0xfe, +0xc5, 0x6e, 0x8b, 0xb7, 0x2f, 0x1e, 0x95, 0x07, +0xc9, 0x6b, 0xb3, 0x90, 0xac, 0x05, 0x59, 0x2d, +0x0a, 0xb6, 0x42, 0xa6, 0xe8, 0x54, 0x5a, 0x28, +0xd7, 0x2a, 0x07, 0xb2, 0x67, 0x65, 0x57, 0x66, +0xbf, 0xcd, 0x89, 0xca, 0x39, 0x96, 0xab, 0x9e, +0x2b, 0xcd, 0xed, 0xcc, 0xb3, 0xca, 0xdb, 0x90, +0x37, 0x9c, 0xef, 0x9f, 0xff, 0xed, 0x12, 0xc2, +0x12, 0xe1, 0x92, 0xb6, 0xa5, 0x86, 0x4b, 0x57, +0x2d, 0x1d, 0x58, 0xe6, 0xbd, 0xac, 0x6a, 0x39, +0xb2, 0x3c, 0x71, 0x79, 0xdb, 0x0a, 0xe3, 0x15, +0x05, 0x2b, 0x86, 0x56, 0x06, 0xac, 0x3c, 0xb8, +0x8a, 0xb6, 0x2a, 0x6d, 0xd5, 0x4f, 0xab, 0xed, +0x57, 0x97, 0xae, 0x7e, 0xbd, 0x26, 0x7a, 0x4d, +0x6b, 0x81, 0x5e, 0xc1, 0xca, 0x82, 0xc1, 0xb5, +0x01, 0x6b, 0xeb, 0x0b, 0x55, 0x0a, 0xe5, 0x85, +0x7d, 0xeb, 0xdc, 0xd7, 0xed, 0x5d, 0x4f, 0x58, +0x2f, 0x59, 0xdf, 0xb5, 0x61, 0xfa, 0x86, 0x9d, +0x1b, 0x3e, 0x15, 0x89, 0x8a, 0xae, 0x14, 0xdb, +0x17, 0x97, 0x15, 0x7f, 0xd8, 0x28, 0xdc, 0x78, +0xe5, 0x1b, 0x87, 0x6f, 0xca, 0xbf, 0x99, 0xdc, +0x94, 0xb4, 0xa9, 0xab, 0xc4, 0xb9, 0x64, 0xcf, +0x66, 0xd2, 0x66, 0xe9, 0xe6, 0xde, 0x2d, 0x9e, +0x5b, 0x0e, 0x96, 0xaa, 0x97, 0xe6, 0x97, 0x0e, +0x6e, 0x0d, 0xd9, 0xda, 0xb4, 0x0d, 0xdf, 0x56, +0xb4, 0xed, 0xf5, 0xf6, 0x45, 0xdb, 0x2f, 0x97, +0xcd, 0x28, 0xdb, 0xbb, 0x83, 0xb6, 0x43, 0xb9, +0xa3, 0xbf, 0x3c, 0xb8, 0xbc, 0x65, 0xa7, 0xc9, +0xce, 0xcd, 0x3b, 0x3f, 0x54, 0xa4, 0x54, 0xf4, +0x54, 0xfa, 0x54, 0x36, 0xee, 0xd2, 0xdd, 0xb5, +0x61, 0xd7, 0xf8, 0x6e, 0xd1, 0xee, 0x1b, 0x7b, +0xbc, 0xf6, 0x34, 0xec, 0xd5, 0xdb, 0x5b, 0xbc, +0xf7, 0xfd, 0x3e, 0xc9, 0xbe, 0xdb, 0x55, 0x01, +0x55, 0x4d, 0xd5, 0x66, 0xd5, 0x65, 0xfb, 0x49, +0xfb, 0xb3, 0xf7, 0x3f, 0xae, 0x89, 0xaa, 0xe9, +0xf8, 0x96, 0xfb, 0x6d, 0x5d, 0xad, 0x4e, 0x6d, +0x71, 0xed, 0xc7, 0x03, 0xd2, 0x03, 0xfd, 0x07, +0x23, 0x0e, 0xb6, 0xd7, 0xb9, 0xd4, 0xd5, 0x1d, +0xd2, 0x3d, 0x54, 0x52, 0x8f, 0xd6, 0x2b, 0xeb, +0x47, 0x0e, 0xc7, 0x1f, 0xbe, 0xfe, 0x9d, 0xef, +0x77, 0x2d, 0x0d, 0x36, 0x0d, 0x55, 0x8d, 0x9c, +0xc6, 0xe2, 0x23, 0x70, 0x44, 0x79, 0xe4, 0xe9, +0xf7, 0x09, 0xdf, 0xf7, 0x1e, 0x0d, 0x3a, 0xda, +0x76, 0x8c, 0x7b, 0xac, 0xe1, 0x07, 0xd3, 0x1f, +0x76, 0x1d, 0x67, 0x1d, 0x2f, 0x6a, 0x42, 0x9a, +0xf2, 0x9a, 0x46, 0x9b, 0x53, 0x9a, 0xfb, 0x5b, +0x62, 0x5b, 0xba, 0x4f, 0xcc, 0x3e, 0xd1, 0xd6, +0xea, 0xde, 0x7a, 0xfc, 0x47, 0xdb, 0x1f, 0x0f, +0x9c, 0x34, 0x3c, 0x59, 0x79, 0x4a, 0xf3, 0x54, +0xc9, 0x69, 0xda, 0xe9, 0x82, 0xd3, 0x93, 0x67, +0xf2, 0xcf, 0x8c, 0x9d, 0x95, 0x9d, 0x7d, 0x7e, +0x2e, 0xf9, 0xdc, 0x60, 0xdb, 0xa2, 0xb6, 0x7b, +0xe7, 0x63, 0xce, 0xdf, 0x6a, 0x0f, 0x6f, 0xef, +0xba, 0x10, 0x74, 0xe1, 0xd2, 0x45, 0xff, 0x8b, +0xe7, 0x3b, 0xbc, 0x3b, 0xce, 0x5c, 0xf2, 0xb8, +0x74, 0xf2, 0xb2, 0xdb, 0xe5, 0x13, 0x57, 0xb8, +0x57, 0x9a, 0xaf, 0x3a, 0x5f, 0x6d, 0xea, 0x74, +0xea, 0x3c, 0xfe, 0x93, 0xd3, 0x4f, 0xc7, 0xbb, +0x9c, 0xbb, 0x9a, 0xae, 0xb9, 0x5c, 0x6b, 0xb9, +0xee, 0x7a, 0xbd, 0xb5, 0x7b, 0x66, 0xf7, 0xe9, +0x1b, 0x9e, 0x37, 0xce, 0xdd, 0xf4, 0xbd, 0x79, +0xf1, 0x16, 0xff, 0xd6, 0xd5, 0x9e, 0x39, 0x3d, +0xdd, 0xbd, 0xf3, 0x7a, 0x6f, 0xf7, 0xc5, 0xf7, +0xf5, 0xdf, 0x16, 0xdd, 0x7e, 0x72, 0x27, 0xfd, +0xce, 0xcb, 0xbb, 0xd9, 0x77, 0x27, 0xee, 0xad, +0xbc, 0x4f, 0xbc, 0x5f, 0xf4, 0x40, 0xed, 0x41, +0xd9, 0x43, 0xdd, 0x87, 0xd5, 0x3f, 0x5b, 0xfe, +0xdc, 0xd8, 0xef, 0xdc, 0x7f, 0x6a, 0xc0, 0x77, +0xa0, 0xf3, 0xd1, 0xdc, 0x47, 0xf7, 0x06, 0x85, +0x83, 0xcf, 0xfe, 0x91, 0xf5, 0x8f, 0x0f, 0x43, +0x05, 0x8f, 0x99, 0x8f, 0xcb, 0x86, 0x0d, 0x86, +0xeb, 0x9e, 0x38, 0x3e, 0x39, 0x39, 0xe2, 0x3f, +0x72, 0xfd, 0xe9, 0xfc, 0xa7, 0x43, 0xcf, 0x64, +0xcf, 0x26, 0x9e, 0x17, 0xfe, 0xa2, 0xfe, 0xcb, +0xae, 0x17, 0x16, 0x2f, 0x7e, 0xf8, 0xd5, 0xeb, +0xd7, 0xce, 0xd1, 0x98, 0xd1, 0xa1, 0x97, 0xf2, +0x97, 0x93, 0xbf, 0x6d, 0x7c, 0xa5, 0xfd, 0xea, +0xc0, 0xeb, 0x19, 0xaf, 0xdb, 0xc6, 0xc2, 0xc6, +0x1e, 0xbe, 0xc9, 0x78, 0x33, 0x31, 0x5e, 0xf4, +0x56, 0xfb, 0xed, 0xc1, 0x77, 0xdc, 0x77, 0x1d, +0xef, 0xa3, 0xdf, 0x0f, 0x4f, 0xe4, 0x7c, 0x20, +0x7f, 0x28, 0xff, 0x68, 0xf9, 0xb1, 0xf5, 0x53, +0xd0, 0xa7, 0xfb, 0x93, 0x19, 0x93, 0x93, 0xff, +0x04, 0x03, 0x98, 0xf3, 0xfc, 0x63, 0x33, 0x2d, +0xdb, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, +0x4d, 0x00, 0x00, 0x7a, 0x25, 0x00, 0x00, 0x80, +0x83, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0x80, +0xe9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, +0x60, 0x00, 0x00, 0x3a, 0x98, 0x00, 0x00, 0x17, +0x6f, 0x92, 0x5f, 0xc5, 0x46, 0x00, 0x00, 0x02, +0xbe, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, +0x99, 0x4f, 0x88, 0x4d, 0x71, 0x14, 0xc7, 0x3f, +0x6f, 0x64, 0x98, 0x99, 0x26, 0x4d, 0xcd, 0x34, +0x8a, 0x11, 0x76, 0x16, 0x63, 0xac, 0x64, 0x23, +0x25, 0x4d, 0x9a, 0x28, 0x65, 0xa3, 0x34, 0x65, +0xc1, 0x86, 0x8d, 0x94, 0x2c, 0xb0, 0xb1, 0x62, +0x23, 0x51, 0xa3, 0x2c, 0x10, 0x66, 0xca, 0x42, +0x09, 0x85, 0xd2, 0x8c, 0x05, 0x8a, 0xb2, 0x60, +0xca, 0xbf, 0xcd, 0x4c, 0x31, 0x83, 0x86, 0xf4, +0x30, 0x53, 0x5e, 0xf8, 0x5a, 0x38, 0xb7, 0x7e, +0xdd, 0x9e, 0x19, 0xd3, 0xdc, 0x7b, 0xdf, 0x9d, +0x79, 0xe7, 0x5b, 0xaf, 0xd7, 0xef, 0x9c, 0xdb, +0xbb, 0xf7, 0x7c, 0x7e, 0x7f, 0xce, 0x39, 0xf7, +0x15, 0x24, 0x51, 0xcd, 0xaa, 0xa1, 0xca, 0xe5, +0x00, 0x1c, 0x80, 0x03, 0x70, 0x00, 0x0e, 0xc0, +0x01, 0x38, 0x00, 0x07, 0xe0, 0x00, 0x1c, 0x80, +0x03, 0x70, 0x00, 0x0e, 0xc0, 0x01, 0x38, 0x00, +0x07, 0xe0, 0x00, 0x1c, 0x80, 0x03, 0x70, 0x00, +0x79, 0xd3, 0x62, 0x60, 0x03, 0xb0, 0xb4, 0xda, +0x00, 0x34, 0x02, 0x97, 0x81, 0x51, 0xe0, 0x3e, +0xf0, 0x16, 0xb8, 0x05, 0xb4, 0x25, 0x79, 0x93, +0x42, 0x4e, 0xff, 0x17, 0xa8, 0x03, 0xfa, 0x81, +0x75, 0x65, 0x7c, 0x63, 0xc0, 0x26, 0xe0, 0xf9, +0x5c, 0x5e, 0x01, 0x07, 0x83, 0xe0, 0x9f, 0x02, +0x67, 0x80, 0x71, 0x1b, 0xb7, 0x00, 0x7b, 0xe7, +0xea, 0x16, 0xa8, 0x05, 0xb6, 0x01, 0x3b, 0x6c, +0xfc, 0x1e, 0x58, 0x0f, 0xdc, 0x33, 0x1f, 0x40, +0x1f, 0x70, 0x18, 0x68, 0x48, 0xe4, 0x8e, 0x92, +0xf2, 0xf4, 0xe9, 0xd5, 0x5f, 0xfd, 0xb6, 0xef, +0x11, 0x49, 0xdb, 0x25, 0x95, 0x6c, 0xdc, 0x2b, +0x69, 0x9e, 0xa4, 0x0b, 0x92, 0x46, 0x25, 0xed, +0x9e, 0xe9, 0x3d, 0xf3, 0x14, 0x7c, 0x9b, 0x26, +0x57, 0x14, 0x7c, 0x77, 0x60, 0xbb, 0x33, 0xd3, +0xfb, 0xe6, 0x65, 0x0b, 0x1c, 0x03, 0xf6, 0x07, +0xe3, 0xbe, 0x98, 0x7f, 0x1c, 0xb8, 0x0b, 0x9c, +0x02, 0x2e, 0x99, 0xed, 0x07, 0x70, 0x60, 0x2e, +0x6c, 0x81, 0xe3, 0xb1, 0x99, 0x2e, 0x9a, 0xfd, +0xf4, 0x24, 0xab, 0xe1, 0x97, 0x6d, 0x0d, 0x66, +0xfb, 0x16, 0x68, 0x96, 0xf4, 0xae, 0x4c, 0x80, +0x1d, 0x92, 0x0a, 0x92, 0x8e, 0x06, 0xfb, 0x3f, +0xd2, 0xa8, 0xa4, 0xce, 0xa4, 0x9e, 0xa1, 0x92, +0x75, 0xc0, 0x4a, 0x60, 0x39, 0xb0, 0x10, 0x38, +0x07, 0x2c, 0x09, 0x7c, 0xcf, 0xac, 0xfa, 0x2b, +0x5a, 0x05, 0xb8, 0xc5, 0xd2, 0xdf, 0x6b, 0x2b, +0x86, 0x26, 0x66, 0x73, 0x21, 0xd4, 0x04, 0x9c, +0xb7, 0x74, 0x17, 0xe9, 0x23, 0xd0, 0x1a, 0xbb, +0xee, 0x11, 0xd0, 0x65, 0x10, 0x52, 0x53, 0xd6, +0x00, 0x1a, 0x81, 0x07, 0xc0, 0xea, 0xff, 0xbc, +0xfe, 0x09, 0xd0, 0x99, 0x26, 0x84, 0xac, 0xb3, +0xc0, 0x91, 0x20, 0xf8, 0x87, 0xc0, 0xc9, 0xd8, +0x72, 0xbe, 0x02, 0x8c, 0x04, 0xe3, 0xb5, 0x76, +0xf2, 0xa7, 0xa7, 0x8c, 0x0f, 0xbd, 0x21, 0x3b, +0xc8, 0x86, 0x24, 0xd5, 0x4a, 0xda, 0x69, 0x27, +0xba, 0x24, 0x9d, 0x95, 0xd4, 0x22, 0x69, 0x4d, +0x70, 0x30, 0x0e, 0x9a, 0x2d, 0xb5, 0x67, 0xca, +0x1a, 0xc0, 0x67, 0x0b, 0x6c, 0x58, 0xd2, 0xae, +0x58, 0xf0, 0x05, 0x49, 0x57, 0x25, 0x7d, 0x90, +0x74, 0x42, 0xd2, 0xed, 0xb4, 0x83, 0x4f, 0x12, +0x40, 0xbb, 0xa4, 0x1e, 0x9b, 0xd5, 0xd0, 0xbe, +0x48, 0xd2, 0x21, 0xcb, 0xe9, 0x5b, 0x25, 0x0d, +0x94, 0x49, 0x79, 0x51, 0xf0, 0xfb, 0x02, 0xdb, +0xf5, 0xac, 0x26, 0x25, 0xa9, 0xe0, 0xc7, 0xec, +0xc1, 0x6f, 0x04, 0x10, 0x5a, 0x25, 0xbd, 0x89, +0x05, 0xfb, 0x25, 0x36, 0xfe, 0x2a, 0x69, 0x8f, +0xd5, 0xf6, 0x91, 0xbe, 0x49, 0x5a, 0x31, 0x5b, +0x00, 0xd4, 0x48, 0x7a, 0x11, 0x0b, 0x2a, 0x82, +0x70, 0x51, 0xd3, 0x57, 0x49, 0xd2, 0xe6, 0x2c, +0xb7, 0x65, 0x12, 0x69, 0xb0, 0xdd, 0x5e, 0x5e, +0x34, 0x07, 0xb6, 0x9b, 0x40, 0x07, 0xb0, 0x6c, +0x1a, 0xbf, 0x33, 0x0c, 0x74, 0x5b, 0x9a, 0xcc, +0x4c, 0x49, 0xd5, 0x01, 0xe5, 0x20, 0x44, 0xea, +0xb2, 0x66, 0xe6, 0x5a, 0xcc, 0xff, 0x0a, 0xe8, +0xb1, 0xb7, 0x3f, 0x2f, 0xad, 0xd9, 0x29, 0x65, +0x5e, 0x8f, 0x26, 0xb8, 0x9c, 0xc2, 0xb3, 0x20, +0x5c, 0xd2, 0x4d, 0x93, 0xf8, 0xfb, 0x25, 0xd5, +0x57, 0xb2, 0x1f, 0x49, 0xb2, 0x10, 0x1a, 0x04, +0x36, 0x02, 0x9f, 0x02, 0xdb, 0x7c, 0x9b, 0xf9, +0xfa, 0x7f, 0xf8, 0x1b, 0xec, 0x9a, 0xca, 0x29, +0x05, 0xaa, 0x53, 0xcd, 0x74, 0xe4, 0x7f, 0x6c, +0x69, 0xb2, 0xa2, 0x1d, 0x69, 0x5a, 0xbd, 0x40, +0xb9, 0x33, 0x61, 0xc0, 0xba, 0xba, 0x09, 0x60, +0x95, 0xbd, 0xee, 0x2e, 0x52, 0x61, 0xa5, 0xd9, +0x0c, 0x4d, 0x05, 0x21, 0x17, 0x4a, 0xbb, 0x1b, +0xac, 0x03, 0x16, 0xc4, 0x6c, 0xdf, 0x81, 0x9f, +0xd5, 0x02, 0xc0, 0xff, 0x1b, 0x74, 0x00, 0x0e, +0xc0, 0x01, 0x38, 0x00, 0x07, 0xe0, 0x00, 0x1c, +0x80, 0x03, 0x70, 0x00, 0x0e, 0xc0, 0x01, 0x38, +0x00, 0x07, 0x90, 0x43, 0xfd, 0x19, 0x00, 0xb2, +0x95, 0x14, 0x60, 0x77, 0x8c, 0x0e, 0x76, 0x00, +0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, +0x42, 0x60, 0x82, +}; + +Byte byHERE_logo_white_transparent_rgb_24px[3266] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, +0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, +0x87, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, +0x73, 0x00, 0x00, 0x2e, 0x23, 0x00, 0x00, 0x2e, +0x23, 0x01, 0x78, 0xa5, 0x3f, 0x76, 0x00, 0x00, +0x0a, 0x4f, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, +0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x66, +0x69, 0x6c, 0x65, 0x00, 0x00, 0x78, 0xda, 0x9d, +0x53, 0x67, 0x54, 0x53, 0xe9, 0x16, 0x3d, 0xf7, +0xde, 0xf4, 0x42, 0x4b, 0x88, 0x80, 0x94, 0x4b, +0x6f, 0x52, 0x15, 0x08, 0x20, 0x52, 0x42, 0x8b, +0x80, 0x14, 0x91, 0x26, 0x2a, 0x21, 0x09, 0x10, +0x4a, 0x88, 0x21, 0xa1, 0xd9, 0x15, 0x51, 0xc1, +0x11, 0x45, 0x45, 0x04, 0x1b, 0xc8, 0xa0, 0x88, +0x03, 0x8e, 0x8e, 0x80, 0x8c, 0x15, 0x51, 0x2c, +0x0c, 0x8a, 0x0a, 0xd8, 0x07, 0xe4, 0x21, 0xa2, +0x8e, 0x83, 0xa3, 0x88, 0x8a, 0xca, 0xfb, 0xe1, +0x7b, 0xa3, 0x6b, 0xd6, 0xbc, 0xf7, 0xe6, 0xcd, +0xfe, 0xb5, 0xd7, 0x3e, 0xe7, 0xac, 0xf3, 0x9d, +0xb3, 0xcf, 0x07, 0xc0, 0x08, 0x0c, 0x96, 0x48, +0x33, 0x51, 0x35, 0x80, 0x0c, 0xa9, 0x42, 0x1e, +0x11, 0xe0, 0x83, 0xc7, 0xc4, 0xc6, 0xe1, 0xe4, +0x2e, 0x40, 0x81, 0x0a, 0x24, 0x70, 0x00, 0x10, +0x08, 0xb3, 0x64, 0x21, 0x73, 0xfd, 0x23, 0x01, +0x00, 0xf8, 0x7e, 0x3c, 0x3c, 0x2b, 0x22, 0xc0, +0x07, 0xbe, 0x00, 0x01, 0x78, 0xd3, 0x0b, 0x08, +0x00, 0xc0, 0x4d, 0x9b, 0xc0, 0x30, 0x1c, 0x87, +0xff, 0x0f, 0xea, 0x42, 0x99, 0x5c, 0x01, 0x80, +0x84, 0x01, 0xc0, 0x74, 0x91, 0x38, 0x4b, 0x08, +0x80, 0x14, 0x00, 0x40, 0x7a, 0x8e, 0x42, 0xa6, +0x00, 0x40, 0x46, 0x01, 0x80, 0x9d, 0x98, 0x26, +0x53, 0x00, 0xa0, 0x04, 0x00, 0x60, 0xcb, 0x63, +0x62, 0xe3, 0x00, 0x50, 0x2d, 0x00, 0x60, 0x27, +0x7f, 0xe6, 0xd3, 0x00, 0x80, 0x9d, 0xf8, 0x99, +0x7b, 0x01, 0x00, 0x5b, 0x94, 0x21, 0x15, 0x01, +0xa0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, +0x00, 0x68, 0x3b, 0x00, 0xac, 0xcf, 0x56, 0x8a, +0x45, 0x00, 0x58, 0x30, 0x00, 0x14, 0x66, 0x4b, +0xc4, 0x39, 0x00, 0xd8, 0x2d, 0x00, 0x30, 0x49, +0x57, 0x66, 0x48, 0x00, 0xb0, 0xb7, 0x00, 0xc0, +0xce, 0x10, 0x0b, 0xb2, 0x00, 0x08, 0x0c, 0x00, +0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7b, +0x00, 0x60, 0xc8, 0x23, 0x23, 0x78, 0x00, 0x84, +0x99, 0x00, 0x14, 0x46, 0xf2, 0x57, 0x3c, 0xf1, +0x2b, 0xae, 0x10, 0xe7, 0x2a, 0x00, 0x00, 0x78, +0x99, 0xb2, 0x3c, 0xb9, 0x24, 0x39, 0x45, 0x81, +0x5b, 0x08, 0x2d, 0x71, 0x07, 0x57, 0x57, 0x2e, +0x1e, 0x28, 0xce, 0x49, 0x17, 0x2b, 0x14, 0x36, +0x61, 0x02, 0x61, 0x9a, 0x40, 0x2e, 0xc2, 0x79, +0x99, 0x19, 0x32, 0x81, 0x34, 0x0f, 0xe0, 0xf3, +0xcc, 0x00, 0x00, 0xa0, 0x91, 0x15, 0x11, 0xe0, +0x83, 0xf3, 0xfd, 0x78, 0xce, 0x0e, 0xae, 0xce, +0xce, 0x36, 0x8e, 0xb6, 0x0e, 0x5f, 0x2d, 0xea, +0xbf, 0x06, 0xff, 0x22, 0x62, 0x62, 0xe3, 0xfe, +0xe5, 0xcf, 0xab, 0x70, 0x40, 0x00, 0x00, 0xe1, +0x74, 0x7e, 0xd1, 0xfe, 0x2c, 0x2f, 0xb3, 0x1a, +0x80, 0x3b, 0x06, 0x80, 0x6d, 0xfe, 0xa2, 0x25, +0xee, 0x04, 0x68, 0x5e, 0x0b, 0xa0, 0x75, 0xf7, +0x8b, 0x66, 0xb2, 0x0f, 0x40, 0xb5, 0x00, 0xa0, +0xe9, 0xda, 0x57, 0xf3, 0x70, 0xf8, 0x7e, 0x3c, +0x3c, 0x45, 0xa1, 0x90, 0xb9, 0xd9, 0xd9, 0xe5, +0xe4, 0xe4, 0xd8, 0x4a, 0xc4, 0x42, 0x5b, 0x61, +0xca, 0x57, 0x7d, 0xfe, 0x67, 0xc2, 0x5f, 0xc0, +0x57, 0xfd, 0x6c, 0xf9, 0x7e, 0x3c, 0xfc, 0xf7, +0xf5, 0xe0, 0xbe, 0xe2, 0x24, 0x81, 0x32, 0x5d, +0x81, 0x47, 0x04, 0xf8, 0xe0, 0xc2, 0xcc, 0xf4, +0x4c, 0xa5, 0x1c, 0xcf, 0x92, 0x09, 0x84, 0x62, +0xdc, 0xe6, 0x8f, 0x47, 0xfc, 0xb7, 0x0b, 0xff, +0xfc, 0x1d, 0xd3, 0x22, 0xc4, 0x49, 0x62, 0xb9, +0x58, 0x2a, 0x14, 0xe3, 0x51, 0x12, 0x71, 0x8e, +0x44, 0x9a, 0x8c, 0xf3, 0x32, 0xa5, 0x22, 0x89, +0x42, 0x92, 0x29, 0xc5, 0x25, 0xd2, 0xff, 0x64, +0xe2, 0xdf, 0x2c, 0xfb, 0x03, 0x3e, 0xdf, 0x35, +0x00, 0xb0, 0x6a, 0x3e, 0x01, 0x7b, 0x91, 0x2d, +0xa8, 0x5d, 0x63, 0x03, 0xf6, 0x4b, 0x27, 0x10, +0x58, 0x74, 0xc0, 0xe2, 0xf7, 0x00, 0x00, 0xf2, +0xbb, 0x6f, 0xc1, 0xd4, 0x28, 0x08, 0x03, 0x80, +0x68, 0x83, 0xe1, 0xcf, 0x77, 0xff, 0xef, 0x3f, +0xfd, 0x47, 0xa0, 0x25, 0x00, 0x80, 0x66, 0x49, +0x92, 0x71, 0x00, 0x00, 0x5e, 0x44, 0x24, 0x2e, +0x54, 0xca, 0xb3, 0x3f, 0xc7, 0x08, 0x00, 0x00, +0x44, 0xa0, 0x81, 0x2a, 0xb0, 0x41, 0x1b, 0xf4, +0xc1, 0x18, 0x2c, 0xc0, 0x06, 0x1c, 0xc1, 0x05, +0xdc, 0xc1, 0x0b, 0xfc, 0x60, 0x36, 0x84, 0x42, +0x24, 0xc4, 0xc2, 0x42, 0x10, 0x42, 0x0a, 0x64, +0x80, 0x1c, 0x72, 0x60, 0x29, 0xac, 0x82, 0x42, +0x28, 0x86, 0xcd, 0xb0, 0x1d, 0x2a, 0x60, 0x2f, +0xd4, 0x40, 0x1d, 0x34, 0xc0, 0x51, 0x68, 0x86, +0x93, 0x70, 0x0e, 0x2e, 0xc2, 0x55, 0xb8, 0x0e, +0x3d, 0x70, 0x0f, 0xfa, 0x61, 0x08, 0x9e, 0xc1, +0x28, 0xbc, 0x81, 0x09, 0x04, 0x41, 0xc8, 0x08, +0x13, 0x61, 0x21, 0xda, 0x88, 0x01, 0x62, 0x8a, +0x58, 0x23, 0x8e, 0x08, 0x17, 0x99, 0x85, 0xf8, +0x21, 0xc1, 0x48, 0x04, 0x12, 0x8b, 0x24, 0x20, +0xc9, 0x88, 0x14, 0x51, 0x22, 0x4b, 0x91, 0x35, +0x48, 0x31, 0x52, 0x8a, 0x54, 0x20, 0x55, 0x48, +0x1d, 0xf2, 0x3d, 0x72, 0x02, 0x39, 0x87, 0x5c, +0x46, 0xba, 0x91, 0x3b, 0xc8, 0x00, 0x32, 0x82, +0xfc, 0x86, 0xbc, 0x47, 0x31, 0x94, 0x81, 0xb2, +0x51, 0x3d, 0xd4, 0x0c, 0xb5, 0x43, 0xb9, 0xa8, +0x37, 0x1a, 0x84, 0x46, 0xa2, 0x0b, 0xd0, 0x64, +0x74, 0x31, 0x9a, 0x8f, 0x16, 0xa0, 0x9b, 0xd0, +0x72, 0xb4, 0x1a, 0x3d, 0x8c, 0x36, 0xa1, 0xe7, +0xd0, 0xab, 0x68, 0x0f, 0xda, 0x8f, 0x3e, 0x43, +0xc7, 0x30, 0xc0, 0xe8, 0x18, 0x07, 0x33, 0xc4, +0x6c, 0x30, 0x2e, 0xc6, 0xc3, 0x42, 0xb1, 0x38, +0x2c, 0x09, 0x93, 0x63, 0xcb, 0xb1, 0x22, 0xac, +0x0c, 0xab, 0xc6, 0x1a, 0xb0, 0x56, 0xac, 0x03, +0xbb, 0x89, 0xf5, 0x63, 0xcf, 0xb1, 0x77, 0x04, +0x12, 0x81, 0x45, 0xc0, 0x09, 0x36, 0x04, 0x77, +0x42, 0x20, 0x61, 0x1e, 0x41, 0x48, 0x58, 0x4c, +0x58, 0x4e, 0xd8, 0x48, 0xa8, 0x20, 0x1c, 0x24, +0x34, 0x11, 0xda, 0x09, 0x37, 0x09, 0x03, 0x84, +0x51, 0xc2, 0x27, 0x22, 0x93, 0xa8, 0x4b, 0xb4, +0x26, 0xba, 0x11, 0xf9, 0xc4, 0x18, 0x62, 0x32, +0x31, 0x87, 0x58, 0x48, 0x2c, 0x23, 0xd6, 0x12, +0x8f, 0x13, 0x2f, 0x10, 0x7b, 0x88, 0x43, 0xc4, +0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xb9, +0x90, 0x02, 0x49, 0xb1, 0xa4, 0x54, 0xd2, 0x12, +0xd2, 0x46, 0xd2, 0x6e, 0x52, 0x23, 0xe9, 0x2c, +0xa9, 0x9b, 0x34, 0x48, 0x1a, 0x23, 0x93, 0xc9, +0xda, 0x64, 0x6b, 0xb2, 0x07, 0x39, 0x94, 0x2c, +0x20, 0x2b, 0xc8, 0x85, 0xe4, 0x9d, 0xe4, 0xc3, +0xe4, 0x33, 0xe4, 0x1b, 0xe4, 0x21, 0xf2, 0x5b, +0x0a, 0x9d, 0x62, 0x40, 0x71, 0xa4, 0xf8, 0x53, +0xe2, 0x28, 0x52, 0xca, 0x6a, 0x4a, 0x19, 0xe5, +0x10, 0xe5, 0x34, 0xe5, 0x06, 0x65, 0x98, 0x32, +0x41, 0x55, 0xa3, 0x9a, 0x52, 0xdd, 0xa8, 0xa1, +0x54, 0x11, 0x35, 0x8f, 0x5a, 0x42, 0xad, 0xa1, +0xb6, 0x52, 0xaf, 0x51, 0x87, 0xa8, 0x13, 0x34, +0x75, 0x9a, 0x39, 0xcd, 0x83, 0x16, 0x49, 0x4b, +0xa5, 0xad, 0xa2, 0x95, 0xd3, 0x1a, 0x68, 0x17, +0x68, 0xf7, 0x69, 0xaf, 0xe8, 0x74, 0xba, 0x11, +0xdd, 0x95, 0x1e, 0x4e, 0x97, 0xd0, 0x57, 0xd2, +0xcb, 0xe9, 0x47, 0xe8, 0x97, 0xe8, 0x03, 0xf4, +0x77, 0x0c, 0x0d, 0x86, 0x15, 0x83, 0xc7, 0x88, +0x67, 0x28, 0x19, 0x9b, 0x18, 0x07, 0x18, 0x67, +0x19, 0x77, 0x18, 0xaf, 0x98, 0x4c, 0xa6, 0x19, +0xd3, 0x8b, 0x19, 0xc7, 0x54, 0x30, 0x37, 0x31, +0xeb, 0x98, 0xe7, 0x99, 0x0f, 0x99, 0x6f, 0x55, +0x58, 0x2a, 0xb6, 0x2a, 0x7c, 0x15, 0x91, 0xca, +0x0a, 0x95, 0x4a, 0x95, 0x26, 0x95, 0x1b, 0x2a, +0x2f, 0x54, 0xa9, 0xaa, 0xa6, 0xaa, 0xde, 0xaa, +0x0b, 0x55, 0xf3, 0x55, 0xcb, 0x54, 0x8f, 0xa9, +0x5e, 0x53, 0x7d, 0xae, 0x46, 0x55, 0x33, 0x53, +0xe3, 0xa9, 0x09, 0xd4, 0x96, 0xab, 0x55, 0xaa, +0x9d, 0x50, 0xeb, 0x53, 0x1b, 0x53, 0x67, 0xa9, +0x3b, 0xa8, 0x87, 0xaa, 0x67, 0xa8, 0x6f, 0x54, +0x3f, 0xa4, 0x7e, 0x59, 0xfd, 0x89, 0x06, 0x59, +0xc3, 0x4c, 0xc3, 0x4f, 0x43, 0xa4, 0x51, 0xa0, +0xb1, 0x5f, 0xe3, 0xbc, 0xc6, 0x20, 0x0b, 0x63, +0x19, 0xb3, 0x78, 0x2c, 0x21, 0x6b, 0x0d, 0xab, +0x86, 0x75, 0x81, 0x35, 0xc4, 0x26, 0xb1, 0xcd, +0xd9, 0x7c, 0x76, 0x2a, 0xbb, 0x98, 0xfd, 0x1d, +0xbb, 0x8b, 0x3d, 0xaa, 0xa9, 0xa1, 0x39, 0x43, +0x33, 0x4a, 0x33, 0x57, 0xb3, 0x52, 0xf3, 0x94, +0x66, 0x3f, 0x07, 0xe3, 0x98, 0x71, 0xf8, 0x9c, +0x74, 0x4e, 0x09, 0xe7, 0x28, 0xa7, 0x97, 0xf3, +0x7e, 0x8a, 0xde, 0x14, 0xef, 0x29, 0xe2, 0x29, +0x1b, 0xa6, 0x34, 0x4c, 0xb9, 0x31, 0x65, 0x5c, +0x6b, 0xaa, 0x96, 0x97, 0x96, 0x58, 0xab, 0x48, +0xab, 0x51, 0xab, 0x47, 0xeb, 0xbd, 0x36, 0xae, +0xed, 0xa7, 0x9d, 0xa6, 0xbd, 0x45, 0xbb, 0x59, +0xfb, 0x81, 0x0e, 0x41, 0xc7, 0x4a, 0x27, 0x5c, +0x27, 0x47, 0x67, 0x8f, 0xce, 0x05, 0x9d, 0xe7, +0x53, 0xd9, 0x53, 0xdd, 0xa7, 0x0a, 0xa7, 0x16, +0x4d, 0x3d, 0x3a, 0xf5, 0xae, 0x2e, 0xaa, 0x6b, +0xa5, 0x1b, 0xa1, 0xbb, 0x44, 0x77, 0xbf, 0x6e, +0xa7, 0xee, 0x98, 0x9e, 0xbe, 0x5e, 0x80, 0x9e, +0x4c, 0x6f, 0xa7, 0xde, 0x79, 0xbd, 0xe7, 0xfa, +0x1c, 0x7d, 0x2f, 0xfd, 0x54, 0xfd, 0x6d, 0xfa, +0xa7, 0xf5, 0x47, 0x0c, 0x58, 0x06, 0xb3, 0x0c, +0x24, 0x06, 0xdb, 0x0c, 0xce, 0x18, 0x3c, 0xc5, +0x35, 0x71, 0x6f, 0x3c, 0x1d, 0x2f, 0xc7, 0xdb, +0xf1, 0x51, 0x43, 0x5d, 0xc3, 0x40, 0x43, 0xa5, +0x61, 0x95, 0x61, 0x97, 0xe1, 0x84, 0x91, 0xb9, +0xd1, 0x3c, 0xa3, 0xd5, 0x46, 0x8d, 0x46, 0x0f, +0x8c, 0x69, 0xc6, 0x5c, 0xe3, 0x24, 0xe3, 0x6d, +0xc6, 0x6d, 0xc6, 0xa3, 0x26, 0x06, 0x26, 0x21, +0x26, 0x4b, 0x4d, 0xea, 0x4d, 0xee, 0x9a, 0x52, +0x4d, 0xb9, 0xa6, 0x29, 0xa6, 0x3b, 0x4c, 0x3b, +0x4c, 0xc7, 0xcd, 0xcc, 0xcd, 0xa2, 0xcd, 0xd6, +0x99, 0x35, 0x9b, 0x3d, 0x31, 0xd7, 0x32, 0xe7, +0x9b, 0xe7, 0x9b, 0xd7, 0x9b, 0xdf, 0xb7, 0x60, +0x5a, 0x78, 0x5a, 0x2c, 0xb6, 0xa8, 0xb6, 0xb8, +0x65, 0x49, 0xb2, 0xe4, 0x5a, 0xa6, 0x59, 0xee, +0xb6, 0xbc, 0x6e, 0x85, 0x5a, 0x39, 0x59, 0xa5, +0x58, 0x55, 0x5a, 0x5d, 0xb3, 0x46, 0xad, 0x9d, +0xad, 0x25, 0xd6, 0xbb, 0xad, 0xbb, 0xa7, 0x11, +0xa7, 0xb9, 0x4e, 0x93, 0x4e, 0xab, 0x9e, 0xd6, +0x67, 0xc3, 0xb0, 0xf1, 0xb6, 0xc9, 0xb6, 0xa9, +0xb7, 0x19, 0xb0, 0xe5, 0xd8, 0x06, 0xdb, 0xae, +0xb6, 0x6d, 0xb6, 0x7d, 0x61, 0x67, 0x62, 0x17, +0x67, 0xb7, 0xc5, 0xae, 0xc3, 0xee, 0x93, 0xbd, +0x93, 0x7d, 0xba, 0x7d, 0x8d, 0xfd, 0x3d, 0x07, +0x0d, 0x87, 0xd9, 0x0e, 0xab, 0x1d, 0x5a, 0x1d, +0x7e, 0x73, 0xb4, 0x72, 0x14, 0x3a, 0x56, 0x3a, +0xde, 0x9a, 0xce, 0x9c, 0xee, 0x3f, 0x7d, 0xc5, +0xf4, 0x96, 0xe9, 0x2f, 0x67, 0x58, 0xcf, 0x10, +0xcf, 0xd8, 0x33, 0xe3, 0xb6, 0x13, 0xcb, 0x29, +0xc4, 0x69, 0x9d, 0x53, 0x9b, 0xd3, 0x47, 0x67, +0x17, 0x67, 0xb9, 0x73, 0x83, 0xf3, 0x88, 0x8b, +0x89, 0x4b, 0x82, 0xcb, 0x2e, 0x97, 0x3e, 0x2e, +0x9b, 0x1b, 0xc6, 0xdd, 0xc8, 0xbd, 0xe4, 0x4a, +0x74, 0xf5, 0x71, 0x5d, 0xe1, 0x7a, 0xd2, 0xf5, +0x9d, 0x9b, 0xb3, 0x9b, 0xc2, 0xed, 0xa8, 0xdb, +0xaf, 0xee, 0x36, 0xee, 0x69, 0xee, 0x87, 0xdc, +0x9f, 0xcc, 0x34, 0x9f, 0x29, 0x9e, 0x59, 0x33, +0x73, 0xd0, 0xc3, 0xc8, 0x43, 0xe0, 0x51, 0xe5, +0xd1, 0x3f, 0x0b, 0x9f, 0x95, 0x30, 0x6b, 0xdf, +0xac, 0x7e, 0x4f, 0x43, 0x4f, 0x81, 0x67, 0xb5, +0xe7, 0x23, 0x2f, 0x63, 0x2f, 0x91, 0x57, 0xad, +0xd7, 0xb0, 0xb7, 0xa5, 0x77, 0xaa, 0xf7, 0x61, +0xef, 0x17, 0x3e, 0xf6, 0x3e, 0x72, 0x9f, 0xe3, +0x3e, 0xe3, 0x3c, 0x37, 0xde, 0x32, 0xde, 0x59, +0x5f, 0xcc, 0x37, 0xc0, 0xb7, 0xc8, 0xb7, 0xcb, +0x4f, 0xc3, 0x6f, 0x9e, 0x5f, 0x85, 0xdf, 0x43, +0x7f, 0x23, 0xff, 0x64, 0xff, 0x7a, 0xff, 0xd1, +0x00, 0xa7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, +0x81, 0x41, 0x81, 0x5b, 0x02, 0xfb, 0xf8, 0x7a, +0x7c, 0x21, 0xbf, 0x8e, 0x3f, 0x3a, 0xdb, 0x65, +0xf6, 0xb2, 0xd9, 0xed, 0x41, 0x8c, 0xa0, 0xb9, +0x41, 0x15, 0x41, 0x8f, 0x82, 0xad, 0x82, 0xe5, +0xc1, 0xad, 0x21, 0x68, 0xc8, 0xec, 0x90, 0xad, +0x21, 0xf7, 0xe7, 0x98, 0xce, 0x91, 0xce, 0x69, +0x0e, 0x85, 0x50, 0x7e, 0xe8, 0xd6, 0xd0, 0x07, +0x61, 0xe6, 0x61, 0x8b, 0xc3, 0x7e, 0x0c, 0x27, +0x85, 0x87, 0x85, 0x57, 0x86, 0x3f, 0x8e, 0x70, +0x88, 0x58, 0x1a, 0xd1, 0x31, 0x97, 0x35, 0x77, +0xd1, 0xdc, 0x43, 0x73, 0xdf, 0x44, 0xfa, 0x44, +0x96, 0x44, 0xde, 0x9b, 0x67, 0x31, 0x4f, 0x39, +0xaf, 0x2d, 0x4a, 0x35, 0x2a, 0x3e, 0xaa, 0x2e, +0x6a, 0x3c, 0xda, 0x37, 0xba, 0x34, 0xba, 0x3f, +0xc6, 0x2e, 0x66, 0x59, 0xcc, 0xd5, 0x58, 0x9d, +0x58, 0x49, 0x6c, 0x4b, 0x1c, 0x39, 0x2e, 0x2a, +0xae, 0x36, 0x6e, 0x6c, 0xbe, 0xdf, 0xfc, 0xed, +0xf3, 0x87, 0xe2, 0x9d, 0xe2, 0x0b, 0xe3, 0x7b, +0x17, 0x98, 0x2f, 0xc8, 0x5d, 0x70, 0x79, 0xa1, +0xce, 0xc2, 0xf4, 0x85, 0xa7, 0x16, 0xa9, 0x2e, +0x12, 0x2c, 0x3a, 0x96, 0x40, 0x4c, 0x88, 0x4e, +0x38, 0x94, 0xf0, 0x41, 0x10, 0x2a, 0xa8, 0x16, +0x8c, 0x25, 0xf2, 0x13, 0x77, 0x25, 0x8e, 0x0a, +0x79, 0xc2, 0x1d, 0xc2, 0x67, 0x22, 0x2f, 0xd1, +0x36, 0xd1, 0x88, 0xd8, 0x43, 0x5c, 0x2a, 0x1e, +0x4e, 0xf2, 0x48, 0x2a, 0x4d, 0x7a, 0x92, 0xec, +0x91, 0xbc, 0x35, 0x79, 0x24, 0xc5, 0x33, 0xa5, +0x2c, 0xe5, 0xb9, 0x84, 0x27, 0xa9, 0x90, 0xbc, +0x4c, 0x0d, 0x4c, 0xdd, 0x9b, 0x3a, 0x9e, 0x16, +0x9a, 0x76, 0x20, 0x6d, 0x32, 0x3d, 0x3a, 0xbd, +0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xaa, +0x21, 0x4d, 0x93, 0xb6, 0x67, 0xea, 0x67, 0xe6, +0x66, 0x76, 0xcb, 0xac, 0x65, 0x85, 0xb2, 0xfe, +0xc5, 0x6e, 0x8b, 0xb7, 0x2f, 0x1e, 0x95, 0x07, +0xc9, 0x6b, 0xb3, 0x90, 0xac, 0x05, 0x59, 0x2d, +0x0a, 0xb6, 0x42, 0xa6, 0xe8, 0x54, 0x5a, 0x28, +0xd7, 0x2a, 0x07, 0xb2, 0x67, 0x65, 0x57, 0x66, +0xbf, 0xcd, 0x89, 0xca, 0x39, 0x96, 0xab, 0x9e, +0x2b, 0xcd, 0xed, 0xcc, 0xb3, 0xca, 0xdb, 0x90, +0x37, 0x9c, 0xef, 0x9f, 0xff, 0xed, 0x12, 0xc2, +0x12, 0xe1, 0x92, 0xb6, 0xa5, 0x86, 0x4b, 0x57, +0x2d, 0x1d, 0x58, 0xe6, 0xbd, 0xac, 0x6a, 0x39, +0xb2, 0x3c, 0x71, 0x79, 0xdb, 0x0a, 0xe3, 0x15, +0x05, 0x2b, 0x86, 0x56, 0x06, 0xac, 0x3c, 0xb8, +0x8a, 0xb6, 0x2a, 0x6d, 0xd5, 0x4f, 0xab, 0xed, +0x57, 0x97, 0xae, 0x7e, 0xbd, 0x26, 0x7a, 0x4d, +0x6b, 0x81, 0x5e, 0xc1, 0xca, 0x82, 0xc1, 0xb5, +0x01, 0x6b, 0xeb, 0x0b, 0x55, 0x0a, 0xe5, 0x85, +0x7d, 0xeb, 0xdc, 0xd7, 0xed, 0x5d, 0x4f, 0x58, +0x2f, 0x59, 0xdf, 0xb5, 0x61, 0xfa, 0x86, 0x9d, +0x1b, 0x3e, 0x15, 0x89, 0x8a, 0xae, 0x14, 0xdb, +0x17, 0x97, 0x15, 0x7f, 0xd8, 0x28, 0xdc, 0x78, +0xe5, 0x1b, 0x87, 0x6f, 0xca, 0xbf, 0x99, 0xdc, +0x94, 0xb4, 0xa9, 0xab, 0xc4, 0xb9, 0x64, 0xcf, +0x66, 0xd2, 0x66, 0xe9, 0xe6, 0xde, 0x2d, 0x9e, +0x5b, 0x0e, 0x96, 0xaa, 0x97, 0xe6, 0x97, 0x0e, +0x6e, 0x0d, 0xd9, 0xda, 0xb4, 0x0d, 0xdf, 0x56, +0xb4, 0xed, 0xf5, 0xf6, 0x45, 0xdb, 0x2f, 0x97, +0xcd, 0x28, 0xdb, 0xbb, 0x83, 0xb6, 0x43, 0xb9, +0xa3, 0xbf, 0x3c, 0xb8, 0xbc, 0x65, 0xa7, 0xc9, +0xce, 0xcd, 0x3b, 0x3f, 0x54, 0xa4, 0x54, 0xf4, +0x54, 0xfa, 0x54, 0x36, 0xee, 0xd2, 0xdd, 0xb5, +0x61, 0xd7, 0xf8, 0x6e, 0xd1, 0xee, 0x1b, 0x7b, +0xbc, 0xf6, 0x34, 0xec, 0xd5, 0xdb, 0x5b, 0xbc, +0xf7, 0xfd, 0x3e, 0xc9, 0xbe, 0xdb, 0x55, 0x01, +0x55, 0x4d, 0xd5, 0x66, 0xd5, 0x65, 0xfb, 0x49, +0xfb, 0xb3, 0xf7, 0x3f, 0xae, 0x89, 0xaa, 0xe9, +0xf8, 0x96, 0xfb, 0x6d, 0x5d, 0xad, 0x4e, 0x6d, +0x71, 0xed, 0xc7, 0x03, 0xd2, 0x03, 0xfd, 0x07, +0x23, 0x0e, 0xb6, 0xd7, 0xb9, 0xd4, 0xd5, 0x1d, +0xd2, 0x3d, 0x54, 0x52, 0x8f, 0xd6, 0x2b, 0xeb, +0x47, 0x0e, 0xc7, 0x1f, 0xbe, 0xfe, 0x9d, 0xef, +0x77, 0x2d, 0x0d, 0x36, 0x0d, 0x55, 0x8d, 0x9c, +0xc6, 0xe2, 0x23, 0x70, 0x44, 0x79, 0xe4, 0xe9, +0xf7, 0x09, 0xdf, 0xf7, 0x1e, 0x0d, 0x3a, 0xda, +0x76, 0x8c, 0x7b, 0xac, 0xe1, 0x07, 0xd3, 0x1f, +0x76, 0x1d, 0x67, 0x1d, 0x2f, 0x6a, 0x42, 0x9a, +0xf2, 0x9a, 0x46, 0x9b, 0x53, 0x9a, 0xfb, 0x5b, +0x62, 0x5b, 0xba, 0x4f, 0xcc, 0x3e, 0xd1, 0xd6, +0xea, 0xde, 0x7a, 0xfc, 0x47, 0xdb, 0x1f, 0x0f, +0x9c, 0x34, 0x3c, 0x59, 0x79, 0x4a, 0xf3, 0x54, +0xc9, 0x69, 0xda, 0xe9, 0x82, 0xd3, 0x93, 0x67, +0xf2, 0xcf, 0x8c, 0x9d, 0x95, 0x9d, 0x7d, 0x7e, +0x2e, 0xf9, 0xdc, 0x60, 0xdb, 0xa2, 0xb6, 0x7b, +0xe7, 0x63, 0xce, 0xdf, 0x6a, 0x0f, 0x6f, 0xef, +0xba, 0x10, 0x74, 0xe1, 0xd2, 0x45, 0xff, 0x8b, +0xe7, 0x3b, 0xbc, 0x3b, 0xce, 0x5c, 0xf2, 0xb8, +0x74, 0xf2, 0xb2, 0xdb, 0xe5, 0x13, 0x57, 0xb8, +0x57, 0x9a, 0xaf, 0x3a, 0x5f, 0x6d, 0xea, 0x74, +0xea, 0x3c, 0xfe, 0x93, 0xd3, 0x4f, 0xc7, 0xbb, +0x9c, 0xbb, 0x9a, 0xae, 0xb9, 0x5c, 0x6b, 0xb9, +0xee, 0x7a, 0xbd, 0xb5, 0x7b, 0x66, 0xf7, 0xe9, +0x1b, 0x9e, 0x37, 0xce, 0xdd, 0xf4, 0xbd, 0x79, +0xf1, 0x16, 0xff, 0xd6, 0xd5, 0x9e, 0x39, 0x3d, +0xdd, 0xbd, 0xf3, 0x7a, 0x6f, 0xf7, 0xc5, 0xf7, +0xf5, 0xdf, 0x16, 0xdd, 0x7e, 0x72, 0x27, 0xfd, +0xce, 0xcb, 0xbb, 0xd9, 0x77, 0x27, 0xee, 0xad, +0xbc, 0x4f, 0xbc, 0x5f, 0xf4, 0x40, 0xed, 0x41, +0xd9, 0x43, 0xdd, 0x87, 0xd5, 0x3f, 0x5b, 0xfe, +0xdc, 0xd8, 0xef, 0xdc, 0x7f, 0x6a, 0xc0, 0x77, +0xa0, 0xf3, 0xd1, 0xdc, 0x47, 0xf7, 0x06, 0x85, +0x83, 0xcf, 0xfe, 0x91, 0xf5, 0x8f, 0x0f, 0x43, +0x05, 0x8f, 0x99, 0x8f, 0xcb, 0x86, 0x0d, 0x86, +0xeb, 0x9e, 0x38, 0x3e, 0x39, 0x39, 0xe2, 0x3f, +0x72, 0xfd, 0xe9, 0xfc, 0xa7, 0x43, 0xcf, 0x64, +0xcf, 0x26, 0x9e, 0x17, 0xfe, 0xa2, 0xfe, 0xcb, +0xae, 0x17, 0x16, 0x2f, 0x7e, 0xf8, 0xd5, 0xeb, +0xd7, 0xce, 0xd1, 0x98, 0xd1, 0xa1, 0x97, 0xf2, +0x97, 0x93, 0xbf, 0x6d, 0x7c, 0xa5, 0xfd, 0xea, +0xc0, 0xeb, 0x19, 0xaf, 0xdb, 0xc6, 0xc2, 0xc6, +0x1e, 0xbe, 0xc9, 0x78, 0x33, 0x31, 0x5e, 0xf4, +0x56, 0xfb, 0xed, 0xc1, 0x77, 0xdc, 0x77, 0x1d, +0xef, 0xa3, 0xdf, 0x0f, 0x4f, 0xe4, 0x7c, 0x20, +0x7f, 0x28, 0xff, 0x68, 0xf9, 0xb1, 0xf5, 0x53, +0xd0, 0xa7, 0xfb, 0x93, 0x19, 0x93, 0x93, 0xff, +0x04, 0x03, 0x98, 0xf3, 0xfc, 0x63, 0x33, 0x2d, +0xdb, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, +0x4d, 0x00, 0x00, 0x7a, 0x25, 0x00, 0x00, 0x80, +0x83, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0x80, +0xe9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, +0x60, 0x00, 0x00, 0x3a, 0x98, 0x00, 0x00, 0x17, +0x6f, 0x92, 0x5f, 0xc5, 0x46, 0x00, 0x00, 0x01, +0xed, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, +0x99, 0x3d, 0x68, 0x14, 0x51, 0x10, 0x80, 0xbf, +0x8b, 0xd1, 0x68, 0x12, 0x2c, 0x44, 0x1b, 0xbd, +0x2a, 0xd8, 0x89, 0x45, 0x1a, 0x1b, 0x2d, 0xc4, +0x4a, 0x10, 0xec, 0x62, 0xa5, 0x90, 0x22, 0xa4, +0x15, 0xc4, 0x42, 0x6d, 0xd2, 0x46, 0x6b, 0x9b, +0x14, 0x36, 0x62, 0x02, 0x8a, 0x22, 0xd8, 0x05, +0x22, 0x16, 0x56, 0x5a, 0x28, 0x88, 0x08, 0x81, +0x1c, 0x2a, 0x58, 0x18, 0x25, 0x85, 0x3f, 0xa8, +0x91, 0x24, 0x9f, 0xcd, 0x0b, 0x2c, 0x9b, 0x4b, +0x30, 0xeb, 0xee, 0x7a, 0x07, 0x33, 0xb0, 0xec, +0xce, 0xc0, 0xbe, 0x99, 0x6f, 0x76, 0xde, 0xbc, +0xb7, 0xbb, 0x0d, 0x95, 0x6e, 0x96, 0x1e, 0xba, +0x5c, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, +0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, +0x02, 0xa0, 0xeb, 0x00, 0xc6, 0x81, 0x05, 0x60, +0x11, 0x98, 0x02, 0xf6, 0x15, 0x1e, 0x49, 0xad, +0xfb, 0xb8, 0xea, 0x46, 0x59, 0x50, 0x9b, 0x45, +0xc6, 0xab, 0xfb, 0x09, 0x1c, 0x04, 0x26, 0x80, +0x15, 0x60, 0x04, 0xb8, 0x9d, 0xec, 0x3f, 0x81, +0xe5, 0x4e, 0x2f, 0xa1, 0x71, 0xe0, 0x0d, 0xd0, +0x07, 0x2c, 0x01, 0x03, 0xc0, 0x79, 0xe0, 0x05, +0x70, 0x06, 0xb8, 0x0f, 0x8c, 0x76, 0x6a, 0x09, +0xed, 0x56, 0x5b, 0x6d, 0x4a, 0xe7, 0x99, 0x7a, +0x40, 0xbd, 0x9b, 0xf4, 0xb9, 0xed, 0x8e, 0x5d, +0x47, 0xf0, 0x67, 0xd5, 0x8f, 0xea, 0x2f, 0xf5, +0xb5, 0x3a, 0x91, 0x01, 0x78, 0xa7, 0xbe, 0x4d, +0xd7, 0x4b, 0xea, 0xe1, 0x4e, 0x03, 0x18, 0x54, +0x3f, 0x67, 0x02, 0x6e, 0xa9, 0xbd, 0xea, 0xa4, +0xba, 0x9a, 0xb3, 0x0f, 0x17, 0xf1, 0xd1, 0xa8, +0xf0, 0xbb, 0xd0, 0x31, 0xe0, 0x04, 0xb0, 0x1f, +0xb8, 0x08, 0xf4, 0x27, 0xfb, 0x75, 0xe0, 0x0a, +0x30, 0x04, 0x1c, 0x4f, 0xf3, 0xe1, 0x71, 0xd1, +0x49, 0x5c, 0x55, 0xe6, 0x6f, 0xb8, 0xb5, 0x4c, +0x96, 0xe5, 0xab, 0x8a, 0xe0, 0xcf, 0xa5, 0x20, +0xbf, 0xab, 0x0f, 0xd4, 0xdf, 0x49, 0x7f, 0xa9, +0x7e, 0xc9, 0x40, 0x8c, 0x95, 0xe1, 0xaf, 0x8a, +0x36, 0x3a, 0x92, 0xce, 0x97, 0x81, 0x39, 0x60, +0x27, 0xf0, 0x1c, 0x18, 0x03, 0x2e, 0x01, 0x5f, +0x81, 0x27, 0xc0, 0x4c, 0x29, 0xde, 0x0a, 0x92, +0x1f, 0x55, 0x77, 0xe4, 0x6c, 0x43, 0xea, 0x21, +0xf5, 0x5e, 0xca, 0xf0, 0xab, 0x5c, 0xab, 0x7c, +0x9a, 0x26, 0xee, 0x35, 0xb5, 0xff, 0x7f, 0x96, +0xd0, 0x29, 0xf5, 0x87, 0x3a, 0x9d, 0x81, 0xb8, +0x99, 0x82, 0x5d, 0x4b, 0xdb, 0x82, 0x75, 0x59, +0x56, 0x2f, 0xa8, 0xb3, 0x99, 0x6e, 0x33, 0x50, +0x66, 0xc9, 0x6e, 0xf7, 0x86, 0x9e, 0x4c, 0x66, +0x4d, 0x10, 0xa7, 0xfd, 0x3b, 0x59, 0x54, 0x8f, +0x94, 0x3d, 0xe7, 0x8a, 0xdc, 0xd4, 0xcc, 0x65, +0x79, 0xbd, 0xcf, 0x3f, 0x54, 0xdf, 0x67, 0xec, +0x2b, 0xa9, 0x7c, 0xe6, 0xd5, 0xa9, 0x54, 0x5e, +0x74, 0x02, 0x40, 0x3b, 0x88, 0x35, 0x75, 0x6f, +0x1b, 0xfb, 0x23, 0x75, 0x57, 0x95, 0x8b, 0x65, +0xd1, 0x2e, 0xf4, 0x01, 0x38, 0x09, 0xb4, 0x92, +0xde, 0x00, 0xee, 0x00, 0x9f, 0x72, 0xf6, 0x41, +0xa0, 0xb7, 0xd2, 0x2d, 0xe2, 0x3f, 0x66, 0x60, +0xb3, 0x8c, 0x37, 0xd5, 0x5b, 0x65, 0x76, 0x9b, +0x2a, 0x17, 0xb2, 0xda, 0xcb, 0xa6, 0x8a, 0xbd, +0x50, 0x1f, 0xb0, 0x27, 0xa3, 0x7f, 0x03, 0x56, +0xeb, 0x78, 0xc9, 0x68, 0xc4, 0x4f, 0xbe, 0x00, +0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, +0x00, 0x28, 0x2e, 0x7f, 0x06, 0x00, 0x7e, 0x07, +0xde, 0xa0, 0x65, 0x46, 0xd5, 0x06, 0x00, 0x00, +0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, +0x60, 0x82, +}; + +Byte byHERE_logo_white_transparent_rgb_48px[3908] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, +0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, +0x08, 0x06, 0x00, 0x00, 0x00, 0xe2, 0x98, 0x77, +0x38, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, +0x73, 0x00, 0x00, 0x2e, 0x23, 0x00, 0x00, 0x2e, +0x23, 0x01, 0x78, 0xa5, 0x3f, 0x76, 0x00, 0x00, +0x0a, 0x4f, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, +0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x66, +0x69, 0x6c, 0x65, 0x00, 0x00, 0x78, 0xda, 0x9d, +0x53, 0x67, 0x54, 0x53, 0xe9, 0x16, 0x3d, 0xf7, +0xde, 0xf4, 0x42, 0x4b, 0x88, 0x80, 0x94, 0x4b, +0x6f, 0x52, 0x15, 0x08, 0x20, 0x52, 0x42, 0x8b, +0x80, 0x14, 0x91, 0x26, 0x2a, 0x21, 0x09, 0x10, +0x4a, 0x88, 0x21, 0xa1, 0xd9, 0x15, 0x51, 0xc1, +0x11, 0x45, 0x45, 0x04, 0x1b, 0xc8, 0xa0, 0x88, +0x03, 0x8e, 0x8e, 0x80, 0x8c, 0x15, 0x51, 0x2c, +0x0c, 0x8a, 0x0a, 0xd8, 0x07, 0xe4, 0x21, 0xa2, +0x8e, 0x83, 0xa3, 0x88, 0x8a, 0xca, 0xfb, 0xe1, +0x7b, 0xa3, 0x6b, 0xd6, 0xbc, 0xf7, 0xe6, 0xcd, +0xfe, 0xb5, 0xd7, 0x3e, 0xe7, 0xac, 0xf3, 0x9d, +0xb3, 0xcf, 0x07, 0xc0, 0x08, 0x0c, 0x96, 0x48, +0x33, 0x51, 0x35, 0x80, 0x0c, 0xa9, 0x42, 0x1e, +0x11, 0xe0, 0x83, 0xc7, 0xc4, 0xc6, 0xe1, 0xe4, +0x2e, 0x40, 0x81, 0x0a, 0x24, 0x70, 0x00, 0x10, +0x08, 0xb3, 0x64, 0x21, 0x73, 0xfd, 0x23, 0x01, +0x00, 0xf8, 0x7e, 0x3c, 0x3c, 0x2b, 0x22, 0xc0, +0x07, 0xbe, 0x00, 0x01, 0x78, 0xd3, 0x0b, 0x08, +0x00, 0xc0, 0x4d, 0x9b, 0xc0, 0x30, 0x1c, 0x87, +0xff, 0x0f, 0xea, 0x42, 0x99, 0x5c, 0x01, 0x80, +0x84, 0x01, 0xc0, 0x74, 0x91, 0x38, 0x4b, 0x08, +0x80, 0x14, 0x00, 0x40, 0x7a, 0x8e, 0x42, 0xa6, +0x00, 0x40, 0x46, 0x01, 0x80, 0x9d, 0x98, 0x26, +0x53, 0x00, 0xa0, 0x04, 0x00, 0x60, 0xcb, 0x63, +0x62, 0xe3, 0x00, 0x50, 0x2d, 0x00, 0x60, 0x27, +0x7f, 0xe6, 0xd3, 0x00, 0x80, 0x9d, 0xf8, 0x99, +0x7b, 0x01, 0x00, 0x5b, 0x94, 0x21, 0x15, 0x01, +0xa0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, +0x00, 0x68, 0x3b, 0x00, 0xac, 0xcf, 0x56, 0x8a, +0x45, 0x00, 0x58, 0x30, 0x00, 0x14, 0x66, 0x4b, +0xc4, 0x39, 0x00, 0xd8, 0x2d, 0x00, 0x30, 0x49, +0x57, 0x66, 0x48, 0x00, 0xb0, 0xb7, 0x00, 0xc0, +0xce, 0x10, 0x0b, 0xb2, 0x00, 0x08, 0x0c, 0x00, +0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7b, +0x00, 0x60, 0xc8, 0x23, 0x23, 0x78, 0x00, 0x84, +0x99, 0x00, 0x14, 0x46, 0xf2, 0x57, 0x3c, 0xf1, +0x2b, 0xae, 0x10, 0xe7, 0x2a, 0x00, 0x00, 0x78, +0x99, 0xb2, 0x3c, 0xb9, 0x24, 0x39, 0x45, 0x81, +0x5b, 0x08, 0x2d, 0x71, 0x07, 0x57, 0x57, 0x2e, +0x1e, 0x28, 0xce, 0x49, 0x17, 0x2b, 0x14, 0x36, +0x61, 0x02, 0x61, 0x9a, 0x40, 0x2e, 0xc2, 0x79, +0x99, 0x19, 0x32, 0x81, 0x34, 0x0f, 0xe0, 0xf3, +0xcc, 0x00, 0x00, 0xa0, 0x91, 0x15, 0x11, 0xe0, +0x83, 0xf3, 0xfd, 0x78, 0xce, 0x0e, 0xae, 0xce, +0xce, 0x36, 0x8e, 0xb6, 0x0e, 0x5f, 0x2d, 0xea, +0xbf, 0x06, 0xff, 0x22, 0x62, 0x62, 0xe3, 0xfe, +0xe5, 0xcf, 0xab, 0x70, 0x40, 0x00, 0x00, 0xe1, +0x74, 0x7e, 0xd1, 0xfe, 0x2c, 0x2f, 0xb3, 0x1a, +0x80, 0x3b, 0x06, 0x80, 0x6d, 0xfe, 0xa2, 0x25, +0xee, 0x04, 0x68, 0x5e, 0x0b, 0xa0, 0x75, 0xf7, +0x8b, 0x66, 0xb2, 0x0f, 0x40, 0xb5, 0x00, 0xa0, +0xe9, 0xda, 0x57, 0xf3, 0x70, 0xf8, 0x7e, 0x3c, +0x3c, 0x45, 0xa1, 0x90, 0xb9, 0xd9, 0xd9, 0xe5, +0xe4, 0xe4, 0xd8, 0x4a, 0xc4, 0x42, 0x5b, 0x61, +0xca, 0x57, 0x7d, 0xfe, 0x67, 0xc2, 0x5f, 0xc0, +0x57, 0xfd, 0x6c, 0xf9, 0x7e, 0x3c, 0xfc, 0xf7, +0xf5, 0xe0, 0xbe, 0xe2, 0x24, 0x81, 0x32, 0x5d, +0x81, 0x47, 0x04, 0xf8, 0xe0, 0xc2, 0xcc, 0xf4, +0x4c, 0xa5, 0x1c, 0xcf, 0x92, 0x09, 0x84, 0x62, +0xdc, 0xe6, 0x8f, 0x47, 0xfc, 0xb7, 0x0b, 0xff, +0xfc, 0x1d, 0xd3, 0x22, 0xc4, 0x49, 0x62, 0xb9, +0x58, 0x2a, 0x14, 0xe3, 0x51, 0x12, 0x71, 0x8e, +0x44, 0x9a, 0x8c, 0xf3, 0x32, 0xa5, 0x22, 0x89, +0x42, 0x92, 0x29, 0xc5, 0x25, 0xd2, 0xff, 0x64, +0xe2, 0xdf, 0x2c, 0xfb, 0x03, 0x3e, 0xdf, 0x35, +0x00, 0xb0, 0x6a, 0x3e, 0x01, 0x7b, 0x91, 0x2d, +0xa8, 0x5d, 0x63, 0x03, 0xf6, 0x4b, 0x27, 0x10, +0x58, 0x74, 0xc0, 0xe2, 0xf7, 0x00, 0x00, 0xf2, +0xbb, 0x6f, 0xc1, 0xd4, 0x28, 0x08, 0x03, 0x80, +0x68, 0x83, 0xe1, 0xcf, 0x77, 0xff, 0xef, 0x3f, +0xfd, 0x47, 0xa0, 0x25, 0x00, 0x80, 0x66, 0x49, +0x92, 0x71, 0x00, 0x00, 0x5e, 0x44, 0x24, 0x2e, +0x54, 0xca, 0xb3, 0x3f, 0xc7, 0x08, 0x00, 0x00, +0x44, 0xa0, 0x81, 0x2a, 0xb0, 0x41, 0x1b, 0xf4, +0xc1, 0x18, 0x2c, 0xc0, 0x06, 0x1c, 0xc1, 0x05, +0xdc, 0xc1, 0x0b, 0xfc, 0x60, 0x36, 0x84, 0x42, +0x24, 0xc4, 0xc2, 0x42, 0x10, 0x42, 0x0a, 0x64, +0x80, 0x1c, 0x72, 0x60, 0x29, 0xac, 0x82, 0x42, +0x28, 0x86, 0xcd, 0xb0, 0x1d, 0x2a, 0x60, 0x2f, +0xd4, 0x40, 0x1d, 0x34, 0xc0, 0x51, 0x68, 0x86, +0x93, 0x70, 0x0e, 0x2e, 0xc2, 0x55, 0xb8, 0x0e, +0x3d, 0x70, 0x0f, 0xfa, 0x61, 0x08, 0x9e, 0xc1, +0x28, 0xbc, 0x81, 0x09, 0x04, 0x41, 0xc8, 0x08, +0x13, 0x61, 0x21, 0xda, 0x88, 0x01, 0x62, 0x8a, +0x58, 0x23, 0x8e, 0x08, 0x17, 0x99, 0x85, 0xf8, +0x21, 0xc1, 0x48, 0x04, 0x12, 0x8b, 0x24, 0x20, +0xc9, 0x88, 0x14, 0x51, 0x22, 0x4b, 0x91, 0x35, +0x48, 0x31, 0x52, 0x8a, 0x54, 0x20, 0x55, 0x48, +0x1d, 0xf2, 0x3d, 0x72, 0x02, 0x39, 0x87, 0x5c, +0x46, 0xba, 0x91, 0x3b, 0xc8, 0x00, 0x32, 0x82, +0xfc, 0x86, 0xbc, 0x47, 0x31, 0x94, 0x81, 0xb2, +0x51, 0x3d, 0xd4, 0x0c, 0xb5, 0x43, 0xb9, 0xa8, +0x37, 0x1a, 0x84, 0x46, 0xa2, 0x0b, 0xd0, 0x64, +0x74, 0x31, 0x9a, 0x8f, 0x16, 0xa0, 0x9b, 0xd0, +0x72, 0xb4, 0x1a, 0x3d, 0x8c, 0x36, 0xa1, 0xe7, +0xd0, 0xab, 0x68, 0x0f, 0xda, 0x8f, 0x3e, 0x43, +0xc7, 0x30, 0xc0, 0xe8, 0x18, 0x07, 0x33, 0xc4, +0x6c, 0x30, 0x2e, 0xc6, 0xc3, 0x42, 0xb1, 0x38, +0x2c, 0x09, 0x93, 0x63, 0xcb, 0xb1, 0x22, 0xac, +0x0c, 0xab, 0xc6, 0x1a, 0xb0, 0x56, 0xac, 0x03, +0xbb, 0x89, 0xf5, 0x63, 0xcf, 0xb1, 0x77, 0x04, +0x12, 0x81, 0x45, 0xc0, 0x09, 0x36, 0x04, 0x77, +0x42, 0x20, 0x61, 0x1e, 0x41, 0x48, 0x58, 0x4c, +0x58, 0x4e, 0xd8, 0x48, 0xa8, 0x20, 0x1c, 0x24, +0x34, 0x11, 0xda, 0x09, 0x37, 0x09, 0x03, 0x84, +0x51, 0xc2, 0x27, 0x22, 0x93, 0xa8, 0x4b, 0xb4, +0x26, 0xba, 0x11, 0xf9, 0xc4, 0x18, 0x62, 0x32, +0x31, 0x87, 0x58, 0x48, 0x2c, 0x23, 0xd6, 0x12, +0x8f, 0x13, 0x2f, 0x10, 0x7b, 0x88, 0x43, 0xc4, +0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xb9, +0x90, 0x02, 0x49, 0xb1, 0xa4, 0x54, 0xd2, 0x12, +0xd2, 0x46, 0xd2, 0x6e, 0x52, 0x23, 0xe9, 0x2c, +0xa9, 0x9b, 0x34, 0x48, 0x1a, 0x23, 0x93, 0xc9, +0xda, 0x64, 0x6b, 0xb2, 0x07, 0x39, 0x94, 0x2c, +0x20, 0x2b, 0xc8, 0x85, 0xe4, 0x9d, 0xe4, 0xc3, +0xe4, 0x33, 0xe4, 0x1b, 0xe4, 0x21, 0xf2, 0x5b, +0x0a, 0x9d, 0x62, 0x40, 0x71, 0xa4, 0xf8, 0x53, +0xe2, 0x28, 0x52, 0xca, 0x6a, 0x4a, 0x19, 0xe5, +0x10, 0xe5, 0x34, 0xe5, 0x06, 0x65, 0x98, 0x32, +0x41, 0x55, 0xa3, 0x9a, 0x52, 0xdd, 0xa8, 0xa1, +0x54, 0x11, 0x35, 0x8f, 0x5a, 0x42, 0xad, 0xa1, +0xb6, 0x52, 0xaf, 0x51, 0x87, 0xa8, 0x13, 0x34, +0x75, 0x9a, 0x39, 0xcd, 0x83, 0x16, 0x49, 0x4b, +0xa5, 0xad, 0xa2, 0x95, 0xd3, 0x1a, 0x68, 0x17, +0x68, 0xf7, 0x69, 0xaf, 0xe8, 0x74, 0xba, 0x11, +0xdd, 0x95, 0x1e, 0x4e, 0x97, 0xd0, 0x57, 0xd2, +0xcb, 0xe9, 0x47, 0xe8, 0x97, 0xe8, 0x03, 0xf4, +0x77, 0x0c, 0x0d, 0x86, 0x15, 0x83, 0xc7, 0x88, +0x67, 0x28, 0x19, 0x9b, 0x18, 0x07, 0x18, 0x67, +0x19, 0x77, 0x18, 0xaf, 0x98, 0x4c, 0xa6, 0x19, +0xd3, 0x8b, 0x19, 0xc7, 0x54, 0x30, 0x37, 0x31, +0xeb, 0x98, 0xe7, 0x99, 0x0f, 0x99, 0x6f, 0x55, +0x58, 0x2a, 0xb6, 0x2a, 0x7c, 0x15, 0x91, 0xca, +0x0a, 0x95, 0x4a, 0x95, 0x26, 0x95, 0x1b, 0x2a, +0x2f, 0x54, 0xa9, 0xaa, 0xa6, 0xaa, 0xde, 0xaa, +0x0b, 0x55, 0xf3, 0x55, 0xcb, 0x54, 0x8f, 0xa9, +0x5e, 0x53, 0x7d, 0xae, 0x46, 0x55, 0x33, 0x53, +0xe3, 0xa9, 0x09, 0xd4, 0x96, 0xab, 0x55, 0xaa, +0x9d, 0x50, 0xeb, 0x53, 0x1b, 0x53, 0x67, 0xa9, +0x3b, 0xa8, 0x87, 0xaa, 0x67, 0xa8, 0x6f, 0x54, +0x3f, 0xa4, 0x7e, 0x59, 0xfd, 0x89, 0x06, 0x59, +0xc3, 0x4c, 0xc3, 0x4f, 0x43, 0xa4, 0x51, 0xa0, +0xb1, 0x5f, 0xe3, 0xbc, 0xc6, 0x20, 0x0b, 0x63, +0x19, 0xb3, 0x78, 0x2c, 0x21, 0x6b, 0x0d, 0xab, +0x86, 0x75, 0x81, 0x35, 0xc4, 0x26, 0xb1, 0xcd, +0xd9, 0x7c, 0x76, 0x2a, 0xbb, 0x98, 0xfd, 0x1d, +0xbb, 0x8b, 0x3d, 0xaa, 0xa9, 0xa1, 0x39, 0x43, +0x33, 0x4a, 0x33, 0x57, 0xb3, 0x52, 0xf3, 0x94, +0x66, 0x3f, 0x07, 0xe3, 0x98, 0x71, 0xf8, 0x9c, +0x74, 0x4e, 0x09, 0xe7, 0x28, 0xa7, 0x97, 0xf3, +0x7e, 0x8a, 0xde, 0x14, 0xef, 0x29, 0xe2, 0x29, +0x1b, 0xa6, 0x34, 0x4c, 0xb9, 0x31, 0x65, 0x5c, +0x6b, 0xaa, 0x96, 0x97, 0x96, 0x58, 0xab, 0x48, +0xab, 0x51, 0xab, 0x47, 0xeb, 0xbd, 0x36, 0xae, +0xed, 0xa7, 0x9d, 0xa6, 0xbd, 0x45, 0xbb, 0x59, +0xfb, 0x81, 0x0e, 0x41, 0xc7, 0x4a, 0x27, 0x5c, +0x27, 0x47, 0x67, 0x8f, 0xce, 0x05, 0x9d, 0xe7, +0x53, 0xd9, 0x53, 0xdd, 0xa7, 0x0a, 0xa7, 0x16, +0x4d, 0x3d, 0x3a, 0xf5, 0xae, 0x2e, 0xaa, 0x6b, +0xa5, 0x1b, 0xa1, 0xbb, 0x44, 0x77, 0xbf, 0x6e, +0xa7, 0xee, 0x98, 0x9e, 0xbe, 0x5e, 0x80, 0x9e, +0x4c, 0x6f, 0xa7, 0xde, 0x79, 0xbd, 0xe7, 0xfa, +0x1c, 0x7d, 0x2f, 0xfd, 0x54, 0xfd, 0x6d, 0xfa, +0xa7, 0xf5, 0x47, 0x0c, 0x58, 0x06, 0xb3, 0x0c, +0x24, 0x06, 0xdb, 0x0c, 0xce, 0x18, 0x3c, 0xc5, +0x35, 0x71, 0x6f, 0x3c, 0x1d, 0x2f, 0xc7, 0xdb, +0xf1, 0x51, 0x43, 0x5d, 0xc3, 0x40, 0x43, 0xa5, +0x61, 0x95, 0x61, 0x97, 0xe1, 0x84, 0x91, 0xb9, +0xd1, 0x3c, 0xa3, 0xd5, 0x46, 0x8d, 0x46, 0x0f, +0x8c, 0x69, 0xc6, 0x5c, 0xe3, 0x24, 0xe3, 0x6d, +0xc6, 0x6d, 0xc6, 0xa3, 0x26, 0x06, 0x26, 0x21, +0x26, 0x4b, 0x4d, 0xea, 0x4d, 0xee, 0x9a, 0x52, +0x4d, 0xb9, 0xa6, 0x29, 0xa6, 0x3b, 0x4c, 0x3b, +0x4c, 0xc7, 0xcd, 0xcc, 0xcd, 0xa2, 0xcd, 0xd6, +0x99, 0x35, 0x9b, 0x3d, 0x31, 0xd7, 0x32, 0xe7, +0x9b, 0xe7, 0x9b, 0xd7, 0x9b, 0xdf, 0xb7, 0x60, +0x5a, 0x78, 0x5a, 0x2c, 0xb6, 0xa8, 0xb6, 0xb8, +0x65, 0x49, 0xb2, 0xe4, 0x5a, 0xa6, 0x59, 0xee, +0xb6, 0xbc, 0x6e, 0x85, 0x5a, 0x39, 0x59, 0xa5, +0x58, 0x55, 0x5a, 0x5d, 0xb3, 0x46, 0xad, 0x9d, +0xad, 0x25, 0xd6, 0xbb, 0xad, 0xbb, 0xa7, 0x11, +0xa7, 0xb9, 0x4e, 0x93, 0x4e, 0xab, 0x9e, 0xd6, +0x67, 0xc3, 0xb0, 0xf1, 0xb6, 0xc9, 0xb6, 0xa9, +0xb7, 0x19, 0xb0, 0xe5, 0xd8, 0x06, 0xdb, 0xae, +0xb6, 0x6d, 0xb6, 0x7d, 0x61, 0x67, 0x62, 0x17, +0x67, 0xb7, 0xc5, 0xae, 0xc3, 0xee, 0x93, 0xbd, +0x93, 0x7d, 0xba, 0x7d, 0x8d, 0xfd, 0x3d, 0x07, +0x0d, 0x87, 0xd9, 0x0e, 0xab, 0x1d, 0x5a, 0x1d, +0x7e, 0x73, 0xb4, 0x72, 0x14, 0x3a, 0x56, 0x3a, +0xde, 0x9a, 0xce, 0x9c, 0xee, 0x3f, 0x7d, 0xc5, +0xf4, 0x96, 0xe9, 0x2f, 0x67, 0x58, 0xcf, 0x10, +0xcf, 0xd8, 0x33, 0xe3, 0xb6, 0x13, 0xcb, 0x29, +0xc4, 0x69, 0x9d, 0x53, 0x9b, 0xd3, 0x47, 0x67, +0x17, 0x67, 0xb9, 0x73, 0x83, 0xf3, 0x88, 0x8b, +0x89, 0x4b, 0x82, 0xcb, 0x2e, 0x97, 0x3e, 0x2e, +0x9b, 0x1b, 0xc6, 0xdd, 0xc8, 0xbd, 0xe4, 0x4a, +0x74, 0xf5, 0x71, 0x5d, 0xe1, 0x7a, 0xd2, 0xf5, +0x9d, 0x9b, 0xb3, 0x9b, 0xc2, 0xed, 0xa8, 0xdb, +0xaf, 0xee, 0x36, 0xee, 0x69, 0xee, 0x87, 0xdc, +0x9f, 0xcc, 0x34, 0x9f, 0x29, 0x9e, 0x59, 0x33, +0x73, 0xd0, 0xc3, 0xc8, 0x43, 0xe0, 0x51, 0xe5, +0xd1, 0x3f, 0x0b, 0x9f, 0x95, 0x30, 0x6b, 0xdf, +0xac, 0x7e, 0x4f, 0x43, 0x4f, 0x81, 0x67, 0xb5, +0xe7, 0x23, 0x2f, 0x63, 0x2f, 0x91, 0x57, 0xad, +0xd7, 0xb0, 0xb7, 0xa5, 0x77, 0xaa, 0xf7, 0x61, +0xef, 0x17, 0x3e, 0xf6, 0x3e, 0x72, 0x9f, 0xe3, +0x3e, 0xe3, 0x3c, 0x37, 0xde, 0x32, 0xde, 0x59, +0x5f, 0xcc, 0x37, 0xc0, 0xb7, 0xc8, 0xb7, 0xcb, +0x4f, 0xc3, 0x6f, 0x9e, 0x5f, 0x85, 0xdf, 0x43, +0x7f, 0x23, 0xff, 0x64, 0xff, 0x7a, 0xff, 0xd1, +0x00, 0xa7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, +0x81, 0x41, 0x81, 0x5b, 0x02, 0xfb, 0xf8, 0x7a, +0x7c, 0x21, 0xbf, 0x8e, 0x3f, 0x3a, 0xdb, 0x65, +0xf6, 0xb2, 0xd9, 0xed, 0x41, 0x8c, 0xa0, 0xb9, +0x41, 0x15, 0x41, 0x8f, 0x82, 0xad, 0x82, 0xe5, +0xc1, 0xad, 0x21, 0x68, 0xc8, 0xec, 0x90, 0xad, +0x21, 0xf7, 0xe7, 0x98, 0xce, 0x91, 0xce, 0x69, +0x0e, 0x85, 0x50, 0x7e, 0xe8, 0xd6, 0xd0, 0x07, +0x61, 0xe6, 0x61, 0x8b, 0xc3, 0x7e, 0x0c, 0x27, +0x85, 0x87, 0x85, 0x57, 0x86, 0x3f, 0x8e, 0x70, +0x88, 0x58, 0x1a, 0xd1, 0x31, 0x97, 0x35, 0x77, +0xd1, 0xdc, 0x43, 0x73, 0xdf, 0x44, 0xfa, 0x44, +0x96, 0x44, 0xde, 0x9b, 0x67, 0x31, 0x4f, 0x39, +0xaf, 0x2d, 0x4a, 0x35, 0x2a, 0x3e, 0xaa, 0x2e, +0x6a, 0x3c, 0xda, 0x37, 0xba, 0x34, 0xba, 0x3f, +0xc6, 0x2e, 0x66, 0x59, 0xcc, 0xd5, 0x58, 0x9d, +0x58, 0x49, 0x6c, 0x4b, 0x1c, 0x39, 0x2e, 0x2a, +0xae, 0x36, 0x6e, 0x6c, 0xbe, 0xdf, 0xfc, 0xed, +0xf3, 0x87, 0xe2, 0x9d, 0xe2, 0x0b, 0xe3, 0x7b, +0x17, 0x98, 0x2f, 0xc8, 0x5d, 0x70, 0x79, 0xa1, +0xce, 0xc2, 0xf4, 0x85, 0xa7, 0x16, 0xa9, 0x2e, +0x12, 0x2c, 0x3a, 0x96, 0x40, 0x4c, 0x88, 0x4e, +0x38, 0x94, 0xf0, 0x41, 0x10, 0x2a, 0xa8, 0x16, +0x8c, 0x25, 0xf2, 0x13, 0x77, 0x25, 0x8e, 0x0a, +0x79, 0xc2, 0x1d, 0xc2, 0x67, 0x22, 0x2f, 0xd1, +0x36, 0xd1, 0x88, 0xd8, 0x43, 0x5c, 0x2a, 0x1e, +0x4e, 0xf2, 0x48, 0x2a, 0x4d, 0x7a, 0x92, 0xec, +0x91, 0xbc, 0x35, 0x79, 0x24, 0xc5, 0x33, 0xa5, +0x2c, 0xe5, 0xb9, 0x84, 0x27, 0xa9, 0x90, 0xbc, +0x4c, 0x0d, 0x4c, 0xdd, 0x9b, 0x3a, 0x9e, 0x16, +0x9a, 0x76, 0x20, 0x6d, 0x32, 0x3d, 0x3a, 0xbd, +0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xaa, +0x21, 0x4d, 0x93, 0xb6, 0x67, 0xea, 0x67, 0xe6, +0x66, 0x76, 0xcb, 0xac, 0x65, 0x85, 0xb2, 0xfe, +0xc5, 0x6e, 0x8b, 0xb7, 0x2f, 0x1e, 0x95, 0x07, +0xc9, 0x6b, 0xb3, 0x90, 0xac, 0x05, 0x59, 0x2d, +0x0a, 0xb6, 0x42, 0xa6, 0xe8, 0x54, 0x5a, 0x28, +0xd7, 0x2a, 0x07, 0xb2, 0x67, 0x65, 0x57, 0x66, +0xbf, 0xcd, 0x89, 0xca, 0x39, 0x96, 0xab, 0x9e, +0x2b, 0xcd, 0xed, 0xcc, 0xb3, 0xca, 0xdb, 0x90, +0x37, 0x9c, 0xef, 0x9f, 0xff, 0xed, 0x12, 0xc2, +0x12, 0xe1, 0x92, 0xb6, 0xa5, 0x86, 0x4b, 0x57, +0x2d, 0x1d, 0x58, 0xe6, 0xbd, 0xac, 0x6a, 0x39, +0xb2, 0x3c, 0x71, 0x79, 0xdb, 0x0a, 0xe3, 0x15, +0x05, 0x2b, 0x86, 0x56, 0x06, 0xac, 0x3c, 0xb8, +0x8a, 0xb6, 0x2a, 0x6d, 0xd5, 0x4f, 0xab, 0xed, +0x57, 0x97, 0xae, 0x7e, 0xbd, 0x26, 0x7a, 0x4d, +0x6b, 0x81, 0x5e, 0xc1, 0xca, 0x82, 0xc1, 0xb5, +0x01, 0x6b, 0xeb, 0x0b, 0x55, 0x0a, 0xe5, 0x85, +0x7d, 0xeb, 0xdc, 0xd7, 0xed, 0x5d, 0x4f, 0x58, +0x2f, 0x59, 0xdf, 0xb5, 0x61, 0xfa, 0x86, 0x9d, +0x1b, 0x3e, 0x15, 0x89, 0x8a, 0xae, 0x14, 0xdb, +0x17, 0x97, 0x15, 0x7f, 0xd8, 0x28, 0xdc, 0x78, +0xe5, 0x1b, 0x87, 0x6f, 0xca, 0xbf, 0x99, 0xdc, +0x94, 0xb4, 0xa9, 0xab, 0xc4, 0xb9, 0x64, 0xcf, +0x66, 0xd2, 0x66, 0xe9, 0xe6, 0xde, 0x2d, 0x9e, +0x5b, 0x0e, 0x96, 0xaa, 0x97, 0xe6, 0x97, 0x0e, +0x6e, 0x0d, 0xd9, 0xda, 0xb4, 0x0d, 0xdf, 0x56, +0xb4, 0xed, 0xf5, 0xf6, 0x45, 0xdb, 0x2f, 0x97, +0xcd, 0x28, 0xdb, 0xbb, 0x83, 0xb6, 0x43, 0xb9, +0xa3, 0xbf, 0x3c, 0xb8, 0xbc, 0x65, 0xa7, 0xc9, +0xce, 0xcd, 0x3b, 0x3f, 0x54, 0xa4, 0x54, 0xf4, +0x54, 0xfa, 0x54, 0x36, 0xee, 0xd2, 0xdd, 0xb5, +0x61, 0xd7, 0xf8, 0x6e, 0xd1, 0xee, 0x1b, 0x7b, +0xbc, 0xf6, 0x34, 0xec, 0xd5, 0xdb, 0x5b, 0xbc, +0xf7, 0xfd, 0x3e, 0xc9, 0xbe, 0xdb, 0x55, 0x01, +0x55, 0x4d, 0xd5, 0x66, 0xd5, 0x65, 0xfb, 0x49, +0xfb, 0xb3, 0xf7, 0x3f, 0xae, 0x89, 0xaa, 0xe9, +0xf8, 0x96, 0xfb, 0x6d, 0x5d, 0xad, 0x4e, 0x6d, +0x71, 0xed, 0xc7, 0x03, 0xd2, 0x03, 0xfd, 0x07, +0x23, 0x0e, 0xb6, 0xd7, 0xb9, 0xd4, 0xd5, 0x1d, +0xd2, 0x3d, 0x54, 0x52, 0x8f, 0xd6, 0x2b, 0xeb, +0x47, 0x0e, 0xc7, 0x1f, 0xbe, 0xfe, 0x9d, 0xef, +0x77, 0x2d, 0x0d, 0x36, 0x0d, 0x55, 0x8d, 0x9c, +0xc6, 0xe2, 0x23, 0x70, 0x44, 0x79, 0xe4, 0xe9, +0xf7, 0x09, 0xdf, 0xf7, 0x1e, 0x0d, 0x3a, 0xda, +0x76, 0x8c, 0x7b, 0xac, 0xe1, 0x07, 0xd3, 0x1f, +0x76, 0x1d, 0x67, 0x1d, 0x2f, 0x6a, 0x42, 0x9a, +0xf2, 0x9a, 0x46, 0x9b, 0x53, 0x9a, 0xfb, 0x5b, +0x62, 0x5b, 0xba, 0x4f, 0xcc, 0x3e, 0xd1, 0xd6, +0xea, 0xde, 0x7a, 0xfc, 0x47, 0xdb, 0x1f, 0x0f, +0x9c, 0x34, 0x3c, 0x59, 0x79, 0x4a, 0xf3, 0x54, +0xc9, 0x69, 0xda, 0xe9, 0x82, 0xd3, 0x93, 0x67, +0xf2, 0xcf, 0x8c, 0x9d, 0x95, 0x9d, 0x7d, 0x7e, +0x2e, 0xf9, 0xdc, 0x60, 0xdb, 0xa2, 0xb6, 0x7b, +0xe7, 0x63, 0xce, 0xdf, 0x6a, 0x0f, 0x6f, 0xef, +0xba, 0x10, 0x74, 0xe1, 0xd2, 0x45, 0xff, 0x8b, +0xe7, 0x3b, 0xbc, 0x3b, 0xce, 0x5c, 0xf2, 0xb8, +0x74, 0xf2, 0xb2, 0xdb, 0xe5, 0x13, 0x57, 0xb8, +0x57, 0x9a, 0xaf, 0x3a, 0x5f, 0x6d, 0xea, 0x74, +0xea, 0x3c, 0xfe, 0x93, 0xd3, 0x4f, 0xc7, 0xbb, +0x9c, 0xbb, 0x9a, 0xae, 0xb9, 0x5c, 0x6b, 0xb9, +0xee, 0x7a, 0xbd, 0xb5, 0x7b, 0x66, 0xf7, 0xe9, +0x1b, 0x9e, 0x37, 0xce, 0xdd, 0xf4, 0xbd, 0x79, +0xf1, 0x16, 0xff, 0xd6, 0xd5, 0x9e, 0x39, 0x3d, +0xdd, 0xbd, 0xf3, 0x7a, 0x6f, 0xf7, 0xc5, 0xf7, +0xf5, 0xdf, 0x16, 0xdd, 0x7e, 0x72, 0x27, 0xfd, +0xce, 0xcb, 0xbb, 0xd9, 0x77, 0x27, 0xee, 0xad, +0xbc, 0x4f, 0xbc, 0x5f, 0xf4, 0x40, 0xed, 0x41, +0xd9, 0x43, 0xdd, 0x87, 0xd5, 0x3f, 0x5b, 0xfe, +0xdc, 0xd8, 0xef, 0xdc, 0x7f, 0x6a, 0xc0, 0x77, +0xa0, 0xf3, 0xd1, 0xdc, 0x47, 0xf7, 0x06, 0x85, +0x83, 0xcf, 0xfe, 0x91, 0xf5, 0x8f, 0x0f, 0x43, +0x05, 0x8f, 0x99, 0x8f, 0xcb, 0x86, 0x0d, 0x86, +0xeb, 0x9e, 0x38, 0x3e, 0x39, 0x39, 0xe2, 0x3f, +0x72, 0xfd, 0xe9, 0xfc, 0xa7, 0x43, 0xcf, 0x64, +0xcf, 0x26, 0x9e, 0x17, 0xfe, 0xa2, 0xfe, 0xcb, +0xae, 0x17, 0x16, 0x2f, 0x7e, 0xf8, 0xd5, 0xeb, +0xd7, 0xce, 0xd1, 0x98, 0xd1, 0xa1, 0x97, 0xf2, +0x97, 0x93, 0xbf, 0x6d, 0x7c, 0xa5, 0xfd, 0xea, +0xc0, 0xeb, 0x19, 0xaf, 0xdb, 0xc6, 0xc2, 0xc6, +0x1e, 0xbe, 0xc9, 0x78, 0x33, 0x31, 0x5e, 0xf4, +0x56, 0xfb, 0xed, 0xc1, 0x77, 0xdc, 0x77, 0x1d, +0xef, 0xa3, 0xdf, 0x0f, 0x4f, 0xe4, 0x7c, 0x20, +0x7f, 0x28, 0xff, 0x68, 0xf9, 0xb1, 0xf5, 0x53, +0xd0, 0xa7, 0xfb, 0x93, 0x19, 0x93, 0x93, 0xff, +0x04, 0x03, 0x98, 0xf3, 0xfc, 0x63, 0x33, 0x2d, +0xdb, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, +0x4d, 0x00, 0x00, 0x7a, 0x25, 0x00, 0x00, 0x80, +0x83, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0x80, +0xe9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, +0x60, 0x00, 0x00, 0x3a, 0x98, 0x00, 0x00, 0x17, +0x6f, 0x92, 0x5f, 0xc5, 0x46, 0x00, 0x00, 0x04, +0x6f, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, +0x9b, 0x5f, 0x8c, 0x5c, 0x53, 0x1c, 0xc7, 0x3f, +0xdb, 0xad, 0x62, 0xd2, 0x76, 0xb1, 0xaa, 0x49, +0x35, 0x52, 0xd4, 0x9f, 0xa4, 0x95, 0x34, 0x91, +0x20, 0x24, 0x62, 0xfb, 0x20, 0x1e, 0x36, 0x12, +0x1b, 0x84, 0xae, 0x8a, 0xfa, 0x93, 0x50, 0x4a, +0x82, 0x48, 0xea, 0x85, 0x0a, 0xda, 0x86, 0x6a, +0x22, 0x94, 0xc4, 0x4b, 0x49, 0x91, 0x4a, 0x79, +0xe1, 0x05, 0x69, 0xb7, 0xa2, 0x15, 0x4b, 0x84, +0x20, 0x11, 0x14, 0x29, 0x5d, 0x0f, 0x1d, 0xc4, +0x16, 0xdd, 0xda, 0x18, 0x5f, 0x0f, 0xf3, 0x9b, +0xf4, 0xf6, 0x66, 0xee, 0xce, 0x6c, 0x77, 0x76, +0xf6, 0xce, 0xf8, 0x7e, 0x92, 0xc9, 0x66, 0xcf, +0x39, 0xf7, 0xce, 0xdd, 0xdf, 0xe7, 0x9c, 0x7b, +0xce, 0xf9, 0xdd, 0xbb, 0x1d, 0x92, 0x30, 0x53, +0xc7, 0x34, 0x87, 0xc0, 0x02, 0x2c, 0xc0, 0x58, +0x80, 0x05, 0x18, 0x0b, 0xb0, 0x00, 0x63, 0x01, +0x16, 0x60, 0x2c, 0xc0, 0x02, 0x8c, 0x05, 0x58, +0x80, 0xb1, 0x00, 0x0b, 0x30, 0x16, 0x60, 0x01, +0xc6, 0x02, 0x2c, 0xc0, 0x58, 0x80, 0x05, 0x18, +0x0b, 0xb0, 0x00, 0x63, 0x01, 0x16, 0x60, 0x2c, +0xc0, 0x02, 0x8c, 0x05, 0x58, 0x80, 0xb1, 0x00, +0x0b, 0x30, 0x16, 0x60, 0x01, 0xc6, 0x02, 0xc6, +0xc3, 0x02, 0xe0, 0x09, 0xe0, 0x63, 0xe0, 0x5b, +0xe0, 0x6d, 0xe0, 0x36, 0xe0, 0xd8, 0xa9, 0xba, +0xa0, 0x8e, 0xff, 0xd1, 0xbf, 0x28, 0xdd, 0x0e, +0x6c, 0x04, 0x8e, 0xab, 0x52, 0xf7, 0x03, 0x70, +0x23, 0xb0, 0xcb, 0x23, 0x60, 0x72, 0x78, 0x18, +0x78, 0x2e, 0x23, 0xf8, 0x00, 0xa7, 0x03, 0x3b, +0x63, 0x34, 0x78, 0x04, 0x34, 0x98, 0x5e, 0xe0, +0xcd, 0x71, 0xb4, 0xbf, 0x03, 0x78, 0xde, 0x23, +0xa0, 0x41, 0x1d, 0x0c, 0x78, 0x32, 0x55, 0xf6, +0x19, 0x70, 0x0d, 0x70, 0x13, 0xf0, 0x63, 0xaa, +0x6e, 0x04, 0xf8, 0xa6, 0x99, 0x17, 0x38, 0xbd, +0x8d, 0x83, 0x3f, 0x1f, 0x98, 0x0b, 0x9c, 0x93, +0x28, 0xfb, 0x19, 0xb8, 0x0c, 0x18, 0x06, 0x2e, +0x04, 0x4e, 0x48, 0x05, 0xbf, 0x17, 0xd8, 0xe1, +0x39, 0x60, 0xe2, 0xf4, 0x03, 0xdf, 0xc7, 0xbd, +0x3f, 0xc9, 0xae, 0x44, 0xf0, 0xdf, 0x01, 0x66, +0x57, 0x09, 0xfe, 0x3d, 0xc0, 0x63, 0x40, 0x57, +0x53, 0xae, 0x54, 0x52, 0xbb, 0x7d, 0x16, 0x4b, +0x1a, 0x55, 0x75, 0x86, 0x24, 0xf5, 0x48, 0x1a, +0x4e, 0x94, 0x0d, 0x4b, 0xba, 0x24, 0x8e, 0x9d, +0x27, 0xe9, 0x40, 0x94, 0x17, 0x25, 0xdd, 0x39, +0xd9, 0xd7, 0xdb, 0x8e, 0x23, 0x60, 0x25, 0x70, +0x4c, 0x46, 0xdd, 0xbc, 0xe8, 0xe5, 0x95, 0x9e, +0x7f, 0x00, 0xb8, 0x1c, 0xd8, 0x0d, 0xcc, 0x00, +0x5e, 0x05, 0x66, 0x45, 0xdd, 0xc9, 0xc0, 0x52, +0xdf, 0x82, 0xea, 0x67, 0x6e, 0x4c, 0xba, 0xe7, +0xd7, 0xd9, 0xbe, 0x12, 0xfc, 0x41, 0x60, 0x26, +0xf0, 0x3a, 0x70, 0x69, 0xa2, 0xbe, 0x04, 0xac, +0xb1, 0x80, 0xfa, 0x58, 0x08, 0x7c, 0x02, 0x6c, +0x03, 0x0a, 0x89, 0xf2, 0xcf, 0x81, 0xab, 0x32, +0x8e, 0x19, 0x89, 0xba, 0x47, 0x81, 0xaf, 0x62, +0x0e, 0x48, 0xb2, 0x26, 0x8e, 0xf7, 0x1c, 0x50, +0xe3, 0xb3, 0x50, 0xd2, 0xbe, 0x8c, 0x7b, 0xfe, +0xad, 0xd1, 0x66, 0x83, 0xc6, 0xc7, 0x56, 0x49, +0xd3, 0x9a, 0x71, 0xfd, 0xad, 0x3e, 0x02, 0x16, +0xc4, 0x0e, 0xf6, 0xd4, 0x8c, 0xfa, 0x13, 0xe3, +0xe7, 0x03, 0xc0, 0xe6, 0x3a, 0xcf, 0xb9, 0x15, +0x58, 0x0e, 0xfc, 0xeb, 0x65, 0x68, 0x6d, 0xf6, +0xd7, 0xd8, 0x38, 0xdd, 0x12, 0x89, 0xb6, 0x12, +0xb0, 0x02, 0x58, 0x05, 0xfc, 0x99, 0xd1, 0xf6, +0x0f, 0xe0, 0x5e, 0xe0, 0x7a, 0x60, 0xd4, 0xa9, +0x88, 0xfa, 0x29, 0x00, 0x6f, 0x01, 0x3d, 0x19, +0xf5, 0x1b, 0x23, 0xb0, 0x24, 0x56, 0x37, 0x7d, +0xd1, 0x7e, 0x4e, 0x48, 0xfc, 0x20, 0x56, 0x40, +0xbf, 0x3a, 0x17, 0x54, 0x9b, 0x45, 0xc0, 0xdd, +0xb1, 0xa3, 0x2d, 0x00, 0x7b, 0x81, 0xed, 0xc0, +0x95, 0xc0, 0x92, 0x8c, 0x63, 0xee, 0x03, 0x9e, +0xca, 0x65, 0xae, 0xa4, 0xc5, 0x04, 0x3c, 0x08, +0x3c, 0x02, 0x74, 0x56, 0xa9, 0xfb, 0x9b, 0xb1, +0xf3, 0xfa, 0xab, 0x81, 0x75, 0x16, 0x70, 0xf4, +0x3c, 0x1b, 0x9b, 0xac, 0x89, 0x90, 0x3b, 0x09, +0xad, 0x22, 0x60, 0x39, 0xf0, 0x52, 0x83, 0xce, +0x95, 0x2b, 0x09, 0xad, 0xb0, 0x0a, 0x9a, 0x0e, +0x3c, 0x9e, 0x2a, 0x7b, 0x3f, 0x76, 0xb1, 0xcb, +0x80, 0xa1, 0x54, 0xdd, 0x2f, 0xc0, 0x45, 0xc0, +0x40, 0xc6, 0xf9, 0xee, 0xe2, 0xc8, 0x2c, 0xa8, +0x05, 0xd4, 0xe0, 0x62, 0xca, 0xa9, 0xe5, 0x0a, +0xdf, 0x01, 0x57, 0x00, 0xef, 0x02, 0x7f, 0x01, +0xa7, 0xa4, 0x82, 0xbf, 0x34, 0xd2, 0x0b, 0xbd, +0x55, 0x24, 0x0c, 0xc5, 0xe4, 0xfd, 0x7b, 0x9e, +0x7a, 0x57, 0xde, 0x39, 0x33, 0xf5, 0xfb, 0x6e, +0xe0, 0x60, 0xac, 0x7a, 0xb6, 0x71, 0x38, 0xf1, +0x56, 0x09, 0xfe, 0x17, 0xc0, 0x43, 0x94, 0x93, +0x6a, 0x37, 0x00, 0x5b, 0x62, 0xc9, 0x59, 0x09, +0xfe, 0x9e, 0x5c, 0xfd, 0x75, 0x2d, 0x90, 0x6a, +0x58, 0x91, 0x4a, 0x13, 0xec, 0x95, 0x74, 0x6d, +0x2a, 0xe5, 0x5c, 0x94, 0x74, 0x5e, 0xb4, 0x3f, +0x4b, 0xd2, 0xa1, 0x28, 0xff, 0x4d, 0xd2, 0x6a, +0x49, 0x5b, 0x22, 0x65, 0x91, 0xbb, 0xbf, 0xaf, +0x99, 0x5f, 0xd6, 0x25, 0x69, 0xad, 0xa4, 0x19, +0x35, 0xda, 0x9d, 0x26, 0x69, 0x99, 0xa4, 0xab, +0x25, 0x75, 0x4b, 0x5a, 0x52, 0x23, 0x6f, 0x93, +0x0c, 0xfe, 0x4c, 0x49, 0x9f, 0xa6, 0xea, 0x37, +0xe7, 0xb9, 0x83, 0x35, 0x33, 0xf8, 0x83, 0x11, +0x90, 0xed, 0x92, 0x0a, 0x55, 0xda, 0x74, 0x4a, +0x5a, 0x2f, 0xe9, 0x9f, 0x44, 0xf0, 0x0e, 0x49, +0x5a, 0x27, 0xe9, 0xeb, 0x3a, 0x82, 0xdf, 0x2d, +0xe9, 0xbd, 0x54, 0xfd, 0x88, 0xa4, 0x33, 0xf2, +0x2c, 0xa0, 0x19, 0xcb, 0xd0, 0x2e, 0xca, 0x8f, +0xff, 0x2e, 0x48, 0x94, 0x0d, 0xc4, 0x24, 0x79, +0xb0, 0xb2, 0x1c, 0x06, 0x5e, 0x01, 0xae, 0xcb, +0x38, 0x47, 0x29, 0x63, 0xf3, 0x55, 0x8c, 0x14, +0x82, 0xe2, 0x7e, 0xdf, 0x9d, 0xaa, 0x5f, 0x05, +0x3c, 0x93, 0xeb, 0x19, 0x6e, 0x92, 0x0d, 0x77, +0x4a, 0xfa, 0x30, 0xa3, 0xf7, 0xee, 0x48, 0x8c, +0x84, 0x3e, 0x35, 0x9e, 0x4d, 0xad, 0x90, 0x4e, +0x9f, 0xec, 0x65, 0x68, 0x09, 0x78, 0x31, 0xa3, +0xae, 0x27, 0x92, 0x68, 0x05, 0xca, 0x0f, 0xd1, +0x1b, 0xc9, 0xa6, 0xe8, 0xfd, 0xb9, 0xa7, 0x59, +0x3b, 0xe1, 0x9b, 0x81, 0x17, 0x32, 0xf6, 0x1d, +0x03, 0x94, 0xf3, 0xf9, 0x67, 0x37, 0xe0, 0x7b, +0x8a, 0xc0, 0xfd, 0x0d, 0xdc, 0x35, 0xb7, 0x55, +0x2a, 0xa2, 0x3f, 0x02, 0x53, 0x6b, 0xd4, 0x6d, +0x00, 0xd6, 0x53, 0xce, 0xdf, 0xaf, 0xcd, 0x68, +0xff, 0x13, 0xf0, 0x34, 0x70, 0x6e, 0xa4, 0x97, +0xf7, 0xc7, 0xee, 0xf8, 0x8d, 0xd8, 0x9c, 0x61, +0x01, 0x47, 0x27, 0x61, 0x18, 0x38, 0x89, 0xc3, +0x4f, 0xa3, 0xc6, 0x6a, 0xff, 0x65, 0x6c, 0xbc, +0x8a, 0xb4, 0x30, 0xcd, 0x4e, 0x45, 0xbc, 0x4c, +0xf9, 0x2d, 0xe4, 0xac, 0xc7, 0x7d, 0xb3, 0x29, +0xbf, 0x28, 0x5b, 0x4f, 0xfb, 0xc5, 0x94, 0x5f, +0x31, 0x99, 0x63, 0x01, 0x8d, 0x93, 0xd0, 0x01, +0xbc, 0xc6, 0x91, 0x6f, 0xa5, 0x8d, 0xd5, 0xfe, +0x78, 0xa6, 0xf0, 0xdd, 0xfe, 0x56, 0x4f, 0x45, +0xf4, 0x4b, 0x2a, 0x65, 0x2c, 0x21, 0x07, 0x63, +0xf3, 0x36, 0x56, 0xfb, 0x3d, 0x92, 0xe6, 0xb7, +0xfa, 0x5b, 0x1d, 0x53, 0x7d, 0x01, 0xb5, 0x24, +0x74, 0x67, 0xb4, 0x6f, 0x8b, 0xe0, 0x37, 0x6b, +0x27, 0x3c, 0x91, 0x89, 0xb9, 0xda, 0x44, 0xdb, +0x07, 0x7c, 0x04, 0xec, 0xa3, 0x0d, 0xc8, 0xcb, +0x13, 0xb1, 0xb6, 0x5f, 0xed, 0xe4, 0xfd, 0x81, +0x4c, 0xdb, 0xaf, 0x76, 0xf2, 0x3e, 0x02, 0x2a, +0xcc, 0xca, 0x48, 0xba, 0x11, 0x89, 0xbb, 0x51, +0x0b, 0x30, 0x6d, 0x79, 0x0b, 0xb2, 0x00, 0x63, +0x01, 0x16, 0x60, 0x2c, 0xc0, 0x02, 0x8c, 0x05, +0x58, 0x80, 0xb1, 0x00, 0x0b, 0x30, 0x16, 0x60, +0x01, 0xc6, 0x02, 0x2c, 0xc0, 0x58, 0x80, 0x05, +0x18, 0x0b, 0xb0, 0x00, 0x63, 0x01, 0x16, 0x60, +0x2c, 0xc0, 0x02, 0x4c, 0x63, 0xf9, 0x6f, 0x00, +0xc5, 0x56, 0x3d, 0x4a, 0xf2, 0xbc, 0x47, 0xe8, +0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, +0xae, 0x42, 0x60, 0x82, +}; + +Byte byHERE_logo_white_transparent_rgb_64px[4279] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, +0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, +0x08, 0x06, 0x00, 0x00, 0x00, 0xc3, 0x3e, 0x61, +0xcb, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, +0x73, 0x00, 0x00, 0x2e, 0x23, 0x00, 0x00, 0x2e, +0x23, 0x01, 0x78, 0xa5, 0x3f, 0x76, 0x00, 0x00, +0x0a, 0x4f, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, +0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x66, +0x69, 0x6c, 0x65, 0x00, 0x00, 0x78, 0xda, 0x9d, +0x53, 0x67, 0x54, 0x53, 0xe9, 0x16, 0x3d, 0xf7, +0xde, 0xf4, 0x42, 0x4b, 0x88, 0x80, 0x94, 0x4b, +0x6f, 0x52, 0x15, 0x08, 0x20, 0x52, 0x42, 0x8b, +0x80, 0x14, 0x91, 0x26, 0x2a, 0x21, 0x09, 0x10, +0x4a, 0x88, 0x21, 0xa1, 0xd9, 0x15, 0x51, 0xc1, +0x11, 0x45, 0x45, 0x04, 0x1b, 0xc8, 0xa0, 0x88, +0x03, 0x8e, 0x8e, 0x80, 0x8c, 0x15, 0x51, 0x2c, +0x0c, 0x8a, 0x0a, 0xd8, 0x07, 0xe4, 0x21, 0xa2, +0x8e, 0x83, 0xa3, 0x88, 0x8a, 0xca, 0xfb, 0xe1, +0x7b, 0xa3, 0x6b, 0xd6, 0xbc, 0xf7, 0xe6, 0xcd, +0xfe, 0xb5, 0xd7, 0x3e, 0xe7, 0xac, 0xf3, 0x9d, +0xb3, 0xcf, 0x07, 0xc0, 0x08, 0x0c, 0x96, 0x48, +0x33, 0x51, 0x35, 0x80, 0x0c, 0xa9, 0x42, 0x1e, +0x11, 0xe0, 0x83, 0xc7, 0xc4, 0xc6, 0xe1, 0xe4, +0x2e, 0x40, 0x81, 0x0a, 0x24, 0x70, 0x00, 0x10, +0x08, 0xb3, 0x64, 0x21, 0x73, 0xfd, 0x23, 0x01, +0x00, 0xf8, 0x7e, 0x3c, 0x3c, 0x2b, 0x22, 0xc0, +0x07, 0xbe, 0x00, 0x01, 0x78, 0xd3, 0x0b, 0x08, +0x00, 0xc0, 0x4d, 0x9b, 0xc0, 0x30, 0x1c, 0x87, +0xff, 0x0f, 0xea, 0x42, 0x99, 0x5c, 0x01, 0x80, +0x84, 0x01, 0xc0, 0x74, 0x91, 0x38, 0x4b, 0x08, +0x80, 0x14, 0x00, 0x40, 0x7a, 0x8e, 0x42, 0xa6, +0x00, 0x40, 0x46, 0x01, 0x80, 0x9d, 0x98, 0x26, +0x53, 0x00, 0xa0, 0x04, 0x00, 0x60, 0xcb, 0x63, +0x62, 0xe3, 0x00, 0x50, 0x2d, 0x00, 0x60, 0x27, +0x7f, 0xe6, 0xd3, 0x00, 0x80, 0x9d, 0xf8, 0x99, +0x7b, 0x01, 0x00, 0x5b, 0x94, 0x21, 0x15, 0x01, +0xa0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, +0x00, 0x68, 0x3b, 0x00, 0xac, 0xcf, 0x56, 0x8a, +0x45, 0x00, 0x58, 0x30, 0x00, 0x14, 0x66, 0x4b, +0xc4, 0x39, 0x00, 0xd8, 0x2d, 0x00, 0x30, 0x49, +0x57, 0x66, 0x48, 0x00, 0xb0, 0xb7, 0x00, 0xc0, +0xce, 0x10, 0x0b, 0xb2, 0x00, 0x08, 0x0c, 0x00, +0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7b, +0x00, 0x60, 0xc8, 0x23, 0x23, 0x78, 0x00, 0x84, +0x99, 0x00, 0x14, 0x46, 0xf2, 0x57, 0x3c, 0xf1, +0x2b, 0xae, 0x10, 0xe7, 0x2a, 0x00, 0x00, 0x78, +0x99, 0xb2, 0x3c, 0xb9, 0x24, 0x39, 0x45, 0x81, +0x5b, 0x08, 0x2d, 0x71, 0x07, 0x57, 0x57, 0x2e, +0x1e, 0x28, 0xce, 0x49, 0x17, 0x2b, 0x14, 0x36, +0x61, 0x02, 0x61, 0x9a, 0x40, 0x2e, 0xc2, 0x79, +0x99, 0x19, 0x32, 0x81, 0x34, 0x0f, 0xe0, 0xf3, +0xcc, 0x00, 0x00, 0xa0, 0x91, 0x15, 0x11, 0xe0, +0x83, 0xf3, 0xfd, 0x78, 0xce, 0x0e, 0xae, 0xce, +0xce, 0x36, 0x8e, 0xb6, 0x0e, 0x5f, 0x2d, 0xea, +0xbf, 0x06, 0xff, 0x22, 0x62, 0x62, 0xe3, 0xfe, +0xe5, 0xcf, 0xab, 0x70, 0x40, 0x00, 0x00, 0xe1, +0x74, 0x7e, 0xd1, 0xfe, 0x2c, 0x2f, 0xb3, 0x1a, +0x80, 0x3b, 0x06, 0x80, 0x6d, 0xfe, 0xa2, 0x25, +0xee, 0x04, 0x68, 0x5e, 0x0b, 0xa0, 0x75, 0xf7, +0x8b, 0x66, 0xb2, 0x0f, 0x40, 0xb5, 0x00, 0xa0, +0xe9, 0xda, 0x57, 0xf3, 0x70, 0xf8, 0x7e, 0x3c, +0x3c, 0x45, 0xa1, 0x90, 0xb9, 0xd9, 0xd9, 0xe5, +0xe4, 0xe4, 0xd8, 0x4a, 0xc4, 0x42, 0x5b, 0x61, +0xca, 0x57, 0x7d, 0xfe, 0x67, 0xc2, 0x5f, 0xc0, +0x57, 0xfd, 0x6c, 0xf9, 0x7e, 0x3c, 0xfc, 0xf7, +0xf5, 0xe0, 0xbe, 0xe2, 0x24, 0x81, 0x32, 0x5d, +0x81, 0x47, 0x04, 0xf8, 0xe0, 0xc2, 0xcc, 0xf4, +0x4c, 0xa5, 0x1c, 0xcf, 0x92, 0x09, 0x84, 0x62, +0xdc, 0xe6, 0x8f, 0x47, 0xfc, 0xb7, 0x0b, 0xff, +0xfc, 0x1d, 0xd3, 0x22, 0xc4, 0x49, 0x62, 0xb9, +0x58, 0x2a, 0x14, 0xe3, 0x51, 0x12, 0x71, 0x8e, +0x44, 0x9a, 0x8c, 0xf3, 0x32, 0xa5, 0x22, 0x89, +0x42, 0x92, 0x29, 0xc5, 0x25, 0xd2, 0xff, 0x64, +0xe2, 0xdf, 0x2c, 0xfb, 0x03, 0x3e, 0xdf, 0x35, +0x00, 0xb0, 0x6a, 0x3e, 0x01, 0x7b, 0x91, 0x2d, +0xa8, 0x5d, 0x63, 0x03, 0xf6, 0x4b, 0x27, 0x10, +0x58, 0x74, 0xc0, 0xe2, 0xf7, 0x00, 0x00, 0xf2, +0xbb, 0x6f, 0xc1, 0xd4, 0x28, 0x08, 0x03, 0x80, +0x68, 0x83, 0xe1, 0xcf, 0x77, 0xff, 0xef, 0x3f, +0xfd, 0x47, 0xa0, 0x25, 0x00, 0x80, 0x66, 0x49, +0x92, 0x71, 0x00, 0x00, 0x5e, 0x44, 0x24, 0x2e, +0x54, 0xca, 0xb3, 0x3f, 0xc7, 0x08, 0x00, 0x00, +0x44, 0xa0, 0x81, 0x2a, 0xb0, 0x41, 0x1b, 0xf4, +0xc1, 0x18, 0x2c, 0xc0, 0x06, 0x1c, 0xc1, 0x05, +0xdc, 0xc1, 0x0b, 0xfc, 0x60, 0x36, 0x84, 0x42, +0x24, 0xc4, 0xc2, 0x42, 0x10, 0x42, 0x0a, 0x64, +0x80, 0x1c, 0x72, 0x60, 0x29, 0xac, 0x82, 0x42, +0x28, 0x86, 0xcd, 0xb0, 0x1d, 0x2a, 0x60, 0x2f, +0xd4, 0x40, 0x1d, 0x34, 0xc0, 0x51, 0x68, 0x86, +0x93, 0x70, 0x0e, 0x2e, 0xc2, 0x55, 0xb8, 0x0e, +0x3d, 0x70, 0x0f, 0xfa, 0x61, 0x08, 0x9e, 0xc1, +0x28, 0xbc, 0x81, 0x09, 0x04, 0x41, 0xc8, 0x08, +0x13, 0x61, 0x21, 0xda, 0x88, 0x01, 0x62, 0x8a, +0x58, 0x23, 0x8e, 0x08, 0x17, 0x99, 0x85, 0xf8, +0x21, 0xc1, 0x48, 0x04, 0x12, 0x8b, 0x24, 0x20, +0xc9, 0x88, 0x14, 0x51, 0x22, 0x4b, 0x91, 0x35, +0x48, 0x31, 0x52, 0x8a, 0x54, 0x20, 0x55, 0x48, +0x1d, 0xf2, 0x3d, 0x72, 0x02, 0x39, 0x87, 0x5c, +0x46, 0xba, 0x91, 0x3b, 0xc8, 0x00, 0x32, 0x82, +0xfc, 0x86, 0xbc, 0x47, 0x31, 0x94, 0x81, 0xb2, +0x51, 0x3d, 0xd4, 0x0c, 0xb5, 0x43, 0xb9, 0xa8, +0x37, 0x1a, 0x84, 0x46, 0xa2, 0x0b, 0xd0, 0x64, +0x74, 0x31, 0x9a, 0x8f, 0x16, 0xa0, 0x9b, 0xd0, +0x72, 0xb4, 0x1a, 0x3d, 0x8c, 0x36, 0xa1, 0xe7, +0xd0, 0xab, 0x68, 0x0f, 0xda, 0x8f, 0x3e, 0x43, +0xc7, 0x30, 0xc0, 0xe8, 0x18, 0x07, 0x33, 0xc4, +0x6c, 0x30, 0x2e, 0xc6, 0xc3, 0x42, 0xb1, 0x38, +0x2c, 0x09, 0x93, 0x63, 0xcb, 0xb1, 0x22, 0xac, +0x0c, 0xab, 0xc6, 0x1a, 0xb0, 0x56, 0xac, 0x03, +0xbb, 0x89, 0xf5, 0x63, 0xcf, 0xb1, 0x77, 0x04, +0x12, 0x81, 0x45, 0xc0, 0x09, 0x36, 0x04, 0x77, +0x42, 0x20, 0x61, 0x1e, 0x41, 0x48, 0x58, 0x4c, +0x58, 0x4e, 0xd8, 0x48, 0xa8, 0x20, 0x1c, 0x24, +0x34, 0x11, 0xda, 0x09, 0x37, 0x09, 0x03, 0x84, +0x51, 0xc2, 0x27, 0x22, 0x93, 0xa8, 0x4b, 0xb4, +0x26, 0xba, 0x11, 0xf9, 0xc4, 0x18, 0x62, 0x32, +0x31, 0x87, 0x58, 0x48, 0x2c, 0x23, 0xd6, 0x12, +0x8f, 0x13, 0x2f, 0x10, 0x7b, 0x88, 0x43, 0xc4, +0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xb9, +0x90, 0x02, 0x49, 0xb1, 0xa4, 0x54, 0xd2, 0x12, +0xd2, 0x46, 0xd2, 0x6e, 0x52, 0x23, 0xe9, 0x2c, +0xa9, 0x9b, 0x34, 0x48, 0x1a, 0x23, 0x93, 0xc9, +0xda, 0x64, 0x6b, 0xb2, 0x07, 0x39, 0x94, 0x2c, +0x20, 0x2b, 0xc8, 0x85, 0xe4, 0x9d, 0xe4, 0xc3, +0xe4, 0x33, 0xe4, 0x1b, 0xe4, 0x21, 0xf2, 0x5b, +0x0a, 0x9d, 0x62, 0x40, 0x71, 0xa4, 0xf8, 0x53, +0xe2, 0x28, 0x52, 0xca, 0x6a, 0x4a, 0x19, 0xe5, +0x10, 0xe5, 0x34, 0xe5, 0x06, 0x65, 0x98, 0x32, +0x41, 0x55, 0xa3, 0x9a, 0x52, 0xdd, 0xa8, 0xa1, +0x54, 0x11, 0x35, 0x8f, 0x5a, 0x42, 0xad, 0xa1, +0xb6, 0x52, 0xaf, 0x51, 0x87, 0xa8, 0x13, 0x34, +0x75, 0x9a, 0x39, 0xcd, 0x83, 0x16, 0x49, 0x4b, +0xa5, 0xad, 0xa2, 0x95, 0xd3, 0x1a, 0x68, 0x17, +0x68, 0xf7, 0x69, 0xaf, 0xe8, 0x74, 0xba, 0x11, +0xdd, 0x95, 0x1e, 0x4e, 0x97, 0xd0, 0x57, 0xd2, +0xcb, 0xe9, 0x47, 0xe8, 0x97, 0xe8, 0x03, 0xf4, +0x77, 0x0c, 0x0d, 0x86, 0x15, 0x83, 0xc7, 0x88, +0x67, 0x28, 0x19, 0x9b, 0x18, 0x07, 0x18, 0x67, +0x19, 0x77, 0x18, 0xaf, 0x98, 0x4c, 0xa6, 0x19, +0xd3, 0x8b, 0x19, 0xc7, 0x54, 0x30, 0x37, 0x31, +0xeb, 0x98, 0xe7, 0x99, 0x0f, 0x99, 0x6f, 0x55, +0x58, 0x2a, 0xb6, 0x2a, 0x7c, 0x15, 0x91, 0xca, +0x0a, 0x95, 0x4a, 0x95, 0x26, 0x95, 0x1b, 0x2a, +0x2f, 0x54, 0xa9, 0xaa, 0xa6, 0xaa, 0xde, 0xaa, +0x0b, 0x55, 0xf3, 0x55, 0xcb, 0x54, 0x8f, 0xa9, +0x5e, 0x53, 0x7d, 0xae, 0x46, 0x55, 0x33, 0x53, +0xe3, 0xa9, 0x09, 0xd4, 0x96, 0xab, 0x55, 0xaa, +0x9d, 0x50, 0xeb, 0x53, 0x1b, 0x53, 0x67, 0xa9, +0x3b, 0xa8, 0x87, 0xaa, 0x67, 0xa8, 0x6f, 0x54, +0x3f, 0xa4, 0x7e, 0x59, 0xfd, 0x89, 0x06, 0x59, +0xc3, 0x4c, 0xc3, 0x4f, 0x43, 0xa4, 0x51, 0xa0, +0xb1, 0x5f, 0xe3, 0xbc, 0xc6, 0x20, 0x0b, 0x63, +0x19, 0xb3, 0x78, 0x2c, 0x21, 0x6b, 0x0d, 0xab, +0x86, 0x75, 0x81, 0x35, 0xc4, 0x26, 0xb1, 0xcd, +0xd9, 0x7c, 0x76, 0x2a, 0xbb, 0x98, 0xfd, 0x1d, +0xbb, 0x8b, 0x3d, 0xaa, 0xa9, 0xa1, 0x39, 0x43, +0x33, 0x4a, 0x33, 0x57, 0xb3, 0x52, 0xf3, 0x94, +0x66, 0x3f, 0x07, 0xe3, 0x98, 0x71, 0xf8, 0x9c, +0x74, 0x4e, 0x09, 0xe7, 0x28, 0xa7, 0x97, 0xf3, +0x7e, 0x8a, 0xde, 0x14, 0xef, 0x29, 0xe2, 0x29, +0x1b, 0xa6, 0x34, 0x4c, 0xb9, 0x31, 0x65, 0x5c, +0x6b, 0xaa, 0x96, 0x97, 0x96, 0x58, 0xab, 0x48, +0xab, 0x51, 0xab, 0x47, 0xeb, 0xbd, 0x36, 0xae, +0xed, 0xa7, 0x9d, 0xa6, 0xbd, 0x45, 0xbb, 0x59, +0xfb, 0x81, 0x0e, 0x41, 0xc7, 0x4a, 0x27, 0x5c, +0x27, 0x47, 0x67, 0x8f, 0xce, 0x05, 0x9d, 0xe7, +0x53, 0xd9, 0x53, 0xdd, 0xa7, 0x0a, 0xa7, 0x16, +0x4d, 0x3d, 0x3a, 0xf5, 0xae, 0x2e, 0xaa, 0x6b, +0xa5, 0x1b, 0xa1, 0xbb, 0x44, 0x77, 0xbf, 0x6e, +0xa7, 0xee, 0x98, 0x9e, 0xbe, 0x5e, 0x80, 0x9e, +0x4c, 0x6f, 0xa7, 0xde, 0x79, 0xbd, 0xe7, 0xfa, +0x1c, 0x7d, 0x2f, 0xfd, 0x54, 0xfd, 0x6d, 0xfa, +0xa7, 0xf5, 0x47, 0x0c, 0x58, 0x06, 0xb3, 0x0c, +0x24, 0x06, 0xdb, 0x0c, 0xce, 0x18, 0x3c, 0xc5, +0x35, 0x71, 0x6f, 0x3c, 0x1d, 0x2f, 0xc7, 0xdb, +0xf1, 0x51, 0x43, 0x5d, 0xc3, 0x40, 0x43, 0xa5, +0x61, 0x95, 0x61, 0x97, 0xe1, 0x84, 0x91, 0xb9, +0xd1, 0x3c, 0xa3, 0xd5, 0x46, 0x8d, 0x46, 0x0f, +0x8c, 0x69, 0xc6, 0x5c, 0xe3, 0x24, 0xe3, 0x6d, +0xc6, 0x6d, 0xc6, 0xa3, 0x26, 0x06, 0x26, 0x21, +0x26, 0x4b, 0x4d, 0xea, 0x4d, 0xee, 0x9a, 0x52, +0x4d, 0xb9, 0xa6, 0x29, 0xa6, 0x3b, 0x4c, 0x3b, +0x4c, 0xc7, 0xcd, 0xcc, 0xcd, 0xa2, 0xcd, 0xd6, +0x99, 0x35, 0x9b, 0x3d, 0x31, 0xd7, 0x32, 0xe7, +0x9b, 0xe7, 0x9b, 0xd7, 0x9b, 0xdf, 0xb7, 0x60, +0x5a, 0x78, 0x5a, 0x2c, 0xb6, 0xa8, 0xb6, 0xb8, +0x65, 0x49, 0xb2, 0xe4, 0x5a, 0xa6, 0x59, 0xee, +0xb6, 0xbc, 0x6e, 0x85, 0x5a, 0x39, 0x59, 0xa5, +0x58, 0x55, 0x5a, 0x5d, 0xb3, 0x46, 0xad, 0x9d, +0xad, 0x25, 0xd6, 0xbb, 0xad, 0xbb, 0xa7, 0x11, +0xa7, 0xb9, 0x4e, 0x93, 0x4e, 0xab, 0x9e, 0xd6, +0x67, 0xc3, 0xb0, 0xf1, 0xb6, 0xc9, 0xb6, 0xa9, +0xb7, 0x19, 0xb0, 0xe5, 0xd8, 0x06, 0xdb, 0xae, +0xb6, 0x6d, 0xb6, 0x7d, 0x61, 0x67, 0x62, 0x17, +0x67, 0xb7, 0xc5, 0xae, 0xc3, 0xee, 0x93, 0xbd, +0x93, 0x7d, 0xba, 0x7d, 0x8d, 0xfd, 0x3d, 0x07, +0x0d, 0x87, 0xd9, 0x0e, 0xab, 0x1d, 0x5a, 0x1d, +0x7e, 0x73, 0xb4, 0x72, 0x14, 0x3a, 0x56, 0x3a, +0xde, 0x9a, 0xce, 0x9c, 0xee, 0x3f, 0x7d, 0xc5, +0xf4, 0x96, 0xe9, 0x2f, 0x67, 0x58, 0xcf, 0x10, +0xcf, 0xd8, 0x33, 0xe3, 0xb6, 0x13, 0xcb, 0x29, +0xc4, 0x69, 0x9d, 0x53, 0x9b, 0xd3, 0x47, 0x67, +0x17, 0x67, 0xb9, 0x73, 0x83, 0xf3, 0x88, 0x8b, +0x89, 0x4b, 0x82, 0xcb, 0x2e, 0x97, 0x3e, 0x2e, +0x9b, 0x1b, 0xc6, 0xdd, 0xc8, 0xbd, 0xe4, 0x4a, +0x74, 0xf5, 0x71, 0x5d, 0xe1, 0x7a, 0xd2, 0xf5, +0x9d, 0x9b, 0xb3, 0x9b, 0xc2, 0xed, 0xa8, 0xdb, +0xaf, 0xee, 0x36, 0xee, 0x69, 0xee, 0x87, 0xdc, +0x9f, 0xcc, 0x34, 0x9f, 0x29, 0x9e, 0x59, 0x33, +0x73, 0xd0, 0xc3, 0xc8, 0x43, 0xe0, 0x51, 0xe5, +0xd1, 0x3f, 0x0b, 0x9f, 0x95, 0x30, 0x6b, 0xdf, +0xac, 0x7e, 0x4f, 0x43, 0x4f, 0x81, 0x67, 0xb5, +0xe7, 0x23, 0x2f, 0x63, 0x2f, 0x91, 0x57, 0xad, +0xd7, 0xb0, 0xb7, 0xa5, 0x77, 0xaa, 0xf7, 0x61, +0xef, 0x17, 0x3e, 0xf6, 0x3e, 0x72, 0x9f, 0xe3, +0x3e, 0xe3, 0x3c, 0x37, 0xde, 0x32, 0xde, 0x59, +0x5f, 0xcc, 0x37, 0xc0, 0xb7, 0xc8, 0xb7, 0xcb, +0x4f, 0xc3, 0x6f, 0x9e, 0x5f, 0x85, 0xdf, 0x43, +0x7f, 0x23, 0xff, 0x64, 0xff, 0x7a, 0xff, 0xd1, +0x00, 0xa7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, +0x81, 0x41, 0x81, 0x5b, 0x02, 0xfb, 0xf8, 0x7a, +0x7c, 0x21, 0xbf, 0x8e, 0x3f, 0x3a, 0xdb, 0x65, +0xf6, 0xb2, 0xd9, 0xed, 0x41, 0x8c, 0xa0, 0xb9, +0x41, 0x15, 0x41, 0x8f, 0x82, 0xad, 0x82, 0xe5, +0xc1, 0xad, 0x21, 0x68, 0xc8, 0xec, 0x90, 0xad, +0x21, 0xf7, 0xe7, 0x98, 0xce, 0x91, 0xce, 0x69, +0x0e, 0x85, 0x50, 0x7e, 0xe8, 0xd6, 0xd0, 0x07, +0x61, 0xe6, 0x61, 0x8b, 0xc3, 0x7e, 0x0c, 0x27, +0x85, 0x87, 0x85, 0x57, 0x86, 0x3f, 0x8e, 0x70, +0x88, 0x58, 0x1a, 0xd1, 0x31, 0x97, 0x35, 0x77, +0xd1, 0xdc, 0x43, 0x73, 0xdf, 0x44, 0xfa, 0x44, +0x96, 0x44, 0xde, 0x9b, 0x67, 0x31, 0x4f, 0x39, +0xaf, 0x2d, 0x4a, 0x35, 0x2a, 0x3e, 0xaa, 0x2e, +0x6a, 0x3c, 0xda, 0x37, 0xba, 0x34, 0xba, 0x3f, +0xc6, 0x2e, 0x66, 0x59, 0xcc, 0xd5, 0x58, 0x9d, +0x58, 0x49, 0x6c, 0x4b, 0x1c, 0x39, 0x2e, 0x2a, +0xae, 0x36, 0x6e, 0x6c, 0xbe, 0xdf, 0xfc, 0xed, +0xf3, 0x87, 0xe2, 0x9d, 0xe2, 0x0b, 0xe3, 0x7b, +0x17, 0x98, 0x2f, 0xc8, 0x5d, 0x70, 0x79, 0xa1, +0xce, 0xc2, 0xf4, 0x85, 0xa7, 0x16, 0xa9, 0x2e, +0x12, 0x2c, 0x3a, 0x96, 0x40, 0x4c, 0x88, 0x4e, +0x38, 0x94, 0xf0, 0x41, 0x10, 0x2a, 0xa8, 0x16, +0x8c, 0x25, 0xf2, 0x13, 0x77, 0x25, 0x8e, 0x0a, +0x79, 0xc2, 0x1d, 0xc2, 0x67, 0x22, 0x2f, 0xd1, +0x36, 0xd1, 0x88, 0xd8, 0x43, 0x5c, 0x2a, 0x1e, +0x4e, 0xf2, 0x48, 0x2a, 0x4d, 0x7a, 0x92, 0xec, +0x91, 0xbc, 0x35, 0x79, 0x24, 0xc5, 0x33, 0xa5, +0x2c, 0xe5, 0xb9, 0x84, 0x27, 0xa9, 0x90, 0xbc, +0x4c, 0x0d, 0x4c, 0xdd, 0x9b, 0x3a, 0x9e, 0x16, +0x9a, 0x76, 0x20, 0x6d, 0x32, 0x3d, 0x3a, 0xbd, +0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xaa, +0x21, 0x4d, 0x93, 0xb6, 0x67, 0xea, 0x67, 0xe6, +0x66, 0x76, 0xcb, 0xac, 0x65, 0x85, 0xb2, 0xfe, +0xc5, 0x6e, 0x8b, 0xb7, 0x2f, 0x1e, 0x95, 0x07, +0xc9, 0x6b, 0xb3, 0x90, 0xac, 0x05, 0x59, 0x2d, +0x0a, 0xb6, 0x42, 0xa6, 0xe8, 0x54, 0x5a, 0x28, +0xd7, 0x2a, 0x07, 0xb2, 0x67, 0x65, 0x57, 0x66, +0xbf, 0xcd, 0x89, 0xca, 0x39, 0x96, 0xab, 0x9e, +0x2b, 0xcd, 0xed, 0xcc, 0xb3, 0xca, 0xdb, 0x90, +0x37, 0x9c, 0xef, 0x9f, 0xff, 0xed, 0x12, 0xc2, +0x12, 0xe1, 0x92, 0xb6, 0xa5, 0x86, 0x4b, 0x57, +0x2d, 0x1d, 0x58, 0xe6, 0xbd, 0xac, 0x6a, 0x39, +0xb2, 0x3c, 0x71, 0x79, 0xdb, 0x0a, 0xe3, 0x15, +0x05, 0x2b, 0x86, 0x56, 0x06, 0xac, 0x3c, 0xb8, +0x8a, 0xb6, 0x2a, 0x6d, 0xd5, 0x4f, 0xab, 0xed, +0x57, 0x97, 0xae, 0x7e, 0xbd, 0x26, 0x7a, 0x4d, +0x6b, 0x81, 0x5e, 0xc1, 0xca, 0x82, 0xc1, 0xb5, +0x01, 0x6b, 0xeb, 0x0b, 0x55, 0x0a, 0xe5, 0x85, +0x7d, 0xeb, 0xdc, 0xd7, 0xed, 0x5d, 0x4f, 0x58, +0x2f, 0x59, 0xdf, 0xb5, 0x61, 0xfa, 0x86, 0x9d, +0x1b, 0x3e, 0x15, 0x89, 0x8a, 0xae, 0x14, 0xdb, +0x17, 0x97, 0x15, 0x7f, 0xd8, 0x28, 0xdc, 0x78, +0xe5, 0x1b, 0x87, 0x6f, 0xca, 0xbf, 0x99, 0xdc, +0x94, 0xb4, 0xa9, 0xab, 0xc4, 0xb9, 0x64, 0xcf, +0x66, 0xd2, 0x66, 0xe9, 0xe6, 0xde, 0x2d, 0x9e, +0x5b, 0x0e, 0x96, 0xaa, 0x97, 0xe6, 0x97, 0x0e, +0x6e, 0x0d, 0xd9, 0xda, 0xb4, 0x0d, 0xdf, 0x56, +0xb4, 0xed, 0xf5, 0xf6, 0x45, 0xdb, 0x2f, 0x97, +0xcd, 0x28, 0xdb, 0xbb, 0x83, 0xb6, 0x43, 0xb9, +0xa3, 0xbf, 0x3c, 0xb8, 0xbc, 0x65, 0xa7, 0xc9, +0xce, 0xcd, 0x3b, 0x3f, 0x54, 0xa4, 0x54, 0xf4, +0x54, 0xfa, 0x54, 0x36, 0xee, 0xd2, 0xdd, 0xb5, +0x61, 0xd7, 0xf8, 0x6e, 0xd1, 0xee, 0x1b, 0x7b, +0xbc, 0xf6, 0x34, 0xec, 0xd5, 0xdb, 0x5b, 0xbc, +0xf7, 0xfd, 0x3e, 0xc9, 0xbe, 0xdb, 0x55, 0x01, +0x55, 0x4d, 0xd5, 0x66, 0xd5, 0x65, 0xfb, 0x49, +0xfb, 0xb3, 0xf7, 0x3f, 0xae, 0x89, 0xaa, 0xe9, +0xf8, 0x96, 0xfb, 0x6d, 0x5d, 0xad, 0x4e, 0x6d, +0x71, 0xed, 0xc7, 0x03, 0xd2, 0x03, 0xfd, 0x07, +0x23, 0x0e, 0xb6, 0xd7, 0xb9, 0xd4, 0xd5, 0x1d, +0xd2, 0x3d, 0x54, 0x52, 0x8f, 0xd6, 0x2b, 0xeb, +0x47, 0x0e, 0xc7, 0x1f, 0xbe, 0xfe, 0x9d, 0xef, +0x77, 0x2d, 0x0d, 0x36, 0x0d, 0x55, 0x8d, 0x9c, +0xc6, 0xe2, 0x23, 0x70, 0x44, 0x79, 0xe4, 0xe9, +0xf7, 0x09, 0xdf, 0xf7, 0x1e, 0x0d, 0x3a, 0xda, +0x76, 0x8c, 0x7b, 0xac, 0xe1, 0x07, 0xd3, 0x1f, +0x76, 0x1d, 0x67, 0x1d, 0x2f, 0x6a, 0x42, 0x9a, +0xf2, 0x9a, 0x46, 0x9b, 0x53, 0x9a, 0xfb, 0x5b, +0x62, 0x5b, 0xba, 0x4f, 0xcc, 0x3e, 0xd1, 0xd6, +0xea, 0xde, 0x7a, 0xfc, 0x47, 0xdb, 0x1f, 0x0f, +0x9c, 0x34, 0x3c, 0x59, 0x79, 0x4a, 0xf3, 0x54, +0xc9, 0x69, 0xda, 0xe9, 0x82, 0xd3, 0x93, 0x67, +0xf2, 0xcf, 0x8c, 0x9d, 0x95, 0x9d, 0x7d, 0x7e, +0x2e, 0xf9, 0xdc, 0x60, 0xdb, 0xa2, 0xb6, 0x7b, +0xe7, 0x63, 0xce, 0xdf, 0x6a, 0x0f, 0x6f, 0xef, +0xba, 0x10, 0x74, 0xe1, 0xd2, 0x45, 0xff, 0x8b, +0xe7, 0x3b, 0xbc, 0x3b, 0xce, 0x5c, 0xf2, 0xb8, +0x74, 0xf2, 0xb2, 0xdb, 0xe5, 0x13, 0x57, 0xb8, +0x57, 0x9a, 0xaf, 0x3a, 0x5f, 0x6d, 0xea, 0x74, +0xea, 0x3c, 0xfe, 0x93, 0xd3, 0x4f, 0xc7, 0xbb, +0x9c, 0xbb, 0x9a, 0xae, 0xb9, 0x5c, 0x6b, 0xb9, +0xee, 0x7a, 0xbd, 0xb5, 0x7b, 0x66, 0xf7, 0xe9, +0x1b, 0x9e, 0x37, 0xce, 0xdd, 0xf4, 0xbd, 0x79, +0xf1, 0x16, 0xff, 0xd6, 0xd5, 0x9e, 0x39, 0x3d, +0xdd, 0xbd, 0xf3, 0x7a, 0x6f, 0xf7, 0xc5, 0xf7, +0xf5, 0xdf, 0x16, 0xdd, 0x7e, 0x72, 0x27, 0xfd, +0xce, 0xcb, 0xbb, 0xd9, 0x77, 0x27, 0xee, 0xad, +0xbc, 0x4f, 0xbc, 0x5f, 0xf4, 0x40, 0xed, 0x41, +0xd9, 0x43, 0xdd, 0x87, 0xd5, 0x3f, 0x5b, 0xfe, +0xdc, 0xd8, 0xef, 0xdc, 0x7f, 0x6a, 0xc0, 0x77, +0xa0, 0xf3, 0xd1, 0xdc, 0x47, 0xf7, 0x06, 0x85, +0x83, 0xcf, 0xfe, 0x91, 0xf5, 0x8f, 0x0f, 0x43, +0x05, 0x8f, 0x99, 0x8f, 0xcb, 0x86, 0x0d, 0x86, +0xeb, 0x9e, 0x38, 0x3e, 0x39, 0x39, 0xe2, 0x3f, +0x72, 0xfd, 0xe9, 0xfc, 0xa7, 0x43, 0xcf, 0x64, +0xcf, 0x26, 0x9e, 0x17, 0xfe, 0xa2, 0xfe, 0xcb, +0xae, 0x17, 0x16, 0x2f, 0x7e, 0xf8, 0xd5, 0xeb, +0xd7, 0xce, 0xd1, 0x98, 0xd1, 0xa1, 0x97, 0xf2, +0x97, 0x93, 0xbf, 0x6d, 0x7c, 0xa5, 0xfd, 0xea, +0xc0, 0xeb, 0x19, 0xaf, 0xdb, 0xc6, 0xc2, 0xc6, +0x1e, 0xbe, 0xc9, 0x78, 0x33, 0x31, 0x5e, 0xf4, +0x56, 0xfb, 0xed, 0xc1, 0x77, 0xdc, 0x77, 0x1d, +0xef, 0xa3, 0xdf, 0x0f, 0x4f, 0xe4, 0x7c, 0x20, +0x7f, 0x28, 0xff, 0x68, 0xf9, 0xb1, 0xf5, 0x53, +0xd0, 0xa7, 0xfb, 0x93, 0x19, 0x93, 0x93, 0xff, +0x04, 0x03, 0x98, 0xf3, 0xfc, 0x63, 0x33, 0x2d, +0xdb, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, +0x4d, 0x00, 0x00, 0x7a, 0x25, 0x00, 0x00, 0x80, +0x83, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0x80, +0xe9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, +0x60, 0x00, 0x00, 0x3a, 0x98, 0x00, 0x00, 0x17, +0x6f, 0x92, 0x5f, 0xc5, 0x46, 0x00, 0x00, 0x05, +0xe2, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, +0x9c, 0x6b, 0x88, 0x15, 0x65, 0x18, 0xc7, 0x7f, +0x67, 0x37, 0x0b, 0xb3, 0x5a, 0xda, 0x34, 0x64, +0xb7, 0x35, 0x2a, 0xc9, 0x08, 0x96, 0xca, 0xd4, +0x28, 0x13, 0xd4, 0x22, 0x33, 0x0a, 0x2b, 0x03, +0x2b, 0x4c, 0xfa, 0x22, 0x89, 0xdd, 0x88, 0x20, +0x93, 0x2c, 0xe8, 0x43, 0x64, 0xd1, 0x87, 0xe8, +0xa2, 0x22, 0x11, 0xac, 0xd5, 0xd2, 0x05, 0x94, +0xf2, 0x43, 0xd9, 0x65, 0xdb, 0x0c, 0x49, 0x85, +0x8a, 0xe8, 0xa2, 0x21, 0xd6, 0xd2, 0xba, 0x09, +0xb1, 0x5d, 0x16, 0x6a, 0x77, 0xb1, 0xdd, 0x7d, +0xfa, 0xf0, 0xbe, 0x4b, 0xc3, 0x38, 0xe7, 0xcc, +0x9c, 0xb3, 0xeb, 0x9e, 0x99, 0x39, 0xff, 0x1f, +0x9c, 0x0f, 0x67, 0xe6, 0x9d, 0x73, 0x7b, 0x7e, +0xf3, 0xbc, 0x97, 0x79, 0xe6, 0x14, 0xcc, 0x0c, +0x51, 0xbb, 0xd4, 0xe9, 0x27, 0x90, 0x00, 0x42, +0x02, 0x08, 0x09, 0x20, 0x24, 0x80, 0x90, 0x00, +0x42, 0x02, 0x08, 0x09, 0x20, 0x24, 0x80, 0x90, +0x00, 0x42, 0x02, 0x08, 0x09, 0x20, 0x24, 0x80, +0x90, 0x00, 0x42, 0x02, 0x08, 0x09, 0x20, 0x24, +0x80, 0x90, 0x00, 0x42, 0x02, 0x08, 0x09, 0x20, +0x24, 0x80, 0x90, 0x00, 0x42, 0x02, 0x08, 0x09, +0x20, 0x24, 0x80, 0x90, 0x00, 0x42, 0x02, 0x08, +0x09, 0x20, 0x24, 0x80, 0x90, 0x00, 0x42, 0x02, +0x08, 0x09, 0x20, 0x24, 0x80, 0x90, 0x00, 0x42, +0x02, 0x08, 0x09, 0x20, 0x24, 0x80, 0x90, 0x00, +0x42, 0x02, 0x08, 0x09, 0x20, 0x24, 0x80, 0x90, +0x00, 0x42, 0x02, 0x08, 0x09, 0x20, 0xaa, 0xca, +0x49, 0xfa, 0x09, 0xc6, 0xcc, 0x19, 0xc0, 0xb5, +0xc0, 0x2c, 0xa0, 0x00, 0x1c, 0x04, 0x3a, 0x81, +0x3f, 0x24, 0x40, 0xfe, 0x03, 0xff, 0x24, 0x70, +0x0f, 0x30, 0x39, 0xb4, 0xef, 0x18, 0xf0, 0x26, +0xf0, 0x38, 0xf0, 0x4b, 0x9a, 0xbf, 0x44, 0x41, +0x7f, 0x17, 0x5f, 0x11, 0xb3, 0x81, 0x1d, 0xc0, +0x8c, 0x98, 0x76, 0x83, 0xc0, 0x83, 0xc0, 0x56, +0x09, 0x90, 0x1f, 0xae, 0x00, 0x3e, 0xf4, 0x19, +0x20, 0x29, 0xaf, 0xfa, 0x4c, 0x31, 0x24, 0x01, +0xb2, 0xcd, 0x0c, 0xe0, 0x6b, 0xa0, 0xb1, 0x82, +0x63, 0x77, 0x02, 0xb7, 0xf9, 0xee, 0x41, 0xb3, +0x80, 0x8c, 0xb2, 0xb5, 0x44, 0xf0, 0xe3, 0xce, +0xee, 0x9b, 0x80, 0xf5, 0x9a, 0x06, 0x66, 0x3b, +0xf5, 0x2f, 0x89, 0xd8, 0xfe, 0x23, 0x30, 0x1f, +0x98, 0x04, 0x5c, 0x0c, 0x7c, 0x56, 0x22, 0x03, +0x3c, 0xab, 0x59, 0x40, 0xf6, 0xa8, 0x03, 0x46, +0x80, 0xe5, 0x11, 0xfb, 0x7e, 0x07, 0x16, 0x01, +0x47, 0xfd, 0xf3, 0x7f, 0x81, 0x99, 0x59, 0x49, +0xff, 0xca, 0x00, 0xf1, 0x4c, 0x03, 0x3e, 0x01, +0x56, 0x03, 0x73, 0x23, 0xf6, 0xbf, 0x16, 0x08, +0xfe, 0x4c, 0x3f, 0xff, 0x6f, 0x2e, 0x11, 0xfc, +0x79, 0xc0, 0xf9, 0xca, 0x00, 0xd9, 0xa0, 0x11, +0xd8, 0x0d, 0x5c, 0x04, 0x5c, 0x05, 0xfc, 0x53, +0xe2, 0x04, 0x4a, 0x12, 0xfc, 0x53, 0x80, 0x76, +0x3f, 0x90, 0x7c, 0x09, 0x78, 0xca, 0x67, 0x90, +0xea, 0x62, 0x66, 0x7a, 0x44, 0x3f, 0xda, 0x2c, +0x9e, 0xa3, 0x66, 0x76, 0xa9, 0x99, 0x1d, 0x89, +0xd8, 0xf7, 0x9e, 0x99, 0x9d, 0x1c, 0x78, 0xbd, +0x0d, 0xa1, 0xfd, 0x7f, 0x99, 0xd9, 0x43, 0xd5, +0xfe, 0x9e, 0x9a, 0x06, 0x46, 0x33, 0x1d, 0x38, +0x02, 0xd4, 0x27, 0x68, 0x3b, 0x1c, 0xd1, 0x2e, +0xdc, 0xe7, 0xcf, 0xf7, 0x19, 0x22, 0x9c, 0x71, +0xdb, 0x80, 0xbb, 0x35, 0x06, 0x48, 0x1f, 0x57, +0x26, 0x0c, 0x3e, 0x09, 0x82, 0xdf, 0x0a, 0xbc, +0x1b, 0x11, 0xfc, 0x61, 0x60, 0xa3, 0x06, 0x81, +0xe9, 0x62, 0x35, 0x70, 0x2e, 0xd0, 0x14, 0xb1, +0x6f, 0x00, 0xe8, 0x8e, 0x39, 0xbe, 0x33, 0x14, +0xfc, 0x65, 0xc0, 0xe7, 0xc0, 0x59, 0x11, 0x6d, +0x5f, 0xc0, 0x5d, 0x38, 0xaa, 0x2a, 0xea, 0x02, +0xfe, 0x67, 0x23, 0xb0, 0x0e, 0xf8, 0x0d, 0x78, +0x0b, 0xb8, 0x3f, 0xb4, 0xff, 0x66, 0x2f, 0xc1, +0xae, 0x12, 0xaf, 0x31, 0xe4, 0xf7, 0x77, 0xf9, +0x81, 0xe3, 0x65, 0x45, 0xda, 0x7d, 0xe7, 0x67, +0x15, 0x83, 0x12, 0x20, 0x5d, 0xc1, 0x2f, 0xc6, +0xe1, 0xc0, 0xfc, 0xfe, 0x79, 0xdc, 0x05, 0x9e, +0x4a, 0xe9, 0x01, 0xae, 0xf6, 0x92, 0x68, 0x1d, +0x20, 0x03, 0xc1, 0x27, 0x34, 0x05, 0x7c, 0xd8, +0x4f, 0xe7, 0x2a, 0xa1, 0x17, 0x58, 0x9a, 0x96, +0xe0, 0x2b, 0x03, 0xc0, 0xf5, 0xc0, 0xfb, 0x09, +0x47, 0xfa, 0x2d, 0x81, 0x45, 0x9f, 0x7a, 0xdf, +0x87, 0xaf, 0x2d, 0xe3, 0xbd, 0x0e, 0xf9, 0x31, +0xc1, 0x81, 0x34, 0xfd, 0x00, 0xb5, 0x9e, 0x01, +0x3e, 0x00, 0x9e, 0x49, 0x38, 0xd2, 0x5f, 0x17, +0x12, 0xe2, 0x5e, 0x60, 0x45, 0x40, 0x8a, 0x52, +0xf2, 0x6c, 0x02, 0x2e, 0x4f, 0x5b, 0xf0, 0x95, +0x01, 0xca, 0xeb, 0x06, 0x0c, 0x58, 0xec, 0x47, +0xfa, 0x41, 0x26, 0x03, 0x77, 0x00, 0xb7, 0xfa, +0x20, 0x4f, 0x07, 0xfa, 0x7d, 0xb0, 0x3f, 0xc2, +0x5d, 0x41, 0xfc, 0x39, 0xad, 0x5f, 0xbc, 0x16, +0x05, 0x68, 0xc6, 0x5d, 0xd5, 0x9b, 0x85, 0xbb, +0xc8, 0x73, 0x08, 0xe8, 0x00, 0xd6, 0x24, 0x90, +0xa0, 0x0f, 0x58, 0x00, 0x7c, 0x9b, 0x97, 0x1f, +0xa3, 0x96, 0x04, 0x68, 0x02, 0x9e, 0xf3, 0x69, +0x3b, 0xaa, 0xeb, 0xfb, 0x18, 0xb7, 0x5e, 0xbf, +0x20, 0xc1, 0x28, 0x7e, 0x09, 0xf0, 0xbd, 0x04, +0xc8, 0x0e, 0xd7, 0x00, 0x6f, 0x53, 0x59, 0x25, +0x4f, 0xb1, 0xd1, 0xfc, 0xe2, 0x3c, 0x64, 0x82, +0x5a, 0x10, 0xe0, 0x46, 0x60, 0x3b, 0xae, 0x60, +0x63, 0x3c, 0xc9, 0x85, 0x04, 0x79, 0x17, 0xa0, +0x15, 0xd8, 0xc7, 0xf1, 0x65, 0xdb, 0x92, 0xa0, +0x06, 0xa6, 0x81, 0x05, 0x5c, 0x35, 0x6e, 0xb1, +0xe0, 0xff, 0x99, 0xe0, 0x35, 0xe2, 0xa6, 0x6d, +0x53, 0xfd, 0x00, 0xb2, 0x55, 0x02, 0xa4, 0x8f, +0xa5, 0xc0, 0x9c, 0x88, 0xed, 0x7b, 0xfd, 0x0c, +0xa0, 0x11, 0x57, 0x9d, 0xb3, 0xa7, 0xc8, 0xf1, +0xed, 0x3e, 0xb0, 0x71, 0xeb, 0x04, 0x53, 0xbc, +0x08, 0x99, 0x24, 0xcf, 0x15, 0x41, 0xb7, 0x47, +0x6c, 0xeb, 0xc2, 0xad, 0xfe, 0xf5, 0xf9, 0xe7, +0x67, 0x17, 0x39, 0x7b, 0xdb, 0x81, 0x55, 0xb8, +0x45, 0x9c, 0x47, 0x71, 0x17, 0x79, 0x1e, 0x8b, +0x68, 0x37, 0xe0, 0xc7, 0x18, 0x9f, 0x2a, 0x03, +0xa4, 0x8f, 0xd9, 0x11, 0xdb, 0xda, 0x02, 0xc1, +0x2f, 0x76, 0x83, 0x47, 0x30, 0xf8, 0xd7, 0x01, +0x17, 0x02, 0x1b, 0x38, 0xbe, 0xa4, 0x7b, 0x34, +0xf8, 0x1d, 0x59, 0xfe, 0x91, 0xf2, 0x2c, 0xc0, +0x69, 0x11, 0xdb, 0x26, 0xc5, 0x04, 0x7f, 0x0b, +0xb0, 0xd2, 0x07, 0xbf, 0x01, 0x78, 0x1d, 0xf8, +0x01, 0x78, 0xd9, 0x8f, 0x27, 0xd6, 0xe7, 0x29, +0xf8, 0x79, 0x9f, 0x05, 0x7c, 0x19, 0x91, 0x05, +0xba, 0x71, 0x25, 0x58, 0x3b, 0x8a, 0x04, 0x7f, +0x2d, 0x6e, 0xc9, 0x17, 0xe0, 0x45, 0xe0, 0xbe, +0xc0, 0xfe, 0xbf, 0x71, 0x37, 0x83, 0x02, 0x7c, +0x95, 0x87, 0xe0, 0xa7, 0x31, 0x03, 0x14, 0x80, +0x07, 0x80, 0x53, 0xcb, 0x3c, 0xee, 0x4c, 0x5c, +0xf5, 0x6e, 0x70, 0xa1, 0xe7, 0x9b, 0x88, 0x76, +0x2d, 0xb8, 0x32, 0xef, 0xb8, 0xe0, 0x2f, 0x0b, +0x05, 0x7f, 0x34, 0xa3, 0xb4, 0xe0, 0x56, 0x13, +0x3b, 0x72, 0x73, 0x9a, 0xa4, 0xa8, 0x0a, 0xb7, +0x60, 0x66, 0x9b, 0x7d, 0xc5, 0xec, 0x6e, 0x33, +0x6b, 0x48, 0x70, 0xcc, 0x25, 0x66, 0xb6, 0xcb, +0xcc, 0x86, 0x03, 0xd5, 0xb6, 0x7b, 0xcd, 0x6c, +0xb9, 0x99, 0xdd, 0x60, 0xc9, 0xd8, 0xec, 0xdf, +0x7b, 0xf4, 0x35, 0x17, 0x9a, 0x59, 0x7f, 0x44, +0xbb, 0x01, 0x33, 0x6b, 0xce, 0x5b, 0xf5, 0x73, +0x1a, 0x83, 0x3f, 0xca, 0xbe, 0x18, 0x09, 0x56, +0x99, 0xd9, 0xb1, 0x12, 0x81, 0xdd, 0x69, 0x66, +0xbd, 0x31, 0xc1, 0xdf, 0x1e, 0x08, 0x7e, 0x9d, +0x99, 0xad, 0xf1, 0x81, 0x8e, 0xe2, 0x91, 0x3c, +0x96, 0xbf, 0xa7, 0x61, 0x0c, 0x50, 0x0f, 0xbc, +0x42, 0x74, 0x79, 0xf4, 0x7e, 0x3f, 0x12, 0xef, +0x0b, 0x6d, 0x5f, 0x81, 0xfb, 0x03, 0x86, 0xb1, +0x32, 0x82, 0xbb, 0x97, 0xef, 0x57, 0x5c, 0x0d, +0xdf, 0x79, 0x45, 0xda, 0x75, 0xe2, 0xae, 0x27, +0x8c, 0xe4, 0x6e, 0xb5, 0xac, 0xca, 0x02, 0xd4, +0x03, 0xdb, 0x80, 0x3b, 0x4b, 0xb4, 0x09, 0x4b, +0x30, 0x15, 0xf8, 0x09, 0x38, 0x7d, 0x82, 0x3e, +0xe3, 0x41, 0xdc, 0x15, 0xc2, 0xde, 0x3c, 0x8e, +0x94, 0xb3, 0x30, 0x0d, 0x9c, 0xe7, 0xa7, 0x6c, +0x0d, 0xfe, 0xf9, 0xca, 0x09, 0x0c, 0x7e, 0x97, +0x97, 0x2f, 0x97, 0xc1, 0x4f, 0x83, 0x00, 0xc3, +0x7e, 0xd1, 0xa5, 0xbd, 0x0c, 0x09, 0xe6, 0x4e, +0xd0, 0x67, 0xdb, 0x8f, 0xab, 0xde, 0xed, 0x26, +0xc7, 0xa4, 0x21, 0x03, 0x94, 0x2b, 0x41, 0xd3, +0x18, 0xdf, 0x6f, 0x20, 0x66, 0x7f, 0x3f, 0xf0, +0x84, 0x0f, 0x7e, 0x0f, 0x39, 0x27, 0x4d, 0x0b, +0x41, 0x49, 0xc6, 0x03, 0x51, 0xec, 0xf1, 0x02, +0x0d, 0xe1, 0x6a, 0xf6, 0x6f, 0x89, 0x69, 0xdf, +0x8d, 0xab, 0xe8, 0x9d, 0x83, 0xab, 0xe1, 0x9b, +0xe6, 0x17, 0x79, 0x0e, 0xe0, 0x2a, 0x84, 0xb7, +0xe5, 0x39, 0xe5, 0xa7, 0x7d, 0x25, 0xb0, 0x5c, +0x09, 0x06, 0x70, 0xb7, 0x5b, 0xf7, 0x06, 0x16, +0x92, 0x36, 0xe1, 0xea, 0xfb, 0x4a, 0x71, 0x18, +0x58, 0x88, 0xbb, 0x01, 0xb4, 0xa6, 0x49, 0xdb, +0x20, 0x30, 0x69, 0x77, 0x30, 0x4a, 0x4f, 0xe8, +0x6c, 0x35, 0xbf, 0xa2, 0xb7, 0x25, 0xe6, 0xb8, +0x0b, 0xfc, 0xd4, 0xee, 0x1c, 0x09, 0x90, 0x3e, +0x86, 0x81, 0xbb, 0x12, 0x04, 0x11, 0xdc, 0xed, +0x5a, 0xe1, 0xf5, 0xfe, 0x72, 0x24, 0xf8, 0x82, +0xe8, 0xbf, 0x74, 0x91, 0x00, 0x55, 0x66, 0x24, +0x61, 0x10, 0x01, 0xde, 0x89, 0x38, 0x93, 0x93, +0x4a, 0x30, 0x85, 0xf1, 0x2b, 0x14, 0xd5, 0x18, +0xe0, 0x44, 0x7c, 0xbe, 0x31, 0xf6, 0xe9, 0xa5, +0x8e, 0xcf, 0x4d, 0x65, 0x6f, 0x1e, 0x33, 0xc0, +0x78, 0xf5, 0xe9, 0xc5, 0x8e, 0x57, 0xf0, 0x33, +0x22, 0xc0, 0x89, 0x90, 0x40, 0xc1, 0xcf, 0x50, +0x17, 0x30, 0xde, 0xdd, 0xc1, 0xd3, 0xc0, 0x1b, +0x0a, 0x7e, 0x36, 0x05, 0x28, 0x57, 0x82, 0x45, +0xe4, 0x7c, 0x19, 0xb7, 0x56, 0xba, 0x00, 0x4d, +0xf1, 0x24, 0x40, 0x45, 0x12, 0x34, 0xfb, 0x31, +0x81, 0x24, 0xc8, 0x51, 0x17, 0x10, 0xee, 0x0e, +0x1a, 0x12, 0xb4, 0x1b, 0x24, 0x05, 0x7f, 0xc6, +0x24, 0x01, 0x84, 0xba, 0x00, 0x21, 0x01, 0x84, +0x04, 0x10, 0x12, 0x40, 0x48, 0x00, 0x21, 0x01, +0x84, 0x04, 0x10, 0x12, 0x40, 0x48, 0x00, 0x21, +0x01, 0x84, 0x04, 0x10, 0x12, 0x40, 0x48, 0x00, +0x21, 0x01, 0x84, 0x04, 0x10, 0x12, 0x40, 0x48, +0x00, 0x21, 0x01, 0x84, 0x04, 0x10, 0x12, 0x40, +0x48, 0x00, 0x21, 0x01, 0x84, 0x04, 0x10, 0x12, +0x40, 0x48, 0x00, 0x21, 0x01, 0x84, 0x04, 0x10, +0x12, 0x40, 0x48, 0x00, 0x21, 0x01, 0xc4, 0x18, +0xf8, 0x6f, 0x00, 0xae, 0xb1, 0x18, 0x25, 0xd7, +0x66, 0x43, 0x37, 0x00, 0x00, 0x00, 0x00, 0x49, +0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; + + +HERE_MAPS_END_NAMESPACE diff --git a/inc/engine/internal/JsonParser.h b/inc/engine/internal/JsonParser.h new file mode 100755 index 0000000..7fa4c40 --- /dev/null +++ b/inc/engine/internal/JsonParser.h @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef JSON_PARSER_H_ +#define JSON_PARSER_H_ + +#include "common/HereMaps_global.h" +#include "finder/Category.h" +#include "finder/ContactDetails.h" +#include "finder/ExtendedAttribute.h" +#include "finder/ImageContent.h" +#include "finder/ReviewContent.h" +#include "finder/EditorialContent.h" +#include "finder/PlaceItem.h" +#include "finder/SearchItem.h" +#include "finder/PlaceDetails.h" + +#ifndef TIZEN_MIGRATION +#include +#include +#endif +#include +#include + +#ifdef TIZEN_MIGRATION +#include "base/BaseByteBuffer.h" +#include + +#define JsonArray json_object +#define JsonNumber json_object +#define JsonObject json_object +#define IJsonValue json_object +#define JsonBool json_object + +using namespace Tizen::Maps; +#else +using namespace Tizen::Base; +using namespace Tizen::Base::Utility; +using namespace Tizen::Web::Json; +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class DiscoveryReply; +class BaseContent; +class Address; +class GeoCoordinates; +class BaseQuery; +class GeoLocation; +class LinkObject; +class Ratings; +class GeoBoundingBox; +class SearchContext; +class FinderError; + +/** + * Parses Places API Json data. + * + * @ingroup Search / Online / Parser + */ +class JsonParser +{ +public: + + /** + * Parse discover search results. + * @param json_stream ByteBuffer. + * @param results_page Parsed Discovery query. + * @param error A pointer to an object that is populated + * with error information should parsing fail. + */ + static bool ParseDiscoverySearch( ByteBuffer& buf, DiscoveryReply& results_page, FinderError*& error); + + /** + * Parse place result. + * @param json_stream ByteBuffer. + * @param place_data Parsed place data. + * @param error A pointer to an object that is populated + * with error information should parsing fail. + */ + static bool ParsePlaceResult( ByteBuffer& buf, PlaceDetails& place_data, FinderError*& error); + +private: + + static void ParseGeocodeSearch( ByteBuffer& json_stream, + std::vector< GeoLocation >& results ); + + static void ParseReverseGeocodeSearch( ByteBuffer& json_stream, Address& address ); + + + static void ParseTextSuggestions( ByteBuffer& json, std::vector< String >& suggestions ); + + + static void ParseDiscoverySearch( IJsonValue* json, DiscoveryReply& results_page ); + + static void ParsePlaceResult( IJsonValue* json, PlaceDetails& place_data ); + + static void ParseAlternativeNames( JsonArray* json_data, + PlaceDetails::AlternativeNames& alternative_names ); + + static void ParsePlaceLocation( JsonObject* json_data, GeoLocation& location ); + + static void ParsePosition( JsonObject* json_data, GeoCoordinates& position ); + + static void ParseAddress( JsonObject* json_data, Address& address ); + + static void ParseContacts( JsonArray* json_data, const String& key, + ContactDetailsList& contacts ); +#ifndef TIZEN_MIGRATION + static void ParseLinkObject( IJsonValue* json_data, + const char* object_name, + LinkObject& link_object ); +#endif + static void ParseLinkObject( JsonObject* json_data, LinkObject& link_object ); +#ifndef TIZEN_MIGRATION + static void ParseLinkObject( JsonObject* json_data, + const char* object_name, + LinkObject& link_object ); +#endif + static void ParseRatings( JsonObject* json_data, Ratings& ratings ); + + static void ParseCategories( JsonArray* json_data, CategoryList& categories ); + + static void ParseCategory( JsonObject* json_data, Category& category ); + + static void ParseAttributes( JsonObject* json_data, ExtendedAttributeList& attributes ); + + static void ParseSearchContext( JsonObject* json_data, SearchContext& results_context ); + + static void ParseBbox( JsonObject* json_data, GeoBoundingBox& bbox ); + + static void ParseResultsItemPlace( JsonObject* json_data, PlaceItem& place_result ); + + static void ParseResultsItemSearch( JsonObject* json_data, SearchItem& search_result ); + + static void ParsePlaceRelated( JsonObject* json_data, PlaceDetails& place_data ); + + static void ParsePlaceMedia( JsonObject* json_data, PlaceDetails& place_data ); + + static void ParsePlaceEditorials( JsonObject* json_data, EditorialContentList& editorials ); + + static void ParsePlaceImages( JsonObject* json_data, ImageContentList& images ); + + static void ParsePlaceReviews( JsonObject* json_data, ReviewContentList& reviews ); + + static void ParsePlaceEditorial( JsonObject* json_data, EditorialContent& editorial ); + + static void ParsePlaceImage( JsonObject* json_data, ImageContent& image ); + + static void ParsePlaceReview( JsonObject* json_data, ReviewContent& review ); + + static void ParsePlaceBaseContent( JsonObject* json_data, BaseContent& media ); + + static void TraverseRootNode( ByteBuffer& json_stream, IJsonValue* root ); + static void ParseCoordinates( IJsonValue* json_location, GeoLocation& loc ); + static void ParseBoundingBox( IJsonValue* json_location, GeoLocation& loc ); + static void ParseAddress( IJsonValue* json_location, GeoLocation& loc ); + + static void ParsePlaceResults(JsonArray* pObject, PlaceItemList&, SearchItemList& ); + +private: + static void GetStringValue(JsonObject* pObject, const String& sKey, String& value ); + static void GetUriValue(JsonObject* pObject, const String& sKey, Uri& uri ); + static bool GetValuePtr(JsonObject* pObject, const String& sKey, IJsonValue*& pValue ); +}; + +HERE_MAPS_END_NAMESPACE + +#endif // JSON_PARSER_H_ diff --git a/inc/engine/internal/Logger.h b/inc/engine/internal/Logger.h new file mode 100644 index 0000000..27a6fc3 --- /dev/null +++ b/inc/engine/internal/Logger.h @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef LOGGER_H +#define LOGGER_H + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class Result; +class Address; +class GeoLocation; + +/** + * This class encapsulates logging utility methods which allow you to output + * debug, error and warning messages as well as specific data objects. + */ +class Logger +{ +public: + /** + * This method obtains a instance of Logger. + * + * @return A static reference to Logger. + */ + static Logger& getInstance(); + + /** + * This method writes a debug message to standard output (and to a file if + * writing to a file is enabled). + * + * @param pFile A constant pointer to a character string containing the name + * of the file where the message originates. + * + * @param uLine A value indicating the line number in the file named by + * pFile. + * + * @param pMsg A constant pointer to a character buffer containing the + * format string of the message to output. + * + * @param ... A variable list of arguments that are used to complete the + * message on the basis of the format string specified by + * pMsg. + */ + void debug(const char* pFile, unsigned int uLine, const char* pMsg, ...); + + /** + * This method writes an error message to standard output (and to a file if + * writing to a file is enabled). + * + * @param pFile A constant pointer to a character string containing the name + * of the file where the message originates. + * + * @param uLine A value indicating the line number in the file named by + * pFile. + * + * @param pMsg A constant pointer to a character buffer containing the + * format string of the message to output. + * + * @param ... A variable list of arguments that are used to complete the + * message on the basis of the format string specified by + * pMsg. + */ + void error(const char* pFile, unsigned int uLine, const char* pMsg, ...); + + /** + * This method writes a warning message to standard output (and to a file if + * writing to a file is enabled). + * + * @param pFile A constant pointer to a character string containing the name + * of the file where the message originates. + * + * @param uLine A value indicating the line number in the file named by + * pFile. + * + * @param pMsg A constant pointer to a character buffer containing the + * format string of the message to output. + * + * @param ... A variable list of arguments that are used to complete the + * message on the basis of the format string specified by + * pMsg. + */ + void warning(const char* pFile, unsigned int uLine, const char* pMsg, ...); + + /** + * This method prints the object provided by the caller to standard output + * and to a file (if writing to a file is enabled). + * + * @param rResult A constant reference to the object to output. + */ + void print(const Result& rResult); + + /** + * This method prints the object provided by the caller to standard output + * and to a file (if writing to a file is enabled). + * + * @param rResult A constant reference to the object to output. + */ + void print(const Address& rResult); + + /** + * This method prints the object provided by the caller to standard output + * and to a file (if writing to a file is enabled). + * + * @param rResult A constant reference to the object to output. + */ + void print(const GeoLocation& rResult); + +private: + //HERE_MAPS_NO_COPY_NO_ASSIGN(Logger); + + Logger(); + ~Logger(); +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/internal/Opt.h b/inc/engine/internal/Opt.h new file mode 100644 index 0000000..f20d599 --- /dev/null +++ b/inc/engine/internal/Opt.h @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef OPT_H +#define OPT_H + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This is a template helper class for optional parameters. + */ +template +class Opt +{ +public: + /** + * This is the default constructor. + */ + Opt(); + + //flag management + /** + * This method retrieves a Boolean value indicating if the property is available + * (set). + * + * @return true if the property is set, otherwise false. + */ + bool IsAvailable() const; + + /** + * This method resets a Boolean value indicating if the property is available + * (set). + */ + void Reset(); + + //access implicit + /** + * This operator returns a reference to the property. + */ + operator T&(); + + /** + * This operator returns a constant reference to the property. + */ + operator const T&() const; + + //access explicit + /** + * This method retrieves a reference to the property. + * + * @return A reference to the property. + */ + T& Get(); + + /** + * This method retrieves a constant reference to the property. + * + * @return A constant reference to the property. + */ + const T& Get() const; + + //assignment + /** + * This is the assignment operator. + * + * @param t A constant reference to a property whose value is to be copied + * to the given instance. + */ + void operator=(const T& t); + +private: + bool m_bAvailable; + T m_aValue; +}; + +//----------------------------------------------------------------------------- +template +inline Opt::Opt() +: m_bAvailable(false) +{ +} + +//----------------------------------------------------------------------------- +template +inline bool Opt::IsAvailable() const +{ + return m_bAvailable; +} + +//----------------------------------------------------------------------------- +template +void Opt::Reset() +{ + m_bAvailable = false; +} + +//----------------------------------------------------------------------------- +template +inline Opt::operator T&() +{ + return m_aValue; +} + +//----------------------------------------------------------------------------- +template +inline Opt::operator const T&() const +{ + return m_aValue; +} + +//----------------------------------------------------------------------------- +template +inline T& Opt::Get() +{ + return m_aValue; +} + +//----------------------------------------------------------------------------- +template +inline const T& Opt::Get() const +{ + return m_aValue; +} + +//----------------------------------------------------------------------------- +template +inline void Opt::operator=(const T& t) +{ + m_aValue = t; + m_bAvailable = true; +} + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/internal/Proximity.h b/inc/engine/internal/Proximity.h new file mode 100644 index 0000000..b767e41 --- /dev/null +++ b/inc/engine/internal/Proximity.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef PROXIMITY_H_ +#define PROXIMITY_H_ + +#include "common/HereMaps_global.h" +#include "common/GeoCoordinates.h" +#include "internal/Distance.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class Proximity +{ +public: + Proximity() : __center(0,0) {} + Proximity(const GeoCoordinates& center, const Distance& radius); + + GeoCoordinates GetCenter() const; + Distance GetRadius() const; + bool IsValid() const; + +private: + GeoCoordinates __center; + Distance __radius; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // PROXIMITY_H_ diff --git a/inc/engine/internal/RestCurl.h b/inc/engine/internal/RestCurl.h new file mode 100755 index 0000000..5e5598b --- /dev/null +++ b/inc/engine/internal/RestCurl.h @@ -0,0 +1,68 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef REST_CURL_H +#define REST_CURL_H + +#include +#include +#include +#include +#include +#include + +#include "common/HereMaps_global.h" + +#include "common/RestItemHandle.h" +#include "base/BaseByteBuffer.h" +#include "base/EventDrivenThread.h" + +#define RESTCURL_CRYPTO_LOCK + +TIZEN_MAPS_BEGIN_NAMESPACE + +using namespace Tizen::Maps; + +typedef struct MemoryStruct { + char *memory; + size_t size; + long http_code; +} MemoryStruct_s; + +class RestCurl +{ +public: + RestCurl(); + virtual ~RestCurl(); + bool Commit(void *pArgs); + void Clear(); + void Shutdown(); + void Abort(const Here::Maps::RestItemHandle::RequestId aRequestId); + int EasyCurl(String sUrl, MemoryStruct_s* pChunk); + String UrlEncode(String sStr); + static RestCurl& GetInstance(); + +private: + static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp); + static void *ThreadFunc(void *pArgs); + + class RestCurlImpl; + RestCurlImpl* m_pImpl; +}; + +TIZEN_MAPS_END_NAMESPACE + +#endif /* REST_CURL_H */ diff --git a/inc/engine/internal/RestEngine.h b/inc/engine/internal/RestEngine.h new file mode 100755 index 0000000..62127ec --- /dev/null +++ b/inc/engine/internal/RestEngine.h @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef RESTENGINE_H +#define RESTENGINE_H + +#include "common/HereMaps_global.h" + +#ifndef TIZEN_MIGRATION +#include +#include +#include +#endif + +#include "common/QueryListener.h" +#include "common/RestItemHandle.h" + +#ifdef TIZEN_MIGRATION +#include "base/BaseObject.h" +#include "base/BaseByteBuffer.h" +#include "base/EventDrivenThread.h" +#include "internal/RestCurl.h" + +using namespace Tizen::Maps; +#else +using namespace Tizen::Base::Runtime; +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class RestItem; +class BaseReply; +class QueryListener; + +class RestEngineArgument +: public Tizen::Maps::Object +{ +public: + RestEngineArgument(const String& sUrl, RestItem* pRestItem) + : m_sUrl(sUrl) + , m_pRestItem(pRestItem) + { + } + + RestEngineArgument(RestItemHandle::RequestId aRequestId) + : m_aRequestId(aRequestId) + { + } + + RestEngineArgument(RestItem* pRestItem) + : m_pRestItem(pRestItem) + { + } + + ~RestEngineArgument() + { + } + + String m_sUrl; + RestItem* m_pRestItem; + RestItemHandle::RequestId m_aRequestId; + #ifdef TIZEN_MIGRATION + Tizen::Maps::MemoryStruct_s m_Chunk; + #endif +}; + +//this is an internal class and should not be used outside +class RestEngine +: public EventDrivenThread +#ifndef TIZEN_MIGRATION +, public Tizen::Net::Http::IHttpTransactionEventListener +#endif +{ +public: + static RestEngine& GetInstance(); + + RestItemHandle::RequestId OpenRequest(const String& sUrl, QueryListener* pListener, BaseReplyPtr pReply); + size_t GetNumPendingRequests() const; + void ShutdownEngine(); + void AbortRequest(RestItemHandle::RequestId aRequestId); + void AbortListenerRequests(QueryListener* pListener); + void AbortAllRequests(); + void UnregisterListener(QueryListener* pListener); + + int CountListeners() const; + + static unsigned int GetMaxPendingRequests(); + +#ifdef TIZEN_MIGRATION + void FireImpl(void* pArgs); +#endif + +private: + enum RequestType + { + RT_OpenRequest = 0, + RT_CloseRestItem, + RT_DeleteRestItem + }; + bool CheckRequestIn(RestItem* pRestItem); + RestItem* GetChechedInRequest(RestItemHandle::RequestId aRequestId) const; + + void CloseRestItemLater(RestItemHandle::RequestId aRequestId); + void CloseRestItem(RestItemHandle::RequestId aRequestId, bool bDeleteLater = false); + void DeleteRestItemLater(RestItem* pRestItem); + +#ifdef TIZEN_MIGRATION + void OnUserEventReceivedN(int requestType, void *pArgs); +#else + void OnTransactionAborted(Tizen::Net::Http::HttpSession& httpSession, + Tizen::Net::Http::HttpTransaction& httpTransaction, result r); + + void OnTransactionCertVerificationRequiredN(Tizen::Net::Http::HttpSession& httpSession, + Tizen::Net::Http::HttpTransaction& httpTransaction, + Tizen::Base::String* pCert); + + void OnTransactionCompleted(Tizen::Net::Http::HttpSession& httpSession, + Tizen::Net::Http::HttpTransaction& httpTransaction); + + void OnTransactionHeaderCompleted(Tizen::Net::Http::HttpSession& httpSession, + Tizen::Net::Http::HttpTransaction& httpTransaction, + int headerLen, + bool bAuthRequired); + + void OnTransactionReadyToRead(Tizen::Net::Http::HttpSession& httpSession, + Tizen::Net::Http::HttpTransaction& httpTransaction, + int availableBodyLen); + + void OnTransactionReadyToWrite(Tizen::Net::Http::HttpSession& httpSession, + Tizen::Net::Http::HttpTransaction& httpTransaction, + int recommendedChunkSize); + + void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList *pArgs); +#endif + + RestEngine(); + ~RestEngine(); + + void Begin(); + + void LockPendingRequests() const; + void UnlockPendingRequests() const; + + void LockListenersRegistery() const; + void UnlockListenersRegistery() const; + + bool OnStart(); + void OnStop(); + + void RegisterListener(QueryListener* rListener); + + bool DoOpenRequest(const String& sUrl, RestItem* pRestItem); + void DoCloseRestItemLater(RestItemHandle::RequestId aRequestId); + void DoDeleteRestItemLater(RestItem* pRestItem); + + //classes allowed to access this internal instance + friend class RestItem; + friend class QueryListener; + + //members + class RestEngineImpl; + RestEngineImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/internal/RestItem.h b/inc/engine/internal/RestItem.h new file mode 100755 index 0000000..8b13f77 --- /dev/null +++ b/inc/engine/internal/RestItem.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef RESTITEM_H +#define RESTITEM_H + +#include "common/HereMaps_global.h" +#include "common/BaseReply.h" +#include "common/RestItemHandle.h" + +#ifdef TIZEN_MIGRATION +#include "internal/RestCurl.h" // MemoryStruct_s +#else +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class ErrorBase; +class BaseReply; +class QueryListener; +#ifndef TIZEN_MIGRATION +class RestEngine; +#endif + +//this class is for internal use only - do not rely on this outside +class RestItem +#ifdef TIZEN_MIGRATION +: public Tizen::Maps::Object +#endif +{ +public: + enum RestItemStatus + { + RIS_Created = 0, + RIS_RequestIssued, + RIS_Completed + }; + + RestItem(QueryListener* rListener, BaseReplyPtr pBaseReply); + ~RestItem(); + + bool Run(const String& rUri); + void Stop(); + + void OnError(ErrorBase& rError); + void OnResponseData(const Tizen::Maps::ByteBuffer& rBuff); + +#ifndef TIZEN_MIGRATION + bool OwnsTransaction(Tizen::Net::Http::HttpTransaction* pTransaction) const; +#endif + QueryListener* GetListener() const; + + RestItemHandle::RequestId GetRequestId() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(RestItem); + friend class RestEngine; + + class RestItemImpl; + RestItemImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/internal/ServerStringBuilder.h b/inc/engine/internal/ServerStringBuilder.h new file mode 100644 index 0000000..8bb0fd0 --- /dev/null +++ b/inc/engine/internal/ServerStringBuilder.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef SERVERSTRINGBUILDER_H_ +#define SERVERSTRINGBUILDER_H_ + +#include + +#include "common/HereMaps_global.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoCoordinates; +class GeoBoundingBox; +class Distance; +class Proximity; + +class ServerStringBuilder +{ +public: + virtual ~ServerStringBuilder(); + + std::string ToString(const GeoCoordinates& coords) const; + std::string ToString(const GeoBoundingBox& box) const; + std::string ToString(const Distance& distance) const; + std::string ToString(const Proximity& proximity) const; + + static ServerStringBuilder& GetInstance(); + +private: + ServerStringBuilder(); + + std::string CoordinateToString(double d) const; + std::string ToString(double d, int percision) const; + + void removeTrailingZeros(std::string& s) const; + +private: + static ServerStringBuilder* m_instance; +}; + +HERE_MAPS_END_NAMESPACE + +#endif /* SERVERSTRINGBUILDER_H_ */ diff --git a/inc/engine/internal/StringHelper.h b/inc/engine/internal/StringHelper.h new file mode 100755 index 0000000..3cb1366 --- /dev/null +++ b/inc/engine/internal/StringHelper.h @@ -0,0 +1,227 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef STRINGHELPER_H +#define STRINGHELPER_H + +#include "common/HereMaps_global.h" +#ifdef TIZEN_MIGRATION +#include "common/GeoCoordinates.h" +#include "common/GeoBoundingBox.h" +#include "common/GeoBoundingCircle.h" +#else +//#include "common/GeoCoordinates.h" +//#include "common/GeoBoundingBox.h" +#endif + +#include +#ifndef TIZEN_MIGRATION +#include +#endif +#include +#ifndef TIZEN_MIGRATION +#include // std::setprecision +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +struct TSPredicate +{ + bool operator()(const String& key, const String& value) + { + return key.compare(value) < 0; + } +}; + +class StringHelper +{ +public: + static void ToLower(std::string& sStr); + + template + static T ToNumber(const std::wstring& sStd); + + template + static T ToNumber(const std::string& sStd); + +#ifndef TIZEN_MIGRATION + template + static T ToNumber(const Tizen::Base::String& sStd); +#endif + + template + static void ToString(T aNumber, std::wstring& sDst); + + template + static void ToString(T aNumber, std::string& sDst); + +#ifndef TIZEN_MIGRATION + template + static void ToString(T aNumber, Tizen::Base::String& rDst); +#endif + +#ifdef TIZEN_MIGRATION + /** + * This method retrieves a string representation of an object containing the + * geographic coordinates of a location. + * + * @param rCoordinate A constant reference to an object containing + * geographic coordinates of a location; the object to be converted. + * + * @param sDst A reference to a string object to which the result of the + * conversion is to be copied. + */ + static void ToString(const GeoCoordinates& rCoordinate, String& sDst); + + /** + * This method converts a bounding box object to string. + * + * @param rBoundingBox A constant reference to the object whose string + * representation is to be obtained. + * + * @param sDst A reference to a string object to which the result of the + * conversion is to be copied. + */ + static void ToString(const GeoBoundingBox& rBoundingBox, String& sDst); + + static void ToString(const GeoBoundingCircle& rBoundingCircle, String& sDst); +#endif +}; + +#ifdef TIZEN_MIGRATION +//----------------------------------------------------------------------------- +inline void StringHelper::ToString(const GeoCoordinates& rCoordinate, String& sDst) +{ + String sLatitude; + ToString(rCoordinate.GetLatitude(), sLatitude); + + String sLongitude; + ToString(rCoordinate.GetLongitude(), sLongitude); + + sDst = sLatitude + "," + sLongitude; +} + +//----------------------------------------------------------------------------- +inline void StringHelper::ToString(const GeoBoundingBox& rBoundingBox, String& sDst) +{ + String sTopLeft; + ToString(rBoundingBox.GetTopLeft(), sTopLeft); + + String sBottomRight; + ToString(rBoundingBox.GetBottomRight(), sBottomRight); + + sDst = sTopLeft + ";" + sBottomRight; +} + +//----------------------------------------------------------------------------- +inline void StringHelper::ToString(const GeoBoundingCircle& rBoundingCircle, String& sDst) +{ + String sCenter; + ToString(rBoundingCircle.GetCenter(), sCenter); + + String sRadius; + ToString(rBoundingCircle.GetRadius(), sRadius); + + sDst = sCenter + ";r=" + sRadius; +} +#else +/* +//----------------------------------------------------------------------------- +inline void StringHelper::ToString(const GeoBoundingBox& rBoundingBox, Tizen::Base::String& sDst) +{ + Tizen::Base::String sTopLeft; + ToString(rBoundingBox.GetTopLeft(), sTopLeft); + + Tizen::Base::String sBottomRight; + ToString(rBoundingBox.GetBottomRight(), sBottomRight); + + sDst = sTopLeft + ";" + sBottomRight; +} +*/ +#endif + +//----------------------------------------------------------------------------- +inline void StringHelper::ToLower(String& sStr) +{ + std::transform(sStr.begin(), sStr.end(), sStr.begin(), ::tolower); +} + +//----------------------------------------------------------------------------- +template +inline T StringHelper::ToNumber(const std::wstring& sStr) +{ + T t; + std::wstringstream aStream; + aStream << sStr; + aStream >> t; + return t; +} + +//----------------------------------------------------------------------------- +template +inline T StringHelper::ToNumber(const std::string& sStr) +{ + T t; + std::stringstream aStream; + aStream << sStr; + aStream >> t; + return t; +} + + +//----------------------------------------------------------------------------- +#ifndef TIZEN_MIGRATION +template +inline T StringHelper::ToNumber(const Tizen::Base::String& sStd) +{ + std::wstring sTmp = sStd.GetPointer(); + return ToNumber(sTmp); +} +#endif + +//----------------------------------------------------------------------------- +template +inline void StringHelper::ToString(T aNumber, std::wstring& sDst) +{ + std::wstringstream aStream; + aStream << aNumber; + sDst = aStream.str(); +} + +//----------------------------------------------------------------------------- +template +inline void StringHelper::ToString(T aNumber, std::string& sDst) +{ + std::stringstream aStream; + aStream << aNumber; + sDst = aStream.str(); +} + +//----------------------------------------------------------------------------- +#ifndef TIZEN_MIGRATION +template +inline void StringHelper::ToString(T aNumber, Tizen::Base::String& rDst) +{ + std::wstring sTemp; + ToString(aNumber, sTemp); + rDst = sTemp.c_str(); +} +#endif + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/maps/DrawableBitmap.h b/inc/engine/maps/DrawableBitmap.h new file mode 100755 index 0000000..3819e7c --- /dev/null +++ b/inc/engine/maps/DrawableBitmap.h @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef DRAWABLE_BITMAP_H +#define DRAWABLE_BITMAP_H + +#include "common/HereMaps_global.h" +#ifdef TIZEN_MIGRATION +#include "graphic/Bitmap.h" +#else +#include +#endif + +#include + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates a bitmap that can be drawn on the map. + */ +class DrawableBitmap +{ +public: + /** + * This typedef defines a rendering handle as a type. + */ + typedef UInt RenderHandle; + + /** + * This is a copy constructor. It creates a new instance of the class, using + * an existing bitmap. + * + * @param bitmap A pointer to an existing bitmap. + */ +#ifdef TIZEN_MIGRATION + DrawableBitmap(std::unique_ptr& bitmap); +#else + DrawableBitmap(std::auto_ptr& bitmap); +#endif + /** + * This is the destructor. + */ + ~DrawableBitmap(); + + /** + * This method retrieves a pointer to the bitmap encapsulated in the given + * instance of the class. + */ +#ifdef TIZEN_MIGRATION + Tizen::Maps::Bitmap* GetBitmap() const; +#else + Tizen::Graphics::Bitmap* GetBitmap() const; +#endif + /** + * This method sets the rendering handle. + * + * @param aRenderHandle A value representing the rendering handle to set. + */ + void SetRenderHandle(RenderHandle aRenderHandle); + + /** + * This method retrieves the rendering handle. + * + * @return A value representing the rendering handle to set. + */ + RenderHandle GetRenderHandle() const; + + /** + * This method resets the rendering handle on the given object. + */ + void ResetRenderHandle(); + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(DrawableBitmap); + + class DrawableBitmapImpl; + DrawableBitmapImpl* m_pImpl; +}; + +typedef std::tr1::shared_ptr DrawableBitmapPtr; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/maps/GeoMapObject.h b/inc/engine/maps/GeoMapObject.h new file mode 100644 index 0000000..17507e6 --- /dev/null +++ b/inc/engine/maps/GeoMapObject.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOMAPOBJECT_H +#define GEOMAPOBJECT_H + +#include "common/HereMaps_global.h" +#include "common/GeoBoundingBox.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoTiledMap; +class GeoCoordinates; + +/** + * This class encapsulates the common aspects of objects such as markers, + * polygons and polylines (or groups of such objects) that can be placed on the + * map. + * + * \ingroup maps + */ +class GeoMapObject +{ +public: + /** + * This enumeration defines identifiers for types of objects that can be + * placed on the map. + */ + enum Type + { + GMO_Marker, ///< Indicates a marker. + GMO_Polyline, ///< Indicates a polyline. + GMO_Polygon, ///< Indicates a polygon. + }; + + /** + * This method is the default constructor. + */ + GeoMapObject(); + + /** + * This method is the (virtual) destructor. + */ + virtual ~GeoMapObject(); + + /** + * This method retrieves the object type. + * + * @return A member of the enumerated data type indicating the type of the + * given object. + */ + virtual Type GetType() const = 0; + + /** + * This method retrieves the object bounding box. + * + * @return An object encapsulating the bounding box of the given object. + */ + virtual GeoBoundingBox GetBoundingBox() const = 0; + + /** + * This method checks if the given object is visible. + * + * @return true if the object is visible, otherwise + * false. + */ + bool IsVisible() const; + + /** + * This method sets a flag to indicate if the given object is visible. + * + * @return visible A Boolean, true if the object is visible, + * otherwise false. + */ + virtual void SetVisible(bool visible); + + /** + * This method checks if the object can be rendered on the map. + * + * @return A Boolean, true if the object can be rendered, + * otherwise false. + */ + virtual bool IsValid() const = 0; + +protected: + + /** + * This method updates the map. + */ + void UpdateMap(); + + /** + * This method retrieves the parent object of the map, which is in effect the + * GL context in which the map is drawn. + * + * @return A pointer to an object encapsulating the parent map. + */ + GeoTiledMap* GetParentMap() const; + +private: + friend class GeoTiledMap; + friend class GeoMapObjectGroup; + void SetParentMap(GeoTiledMap& rMap); + void ResetParentMap(); + + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoMapObject); + + class GeoMapObjectImpl; + std::auto_ptr m_impl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // GEOMAPOBJECT_H diff --git a/inc/engine/maps/GeoMapObjectMarker.h b/inc/engine/maps/GeoMapObjectMarker.h new file mode 100755 index 0000000..d25a7d5 --- /dev/null +++ b/inc/engine/maps/GeoMapObjectMarker.h @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef MAPOBJECTMARKER_H +#define MAPOBJECTMARKER_H + +#include "common/HereMaps_global.h" +#ifndef TIZEN_MIGRATION +#include +#endif + +#include "maps/GeoMapObject.h" +#ifdef TIZEN_MIGRATION +#include "graphic/Dimension.h" +#include "graphic/Point.h" +#include "graphic/Bitmap.h" +#include "graphic/FloatPoint.h" +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class GlTexture; +class GeoCoordinates; + +/** + * This class encapsulates a map marker object that indicates a location + * with an image (icon). + * + * \ingroup maps + */ +class EXPORT_API GeoMapObjectMarker : public GeoMapObject +{ +public: + + /** + * This method is the default constructor. + */ + GeoMapObjectMarker(); + + /** + * This method is the (virtual) destructor. + */ + virtual ~GeoMapObjectMarker(); + + /** + * This method retrieves the object type. + * + * @return A member of the enumerated data type indicating the type of the + * given object. + */ + virtual Type GetType() const; + + /** + * This method retrieves the object bounding box. + * + * @return An object encapsulating the bounding box of the given object. + */ + virtual GeoBoundingBox GetBoundingBox() const; + + /** + * This method sets the position of the given object. + * + * @param rCoord A constant reference to an object containing the geographic + * coordinates of the position of the given object. + */ + virtual void SetPosition(const GeoCoordinates& rCoord); + + /** + * This method retrieves the position of the given object. + * + * @return A constant reference to an object containing the geographic + * coordinates of the position of the given object. + */ + const GeoCoordinates& GetPosition() const; + + /** + * This method sets the marker image (icon). + * + * @param rBitmap A constant reference to an object encapsulating the icon + * image. + */ + void SetBitmap(const Tizen::Maps::Bitmap& rBitmap); + + /** + * This method retrieves the width of the bitmap (icon). + * + * @return A value indicating the width of the bitmap (icon) in pixels. + */ + unsigned int GetWidth() const; + + /** + * This method retrieves the height of the bitmap (icon). + * + * @return A value indicating the height of the bitmap (icon) in pixels. + */ + unsigned int GetHeight() const; + + /** + * This method sets a value that defines the point on the marker bitmap that + * touches the map. The point is calculated relative to the top-left corner + * of the bitmap. + * + * @param rOrigin A floating point value defining the origin. + */ + void SetMarkerOrigin(const Tizen::Maps::FloatPoint& rOrigin); + + /** + * This method retrieves a value that represents the point on the marker + * bitmap that "touches" the map. The point is calculated relative to the + * top-left corner of the bitmap. + * + * @return A floating point value defining the bitmap origin. + */ + Tizen::Maps::FloatPoint GetMarkerOrigin() const; + + /** + * This method retrieves a value that represents the point on the marker + * bitmap that "touches" the map. The point is calculated relative to the + * top-left corner of the bitmap. + * + * @return An object containing the pixel coordinates of the bitmap origin + * relative to the top-left corner of the bitmap. + */ + Tizen::Maps::Point GetMarkerOriginInPx() const; + + /** + * This method retrieves the marker bitmap as a GL texture. + * + * @return A pointer to the GL texture of the bitmap. + */ + GlTexture* GetGlTexture() const; + + /** + * This method checks if the object is valid (it geographic location is + * defined). + * + * @return visible A Boolean, true if the object is valid, + * otherwise false. + */ + virtual bool IsValid() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoMapObjectMarker); + + class GeoMapObjectMarkerImpl; + GeoMapObjectMarkerImpl* m_impl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/maps/GeoMapObjectPolygon.h b/inc/engine/maps/GeoMapObjectPolygon.h new file mode 100755 index 0000000..eaa2b5f --- /dev/null +++ b/inc/engine/maps/GeoMapObjectPolygon.h @@ -0,0 +1,176 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef MAPOBJECTPOLYGON_H +#define MAPOBJECTPOLYGON_H + +#include "common/HereMaps_global.h" +#include "maps/GeoMapObject.h" +#include "common/GeoCoordinates.h" +#include + +#ifdef TIZEN_MIGRATION +#include "graphic/Color.h" +#else +namespace Tizen { namespace Graphics { class Color; } } +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates a map polygon object. A polygon is a closed polyline, + * therefore, in addition to a polyline, its properties include a fill color. + * + * \ingroup maps + */ +class EXPORT_API GeoMapObjectPolygon : public GeoMapObject +{ +public: + + /** + * This method is the default constructor. + */ + GeoMapObjectPolygon(); + + /** + * This method is the (virtual) destructor. + */ + virtual ~GeoMapObjectPolygon(); + + /** + * This method sets the path of the polygon, which is a list of locations + * that the path (line) connects. + * + * @param path A constant reference to an object containing a list of + * locations defined in terms of their geographic coordinates. + * Paths representing self-intersecting polygons are not supported. + * Such paths are not rendered on the map. + */ + void SetPath(const GeoCoordinateList& path); + + /** + * This method appends the location of a new vertex to the polyline path. + * + * Note that self-intersecting polygons are not supported, therefore, if the + * given polygon should become self-intersecting as a result of this + * operation, it cannot be rendered on the map. + * + * @param rCoord A constant reference to an object specifying the geographic + * coordinates of a new vertex to be added to the path. + */ + void AppendToPath(const GeoCoordinates& rCoord); + + /** + * This method retrieves the path of the polygon, which is a list of + * objects containing the geographic coordinates of its vertices. + * + * @return A reference to an object containing a list of vertices defined + * in terms of their geographic coordinates. + */ + GeoCoordinateList GetPath() const; + + /** + * This typedef defines a function object as a type. The function object can + * be called when the path of the polygon has changed. A function object of + * this type returns void and receives a constant reference to + * a GeoMapObject as an argument. + */ + typedef std::tr1::function PathChangedFunctor; + + /** + * This method sets a callback to be invoked when the polygon path has + * changed. + * + * @param pathChanged A function object to be called when the path has + * changed. + */ + void SetPathChangedNotifier(PathChangedFunctor pathChanged); + + /** + * This method retrieves the bounding box of the polygon. + * + * @return An object encapsulating the bounding box of the given polygon + * object. + */ + GeoBoundingBox GetBoundingBox() const; + + /** + * This method retrieves the current value of the polygon fill color. + * + * @return An object encapsulating the fill color. + */ + Tizen::Maps::Color GetFillColor() const; + + /** + * This method sets the current value of the polygon fill color. + * + * @param fillColor An object encapsulating the fill color. + */ + void SetFillColor(const Tizen::Maps::Color& fillColor); + + /** + * This typedef defines a fill-color-changed function object as a + * type. The function object can be called when the polygon fill color + * has changed. A function object of this type returns void and + * receives a constant reference to a GeoMapObject as an + * argument. + */ + typedef std::tr1::function FillColorChangedFunctor; + + /** + * This method sets a callback to be invoked when the polygon fill color + * has changed. + * + * @param fillColorChanged A function object to be called when the polygon + * fill color has changed. + */ + void SetFillColorChangedNotifier(FillColorChangedFunctor fillColorChanged); + + /** + * This method retrieves the object type of the given polygon. + * + * @return A member of the enumerated data type indicating the type of the + * given polygon object. + */ + Type GetType() const; + + /** + * This method sets a flag to indicate if the given object is visible. + * + * @return visible A Boolean, true if the object is visible, + * otherwise false. + */ + virtual void SetVisible(bool visible); + + /** + * This method checks if the object can be rendered on the map. + * + * @return A Boolean, true if the object can be rendered, + * otherwise false. + */ + virtual bool IsValid() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoMapObjectPolygon); + + class GeoMapObjectPolygonImpl; + GeoMapObjectPolygonImpl* m_impl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/maps/GeoMapObjectPolyline.h b/inc/engine/maps/GeoMapObjectPolyline.h new file mode 100755 index 0000000..105064b --- /dev/null +++ b/inc/engine/maps/GeoMapObjectPolyline.h @@ -0,0 +1,205 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef MAPOBJECTPOLYLINE_H +#define MAPOBJECTPOLYLINE_H + +#include "common/HereMaps_global.h" +#include "maps/GeoMapObject.h" +#include "common/GeoCoordinates.h" +#include + +#ifdef TIZEN_MIGRATION +#include "graphic/Color.h" +#else +namespace Tizen { namespace Graphics { class Color; } } +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates a map polyline object. A polyline is a line that + * connects a number of points on the map. Its properties include stroke color + * and thickness. + * + * \ingroup maps + */ +class EXPORT_API GeoMapObjectPolyline : public GeoMapObject +{ +public: + + /** + * This method is the default constructor. + */ + GeoMapObjectPolyline(); + + /** + * This method is the (virtual) destructor. + */ + virtual ~GeoMapObjectPolyline(); + + /** + * This method sets the path of the polyline, which is a list of locations + * that the polyline connects. + * + * @param path A constant reference to an object containing a list of + * locations defined in terms of their geographic coordinates. + */ + void SetPath(const GeoCoordinateList& path); + + /** + * This method appends the location of a new vertex to the polyline path. + * + * @param aCoord A constant reference to an object specifying the geographic + * coordinates of a new vertex to be added to the path. + */ + void AppendToPath(const GeoCoordinates& aCoord); + + /** + * This method retrieves the path of the polyline, which is a list of + * locations that the polyline connects. + * + * @return A reference to an object containing a list of locations defined + * in terms of their geographic coordinates. + */ + GeoCoordinateList GetPath() const; + + /** + * This typedef defines a function object as a type. The function object can + * be called when the polyline path has changed. A function object of this + * type returns void and receives a constant reference to a + * GeoMapObject as an argument. + */ + typedef std::tr1::function PathChangedFunctor; + + /** + * This method sets a callback to be invoked when the polyline path has + * changed. + * + * @param pathChanged A function object to be called when the path has + * changed. + */ + void SetPathChangedNotifier(PathChangedFunctor pathChanged); + + /** + * This method retrieves the current value of the polyline stroke color. + * + * @return An object encapsulating the stroke color. + */ + Tizen::Maps::Color GetStrokeColor() const; + + /** + * This method sets the value of the polyline stroke color. + * + * @param strokeColor A constant reference to an object encapsulating the + * stroke color. + */ + void SetStrokeColor(const Tizen::Maps::Color& strokeColor); + + /** + * This typedef defines a function object as a type. The function object can + * be called when the polyline stroke color has changed. A function object + * of this type returns void and receives a constant reference + * to a GeoMapObject as an argument. + */ + typedef std::tr1::function StrokeColorChangedFunctor; + + /** + * This method sets a callback to be invoked when the polyline stroke color + * has changed. + * + * @param strokeColorChanged A function object to be called when the polyline + * stroke color has changed. + */ + void SetStrokeColorChangedNotifier(StrokeColorChangedFunctor strokeColorChanged); + + /** + * This method retrieves a value indicating the polyline stroke thickness in + * pixels. + * + * @return A value indicating the stroke thickness in pixels. + */ + int GetStrokeThickness() const; + + /** + * This method sets a value indicating the polyline stroke thickness in + * pixels. + * + * @strokeThickness A value indicating the stroke thickness in pixels. + */ + void SetStrokeThickness(int strokeThickness); + + /** + * This typedef defines a function object as a type. The function object can + * be called when the polyline stroke thickness has changed. A function + * object of this type returns void and receives a constant + * reference to a GeoMapObject as an argument. + */ + typedef std::tr1::function StrokeThicknessChangedFunctor; + + /** + * This method sets a callback to be invoked when the polyline stroke + * thickness has changed. + * + * @param strokeThicknessChanged A function object to be called when the polyline + * stroke thickness has changed. + */ + void SetStrokeThicknessChangedNotifier(StrokeThicknessChangedFunctor strokeThicknessChanged); + + /** + * This method retrieves the bounding box of the polyline. + * + * @return An object encapsulating the bounding box of the given polyline + * object. + */ + GeoBoundingBox GetBoundingBox() const; + + /** + * This method retrieves the object type of the given polyline. + * + * @return A member of the enumerated data type indicating the type of the + * given polyline object. + */ + Type GetType() const; + + /** + * This method sets a flag to indicate if the given object is visible. + * + * @return visible A Boolean, true if the object is visible, + * otherwise false. + */ + virtual void SetVisible(bool visible); + + /** + * This method checks if the object was built with legal input. A valid + * polyline must have a path that contains of at least two vertices. + * + * @return visible A Boolean, true if the object is valid, + * otherwise false. + */ + virtual bool IsValid() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoMapObjectPolyline); + + class GeoMapObjectPolylineImpl; + std::auto_ptr m_impl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/maps/GeoObjectProvider.h b/inc/engine/maps/GeoObjectProvider.h new file mode 100755 index 0000000..b742203 --- /dev/null +++ b/inc/engine/maps/GeoObjectProvider.h @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOOBJECTPROVIDER_H +#define GEOOBJECTPROVIDER_H + +#include "common/HereMaps_global.h" +#include "maps/GeoProvider.h" +#ifdef TIZEN_MIGRATION +#include "graphic/Dimension.h" +#include "graphic/Point.h" +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoMapObject; +class GeoProjection; + +/** + * This class encapsulates a map object provider which manages all the objects + * to be displayed in any of the tiles that make up the visible map. The + * provider object can load tiles, add and remove objects to them, and retrieve + * objects from a specific pixel location. + * + * \ingroup maps + */ +class GeoObjectProvider: public GeoProvider +{ +public: + + /** + * This method is a constructor. + * + * @param projection A Pointer to the projection to use. + * + * @param tileSize a value indicating the size of the map tile to use. + */ + GeoObjectProvider(GeoProjection* projection, int tileSize); + + /** + * This method is the (virtual) destructor. + */ + virtual ~GeoObjectProvider(); + + /** + * This method loads the tile specified by the caller. + * + * @param tileKey A constant reference to an object that specifies a tile + * key. + * + * @return A value representing the identifier of the issued request. + */ + RestItemHandle::RequestId LoadTile(const TileKey& tileKey); + + /** + * This method aborts loading of the tile specified by the caller. + * + * @param tile A constant reference to an object encapsulating the tile + * whose loading is to be aborted. + */ + void AbortTile(const TilePtr& tile); + + /** + * This method sets a function to be invoked when the tile has loaded. + * + * @param signal A constant reference to a function to be invoked when the + * tile has loaded; the function accepts a reference to a + * TileKey object and a pointer to the tile bitmap (see + * also GeoProvider). + */ + void TileLoaded(const TileLoadedFunc& signal); + + /** + * This method sets function to be invoked when loading the tile failed. + * + * @param signal A constant reference to a function to be invoked when the + * tile load failed; the function accepts a reference to the + * corresponding ErrorBase object + * GeoProvider). + */ + void TileFailed(const TileFailedFunc& signal); + + /** + * This method adds an object specified by the caller. + * + * @param obj A pointer to the object to add. + */ + void AddObject(GeoMapObject* obj, bool transferOwnership); + + /** + * This method removes an object specified by the caller. The objects + * are also deleted if we have ownership (see AddObject) + * + * @param obj A pointer to the object to remove. + * @return Boolean value indicating if the removal of the object was successful + */ + bool RemoveObject(GeoMapObject* obj); + + /** + * This method removes all objects specified by the caller. The objects + * are also deleted if we have ownership (see AddObject) + * + * @param obj A pointer to the object to remove. + * @return Boolean value indicating if the removal of the object was successful + */ + bool RemoveAllObjects(); + + /** + * This method retrieves an object at the screen position specified by the + * caller. + * + * @param point A constant reference to an object specifying the screen + * coordinates of a location from which to retrieve an object. + */ + GeoMapObject* GetObjectAtScreenPosition(const Tizen::Maps::Point& point); + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoObjectProvider); + + class GeoObjectProviderImpl; + std::auto_ptr m_impl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // GEOOBJECTPROVIDER_H diff --git a/inc/engine/maps/GeoProjection.h b/inc/engine/maps/GeoProjection.h new file mode 100755 index 0000000..b7dbb5b --- /dev/null +++ b/inc/engine/maps/GeoProjection.h @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOPROJECTION_H +#define GEOPROJECTION_H + +#include + +#include "common/HereMaps_global.h" + +#ifdef TIZEN_MIGRATION +#include "graphic/DoubleMatrix4.h" +#include "graphic/Dimension.h" +#include "graphic/Point.h" +#else +#include +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class DoublePoint; +class DoublePoint3; +class GeoCoordinates; +class GeoProjectionNode; + +class GeoProjection +{ +public: + GeoProjection(); + virtual ~GeoProjection(); + + virtual Tizen::Maps::Point geoToPixel(const GeoCoordinates& geo) const = 0; + virtual GeoCoordinates pixelToGeo(const Tizen::Maps::Point& pixel) const = 0; + + virtual std::vector projectRoot(); + virtual GeoProjectionNode* projectQuad(GeoProjectionNode* parent, int quad); + + virtual void setTileSize(const Tizen::Maps::Dimension& size); + Tizen::Maps::Dimension tileSize() const; + + virtual void setScreenSize(const Tizen::Maps::Dimension& size); + Tizen::Maps::Dimension screenSize() const; + + virtual void setLevel(double value); + double level() const; + + virtual void setMaximumLevel(double value); + double maximumLevel() const; + + virtual void setMinimumLevel(double value); + double minimumLevel() const; + + virtual void setHeading(double value); + double heading() const; + + virtual void setGeoCenter(const GeoCoordinates& value); + GeoCoordinates geoCenter() const; + + virtual bool setGeoCenterInPx(const Tizen::Maps::Point& value); + Tizen::Maps::Point screenCenter() const; + + DoublePoint projectPoint(const DoublePoint& point) const; + +protected: + virtual void filter(GeoProjectionNode& transform,const std::vector& points) = 0; + virtual DoublePoint3 projectPoint(double x, double y, double z=0) const = 0; + + Tizen::Maps::DoubleMatrix4& GetMatrix(); + const Tizen::Maps::DoubleMatrix4& GetMatrix() const; + Tizen::Maps::DoubleMatrix4& GetInverse(); + const Tizen::Maps::DoubleMatrix4& GetInverse() const; + + Tizen::Maps::Dimension& GetTileSize(); + Tizen::Maps::Dimension& GetScreenSize(); + GeoCoordinates& GetGeoCenter(); + double& GetLevel(); + double& GetHeading(); + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoProjection); + friend class TestGeoProjection; + + class GeoProjectionImpl; + GeoProjectionImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // GEOPROJECTION_P_H diff --git a/inc/engine/maps/GeoProjectionNode.h b/inc/engine/maps/GeoProjectionNode.h new file mode 100755 index 0000000..74e9c02 --- /dev/null +++ b/inc/engine/maps/GeoProjectionNode.h @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOPROJECTIONNODE_P_H +#define GEOPROJECTIONNODE_P_H + +#include +#include + +#include "common/HereMaps_global.h" + +#ifndef TIZEN_MIGRATION +#include +#include +#endif + +#include "internal/DoublePoint.h" +#include "internal/DoublePoint3.h" +#ifdef TIZEN_MIGRATION +// chanywa #include "base/BaseByteBuffer.h" +#endif + +#include "maps/GeoTile.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoProjectionNode +{ +public: + GeoProjectionNode(); + GeoProjectionNode(const DrawableBitmapPtr& image); + ~GeoProjectionNode(); + + std::vector m_points; + std::vector m_subPoints; + + DrawableBitmapPtr m_image; + DrawableBitmapPtr m_layer; + double m_r; + double m_x; + double m_y; + bool m_clipped; + bool m_culled; + bool m_split; + bool m_requestImage; + bool m_peekImage; + bool m_postdrawing; + bool m_drawing; + bool m_predrawing; + int m_splitCount; + int m_tx; + int m_ty; + int m_stx; + int m_sty; + int m_rtx; + int m_rty; + int m_rlevel; + int m_level; + float m_opacity; + + enum{ NUM_OF_CHILDREN = 4 }; + GeoProjectionNode* m_children[NUM_OF_CHILDREN]; + + void setImage(const DrawableBitmapPtr& image); + void applyImage(const DrawableBitmapPtr& image,const float opacity); + + bool requestImage(){ return m_requestImage; } + bool peekImage(){ return m_peekImage; } + bool split(){ return m_split; } + bool postdrawing(){ return m_postdrawing && m_image != 0; } + bool drawing(){ return m_drawing && m_image != 0; } + bool predrawing(){ return m_predrawing && m_image != 0; } + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoProjectionNode); +}; + +HERE_MAPS_END_NAMESPACE + +#endif // QGEOPROJECTED_P_H diff --git a/inc/engine/maps/GeoProvider.h b/inc/engine/maps/GeoProvider.h new file mode 100755 index 0000000..938593e --- /dev/null +++ b/inc/engine/maps/GeoProvider.h @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOPROVIDER_P_H_ +#define GEOPROVIDER_P_H_ + +#include + +#include "common/HereMaps_global.h" +#include "common/RestItemHandle.h" +#include "maps/GeoTile.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class TileKey; +class ErrorBase; +class DrawableBitmap; + +/** + * This class is the base class for provider classes in the Maps API. An example + * of a derived class is GeoObjectProvider. + * + * \ingroup maps + */ +class GeoProvider +{ +public: + /** + * This method is the default constructor. + */ + GeoProvider() {} + + /** + * This method is the (virtual) destructor. + */ + virtual ~GeoProvider() {} + + /** + * This method loads the map tile specified by the caller. The method must + * be implemented by the derived classes. + * + * @param tileKey A constant reference to an object that specifies a tile + * key. + * + * @return A value representing the identifier of the tile request. + */ + virtual RestItemHandle::RequestId LoadTile(const TileKey& tileKey) = 0; + + /** + * This method aborts loading of the map tile specified by the caller. The + * method must be implemented by the derived classes. + * + * @param tile The tile whose loading is to be aborted. + */ + virtual void AbortTile(const TilePtr& tile) = 0; + + /** + * This typedef defines a function as a type. The function can be called + * when the map tile has been loaded. A function of this type accepts a + * reference to a TileKey object, a pointer to the tile + * bitmap and a reference to an instance of GeoProvider. + */ + typedef std::tr1::function TileLoadedFunc; + + /** + * This method registers a function to be invoked when the tile has loaded. + * + * @param signal A constant reference to a function to be invoked when the + * tile has loaded; the function accepts a reference to a + * TileKey object and a pointer to the tile bitmap. + */ + virtual void TileLoaded(const TileLoadedFunc& signal) = 0; + + /** + * This typedef defines a function as a type. The function can be called + * when an attempt to load a map tile has failed. A function of this type + * accepts a reference to a TileKey object and a reference to + * an object containing information about the error that occurred (an + * instance of ErrorBase). + */ + typedef std::tr1::function TileFailedFunc; + + /** + * This method sets function to be invoked when an attempt to load a tile + * has failed. + * + * @param signal A constant reference to a function to be invoked when the + * tile load has failed; the callback function accepts a reference to + * a TileKey object and a reference to an object + * encapsulating information about the error that occurred (an + * instance of ErrorBase). + */ + virtual void TileFailed(const TileFailedFunc& signal) = 0; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoProvider); +}; + +HERE_MAPS_END_NAMESPACE + +#endif /* GEOPROVIDER_P_H_ */ diff --git a/inc/engine/maps/GeoProviderManager.h b/inc/engine/maps/GeoProviderManager.h new file mode 100755 index 0000000..316f485 --- /dev/null +++ b/inc/engine/maps/GeoProviderManager.h @@ -0,0 +1,282 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOPROVIDERMANAGER_P_H_ +#define GEOPROVIDERMANAGER_P_H_ + +#include + +#include "common/HereMaps_global.h" + +#include "maps/GeoTile.h" +#include "maps/GeoProvider.h" + +#ifdef TIZEN_MIGRATION +#include "base/Timer.h" +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoTiledMap; +class QueryListener; + +/** + * This class encapsulates management of all the providers of tiles and map + * objects. It registers providers and requests tiles and objects on their + * behalf, eventually compositing each tile in the map to ensure the tiles + * contain not only the map tile bitmaps, but also any markers, polylines and + * polygons that must be drawn on top of the bitmaps. + * + * The virtual methods defined on this class require implementation by derived + * classes. + * + * \ingroup maps + */ +class GeoProviderManager : public Tizen::Maps::ITimerEventListener +{ +public: + /** + * This method retrieves an object representing the key for a tile on the + * basis of the zoom level and coordinates of the tile in the tile grid at + * that zoom level. + * + * @param level A value indicating the zoom level. + * + * @param x A value representing the x-coordinate in the tile grid. + * + * @param y A value representing the y-coordinate in the tile grid. + * + * @return An object representing the tile key. + */ + TileKey GetKey(int level, int x, int y); + + /** + * This method is the default constructor. + */ + GeoProviderManager(); + + /** + * This method is a constructor. + * + * @param rMap A reference to the tile map whose tiles are processed by the + * given manager object. + */ + GeoProviderManager(GeoTiledMap& rMap); + + /** + * This method is the (virtual) destructor. + */ + virtual ~GeoProviderManager(); + + /** + * This method is invoked when the timer expires. + * + * @param timer A reference to the timer object. + */ + virtual void OnTimerExpired(Tizen::Maps::Timer& timer); + + /** + * This method checks if a previously requested tile is available. + * + * @param level A value indicating the zoom level. + * + * @param x A value representing the x-coordinate in the tile grid. + * + * @param y A value representing the y-coordinate in the tile grid. + * + * @return A pointer to the tile object (which is NULL if the + * tile is not available). + */ + TilePtr PeekTile(int level, int x, int y); + + /** + * This method checks if a previously requested tile is available. + * + * @param key An object representing the key that identifies the tile to check. + * + * @return A pointer to the tile object (which is NULL if the + * tile is not available). + */ + TilePtr PeekTile(const TileKey& key); + + /** + * This method requests a tile. + * + * @param level A value indicating the zoom level. + * + * @param x A value representing the x-coordinate in the tile grid. + * + * @param y A value representing the y-coordinate in the tile grid. + * + * @return A pointer to the tile object (which is NULL if the + * tile is not available). + */ + TilePtr RequestTile(int level, int x, int y); + + /** + * This method removes the tile specified by the caller from the cache. + * + * @param tile A constant reference to the tile object to remove from the cache. + */ + void RemoveCachedTile(const TilePtr& tile); + + /** + * This method clears the map tile cache. + */ + void ClearCache(); + + /** + * This method clears any map objects from the cache. + * + * @param bClearAndRequest A Boolean indicating if the map objects should be + * rerequested when they have been cleared (true, + * default) or not fault. + */ + void ClearCachedMapObjectsOnly(bool bClearAndRequest=true); + + /** + * This method retrieves a count of cached map tiles. + * + * @return A value indicating the number of cached map tiles. + */ + size_t GetNumCachedTiles() const; + + /** + * This method adds a provider to those managed by the given manager instance. + * + * @param provider A pointer to a provider object to add. + */ + void AddProvider(GeoProvider* provider); + + /** + * This method removes the provider identified by the caller to those + * managed by the given manager instance. + * + * @param provider A pointer to a provider object to remove. + */ + bool RemoveProvider(GeoProvider* pProvider); + + /** + * This method retrieves a provider matching the index supplied by the caller. + * + * @param idx A value of the index from which to retrieve the provider. + * + * @return A pointer to the provider object or NULL if the + * supplied index is invalid. + */ + GeoProvider* GetProvider(size_t idx) const; + + /** + * This method obtains the count of providers managed by the given + * instance of GeoProviderManager. + * + * @return A value representing the count of providers. + */ + size_t GetNumProviders() const; + + /** + * This method is invoked when a tile has been loaded. It adds the + * tile to the list of loaded files, removes it from the list of loading + * tiles and the cache, and ensures it is displayed. + * + * @param rKey A constant reference to a key object that identifies the + * loaded tile. + * + * @param image A pointer to the tile image object. + * + * @param rProvider The provider for which the tile has been acquired. + */ + void HandleTileLoaded(const TileKey& rKey, DrawableBitmapPtr image, GeoProvider& rProvider); + + /** + * This method is invoked when a tile has been loaded. It adds the + * tile to the list of loaded files, removes it from the list of loading + * tiles and the cache, and ensures it is displayed. + * + * @param rKey A constant reference to a key object that identifies the + * tile. + * + * @param rError A constant reference to an object containing information + * about the error that occurred. + */ + void HandleTileFailed(const TileKey& rKey, const ErrorBase& rError); + + /** + * This method starts the process of loading the next requested file. + */ + void StartNextTileLoad(); + + /** + * This method sets a value indicating the maximum number of pending + * requests. + * + * @param uLimit A value indicating the maximum number of pending requests. + */ + void SetPendingRequestsLimit(size_t uLimit); + + /** + * This method retrieves a value indicating the maximum number of pending + * requests. + * + * @return A value indicating the maximum number of pending requests. + */ + size_t GetPendingRequestsLimit() const; + + /** + * This method retrieves a value indicating the count of pending + * requests. + * + * @return A value indicating how many requests are pending. + */ + size_t GetNumPendingRequests() const; + + /** + * This method sets a value indicating the maximum number of tiles that can + * be cached. + * + * @param uLimit A value indicating the maximum number of cached tiles. + */ + void SetCachedTilesLimit(size_t uLimit); + + /** + * This method retrieves a value indicating the maximum number of tiles that + * can be cached. + * + * @return A value indicating the maximum number of cached tiles. + */ + size_t GetCachedTilesLimit() const; + +private: + void LoadTile(const TilePtr tile, unsigned int uProviderLevel); + void AbortTile(const TilePtr tile); + void LogTile(const String& text,const TilePtr& tile); + void LogTile(const String& text,int level,int x,int y); + + void BeginMarking(); + void EndMarking(); + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoProviderManager); + friend class GeoTiledMap; + friend class TestGeoProviderManager; + class GeoProviderManagerImpl; + GeoProviderManagerImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/maps/GeoTile.h b/inc/engine/maps/GeoTile.h new file mode 100755 index 0000000..8b325b2 --- /dev/null +++ b/inc/engine/maps/GeoTile.h @@ -0,0 +1,284 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOTILE_H +#define GEOTILE_H + +#include +#include "common/HereMaps_global.h" + +#ifndef TIZEN_MIGRATION +#include +#include +#endif + +#include "common/RestItemHandle.h" +#include "maps/DrawableBitmap.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoProviderManager; + +#if 0 //note: this class has been moved to a separate file +/** + * This class encapsulates a bitmap that can be drawn in a graphics context (on + * the map, whether the bitmap can represent a tile). + * + * A map tile supports two layers, the map tile layer and a map objects layer, + * (which overlays the map tile layer). The latter may be + * NULL if no objects have been added to the map. + * + * \ingroup maps + */ +class DrawableBitmap +{ +public: + /** + * This typedef defines a render handle as a type. + */ + typedef UInt RenderHandle; + + + /** + * This method is a constructor. It initiates a new instance using the + * bitmap pointer supplied by the caller. + * + * @param bitmap A pointer to a bitmap object. + */ + DrawableBitmap(std::auto_ptr& bitmap) + : m_bitmap(bitmap) + , m_renderHandle(0) + { + } + + /** + * This method is the destructor. It destroys the given instance and rests + * the render handle. + */ + ~DrawableBitmap() + { + ResetRenderHandle(); + } + + /** + * This method resets the render handle for the given bitmap instance. + */ + void ResetRenderHandle() + { + if (m_renderHandle) + { + Tizen::Graphics::Opengl::glDeleteTextures(1, &m_renderHandle); + } + m_renderHandle = 0; + } + + /** + * This method obtains a pointer to the bitmap. + * + * @return A pointer to the bitmap. + */ + Tizen::Graphics::Bitmap* GetBitmap() const + { + return m_bitmap.get(); + } + + /** + * This method sets the render handle for the given bitmap instance to the + * value provided by the caller. + * + * @param aRenderHandle A new value for the render handle. + */ + void SetRenderHandle(RenderHandle aRenderHandle) + { + m_renderHandle = aRenderHandle; + } + + /** + * This method retrieves the current render handle. + * + * @return A unsigned integer representing the render handle. + */ + RenderHandle GetRenderHandle() const + { + return m_renderHandle; + } + +private: + std::auto_ptr m_bitmap; + RenderHandle m_renderHandle; +}; + +//----------------------------------------------------------------------------- + +typedef std::tr1::shared_ptr DrawableBitmapPtr; + +#endif + +class TileKey; + + +/** + * This class encapsulates a map tile. A map tile is a square bitmap that is + * fetched from a grid representing the normalized Mercator projection. The + * position of the tile in this grid depends on the map zoom level and is + * defined by the x and y coordinates. At the lowest zoom level, there is only + * one tile. At the next higher zoom level, the grid is 2 x 2. With each zoom + * level above that, the x-size and the y-size of the grid increase by a power + * of two. + * + * \ingroup maps + */ +class GeoTile +{ +public: + + /** + * This enumeration defines identifiers for event types. + */ + enum EventType + { + ET_OnTileFetcherReply = 0, ///< Indicates an event fired when a reply to + /// a tile fetch request arrives. + ET_OnFailure ///< Indicates an event fired on failure. + }; + + + /** + * This property holds a value representing the tile size. + */ + static int size; + + /** + * This method is a contructor. It initializes a new instance of the class + * using the manager reference and the tile key provided by the caller. + * + * @param rKey A constant reference to a key object that identifies the tile. + */ + GeoTile(const TileKey& rKey); + + /** + * This method is the (virtual) destructor. + */ + virtual ~GeoTile(); + + /** + * This method retrieves the tile key. + * + * @return A constant reference to the tile key object for the given tile. + */ + const TileKey& GetKey() const; + + /** + * This method sets a flag to indicate whether the given map tile has been + * requested for display. + * + * @param b A Boolean indcating if the given map tile has been requested + *( true) or not (false). + */ + void SetMarked(bool b); + + /** + * This method checks whether the given map tile has been + * requested for display. + * + * @return A Boolean indcating if the given map tile has been requested + *( true) or not (false). + */ + bool IsMarked() const; + + /** + * This method retrieves a point to the tile image. + * + * @return A pointer to the tile image. + */ + DrawableBitmapPtr GetImage() const; + + /** + * This method sets the tile image. + * + * @param image A pointer to the tile image. + */ + void SetImage(DrawableBitmapPtr image); + + /** + * This method retrieves an object that represents a pending tile request to + * the REST server. + * + * @return A value representing the identifier of the issued request. + */ + const RestItemHandle::RequestId GetPendingRequest() const; + + /** + * This method marks a tile request to the REST server as pending. + * + * @aRequestId An identifier representing a tile request. + */ + void SetPendingRequest(RestItemHandle::RequestId aRequestId); + + /** + * This method sets/creates the map object layer. + * + * A tile supports two layers, the map tile layer on which the tile is + * drawn, and a layer superimposed on top of the map tile layer, which + * contains the map objects that may have been added/created. If no objects + * have been added/created, the map object layer is NULL. + * + * @param layer A pointer to an instance of DrawableBitmap that + * constitutes the object layer. + */ + void SetMapObjectLayer(DrawableBitmapPtr layer); + + /** + * This method retrieves a pointer to the map object layer. + * + * A tile supports two layers, the map tile layer on which the tile is + * drawn, and a layer superimposed on top of the map tile layer, which + * contains the map objects that may have been added/created. If no objects + * have been added/created, the map object layer is NULL. + * + * @return A pointer to an instance of DrawableBitmap that + * constitutes the object layer. + */ + DrawableBitmapPtr GetMapObjectLayer() const; + + /** + * This method removes the map object layer. + * + * A tile supports two layers, the map tile layer on which the tile is + * drawn, and a layer superimposed on top of the map tile layer, which + * contains the map objects that may have been added/created. If no objects + * have been added/created, the map object layer is NULL. + */ + void RemoveMapObjectLayer(); + + /** + * This methods aborts loading of the given tile. + */ + void AbortLoading(); + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoTile); + + class GeoTileImpl; + GeoTileImpl* m_pImpl; +}; + +typedef std::tr1::shared_ptr TilePtr; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/maps/GeoTileProvider.h b/inc/engine/maps/GeoTileProvider.h new file mode 100755 index 0000000..b3531fe --- /dev/null +++ b/inc/engine/maps/GeoTileProvider.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOTILEPROVIDER_H +#define GEOTILEPROVIDER_H + +#include "common/HereMaps_global.h" +#include "maps/GeoProvider.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class DrawableBitmap; +class TileKey; + +/** + * This class encapsulates a map tile provider which is responsible + * for loading map tiles. + * + * \ingroup maps + */ +class GeoTileProvider : public GeoProvider +{ +public: + /** + * This method is the default constructor. + */ + GeoTileProvider(); + + /** + * This method is the (virtual) destructor. + */ + virtual ~GeoTileProvider(); + + /** + * This method loads the map tile specified by the caller. + * + * @param tileKey A constant reference to an object that specifies a tile + * key. + * + * @return A value representing the identifier of request to load the tile. + */ + RestItemHandle::RequestId LoadTile(const TileKey& tileKey); + + /** + * This method aborts loading of the map tile specified by the caller. + * + * @param tile A constant reference to an object representing the tile whose + * loading is to be aborted. + */ + void AbortTile(const TilePtr& tile); + + /** + * This method registers a callback function to be invoked when the tile has loaded. + * + * @param signal A constant reference to a function to be invoked when the + * tile has loaded; the function accepts a reference to a + * TileKey object and a pointer to the tile bitmap (see + * also \ref GeoProvider). + */ + void TileLoaded(const TileLoadedFunc &signal); + + /** + * This method registers a callback function to be invoked when an attempt + * to load a map tile has failed. + * + * @param signal A constant reference to a function to be invoked when an + * attempt to load a tile has failed; the function accepts a + * reference to a TileKey object and a reference to an + * object containing information about the error that occurred (an + * instance of ErrorBase). + */ + void TileFailed(const TileFailedFunc& signal); + +private: + class GeoTileProviderImpl; + std::auto_ptr m_impl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // GEOTILEPROVIDER_H diff --git a/inc/engine/maps/GeoTiledMap.h b/inc/engine/maps/GeoTiledMap.h new file mode 100755 index 0000000..304ad22 --- /dev/null +++ b/inc/engine/maps/GeoTiledMap.h @@ -0,0 +1,431 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOTILEDMAP_H +#define GEOTILEDMAP_H + +#include +#include + +#include "common/HereMaps_global.h" + +#ifndef TIZEN_MIGRATION +#include +#include +#include +#endif + +#include "maps/DrawableBitmap.h" +#ifdef TIZEN_MIGRATION +#include "graphic/Dimension.h" +#include "graphic/Point.h" +#include "graphic/Color.h" +#include + +using namespace Tizen::Maps; +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoTile; +class ErrorBase; +class GeoMapObject; +class GeoCoordinates; +class TileFetcherReply; +class GeoProjectionNode; +class GeoMapObjectMarker; +class GeoProviderManager; + + +/** + * This class encapsulates a tiled map. The map is composed of square bitmap + * tiles retrieved from a grid that represents the normalized Mercator + * projection (see also GeoTile). The class supports a number of + * map types (for example normal, terrain, satellite, etc.) and provides methods + * to control the map size, orientation (heading), zoom level, and managing + * objects such as markers, polylines and polygons that can be superimposed on + * the map. + * + * \ingroup maps + */ +class EXPORT_API GeoTiledMap +{ +public: + + /** + * This enumeration defines identifiers for supported map types. + */ + enum MapType + { + MT_Normal_Day = 0, ///< Indicates a normal (street/physical + /// day map. + MT_Satellite_Day, ///< Indicates a satellite day map. + MT_Terrain_Day, ///< Indicates a terrain day map. + MT_Hybrid_Day, ///< Indicates a hybrid day map + /// (satellite, with roads and labels). + MT_Last_Entry_Undefined ///< Indicates that the map type is not + /// defined. + }; + + /** + * This enumeration defines identifiers for logo color. + */ + enum LogoColor + { + LC_Blue = 0, ///< Indicates that the color is blue. + LC_White ///< Indicates that the color is white. + }; + + /** + * This method is the default constructor. + */ + GeoTiledMap(); + + /** + * This method is the (virtual) destructor. + */ + virtual ~GeoTiledMap(); + + /** + * This method sets the size of the map. + * + * @param size A constant reference to an object specifying the size of the + * map in pixels (width and height). + */ + void SetMapSize(const Tizen::Maps::Dimension& size); + + /** + * This method retrieves the map size. + * + * @return A constant reference to an object containing the width and height + * of the map in pixels. + */ + const Tizen::Maps::Dimension& GetMapSize() const; + + /** + * This method sets the map zoom level. + * + * @param zoomLevel A value indicating the new zoom level. + */ + void SetZoomLevel(double zoomLevel); + + /** + * This method retrieves the map zoom level. + * + * @return A value indicating the new zoom level. + */ + double GetZoomLevel() const; + + /** + * This method retrieves the minimum map zoom level. + * + * @return A value indicating the minimum map zoom level. + */ + double GetMinimumZoomLevel() const; + + /** + * This method retrieves the maximum map zoom level. + * + * @return A value indicating the maximum map zoom level. + */ + double GetMaximumZoomLevel() const; + + /** + * This method pans the map the caller-specified number of pixels + * horizontally and vertically. + * + * @param dx A value indicating the number of pixels to move the map along + * the horizontal axis. + * + * @param dy A value indicating the number of pixels to move the map along + * the vertical axis. + */ + void Pan(int dx, int dy); + + /** + * This method sets the coordinates of the map center. + * + * @param center A constant reference to an object containing the new + * geographic coordinates of the map center. + */ + void SetCenter(const GeoCoordinates& center); + + /** + * This method retrieves the coordinates of the map center. + * + * @return A constant reference to an object containing the + * geographic coordinates of the map center. + */ + GeoCoordinates GetCenter() const; + + /** + * This method renders the given object invalid by resetting the drawable + * object representing the map and resetting and reinitializing the tile + * cache. + */ + void Invalidate(); + + /** + * This method invalidates (discards) all the map objects, including + * markers. + */ + void InvalidateMapObjects(); + + /** + * This method invalidates (clears) the cache. + */ + void ClearCache(); + + /** + * This method clears all the map objects associated with the given tiled + * map object. + */ + void ClearMapObjects(); + + /** + * This method converts the geographic location specified by the caller to + * screen coordinates, taking into consideration the current zoom level and + * the view area. + * + * @param coordinate A constant reference to an object containing the + * coordinates to convert. + * + * @return An object containing the x and y coordinates defining the screen + * location. + */ + Tizen::Maps::Point CoordinateToScreenPosition(const GeoCoordinates& coordinate) const; + + /** + * This method converts the screen position specified by the caller to + * geographic coordinates. The method is called, for example, when a marker + * is being added to the map. + * + * @param screenPosition An object containing the x and y coordinates + * defining the screen location to convert. + * + * @return An object containing the geographic coordinates of corresponding + * to the received screen position. + */ + GeoCoordinates ScreenPositionToCoordinate(const Tizen::Maps::Point& screenPosition) const; + + //map objects support + /** + * This method adds an object to the map. The object is a marker, a polygon + * or polyline, or a group of objects. + * + * @param obj A pointer to an object to add to the map. If the object does + * not exist (is NULL), the method has no effect. + * + * @param bTransferOwnership A Boolean value indicating if the ownership of + * the map object given in the first parameter should be transferred + * to this map instance (true, default) or not + * (false). The default behavior transfers the + * ownership, which means that the map object becomes responsible for + * deleting the markers. + */ + void AddObject(GeoMapObject* obj, bool bTransferOwnership=true); + + /** + * This method removes the object specified by the caller from the map. + * + * @param obj A pointer to the object to remove from the map. If the object + * does not exist (is NULL), the method has no effect. + * + * @return Boolean value indicating if the removal of the object was + * successful (true) or not (false). + */ + bool RemoveObject(GeoMapObject* obj); + + /** + * This method obtains a pointer to the map object located at the screen + * position indicated by the caller. + * + * @param point A constant reference to an object containing the pixel + * coordinates of the screen position from which to get the map object. + * + * @return A pointer to the map object at the specified screen location, + * otherwise NULL if no map object is found. + */ + GeoMapObject* GetObjectAtScreenPosition(const Tizen::Maps::Point& point) const; + + /** + * This method obtains a count of marker objects in the given tiled map. + * + * @return A value that indicates the number of marker objects. + */ + size_t GetNumMarkerObjects() const; + + /** + * This method retrieves a pointer to a marker object at the index specified + * by the caller. + * + * @param idx A value specifying the index of the marker object to + * retrieve. + * + * @return A pointer to the marker object at the specified index or + * NULL if the index is invalid. + */ + GeoMapObjectMarker* GetMarkerObject(size_t idx) const; + + //draws the map into the current OpenGl context + /** + * This method draws (renders and displays) a map image of the size + * specified by the caller. The displayed map includes the required map + * tiles as well as any objects such as markers, polygons and polylines. + * + * @param uWidth A value specifying the width of the map image. + * + * @param uHeight A value specifying the height of the map image. + * + * @return A Boolean, true if the map has been successfully + * pained, otherwise false. + */ + bool PaintMap(unsigned int uWidth, unsigned int uHeight); + + /** + * This typedef defines a function object as a type. The function object can + * be called when the map has been updated. A function object of this type + * returns void and receives no arguments. + */ +#ifdef TIZEN_MIGRATION + typedef std::tr1::function UpdateMapSignalFunctor; +#else + typedef std::tr1::function UpdateMapSignalFunctor; +#endif + + /** + * This method sets a callback to be invoked when the map has + * been updated. + * + * @param slot A function object to be called when the map has + * been updated. + */ +#ifdef TIZEN_MIGRATION + void SetUpdateMapSignal(UpdateMapSignalFunctor slot, void *data); +#else + void SetUpdateMapSignal(UpdateMapSignalFunctor slot); +#endif + + /** + * This method sets the map type. + * + * @param aMapType A value indicating the new map type. + */ + void SetMapType(MapType aMapType); + + /** + * This method retrieves the map type. + * + * @return A value indicating the current map type. + */ + MapType GetMapType() const; + + /* + * Available language options are: + * L"ara", L"chi", L"cht", L"dut", L"eng", L"ger", L"gle", L"fre", L"ita", L"spa", L"rus", L"pol", L"gre", L"wel" + */ + /** + * This method sets the language of the map. + * + * @param aMapLanguage A constant reference to a string containing a + * language code. The value of the string must be one of "ara" + * (Arabic), "chi" (Chinese), "cht" (Chinese-Taiwan), "dut" (Dutch), + * "eng" (English), "ger" (German), "gle" (Irish), "fre" (French), + * "ita" (Italian), "spa" (Spanish), "rus" (Russian), "pol" (Polish), + * "gre" (Greek), "wel" (Welsh) + */ + void SetMapLanguage(const String& aMapLanguage); + + /** + * This method retrieves the current language of the map. + * + * @return A constant reference to a string containing the language code, + * which is one of "ara" (Arabic), "chi" (Chinese), "cht" + * (Chinese-Taiwan), "dut" (Dutch), "eng" (English), "ger" (German), + * "gle" (Irish), "fre" (French), "ita" (Italian), "spa" (Spanish), + * "rus" (Russian), "pol" (Polish), "gre" (Greek), "wel" (Welsh) + */ + const String& GetMapLanguage() const; + + /** + * This method sets the size of the tiles used for rendering the map. + * + * @param uTileSizeInPX Specifies the width and the height of the tiles. Note that + * only 128 and 256 are supported as valid values. + */ + void SetTileSize(unsigned int uTileSizeInPx); + + /** + * This method retrieves the size of the tiles, used for rendering the map. + * + * @return An unsigned integer indicating the size of the map tiles. + */ + unsigned int GetTileSize() const; + + /** + * This method changes the background color of the map. + * The background color is updated after refreshing the map. + * + * @param color A constant reference to an object representing the new map + * background color. + */ + void SetBackgroundColor(const Tizen::Maps::Color& color); + +#ifdef TIZEN_CUSTOMIZATION + /** + * This method retrieves the root tile, used for rendering the map. + * + * @return An pointer indicating the bitmap of the root tile. + */ + DrawableBitmapPtr GetRootPixmap(); + + /** + * This method sets a pointer of a structure of the Evas GL API object that + * contains the GL APIs to be used in Evas GL. + * + * @param __glapi A pointer to a structure of the Evas GL API object. + */ + void SetEvasGlApi(Evas_GL_API *__glapi); +#endif + +private: + bool HandleTileReady(int level, int x, int y, unsigned int uLevelProvider); + bool DrawLogo(UInt uWidth, UInt uHeight, UInt aMapX = 0, UInt aMapY = 0); + + void UpdateMapSignal(); + void UpdateProjectionNodes(); + float CreateProjectionTree(std::vector& result, GeoProjectionNode* node); + void InitializeCache(); + void SortMarkers(); + int GetDisplayDPI() const; + void ClearMarkers(); + void SetRootPixmap(DrawableBitmapPtr rootPixmap); + +private: + friend class GeoMapObject; + friend class GeoMapObjectMarker; + friend class GeoProviderManager; + friend class TestGeoTiledMap; + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoTiledMap); + + class GeoTiledMapImpl; + std::auto_ptr m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif // GEOTILEDMAPDATA_H diff --git a/inc/engine/maps/GlTexture.h b/inc/engine/maps/GlTexture.h new file mode 100755 index 0000000..1552142 --- /dev/null +++ b/inc/engine/maps/GlTexture.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GLTEXTURE_H +#define GLTEXTURE_H + +#include "common/HereMaps_global.h" + +#ifdef TIZEN_MIGRATION +#include "graphic/Bitmap.h" +#else +#include +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates a GL texture that is a container for map tile bitmaps. + * + * \ingroup maps + */ +class GlTexture +{ +public: + + /** + * This method is a constructor that initializes a new texture instance with + * the bitmap object provided by the caller. + * + * @param rBitmap A constant reference to a bitmap object. + */ + GlTexture(const Tizen::Maps::Bitmap& rBitmap); + + /** + * This method is the destructor. + */ + ~GlTexture(); + + /** + * This method retrieves the texture id. + * + * @return A value representing the texture id. + */ + unsigned int GetTextureId() const; + + /** + * This method sets the texture id. + * + * @param uId A value representing the texture id. + */ + void SetTextureId(unsigned int uId); + + /** + * This method checks if the called instance wraps a valid GL texture + * + */ + bool IsValid() const; + + /** + * This method checks if the passed texture handle is a valid GL texture + * + */ + static bool IsValid(unsigned int uId); + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GlTexture); + + class GlTextureImpl; + GlTextureImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/routes/GeoRoute.h b/inc/engine/routes/GeoRoute.h new file mode 100755 index 0000000..26266cf --- /dev/null +++ b/inc/engine/routes/GeoRoute.h @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOROUTE_H +#define GEOROUTE_H + +#include + +#include "common/HereMaps_global.h" +#include "common/GeoCoordinates.h" +#include "routes/GeoRouteQuery.h" +#include "routes/RouteSegment.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class RouteSegment; +class GeoBoundingBox; + +class GeoRoute; + +/** + * This typedef defines a list (vector) of instances of GeoRoute as + * a type. + * + * \ingroup routes + */ +typedef std::vector GeoRouteList; + +/** + * This class encapsulates a route. Instances of the class are data objects. The + * information they contain can be used to draw routes on the map. + * + * A route object contains member variables that represent: + *
    + * + *
  • route segments - sections of the route encapsulated as instances of + * RouteSegment
  • + * + *
  • maneuvers - instances of Maneuver
  • that contain + * navigation instructions for the person following the route, indicating + * how to continue from one section of the route to the next + * + *
  • route geometry - a list of instances of GeoCoordinates
  • + * that contains the point objects with the coordinates of the geographical + * locations through which the route passes + * + *
  • duration - the length of time required to travel the route from start + * to finish
  • + * + *
+ * + * Note that the above list is indicative, rather than comprehensive. + */ +class EXPORT_API GeoRoute +{ +public: + + /** + * This is the default constructor. + */ + GeoRoute(); + + /** + * This method is the copy constructor. + * + * @param rRhs An object whose contents are to be copied to the instance + * being created. + */ + GeoRoute(const GeoRoute& rRhs); + + /** + * This method is the destructor. + */ + ~GeoRoute(); + + /** + * This method sets the id of the route object. + * + * @param rId A constant reference to a string containing the unique id of + * the route object. + */ + void SetRouteId(const String& rId); + + /** + * This method retrieves the id of the route object. + * + * @return A string containing the unique id of + * the route object. + */ + String GetRouteId() const; + + /** + * This method sets class property holding the request used to obtain the + * route data. + * + * @param rRequest A constant reference to an object that encapsulates the + * query used to obtain the route data. + */ + void SetRequest(const GeoRouteQuery& rRequest); + + /** + * This method retrieves the value class property holding the request used + * to obtain the route data. + * + * @return An object that encapsulates the query used to obtain the route + * data. + */ + GeoRouteQuery GetRequest() const; + + /** + * This method sets a property that holds the bounding box enclosing + * the route. The bounding box is defined by the geographic coordinates of + * its top-left and bottom-right corners. + * + * @param rBounds A constant reference to an object containing the bounding + * box. + */ + void SetBounds(const GeoBoundingBox& rBounds); + + /** + * This method retrieves the value of a class property that holds the + * bounding box enclosing the route. The bounding box is defined by the + * geographic coordinates of its top-left and bottom-right corners. + * + * @return An object containing the bounding box. + */ + GeoBoundingBox GetBounds() const; + + /** + * This method sets a class property that holds the list of segments of the + * route. + * + * @param vRouteSegmentList A constant reference to an object that defines + * the first segment of the route. + */ + void SetRouteSegmentList(const RouteSegmentList& vRouteSegmentList); + + /** + * This method retrieves the value of a class property that holds the list of + * segments of the route. + * + * @return An object that defines the list of segments of the route. + */ + RouteSegmentList GetRouteSegmentList() const; + + /** + * This method sets a class property that holds the time required to travel + * the length of the route. + * + * @param aSecs An integer value specifying the time required to travel the + * length of the route in seconds. + */ + void SetTravelTime(int aSecs); + + /** + * This method retrieves the value of a class property that holds the time + * required to travel the length of the route. + * + * @return An integer value specifying the time required to travel the + * length of the route in seconds. + */ + int GetTravelTime() const; + + /** + * This method sets a class property that holds the length of the route -- + * the total distance to travel between the start and end points of the + * route. + * + * @param aDistance A value specifying the length of the route in meters. + */ + void SetDistance(double aDistance); + + /** + * This method retrieves the value of a class property that holds the length + * of the route -- the total distance to travel between the start and end + * points of the route. + * + * @return A value specifying the length of the route in meters. + */ + double GetDistance() const; + + /** + * This method sets a class property indicating the travel mode for which + * the route was calculated. + * + * @param aTravelMode A value indicating the mode of travel for the route. + */ + void SetTravelMode(GeoRouteQuery::TravelMode aTravelMode); + + /** + * This method retrieves the value of a class property indicating the travel + * mode for which the route was calculated. + * + * @return A value indicating the mode of travel for the route. + */ + GeoRouteQuery::TravelMode GetTravelMode() const; + + /** + * This method sets a class property that defines the geometry of the route + * (it holds the coordinates of the points through which the route passes, + * the vertices of the route). + * + * @param rPath A constant reference to an object containing the geographic + * coordinates of the points through which the route passes (the route + * vertices). + */ + void SetPath(const GeoCoordinateList& rPath); + + /** + * This method retrieves the value of a class property that defines the + * geometry of the route (it holds the coordinates of the points through + * which the route passes, the vertices of the route). + * + * @return An object containing the geographic coordinates of the points + * through which the route passes (the route vertices). + */ + GeoCoordinateList GetPath() const; + + /** + * This is the assignment operator. + * + * @param rRhs A constant reference to an object whose properties are to be + * copied to the given instance of the class. + * + * @return A reference to the given instance of the class after its member + * elements have been updated. + */ + GeoRoute& operator = (const GeoRoute& rRhs); + +private: + class GeoRouteImpl; + GeoRouteImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif /* GEOROUTE_H */ diff --git a/inc/engine/routes/GeoRouteQuery.h b/inc/engine/routes/GeoRouteQuery.h new file mode 100755 index 0000000..f3af232 --- /dev/null +++ b/inc/engine/routes/GeoRouteQuery.h @@ -0,0 +1,387 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOROUTEQUERY_H +#define GEOROUTEQUERY_H + +#include + +#include "common/HereMaps_global.h" +#include "common/BaseQuery.h" +#include "common/GeoCoordinates.h" +#include "common/GeoBoundingBox.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoRouteReply; +class QueryListener; +class GeoRouteQueryListener; + +/** + * This class encapsulates a query that requests a route calculation. The + * required calculation is specified in terms of route features, including the + * start and end points, waypoints (the locations through which the route must + * pass), areas to include and to avoid, mode of travel, route features with + * weighting, required optimization, etc. + * + * \ingroup routes + */ +class EXPORT_API GeoRouteQuery : public BaseQuery +{ +public: + + /** + * This enumeration defines identifiers for the supported modes of travel. + */ + enum TravelMode { + TM_CarTravel = 0x0001, ///< Indicates that the route is to be + /// traveled by car. + TM_PedestrianTravel = 0x0002, ///< Indicates that the route is for a pedestrian. + TM_PublicTransitTravel = 0x0008, ///< Indicates that the route is to be + /// traveled using public transport. + }; + + /** + * This enumeration defines identifiers for the supported route feature + * types, feature types that can be favored or excluded by the route + * calculation. + */ + enum FeatureType { + FT_NoFeature = 0x00000000, ///< Indicates no route features (are selected). + FT_TollFeature = 0x00000001, ///< Indicates toll roads (toll gates/booths). + FT_MotorwayFeature = 0x00000002, ///< Indicates motorway(s). + FT_BoatFerryFeature = 0x00000004, ///< Indicates a boat ferry. + FT_RailFerryFeature = 0x00000008, ///< Indicates rail (train) ferry. + FT_PublicTransitFeature = 0x00000010, ///< Indicates public transport. + FT_TunnelFeature = 0x00000020, ///< Indicates tunnel. + FT_DirtRoadFeature = 0x00000040, ///< Indicates dirt road. + FT_ParksFeature = 0x00000080, ///< Indicates park. + FT_HOVLane = 0x00000100, ///< Indicates a high-occupancy vehicle lane. + FT_Stairs = 0x00000200 ///< Indicates stairs. + }; + + /** + * This enumeration defines identifiers for the supported route feature weighting. + */ + enum FeatureWeight { + FW_NormalFeatureWeight = 0x00000000, ///< Indicates normal weighting. + FW_PreferFeatureWeight = 0x00000001, ///< Indicates that a feature is preferred. + FW_AvoidFeatureWeight = 0x00000002, ///< Indicates that a feature is to be avoided. + FW_SoftExcludeFeatureWeight = 0x00000004, ///< Indicates that soft-exclude applies to the feature. + FW_StrictExcludeFeatureWeight = 0x00000008 ///< Indicates that the feature is to be strictly excluded. + }; + + /** + * This typedef defines a map of route feature types and weighting as a type. + */ + typedef std::map< GeoRouteQuery::FeatureType, GeoRouteQuery::FeatureWeight > FeaturesMap; + + /** + * This enumeration defines identifiers for the supported route optimizations. + */ + enum RouteOptimization { + RO_ShortestRoute = 0x0001, ///< Indicates the shortest route. + RO_FastestRoute = 0x0002, ///< Indicates the fastest route. + }; + + /** + * This enumeration defines identifiers for route segment detail specifiers. + */ + enum SegmentDetail { + SD_NoSegmentData = 0x0000, ///< Indicates that no route segment data are to be included. + SD_BasicSegmentData = 0x0001 ///< Indicates that basic route segment data are to be included. + }; + + /** + * This enumeration defines identifiers for route maneuver specifiers. + */ + enum ManeuverDetail { + MD_NoManeuvers = 0x0000, ///< Indicates that manuevers are to be included int he route. + MD_BasicManeuvers = 0x0001 ///< Indicates that basic maneuvers are to be included in the route calculation. + }; + +#ifdef TIZEN_CUSTOMIZATION + /** + * This enumeration defines identifiers for route MetricSystem specifiers. + */ + enum MetricSystem { + DIST_imperial = 0x0000, ///< Indicates that MetricSystem is miles + DIST_metric = 0x0001 ///< Indicates that MetricSystem is m & km + }; +#endif + + /** + * This method is a constructor that initializes a new instance of the + * class, using the list of waypoints supplied by the caller. + * + * @param rWaypoints A constant reference to a vector of instances of + * GeoCoordinates that define the route waypoints. + */ + GeoRouteQuery(const GeoCoordinateList &rWaypoints = GeoCoordinateList()); + + /** + * This method is a constructor that initializes a new instance of the + * class, using the objects representing the route origin and destination + * supplied by the caller. + * + * @param rOrigin A constant reference to an object that defines the point + * of origin for the route. + * + * @param rDestination A constant reference to an object that defines the + * destination for the route. + */ + GeoRouteQuery(const GeoCoordinates &rOrigin, const GeoCoordinates &rDestination); + + /** + * This method is a copy constructor that initializes a new instance of the + * class by copying the values of the properties of the object supplied by + * the caller. + * + * @param rRhs A constant reference to an object whose property values are + * to be used to initialize a new instance of the class. + */ + GeoRouteQuery(const GeoRouteQuery &rRhs); + + /** + * This method is the destructor for objects of this class. + */ + ~GeoRouteQuery(); + + /** + * This is the assignment operator. + * + * @param rRhs A constant reference to an object whose property values are + * to be copied to the given instance. + */ + GeoRouteQuery& operator = (const GeoRouteQuery &rRhs); + + /** + * This method sets route waypoints, using the list of objects supplied by + * the caller. + * + * @param rWaypoints A constant reference to a vector of instances of + * GeoCoordinates that define the route waypoints. + */ + void SetWaypoints(const GeoCoordinateList &rWaypoints); + + /** + * This method retrieves the route waypoints. + * + * @return A vector of instances of GeoCoordinates that define + * the route waypoints. + */ + GeoCoordinateList GetWaypoints() const; + + /** + * This method sets areas through which the route must not pass, using a + * list of bounding box objects supplied by the caller. + * + * @param rAreas A constant reference to a list of bounding box objects that + * define the areas the route must avoid. + */ + void SetExcludeAreas(const GeoBoundingBoxList &rAreas); + + /** + * This method retrieves a list of bounding boxes that defines areas through + * which the route must not pass. + * + * @return A list of bounding box objects that define the areas the route + * must avoid. + */ + GeoBoundingBoxList GetExcludeAreas() const; + + // defaults to TravelByCar + /** + * This method sets the travel mode to be used in the route query. + * + * @param aTravelModes A value indicating the travel mode to use in the + * query. + */ + void SetTravelModes(TravelMode aTravelModes); + + /** + * This method retrieves the travel mode used in the route query. + * + * @return A value indicating the travel mode used in the + * query. + */ + TravelMode GetTravelModes() const; + + /** + * This method associates weighting with a feature to be used in the route + * query. + * + * @param aFeatureType A value indicating the feature type to which the + * weighting is to apply. + * + * @param aFeatureWeight A value indicating the weighting to apply. + */ + void SetFeatureWeight(FeatureType aFeatureType, FeatureWeight aFeatureWeight); + + /** + * This method retrieves the weighting for the feature type specified by the + * caller. + * + * @param aFeatureType A value indicating the feature type for which to + * retrieve weighting. + * + * @return A value indicating the weighting associated with the named route + * feature. + */ + FeatureWeight GetFeatureWeight(FeatureType aFeatureType) const; + + /** + * This method retrieves a map of route feature types specified for the + * given query. + * + * @return An object containing a map of route feature types specified for + * the given query. + */ + FeaturesMap GetFeatureTypes() const; + + // defaults to OptimizeFastes) + /** + * This method sets the route optimization option for the given query. + * + * @param aOptimization A value indicating the route optimization option to + * set for the given query. + */ + void SetRouteOptimization(RouteOptimization aOptimization); + + /** + * This method retrieves the route optimization selector set for the given + * query. + * + * @return A value indicating the route optimization selector set for the + * given query. + */ + RouteOptimization GetRouteOptimization() const; + + // defaults to BasicSegmentData + /** + * This method sets the segment detail selector for the given query. + * + * @param aSegmentDetail A value indicating the segment detail selector for + * the given query. + */ + void SetSegmentDetail(SegmentDetail aSegmentDetail); + + /** + * This method retrieves the segment detail selector for the given query. + * + * @return A value indicating the segment detail selector set for the given + * query. + */ + SegmentDetail GetSegmentDetail() const; + + // defaults to BasicManeuvers + /** + * This method sets the maneuver detail selector for the given + * query. + * + * @param aManeuverDetail A value indicating the maneuver detail selector for + * the given query. + */ + void SetManeuverDetail(ManeuverDetail aMneuverDetail); + + /** + * This method retrieves the maneuver detail selector set for the given + * query. + * + * @return A value indicating the maneuver detail selector for + * the given query. + */ + ManeuverDetail GetManeuverDetail() const; + +#ifdef TIZEN_CUSTOMIZATION + /** + * This method sets the MetricSystem selector for the given + * query. + * + * @param aMetricSystem A value indicating the MetricSystemselector for + * the given query. + */ + void SetMetricSystem(GeoRouteQuery::MetricSystem aMetricSystem); + + /** + * This method retrieves the MetricSystem selector set for the given query. + * + * @return A value indicating the MetricSystem selector for + * the given query. + */ + GeoRouteQuery::MetricSystem GetMetricSystem(void); + + /** + * This method sets the bounding area for the given query. + * + * @param aMetricSystem A value indicating the bounding area for + * the given query. + */ + void SetViewBounds(GeoBoundingBox aViewBounds); + + /** + * This method retrieves the bounding area set for the given query. + * + * @return A value indicating the bounding area for + * the given query. + */ + GeoBoundingBox GetViewBounds(void); +#endif + + /** + * This method attempts to establish a connection with the server and then, + * if the connection has been established, it builds and submits a query. + * + * @rListener rListener A reference to an object that is to be notified when + * the reply to the query has arrived from the server. + * + * @param pUserData A pointer to user data to be passed back within the + * corresponding reply object. + * + * @return A vaur representing the identifier of issued request. + */ + RestItemHandle::RequestId Execute(GeoRouteQueryListener& rListener, Tizen::Maps::HereObject* pUserData = NULL) const; + + /** + * This static method returns the base URI to be used for all subsequent + * geo route queries. + * + * @return A string containing the base URI. + */ + static String GetBaseUri(); + + /** + * This static method returns the base URI to be used for all subsequent + * geo route queries. + * + * @param sUri A constant reference to a string containing the base URI. + */ + static void SetBaseUri(const String& sUri); + +private: + bool CreateBaseUrl(const String& sService, String& sDst) const; + + String CreateUri() const; + +private: + class GeoRouteQueryImpl; + GeoRouteQueryImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif /* GEOROUTEQUERY_H */ diff --git a/inc/engine/routes/GeoRouteQueryListener.h b/inc/engine/routes/GeoRouteQueryListener.h new file mode 100755 index 0000000..a3540f3 --- /dev/null +++ b/inc/engine/routes/GeoRouteQueryListener.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOROUTEQUERYLISTENER_H +#define GEOROUTEQUERYLISTENER_H + +#include "common/HereMaps_global.h" +#include "common/QueryListener.h" + +#include "routes/GeoRouteReply.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoRouteReply; + +/** + * This class encapsulates an object that is notified when a response to a query + * has become available. The derived classes must implement the methods defined + * on this class to provide handling of the replies from the server. + * + * \ingroup routes + */ +class EXPORT_API GeoRouteQueryListener : public QueryListener +{ +public: + + /** + * This is the default constructor. + */ + GeoRouteQueryListener(); + + /** + * This method is the destructor. + */ + ~GeoRouteQueryListener(); + + /** + * This method is a callback invoked when data have arrived in response to a + * route request. + * + * @param rReply A Constant reference to an object containing the response data. + */ + virtual void OnRouteReply(const GeoRouteReply& rReply) = 0; + + #ifdef TIZEN_MIGRATION + /** + * This method is a callback invoked when geocoding request is failed. + * + * @param rReply A Constant reference to an object containing the response data. + */ + virtual void OnRouteFailure(const GeoRouteReply& rReply) = 0; + #endif + +private: + + void OnReplySuccess(BaseReply& rReply); + + #ifdef TIZEN_MIGRATION + void OnFailure(const BaseReply& rReply); + #endif +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/routes/GeoRouteReply.h b/inc/engine/routes/GeoRouteReply.h new file mode 100755 index 0000000..50bcf9e --- /dev/null +++ b/inc/engine/routes/GeoRouteReply.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOROUTEREPLY_H +#define GEOROUTEREPLY_H + +#include "common/HereMaps_global.h" +#include "common/BaseReply.h" +#include "routes/GeoRoute.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class GeoRouteQuery; + +/** + * This class encapsulates a response to a route calculation request query. + * + * \ingroup routes + */ +class EXPORT_API GeoRouteReply : public BaseReply +{ +public: + + /** + * This is the default constructor. + */ + GeoRouteReply(); + + /** + * This is the (virtual) destructor. + */ + virtual ~GeoRouteReply(); + + /** + * This method retrieves the original route query request. + * + * @return An object that encapsulates the original route query request. + */ + GeoRouteQuery GetRequest() const; + + /** + * This method retrieves a list of routes calculated in response to the + * request (see GetRequest). + * + * @return A reference a an object containing the calculated routes. + */ + GeoRouteList& GetRoutes() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoRouteReply); + friend class TestGeoRouteReply; + + virtual bool OnDataReceived(const unsigned char* pBuffer, size_t uSize); + + void SetRequest(const GeoRouteQuery& aGeoRouteQuery); + void SetRoutes(const GeoRouteList& rRoutes); + +private: + class GeoRouteReplyImpl; + GeoRouteReplyImpl* m_pImpl; + + friend class GeoRouteReplyImpl; + friend class GeoRouteQuery; +}; + +HERE_MAPS_END_NAMESPACE + +#endif /* GEOROUTEREPLY_H */ diff --git a/inc/engine/routes/GeoRouterReplyParser.h b/inc/engine/routes/GeoRouterReplyParser.h new file mode 100755 index 0000000..b07b99c --- /dev/null +++ b/inc/engine/routes/GeoRouterReplyParser.h @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef GEOROUTERREPLYPARSER_H +#define GEOROUTERREPLYPARSER_H + +#include "common/HereMaps_global.h" + +#include "common/GeoCoordinates.h" +#include "common/GeoBoundingBox.h" +#include "routes/RouteSegment.h" + +#include +#include + +HERE_MAPS_BEGIN_NAMESPACE + +class ErrorBase; +class ParserError; +class GeoRoute; + + +/** + * This class encapsulates a parser of replies to routing requests. It provides + * methods dedicated to parsing specific nodes of the reply data and populating + * a destination object supplied by the caller. + * + * \ingroup routes + */ +class GeoRouterReplyParser +{ +public: + + /** + * This method retrieves the route details held in the XML node supplied by + * the caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseRouteEntry(xmlNodePtr pNode, GeoRoute& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + + /** + * This method retrieves a route summary entry held in the XML node supplied + * by the caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseSummary(xmlNodePtr pNode, GeoRoute& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + + /** + * This method retrieves a route travel mode held in the XML node supplied + * by the caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseMode(xmlNodePtr pNode, GeoRoute& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + + /** + * This method retrieves the route shape definition from the XML node + * supplied by the caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseShape(xmlNodePtr pNode, GeoCoordinateList& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + + /** + * This method retrieves a route bounding box from the XML node + * supplied by the caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseBoundingBox(xmlNodePtr pNode, GeoBoundingBox& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + + /** + * This method retrieves a route waypoint defined in the XML node supplied + * by the caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseCoordinate(xmlNodePtr pNode, GeoCoordinates& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + + /** + * This method retrieves a route leg defined in the XML node supplied by the + * caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseLeg(xmlNodePtr pNode, RouteSegment& rDst, xmlXPathContextPtr pCtx, ParserError*& pError); + + /** + * This method retrieves the details of a maneuver defined in the XML node + * supplied by the caller. + * + * @param pNode A pointer to the XML node to parse. + * + * @param rDst A reference to an object which is to receive the results. + * + * @param pCtx A pointer to the XPath context. + * + * @param pError A pointer to an object that is populated + * with error information should parsing fail. + * + * @return true on success, otherwise false (in + * which case the last argument to the method can be used to retrieve + * the error information. + */ + static bool ParseManeuver(xmlNodePtr pNode, Maneuver& rDst, GeoCoordinateList& vSegmentPath, xmlXPathContextPtr pCtx, ParserError*& pError); + +private: + static bool ExtractContent(xmlNodePtr pNode, String& sDst, ParserError*& pError); + static xmlNodePtr FindChildNode(xmlNodePtr pNode, const char* pUTF8Literal); + + static void AppendOrSet(ParserError*& pError, ParserError* pLoc); + + HERE_MAPS_NO_COPY_NO_ASSIGN(GeoRouterReplyParser); + +}; + +HERE_MAPS_END_NAMESPACE + +#endif // GEOROUTERREPLYPARSER_H diff --git a/inc/engine/routes/Maneuver.h b/inc/engine/routes/Maneuver.h new file mode 100755 index 0000000..d4e2bee --- /dev/null +++ b/inc/engine/routes/Maneuver.h @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef MANEUVER_H +#define MANEUVER_H + +#include "common/HereMaps_global.h" +#include "common/GeoCoordinates.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class Maneuver; +typedef std::vector ManeuverList; + + +/** + * This class represents a route maneuver. A route maneuver contains information + * that allows for navigation instructions to be generated, which explain how + * the person following a route is to proceed from one segment of the route to + * another. A Maneuver instance contains instruction text for the + * person following the route, the geographic coordinates of the waypoint to + * which it applies, an indication of the direction of travel, as well + * as time and distance to the next instruction. + * + * Maneuvers are tightly coupled to the Route instance for which + * they are generated. + * + * \ingroup routes + */ +class EXPORT_API Maneuver +{ + +public: + /** + * This enumeration defines identifiers for route maneuver directions. + */ + enum InstructionDirection { + ID_NoDirection, ///< Indicates that no directional instruction + /// is set/specified; this is the default + /// direction set by the default constructor. + ID_DirectionForward, ///< Indicates instruction to travel forward. + ID_DirectionBearRight, ///< Indicates instruction to bear right. + ID_DirectionLightRight, ///< Indicates instruction to turn slightly to + /// the right. + ID_DirectionRight, ///< Indicates instruction to turn right. + ID_DirectionHardRight, ///< Indicates instruction to turn hard to the + /// right. + ID_DirectionUTurnRight, ///< Indicates instruction to make a right + /// u-turn. + ID_DirectionUTurnLeft, ///< Indicates instruction to make a left + /// u-turn. + ID_DirectionHardLeft, ///< Indicates instruction to turn hard to the + /// left. + ID_DirectionLeft, ///< Indicates instruction to turn left. + ID_DirectionLightLeft, ///< Indicates instruction to turn slightly to + /// the left. + ID_DirectionBearLeft ///< Indicates instruction to bear left. + }; + + /** + * This method is the default constructor. It creates an invalid instance, + * with direction set to ID_NoDirection. + */ + Maneuver(); + + /** + * This method is the copy constructor. + * + * @param rRhs A constant reference to an object whose contents are to be + * copied to the new instance of the class. + */ + Maneuver(const Maneuver& rRhs); + + /** + * This method is the destructor. + */ + ~Maneuver(); + + /** + * This method is the assignment operator. + * + * @param rRhs A constant reference to an object whose contents are to be + * copied to the given instance of the class. + * + * @return A reference to the given instance after the assignment. + */ + Maneuver& operator = (const Maneuver& rRhs); + + /** + * This method checks if the given maneuver object is valid. The object is + * valid if at least its position property holds valid coordinates and + * direction is set to a value other than ID_NoDirection. + * + * @return true if the given object is valid, otherwise + * false. + */ + bool IsValid() const; + + /** + * This method sets the position (location) of the maneuver. + * + * @param rPosition A constant reference to an object containing the + * geographic coordinates of the location at which the maneuver is to + * be executed. + */ + void SetPosition(const GeoCoordinates& rPosition); + + /** + * This method retrieves the position (location) of the maneuver. + * + * @return An object containing the geographic coordinates of the location + * at which the maneuver is to be executed. + */ + GeoCoordinates GetPosition() const; + + /** + * This method sets the maneuver instruction text. + * + * @param sInstructionText A constant reference to a string containing the + * maneuver instruction text. + */ + void SetInstructionText(const String& sInstructionText); + + /** + * This method retrieves the maneuver instruction text. + * + * @return A constant reference to a string containing the maneuver + * instruction text. + */ + String GetInstructionText() const; + + /** + * This method sets the maneuver direction. + * + * @param aDirection A value indicating the maneuver direction. + */ + void SetDirection(InstructionDirection aDirection); + + /** + * This method retrieves the maneuver direction. + * + * @return A value indicating the maneuver direction. + */ + InstructionDirection GetDirection() const; + + /** + * This method sets the time to next instruction in the given maneuver. + * + * @param aSecs A value specifying the time to the next instruction in + * seconds. + */ + void SetTimeToNextInstruction(int aSecs); + + /** + * This method retrieves the time to next instruction in the given maneuver. + * + * @return A value specifying the time to the next instruction in seconds. + */ + int GetTimeToNextInstruction() const; + + /** + * This method sets the distance to next instruction in the given maneuver. + * + * @param aDistance A value specifying the distance to the next instruction + * in meters. + */ + void SetDistanceToNextInstruction(double aDistance); + + /** + * This method retrieves the distance to next instruction in the given + * maneuver. + * + * @return A value specifying the distance to the next instruction + * in meters. + */ + double GetDistanceToNextInstruction() const; + +private: + class ManeuverImpl; + ManeuverImpl* m_pImpl; + + friend class ManeuverImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif /* MANEUVER_H */ diff --git a/inc/engine/routes/RouteSegment.h b/inc/engine/routes/RouteSegment.h new file mode 100755 index 0000000..6835f07 --- /dev/null +++ b/inc/engine/routes/RouteSegment.h @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef ROUTESEGMENT_H +#define ROUTESEGMENT_H + +#include "common/HereMaps_global.h" +#include "common/GeoCoordinates.h" +#include "routes/Maneuver.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class Maneuver; +class RouteSegmentImpl; + +class RouteSegment; + +/** + * This typedef defines a vector of instances of RouteSegment as a + * type. + * + * \ingroup routes + */ +typedef std::vector RouteSegmentList; + + +/** + * This class encapsulates a route segment which is a section of a route between + * two waypoints. A number of properties define a route segment, including the + * time required to travel it, its length, path (geometry), and maneuvers. + * + * \ingroup routes + */ +class EXPORT_API RouteSegment +{ + +public: + /** + * This method is the default constructor. It creates an invalid object, + * with both travel time and distance set to zero. + */ + RouteSegment(); + + /** + * This method is a copy constructor that initializes a new instance of the + * class, using the property values from the object supplied by the caller. + * + * @param rRhs A constant reference to an object whose property values are to + * be used to initialize a new instance of RouteSegment. + */ + RouteSegment(const RouteSegment& rRhs); + + /** + * This method is the destructor. + */ + ~RouteSegment(); + + /** + * This is the assignment operator. + * + * @param rRhs A constant reference to an object whose property values are to + * be copied to the given instance of RouteSegment. + * + * @return A reference to the given instance of the class after the + * assignment. + */ + RouteSegment& operator = (const RouteSegment& rRhs); + + + /** + * This method checks if the given instance of the class is valid. A segment + * is valid if, at a minimum, its path property is defined. + * + * @return true if the object is valid, otherwise + * false. + */ + bool IsValid() const; + + /** + * This method sets the route segment travel time. + * + * @param aSecs A value indicating the length of time required to travel the + * length of the route segment in seconds. + */ + void SetTravelTime(int aSecs); + + /** + * This method retrieves the route segment travel time. + * + * @return A value indicating time required to travel the + * length of the route segment in seconds. + */ + int GetTravelTime() const; + + /** + * This method sets the route segment length. + * + * @param aDistance A value indicating the length of the + * the route segment in meters. + */ + void SetDistance(double aDistance); + + /** + * This method retrieves the length of the route segment. + * + * @return A value indicating the length of the + * the route segment in meters. + */ + double GetDistance() const; + + /** + * This method sets the path (geometry) of the route segment. + * + * @param rPath A constant reference to a vector of instances of + * GeoCoordinates which defines the path (geometry) of + * the route segment. + */ + void SetPath(const GeoCoordinateList& rPath); + + /** + * This method retrieves the path (geometry) of the route segment. + * + * @return A vector of instances of GeoCoordinates which + * defines the path (geometry) of the route segment. + */ + GeoCoordinateList GetPath() const; + + /** + * This method adds a maneuver to the given route segment. + * + * @param rManeuver A constant reference to an object that defines a route + * maneuver. + */ + void addManeuver(const Maneuver& rManeuver); + + /** + * This method associates a list of maneuvers with the given route segment. + * + * @param vManeuverList A constant reference to a vector of route maneuver + * objects. + */ + void SetManeuverList(const ManeuverList& vManeuverList); + + /** + * This method retrieves a list of maneuvers associated with the given route + * segment. + * + * @return A vector of route maneuver objects. + */ + ManeuverList GetManeuverList() const; + +private: + RouteSegmentImpl* m_pImpl; + + friend class RouteSegmentImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif /* ROUTESEGMENT_H */ diff --git a/inc/engine/routes/RouterError.h b/inc/engine/routes/RouterError.h new file mode 100755 index 0000000..7d9b2c0 --- /dev/null +++ b/inc/engine/routes/RouterError.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef ROUTERERROR_H +#define ROUTERERROR_H + +#include "common/HereMaps_global.h" +#include "common/ErrorBase.h" + +HERE_MAPS_BEGIN_NAMESPACE + + +/** + * This class encapsulates an error condition that may arise when processing a + * routing request. + * + * \ingroup routes + */ +class EXPORT_API RouterError : public ErrorBase +{ +public: + + /** + * This enumeration defines identifiers for the recognized error types. + */ + enum ErrorCode + { + EC_ParseError, ///< Indicates a parsing error. + EC_UnsupportedOptionError, ///< Indicates that an attempt to use an + /// unsupported option was detected. + EC_UnknownError ///< Indicates an unknown error. + }; + + /** + * This method is a constructor that initializes a new instance of the class + * using the error code value supplied by the caller. + * + * @param aErrorCode A value indicating the error type to use when + * initializing the new instance of the class. + */ + RouterError(ErrorCode aErrorCode); + + /** + * This method is the (virtual) destructor. + */ + virtual ~RouterError(); + + /** + * This method retrieves the error code. + * + * @return A value indicating the error type. + */ + ErrorCode GetErrorCode() const; + + /** + * This method obtains a string representation of the given instance. + * The method must be implemented by derived classes. + * + * @return A string containing the text representation of the given instance + * of the class. + */ + virtual String ToString() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(RouterError); + + class RouterErrorImpl; + RouterErrorImpl* m_pImpl; + +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/tilefetcher/TileFetcherError.h b/inc/engine/tilefetcher/TileFetcherError.h new file mode 100755 index 0000000..8a14411 --- /dev/null +++ b/inc/engine/tilefetcher/TileFetcherError.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef TILEFETCHERERROR_H +#define TILEFETCHERERROR_H + +#include "common/HereMaps_global.h" +#include "common/ErrorBase.h" + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates information related to an error condition that may + * arise when requesting map tiles from the server. + * + * \ingroup tilefetcher + */ +class EXPORT_API TileFetcherError : public ErrorBase +{ +public: + + /** + * This enumeration defines identifiers for error conditions related to the + * tile fetcher. + */ + enum ErrorEntity + { + TFE_COULD_NOT_DECODE_SRC_IMAGE, ///< Indicates that the source image + /// could not be decoded. + TFE_COULD_NOT_RETRIEVE_HASH ///< Indicates that the hash could not + /// be retrieved. + }; + + /** + * This method is a constructor. + * + * @param aItem A value rerpresenting an error condition; a value with which + * to initialize the given instance of the class. + */ + TileFetcherError(ErrorEntity aItem); + + /** + * This method is the (virtual) destructor. + */ + virtual ~TileFetcherError(); + + /** + * This method produces a string representation of the given instance of + * the class. The method must be implemented by derived classes. + * + * @return A string containing a text representation of the given instance + * of the class. + */ + virtual String ToString() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(TileFetcherError); + + class TileFetcherErrorImpl; + TileFetcherErrorImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/tilefetcher/TileFetcherMetaQuery.h b/inc/engine/tilefetcher/TileFetcherMetaQuery.h new file mode 100644 index 0000000..2244746 --- /dev/null +++ b/inc/engine/tilefetcher/TileFetcherMetaQuery.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef TILEFETCHERMETAQUERY_H +#define TILEFETCHERMETAQUERY_H + +#include "common/HereMaps_global.h" +#include "common/BaseQuery.h" + + +HERE_MAPS_BEGIN_NAMESPACE + +class TileFetcherMetaQueryListener; + +/** + * This class encapsulates a query representing a map tile metadata request. + * + * \ingroup tilefetcher + */ +class TileFetcherMetaQuery : public BaseQuery +{ +public: + /** + * This method is the constructor. + * + * @param sUri A constant reference to a string containing the base URL + * which is used in the query. + */ + TileFetcherMetaQuery( const String& sUri ); + + /** + * This method is the (virtual) destructor. + */ + virtual ~TileFetcherMetaQuery(); + + /** + * This method attempts to establish a connection with the server and then, + * if the connection has been established, it builds and submits a query. + * + * @param rListener A reference to a an object that is to be notified when + * the reply to the query has arrived from the server. + * + * @param pUserData A pointer to user passed data that will be received + * back through the reply object. + * + * @return NULL if a connection to the server cannot be + * established, a pointer to the request object handle if the query + * has been submitted successfully. Note that true does + * not indicate that a reply is available. + */ + RequestId Execute(TileFetcherMetaQueryListener& rListener, Tizen::Maps::HereObject* pUserData = NULL) const; + + /** + * This static method obrains the base URI to be used for all subsequent + * tile fetcher queries. + * + * @return A string containing the base URI. + */ + static String GetBaseUri(); + + /** + * This static method obtains the base URI to be used for all subsequent + * tile fetcher queries. + * + * @param sUri A constant reference to a string containing the base URI. + */ + static void SetBaseUri(const String& sUri); + +private: + /** + * This method creates the URI for the request. + * + * @return URI request string. + */ + String CreateUri() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(TileFetcherMetaQuery); + + String m_sBaseUri; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/tilefetcher/TileFetcherMetaQueryListener.h b/inc/engine/tilefetcher/TileFetcherMetaQueryListener.h new file mode 100644 index 0000000..0fb9ff1 --- /dev/null +++ b/inc/engine/tilefetcher/TileFetcherMetaQueryListener.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef TILEFETCHERMETAQUERYLISTENER_H +#define TILEFETCHERMETAQUERYLISTENER_H + +#include "common/HereMaps_global.h" + +#include "common/QueryListener.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class TileFetcherMetaReply; + +/** + * This class encapsulates an object that is notified when a response to a query + * has become available. The derived classes must implement the methods defined + * on this class to provide handling of the replies from the server. + * + * \ingroup tilefetcher + */ +class TileFetcherMetaQueryListener : public QueryListener +{ +public: + + /** + * This is the default constructor. + */ + TileFetcherMetaQueryListener(); + + /** + * This method is the destructor. + */ + ~TileFetcherMetaQueryListener(); + + /** + * This method is a callback invoked when data have arrived in response to a + * tile fetch meta request. + * + * @param rReply A Constant reference to an object containing the response data. + */ + virtual void OnTileFetcherMetaReply(const TileFetcherMetaReply& rReply) = 0; + +private: + + void OnReplySuccess(BaseReply& rReply); + +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/tilefetcher/TileFetcherMetaReply.h b/inc/engine/tilefetcher/TileFetcherMetaReply.h new file mode 100644 index 0000000..e357b7f --- /dev/null +++ b/inc/engine/tilefetcher/TileFetcherMetaReply.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef TILEFETCHERMETAREPLY_H +#define TILEFETCHERMETAREPLY_H + +#include "common/HereMaps_global.h" +#include "common/BaseReply.h" + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates a reply to a map tile metadata request. + * + * + * \ingroup tilefetcher + */ +class TileFetcherMetaReply : public BaseReply +{ +public: + /** + * This method is a constructor that initialize the class instance. + */ + TileFetcherMetaReply(); + + /** + * This method is the (virtual) destructor. + */ + virtual ~TileFetcherMetaReply(); + + /** + * This method retrieves the hash key which should be used for map tile + * requests. + * + * @return A string representing the hash key. + */ + String GetHash() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(TileFetcherMetaReply); + + virtual bool OnDataReceived(const unsigned char* pBuffer, size_t uSize); + + class TileFetcherMetaReplyImpl; + TileFetcherMetaReplyImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/tilefetcher/TileFetcherQuery.h b/inc/engine/tilefetcher/TileFetcherQuery.h new file mode 100755 index 0000000..9a6adfd --- /dev/null +++ b/inc/engine/tilefetcher/TileFetcherQuery.h @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef TILEFETCHERQUERY_H +#define TILEFETCHERQUERY_H + +#include "common/HereMaps_global.h" +#include "common/BaseQuery.h" +#include "common/TileKey.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class TileFetcherQueryListener; + +/** + * This class encapsulates a query representing a request for a map tile. + * + * Map tiles form a grid reflecting the normalized Mercator projection, which + * represents the surface of the globe as a set of squares. The size of the grid + * depends on the map zoom level. At the lowest zoom level, the entire globe is + * shown in one square, which means that the tile grid consists of one row and + * one column. At the next higher zoom level, the tile grid contains two rows + * and two columns per row, at the next, four rows and four columns per row, and + * so on -- in other words, the number of rows and columns doubles at each + * higher zoom level. + * + * The map tiles are available in resolutions of 128 x 128 pixels or 256 x 256 + * pixels, depending on the size of the available memory on the target device. + * + * \ingroup tilefetcher + */ +class TileFetcherQuery : public BaseQuery +{ +public: + /** + * This method is the default constructor. + */ + TileFetcherQuery(); + + /** + * This method is a constructor that sets the class attributes using the + * arguments provided by the caller. + * + * @param rKey A constant reference to an object that specifies the map tile + * row, column and zoom level. + * + * @param uSize A value indicating the tile size. + */ + TileFetcherQuery(const TileKey& rKey, size_t uSize); + + /** + * This method is the (virtual) destructor. + */ + virtual ~TileFetcherQuery(); + + /** + * This method sets the hash key which is used for the query. + * If not set or string is empty, "newest" will be used. + * + * @param hash A string containing the hash key to be used. + */ + void SetHash(String hash); + + /** + * This method retrieves an object specifying the map tile row, column and + * zoom level. + * + * @return A constant reference to an object that specifies the map tile + * row, column and zoom level. + */ + const TileKey& GetKey() const; + + /** + * This method sets an object specifying the map tile row, column and zoom + * level. + * + * @return rKey A constant reference to an object that specifies the map tile + * row, column and zoom level. + */ + void SetKey(const TileKey& rKey); + + /** + * This method sets the size of the map tile (resolution) in pixels. + * + * @param uTileSize A value indicating the tile size. + */ + void SetTileSize(size_t uTileSize); + + /** + * This method retrieves the size of the map tile (resolution) in pixels. + * + * @param uTileSize A value indicating the tile size. + */ + size_t GetTileSize() const; + + /** + * This method attempts to establish a connection with the server and then, + * if the connection has been established, it builds and submits a query. + * + * @param rListener A reference to a an object that is to be notified when + * the reply to the query has arrived from the server. + * + * @param pUserData A pointer to an object containing user passed, which is + * to be echoed back through the reply object. + * + * @return A value representing the identifier of issued request. + */ + virtual RestItemHandle::RequestId Execute(TileFetcherQueryListener& rListener, Tizen::Maps::HereObject* pUserData = NULL) const; + + /** + * This method returns the base URI to be used for all subsequent + * tile fetcher queries based on the current setting of map type in the + * TileKey object. + * + * @return A string containing the base URI. + */ +#ifdef TIZEN_MIGRATION + String GetBaseUri(); +#else + static String GetBaseUri(); +#endif + + /** + * This method returns the base URI to be used for all subsequent + * tile fetcher queries based on the current setting of map type in the + * TileKey object. + * + * @param sUri A constant reference to a string containing the base URI. + */ +#ifdef TIZEN_MIGRATION + void SetBaseUri(const String& sUri); +#else + static void SetBaseUri(const String& sUri); +#endif + +private: + /** + * This method creates the URI for the request. + * + * @return URI request string. + */ + String CreateUri() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(TileFetcherQuery); + + class TileFetcherQueryImpl; + TileFetcherQueryImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/tilefetcher/TileFetcherQueryListener.h b/inc/engine/tilefetcher/TileFetcherQueryListener.h new file mode 100644 index 0000000..f4675f2 --- /dev/null +++ b/inc/engine/tilefetcher/TileFetcherQueryListener.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef TILEFETCHERQUERYLISTENER_H +#define TILEFETCHERQUERYLISTENER_H + +#include "common/HereMaps_global.h" +#include "common/QueryListener.h" + +HERE_MAPS_BEGIN_NAMESPACE + +class TileFetcherReply; + +/** + * This class encapsulates an object that is notified when a response to a query + * has become available. The derived classes must implement the methods defined + * on this class to provide handling of the replies from the server. + * + * \ingroup tilefetcher + */ +class TileFetcherQueryListener : public QueryListener +{ +public: + + /** + * This is the default constructor. + */ + TileFetcherQueryListener(); + + /** + * This method is the destructor. + */ + ~TileFetcherQueryListener(); + + /** + * This method is a callback invoked when data have arrived in response to a + * tile fetch request. + * + * @param rReply A Constant reference to an object containing the response data. + */ + virtual void OnTileFetcherReply(const TileFetcherReply& rReply) = 0; + +private: + + void OnReplySuccess(BaseReply& rReply); + +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/engine/tilefetcher/TileFetcherReply.h b/inc/engine/tilefetcher/TileFetcherReply.h new file mode 100755 index 0000000..93e5a4b --- /dev/null +++ b/inc/engine/tilefetcher/TileFetcherReply.h @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2013 HERE Global B.V. All rights reserved. + * This software, including documentation, is protected by copyright controlled by + * HERE Global B.V. (“Software”). All rights are reserved. Copying, including reproducing, + * storing, adapting or translating, any or all of this material requires the prior + * written consent of HERE Global B.V. You may use this + * Software in accordance with the terms and conditions defined in the + * HERE Location Platform Services Terms and Conditions, available at + * http://developer.here.com/terms-conditions-base + * + * As an additional permission to the above, you may distribute Software, + * in object code format as part of an Application, according to, and subject to, terms and + * conditions defined in the Tizen Software Development kit (“SDK”) License Agreement. + * You may distribute such object code format Application under terms of your choice, + * provided that the header and source files of the Software have not been modified. + */ + +#ifndef TILEFETCHERREPLY_H +#define TILEFETCHERREPLY_H + +#include + +#include "common/HereMaps_global.h" +#include "common/BaseReply.h" +#include "common/TileKey.h" + +#include "maps/GeoTile.h" + +#ifndef TIZEN_MIGRATION +namespace Tizen{ namespace Graphics{ class Bitmap; } } +#endif + +HERE_MAPS_BEGIN_NAMESPACE + +/** + * This class encapsulates a reply to a request for a map tile. + * + * \ingroup tilefetcher + */ +class TileFetcherReply : public BaseReply +{ +public: + /** + * This method is a constructor that initialize the class instance, using + * an object that specifies the map tile row, column, zoom level, map + * language and map type. + * + * @param rKey A constant reference to a tile key object. + */ + TileFetcherReply(const TileKey& rKey); + + /** + * This method is the (virtual) destructor. + */ + virtual ~TileFetcherReply(); + + /** + * This method retrieves the map tile as a bitmap from the reply to the + * query. + * + * @return A bitmap that contains the map tile. + */ + DrawableBitmapPtr GetTile() const; + + /** + * This method retrieves an object specifying the map tile + * row, column and zoom level. + * + * @return A constant reference to an object that contains the map tile row, + * column, zoom level, map language and map type. + */ + const TileKey& GetKey() const; + +private: + HERE_MAPS_NO_COPY_NO_ASSIGN(TileFetcherReply); + friend class TestTileFetcher; + + virtual bool OnDataReceived(const unsigned char* pBuffer, size_t uSize); + + class TileFetcherReplyImpl; + TileFetcherReplyImpl* m_pImpl; +}; + +HERE_MAPS_END_NAMESPACE + +#endif diff --git a/inc/here_api.h b/inc/here_api.h new file mode 100644 index 0000000..61694ef --- /dev/null +++ b/inc/here_api.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef _LOCATION_HERE_API_H_ +#define _LOCATION_HERE_API_H_ + +#include + +int HerePluginInit(maps_plugin_h *hPlugin); + +int HerePluginShutdown(maps_plugin_h hPlugin); + +int HerePluginSetProviderKey(const char* szKey); + +int HerePluginGetProviderKey(char** szKey); + +int HerePluginSetPreference(maps_preference_h hPref); + +int HerePluginGetPreference(maps_preference_h *hPref); + +int HerePluginGeocode(const char* szAddr, + maps_item_hashtable_h hPref, maps_service_geocode_cb pCbFunc, + void *pUserData, int *nReqId); + +int HerePluginGeocodeByStructuredAddress(const maps_address_h hAddr, + maps_item_hashtable_h hPref, maps_service_geocode_cb pCbFunc, + void *pUserData, int *nReqId); + +int HerePluginGeocodeInsideArea(const char* szAddr, maps_area_h hArea, + maps_item_hashtable_h hPref, maps_service_geocode_cb pCbFunc, + void *pUserData, int *nReqId); + +int HerePluginReverseGeocode(double dLatitude, double dLongitude, + maps_item_hashtable_h hPref, maps_service_reverse_geocode_cb pCbFunc, + void *pUserData, int *nReqId); + +int HerePluginSearchPlace(maps_coordinates_h hPos, int nDistance, + maps_item_hashtable_h hPref, maps_place_filter_h hFilter, maps_service_search_place_cb pCbFunc, + void * pUserData, int *nReqId); + +int HerePluginSearchPlaceByArea(maps_area_h hArea, + maps_item_hashtable_h hPref, maps_place_filter_h hFilter, maps_service_search_place_cb pCbFunc, + void * pUserData, int *nReqId); + +int HerePluginSearchPlaceByAddress(const char* szAddr, maps_area_h hArea, + maps_item_hashtable_h hPref, maps_place_filter_h hFilter, maps_service_search_place_cb pCbFunc, + void * pUserData, int *nReqId); + +int HerePluginSearchPlaceDetails(const char* szUrl, + maps_item_hashtable_h hPref, maps_service_search_place_cb pCbFunc, + void * pUserData, int *nReqId); + +int HerePluginSearchRoute(maps_coordinates_h hOrigin, maps_coordinates_h hDestination, + maps_item_hashtable_h hPref, maps_service_search_route_cb pCbFunc, + void *pUserData, int *nReqId); + +int HerePluginSearchRouteWaypoints(const maps_coordinates_h* hWaypointList, int nWaypointNum, + maps_item_hashtable_h hPref, maps_service_search_route_cb pCbFunc, + void* pUserData, int *nReqId); + +int HerePluginCancelRequest(int nReqId); + +#endif //_LOCATION_HERE_API_H_ \ No newline at end of file diff --git a/inc/here_base.h b/inc/here_base.h new file mode 100644 index 0000000..6d91848 --- /dev/null +++ b/inc/here_base.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LOCATION_HERE_BASE_H_ +#define _LOCATION_HERE_BASE_H_ + +//plug-in header +#include "here_utils.h" +#include + +HERE_PLUGIN_BEGIN_NAMESPACE + +class HereBase +{ +public: + /** + *This is the default constructor for Geocoder. + */ + + HereBase(); + + /** + *This is the default destructor for Geocoder. + */ + + virtual ~HereBase(); + + void TerminateService(void); + + gint GetReqId(void); + gint GetRestReqId(void); + gint GetErrorCode(const BaseReply& Reply); + +protected: + gint m_nReqId; + gint m_nRestReqId; + void* m_pCbFunc; + void* m_pUserData; + gboolean m_bCanceled; +}; + +HERE_PLUGIN_END_NAMESPACE + +#endif //_LOCATION_HERE_BASE_H_ + diff --git a/inc/here_geocode.h b/inc/here_geocode.h new file mode 100644 index 0000000..33567de --- /dev/null +++ b/inc/here_geocode.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LOCATION_HERE_GEOCODER_H_ +#define _LOCATION_HERE_GEOCODER_H_ + +//plug-in header +#include "here_manager.h" + +// maps-service header +#include +#include +#include + +//map engine header +#include +#include +#include +#include +#include +#include + + +HERE_PLUGIN_BEGIN_NAMESPACE + +using namespace HERE_MAPS_NAMESPACE_PREFIX; + +class HereGeocode +: public HereBase +, public GeoCoderQueryListener +{ +public: + /** + *This is the default constructor for Geocoder. + */ + + HereGeocode(void *pCbFunc, void *pUserData, int nReqId); + + /** + *This is the default destructor for Geocoder. + */ + + ~HereGeocode(); + + here_error_e PrepareQuery(); + here_error_e PreparePreference(maps_preference_h hPref); + + here_error_e StartGeocode(const char* szAddr); + here_error_e StartGeocodeInsideArea(const char* szAddr, const maps_area_h hArea); + here_error_e StartGeocodeByStructuredAddress(const maps_address_h hAddr); + + virtual void OnGeoCoderReply(const GeoCoderReply& Reply); + virtual void OnGeoCoderFailure(const GeoCoderReply& Reply); + +private: + GeoCoderQuery* m_pQuery; +}; + +HERE_PLUGIN_END_NAMESPACE + +#endif //_LOCATION_HERE_GEOCODER_H_ diff --git a/inc/here_manager.h b/inc/here_manager.h new file mode 100644 index 0000000..8984392 --- /dev/null +++ b/inc/here_manager.h @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LOCATION_HERE_MANAGER_H_ +#define _LOCATION_HERE_MANAGER_H_ + +//common header +#include +#include +#include +#include +#include +#include + +//platform header +#include +#include + +//plug-in header +#include "here_base.h" +#include "here_api.h" +#include "here_types.h" +#include "here_utils.h" + +//map engine header +#include +#include + +HERE_PLUGIN_BEGIN_NAMESPACE + +class HereManager; + +typedef std::vector HereSvcList; + +class HereManager +{ +public: + /** + *This is the default constructor for Geocoder. + */ + + HereManager(); + + /** + *This is the default destructor for Geocoder. + */ + + virtual ~HereManager(); + + enum HereSvcType { + HERE_SVC_GEOCODE, + HERE_SVC_REV_GEOCODE, + HERE_SVC_PLACE, + HERE_SVC_ROUTE + }; + + void* CreateInstance(HereSvcType nHereSvc, void* pCbFunc, void* pUserData, int *nReqId); + here_error_e CloseInstance(int nReqId); + here_error_e CancelInstance(int nReqId); + here_error_e SetCredentials(const char* provider_key); + here_error_e GetCredentials(char** provider_key); + void TerminateAllServices(void); + + here_error_e SetProxyAddress(); + here_error_e SetPreference(maps_preference_h hPref); + here_error_e GetPreference(maps_preference_h *hPref); + maps_preference_h GetPreference(); + + static bool Create(); + static HereManager* GetHandler(); + static void Close(); + +private: + here_error_e SetCredentials(); + static bool AppInfoMetadataCb(const char *metadata_key, const char *metadata_value, void *user_data); + static void NetworkStateChangedIndCb(connection_type_e type, void *user_data); + static here_error_e ConvertNetworkErrorCode(const int nErrorCode); + connection_h m_hConnection; + static int m_nRefCnt; + static HereManager *m_pHereManager; + +protected: + HereSvcList m_HereList; + gint m_nNextReqId; + maps_preference_h m_hPref; + pthread_mutex_t m_mtxHereList; +}; + +HERE_PLUGIN_END_NAMESPACE + +#endif //_LOCATION_HERE_MANAGER_H_ diff --git a/inc/here_place.h b/inc/here_place.h new file mode 100644 index 0000000..2ba5fba --- /dev/null +++ b/inc/here_place.h @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LOCATION_HERE_PLACE_H_ +#define _LOCATION_HERE_PLACE_H_ + +#include + +//plug-in header +#include "here_manager.h" + +//maps-service header +#include +#include +#include +#include +#include +#include +#include + +//map engine header +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +HERE_PLUGIN_BEGIN_NAMESPACE + +using namespace HERE_MAPS_NAMESPACE_PREFIX; + +class HerePlace +: public HereBase +, public FinderQueryListener +{ +public: + typedef std::deque PlaceList; + + /** + *This is the default constructor for Place. + */ + + HerePlace(void *pCbFunc, void *pUserData, int nReqId); + + /** + *This is the default destructor for Place. + */ + + ~HerePlace(); + + here_error_e PrepareDiscoveryQuery(); + here_error_e PrepareDiscoveryPreference(maps_preference_h hPref); + here_error_e PrepareDiscoveryFilter(maps_place_filter_h hFilter); + + here_error_e StartDiscoveryPlace(maps_coordinates_h hCoord, int nDistance); + here_error_e StartDiscoveryPlaceByArea(maps_area_h hArea); + here_error_e StartDiscoveryPlaceByAddress(const char *szAddr, maps_area_h hArea); + + here_error_e PreparePlaceDetailsQuery(); + here_error_e PreparePlaceDetailsPreference(maps_preference_h hPref); + + here_error_e StartPlaceDetails(const char* szPlaceId); + here_error_e StartPlaceDetailsInternal(const char* szUrl); + + virtual void OnDiscoverReply(const DiscoveryReply &Reply); + virtual void OnDiscoverFailure(const DiscoveryReply& Reply); + + virtual void OnPlaceDetailsReply(const PlaceDetailsReply &Reply); + virtual void OnPlaceDetailsFailure(const PlaceDetailsReply& Reply); + +private: + void ProcessPlaceLocation(PlaceDetails herePlace, maps_place_h mapsPlace); + void ProcessPlaceContact(PlaceDetails herePlace, maps_place_h mapsPlace); + void ProcessPlaceCategory(PlaceDetails herePlace, maps_place_h mapsPlace); + void ProcessPlaceImage(PlaceDetails herePlace, maps_place_h mapsPlace); + void ProcessPlaceDetails(PlaceDetails herePlace, maps_place_h mapsPlace); + void ProcessPlaceReviews(PlaceDetails herePlace, maps_place_h mapsPlace); + void ProcessPlaceRatings(PlaceDetails herePlace, maps_place_h mapsPlace); + void ProcessPlaceRated(PlaceDetails herePlace, maps_place_h mapsPlace); + + void __sortList(PlaceList &list); + static bool __compareWithTitle(const maps_place_h &item1, const maps_place_h &item2); + static bool __compareWithId(const maps_place_h &item1, const maps_place_h &item2); + static bool __compareWithType(const maps_place_h &item1, const maps_place_h &item2); + static bool __compareWithDistance(const maps_place_h &item1, const maps_place_h &item2); + static bool __compareWithRating(const maps_place_h &item1, const maps_place_h &item2); + static bool __compareWithCategory(const maps_place_h &item1, const maps_place_h &item2); + static bool __compareWithCategoryCb(int index, int total, maps_place_category_h category, + void *user_data); + + DiscoveryQuery* m_pDiscoveryQuery; + PlaceDetailsQuery* m_pPlaceDetailsQuery; + int m_nReplyCnt; + int m_nReplyIdx; + char *m_szSortBy; + + PlaceList m_PlaceList; + + static const bool __sending_place_details_query_automatically = TRUE; +}; + +HERE_PLUGIN_END_NAMESPACE + +#endif //_LOCATION_HERE_PLACE_H_ diff --git a/inc/here_revgeocode.h b/inc/here_revgeocode.h new file mode 100644 index 0000000..43507a1 --- /dev/null +++ b/inc/here_revgeocode.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LOCATION_HERE_REV_GEOCODER_H_ +#define _LOCATION_HERE_REV_GEOCODER_H_ + +//plug-in header +#include "here_manager.h" + +#include +#include + +//map engine header +#include +#include +#include +#include +#include +#include + +HERE_PLUGIN_BEGIN_NAMESPACE + +using namespace HERE_MAPS_NAMESPACE_PREFIX; + +class HereRevGeocode +: public HereBase +, public GeoCoderQueryListener +{ +public: + /** + *This is the default constructor for reverse Geocoder. + */ + + HereRevGeocode(void *pCbFunc, void *pUserData, int nReqId); + + /** + *This is the default destructor for reverse Geocoder. + */ + + ~HereRevGeocode(); + + + here_error_e PrepareQuery(); + here_error_e PreparePreference(maps_preference_h hPref); + here_error_e PreparePosition(double dLat, double dLng); + + here_error_e StartRevGeocode(maps_item_hashtable_h hPref); + + virtual void OnGeoCoderReply(const GeoCoderReply& Reply); + virtual void OnGeoCoderFailure(const GeoCoderReply& Reply); + +private: + ReverseGeoCoderQuery* m_pQuery; + GeoCoordinates m_geoCoord; +}; + +HERE_PLUGIN_END_NAMESPACE + +#endif //_LOCATION_HERE_REV_GEOCODER_H_ diff --git a/inc/here_route.h b/inc/here_route.h new file mode 100644 index 0000000..0aab609 --- /dev/null +++ b/inc/here_route.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LOCATION_HERE_ROUTE_H_ +#define _LOCATION_HERE_ROUTE_H_ + +//plug-in header +#include "here_manager.h" + +//maps-service header +#include +#include +#include + +//map engine header +#include +#include +#include + +HERE_PLUGIN_BEGIN_NAMESPACE + +using namespace HERE_MAPS_NAMESPACE_PREFIX; + +class HereRoute +: public HereBase +, public GeoRouteQueryListener +{ +public: + /** + *This is the default constructor for Route. + */ + + HereRoute(void *pCbFunc, void *pUserData, int nReqId); + + /** + *This is the default destructor for Route. + */ + + ~HereRoute(); + + here_error_e PrepareQuery(); + here_error_e PrepareWaypoint(maps_coordinates_h hOrigin, maps_coordinates_h hDestination); + here_error_e PrepareWaypoint(const maps_coordinates_h* hWaypointList, int nWaypointNum); + here_error_e PreparePreference(maps_preference_h hPref); + + here_error_e StartRoute(void); + + virtual void OnRouteReply(const GeoRouteReply& Reply); + virtual void OnRouteFailure(const GeoRouteReply& Reply); + +private: + maps_error_e ProcessSegments(maps_route_h mapsRoute, const RouteSegmentList& hereSegmList); + maps_error_e ProcessManeuver(maps_route_segment_h mapsSegm, const ManeuverList& hereManeList); + + GeoRouteQuery* m_pQuery; +}; + +HERE_PLUGIN_END_NAMESPACE + +#endif //_LOCATION_HERE_ROUTE_H_ diff --git a/inc/here_types.h b/inc/here_types.h new file mode 100644 index 0000000..32899ad --- /dev/null +++ b/inc/here_types.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LOCATION_HERE_TYPES_H_ +#define _LOCATION_HERE_TYPES_H_ + +#include + +typedef enum { + HERE_ERROR_NONE = 0, /**< Successful */ + HERE_ERROR_PERMISSION_DENIED, /**< Permission Denied */ + HERE_ERROR_OUT_OF_MEMORY, /**< Out of memory */ + HERE_ERROR_INVALID_PARAMETER, /**< Invalid parameter */ + HERE_ERROR_NOT_SUPPORTED, /**< Not supported */ + HERE_ERROR_CONNECTION_TIME_OUT, /**< Timeout error, no answer */ + HERE_ERROR_NETWORK_UNREACHABLE, /**< Network unavailable */ + HERE_ERROR_INVALID_OPERATION, /**< Opeartion is not valid */ + HERE_ERROR_KEY_NOT_AVAILABLE, /**< Invalid key */ + HERE_ERROR_RESOURCE_BUSY, /**< Resource busy */ + HERE_ERROR_CANCELED, /**< Service canceled */ + HERE_ERROR_UNKNOWN, /**< Unknown error */ + HERE_ERROR_SERVICE_NOT_AVAILABLE, /**< Service unavailabe*/ + HERE_ERROR_NOT_FOUND, /**< Result not found */ +} here_error_e; + +#endif //_LOCATION_HERE_TYPES_H_ diff --git a/inc/here_utils.h b/inc/here_utils.h new file mode 100644 index 0000000..ff47926 --- /dev/null +++ b/inc/here_utils.h @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LOCATION_HERE_UTILS_H_ +#define _LOCATION_HERE_UTILS_H_ + +//common header +#include +#include +#include +#include +#include +#include + +//maps-service header +#include +#include +#include +#include +#include +#include + +//plug-in header +#include "here_types.h" + +//map engine header +#include +#include +#include +#include +#include + +#define HERE_PLUGIN_BEGIN_NAMESPACE namespace Here { namespace PlugIn { +#define HERE_PLUGIN_END_NAMESPACE }} +#define HERE_PLUGIN_NAMESPACE_PREFIX Here::PlugIn + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "HERE_PLUGIN" + +/* +* Internal Macros +*/ +#define MAPS_LOGD(fmt,args...) LOGD(fmt, ##args) +#define MAPS_LOGW(fmt,args...) LOGW(fmt, ##args) +#define MAPS_LOGI(fmt,args...) LOGI(fmt, ##args) +#define MAPS_LOGE(fmt,args...) LOGE(fmt, ##args) +#define MAPS_SECLOG(fmt,args...) SECURE_LOGD(fmt, ##args) + +#define MAPS_CHECK_CONDITION(condition, error, msg) \ + do { \ + if (condition) { \ + } else { \ + MAPS_LOGE("%s(0x%08x)", msg, error); \ + return error; \ + } \ + } while (0) + +#define MAPS_NULL_ARG_CHECK_RETURN_FALSE(arg)\ + do { \ + if(arg != NULL) { \ + } else { \ + MAPS_LOGE("MAPS_ERROR_INVALID_PARAMETER"); \ + return false; }; \ + } while (0) + +#define MAPS_NULL_ARG_CHECK(arg) \ + MAPS_CHECK_CONDITION(arg != NULL,MAPS_ERROR_INVALID_PARAMETER,"MAPS_ERROR_INVALID_PARAMETER") + +#define MAPS_PRINT_ERROR_CODE_RETURN(code) \ + do{ \ + MAPS_LOGE("%s(0x%08x)", #code, code); \ + return code; \ + } while (0) + +#ifndef TIZEN_MIGRATION +typedef std::string String; +typedef std::string Uri; +typedef std::wstring WString; +#endif + +#define maps_item_list_items(item_list) g_list_length((GList*)(*(unsigned long*)item_list) ) + +extern "C" +{ + int ConvertToMapsError(int nRet); + int ConvertToHereError(int nRet); + const char* ConverHereErrorToString(int nErr); + const char* ConvertMapsErrorToChar(int nErr); +} + +HERE_PLUGIN_BEGIN_NAMESPACE + +using namespace HERE_MAPS_NAMESPACE_PREFIX; + +class HereUtils +{ +public: + /** + *This is the default constructor for Geocoder. + */ + + HereUtils(); + + /** + *This is the default destructor for Geocoder. + */ + + ~HereUtils(); + + static GeoRouteQuery::TravelMode Convert(maps_route_transport_mode_e nVal); + static maps_route_transport_mode_e Convert(GeoRouteQuery::TravelMode nVal); + static GeoRouteQuery::FeatureType Convert(maps_route_feature_e nVal); + static GeoRouteQuery::FeatureWeight Convert(maps_route_feature_weight_e nVal); + static Maneuver::InstructionDirection Convert(maps_route_turn_type_e nVal); + static maps_route_turn_type_e Convert(Maneuver::InstructionDirection nVal); + static GeoBoundingBox& Convert(maps_area_h hArea, GeoBoundingBox& Box); + static maps_area_h& Convert(GeoBoundingBox Box, maps_area_h& hArea); + static void Convert(String strUtf8, WString& strUtf16); + static void Convert(WString strUtf16, String& strUtf8); + static GeoBoundingBox& Convert(const char *src, GeoBoundingBox &box); + static maps_error_e ConvertHttpCodeToMapsError(int nVal); + + static bool IsValid(GeoCoordinates geoCoord); + static bool IsValid(maps_coordinates_s geoCoord); + static bool IsValidCoord(double dLat, double dLng); + static bool IsValid(maps_area_s hArea); + +private: +}; + +HERE_PLUGIN_END_NAMESPACE + +#endif //_LOCATION_HERE_UTILS_H_ diff --git a/x86_64/libheremaps-engine.so b/lib/aarch64/libheremaps-engine.so similarity index 100% rename from x86_64/libheremaps-engine.so rename to lib/aarch64/libheremaps-engine.so diff --git a/lib/aarch64/libheremaps-engine.so.1 b/lib/aarch64/libheremaps-engine.so.1 new file mode 120000 index 0000000..9345673 --- /dev/null +++ b/lib/aarch64/libheremaps-engine.so.1 @@ -0,0 +1 @@ +libheremaps-engine.so.1.0.6_7 \ No newline at end of file diff --git a/lib/aarch64/libheremaps-engine.so.1.0.6_7 b/lib/aarch64/libheremaps-engine.so.1.0.6_7 new file mode 100755 index 0000000..56cc739 Binary files /dev/null and b/lib/aarch64/libheremaps-engine.so.1.0.6_7 differ diff --git a/i586/libheremaps-engine.so b/lib/arm/libheremaps-engine.so similarity index 100% rename from i586/libheremaps-engine.so rename to lib/arm/libheremaps-engine.so diff --git a/lib/arm/libheremaps-engine.so.1 b/lib/arm/libheremaps-engine.so.1 new file mode 120000 index 0000000..9345673 --- /dev/null +++ b/lib/arm/libheremaps-engine.so.1 @@ -0,0 +1 @@ +libheremaps-engine.so.1.0.6_7 \ No newline at end of file diff --git a/lib/arm/libheremaps-engine.so.1.0.6_7 b/lib/arm/libheremaps-engine.so.1.0.6_7 new file mode 100755 index 0000000..3602a23 Binary files /dev/null and b/lib/arm/libheremaps-engine.so.1.0.6_7 differ diff --git a/arm/libheremaps-engine.so b/lib/i586/libheremaps-engine.so similarity index 100% rename from arm/libheremaps-engine.so rename to lib/i586/libheremaps-engine.so diff --git a/lib/i586/libheremaps-engine.so.1 b/lib/i586/libheremaps-engine.so.1 new file mode 120000 index 0000000..9345673 --- /dev/null +++ b/lib/i586/libheremaps-engine.so.1 @@ -0,0 +1 @@ +libheremaps-engine.so.1.0.6_7 \ No newline at end of file diff --git a/lib/i586/libheremaps-engine.so.1.0.6_7 b/lib/i586/libheremaps-engine.so.1.0.6_7 new file mode 100755 index 0000000..7973594 Binary files /dev/null and b/lib/i586/libheremaps-engine.so.1.0.6_7 differ diff --git a/aarch64/libheremaps-engine.so b/lib/x86_64/libheremaps-engine.so similarity index 100% rename from aarch64/libheremaps-engine.so rename to lib/x86_64/libheremaps-engine.so diff --git a/lib/x86_64/libheremaps-engine.so.1 b/lib/x86_64/libheremaps-engine.so.1 new file mode 120000 index 0000000..9345673 --- /dev/null +++ b/lib/x86_64/libheremaps-engine.so.1 @@ -0,0 +1 @@ +libheremaps-engine.so.1.0.6_7 \ No newline at end of file diff --git a/lib/x86_64/libheremaps-engine.so.1.0.6_7 b/lib/x86_64/libheremaps-engine.so.1.0.6_7 new file mode 100755 index 0000000..cd43eb7 Binary files /dev/null and b/lib/x86_64/libheremaps-engine.so.1.0.6_7 differ diff --git a/maps-plugin-here.changes b/maps-plugin-here.changes new file mode 100644 index 0000000..1087dc3 --- /dev/null +++ b/maps-plugin-here.changes @@ -0,0 +1,29 @@ +[Version] maps-plugin-here_0.1.5 +[Date] 06 Oct 2015 +[Title] Fixed to return more proper error codes +[Developer] Seechan Kim + +[Version] maps-plugin-here_0.1.4 +[Date] 24 Sep 2015 +[Title] Fixed to use reference count of handler +[Developer] Seechan Kim + +[Version] maps-plugin-here_0.1.3 +[Date] 21 Sep 2015 +[Title] Get here_key from metadata of application manifest +[Developer] Young-Ae Kang + +[Version] maps-plugin-here_0.1.2 +[Date] 18 Oct 2015 +[Title] Fixed route query bugs +[Developer] Seechan Kim + +[Version] maps-plugin-here_0.1.1 +[Date] 09 Jun 2015 +[Title] Fixed memory leaks +[Developer] Seechan Kim + +[Version] maps-plugin-here_0.1.0 +[Date] 01 July 2015 +[Title] Initialize version +[Developer] Seechan Kim diff --git a/maps-plugin-here.pc.in b/maps-plugin-here.pc.in new file mode 100644 index 0000000..599cd78 --- /dev/null +++ b/maps-plugin-here.pc.in @@ -0,0 +1,14 @@ +#Package Information for pkg-config + +prefix=@PREFIX@ +exec_prefix=/usr +libdir=/usr/lib +includedir=@PC_INCLUDE@ + +Name: @PC_NAME@ +Description: @PC_DESCRIPTION@ +Version: @VERSION@ +Requires: @PC_REQUIRED@ +Libs: -L${libdir} @PC_LDFLAGS@ +Cflags: -I${includedir} + diff --git a/packaging/maps-plugin-here.spec b/packaging/maps-plugin-here.spec index fcdce18..5a94839 100644 --- a/packaging/maps-plugin-here.spec +++ b/packaging/maps-plugin-here.spec @@ -25,6 +25,9 @@ BuildRequires: pkgconfig(capi-system-info) BuildRequires: pkgconfig(cairo) BuildRequires: pkgconfig(evas) BuildRequires: boost-devel +# +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig %ifarch %arm %define ARCH arm @@ -49,8 +52,15 @@ This packages provides Plugin APIs capsulating HERE Maps Engine Library for Maps %setup -q %build -cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DARCH=%{ARCH} -#make %{?_smp_mflags} +%if 0%{?tizen_build_binary_release_type_eng} +export CFLAGS="$CFLAGS -DTIZEN_ENGINEER_MODE -g" +export CXXFLAGS="$CXXFLAGS -DTIZEN_ENGINEER_MODE -g" +export FFLAGS="$FFLAGS -DTIZEN_ENGINEER_MODE" +%endif + +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DMAJORVER=${MAJORVER} -DFULLVER=%{version} -DLIBDIR=%{_libdir} -DARCH=%{ARCH} +make %{?jobs:-j%jobs} %install rm -rf %{buildroot} @@ -58,14 +68,17 @@ rm -rf %{buildroot} mkdir -p %{buildroot}/usr/share/license cp LICENSE %{buildroot}/usr/share/license/%{name} +cp -a lib/%{ARCH}/libheremaps-engine.so* %{buildroot}%{_prefix}/lib/ + +%post +/sbin/ldconfig -mkdir -p %{buildroot}%{_prefix}/lib/maps/plugins/ -cp -a %{ARCH}/libmaps-plugin-here.so* %{buildroot}%{_prefix}/lib/maps/plugins/ -cp -a %{ARCH}/libheremaps-engine.so* %{buildroot}%{_prefix}/lib/ +%postun +/sbin/ldconfig %files %manifest maps-plugin-here.manifest %defattr(-,root,root,-) -%{_prefix}/lib/maps/plugins/libmaps-plugin-here.so* +%{_libdir}/maps/plugins/libmaps-plugin-here.so* %{_prefix}/lib/libheremaps-engine.so* /usr/share/license/maps-plugin-here diff --git a/src/here_api.cpp b/src/here_api.cpp new file mode 100644 index 0000000..f6cf4d2 --- /dev/null +++ b/src/here_api.cpp @@ -0,0 +1,538 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "here_api.h" +#include "here_types.h" +#include "here_geocode.h" +#include "here_revgeocode.h" +#include "here_place.h" +#include "here_route.h" +#include + + +using namespace HERE_PLUGIN_NAMESPACE_PREFIX; + +int HerePluginInit(maps_plugin_h *hPlugin) +{ + if (!hPlugin) + return HERE_ERROR_INVALID_PARAMETER; + + HereManager::Create(); + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + HereManager::GetHandler()->SetProxyAddress(); + + return HERE_ERROR_NONE; +} + +int HerePluginShutdown(maps_plugin_h hPlugin) +{ + if (!hPlugin) + return HERE_ERROR_INVALID_PARAMETER; + + if (HereManager::GetHandler()) + HereManager::GetHandler()->Close(); + + return HERE_ERROR_NONE; +} + +int HerePluginSetProviderKey(const char* szKey) +{ + if (!szKey) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + here_error_e error = HereManager::GetHandler()->SetCredentials(szKey); + + return error; +} + +int HerePluginGetProviderKey(char** szKey) +{ + if (!szKey) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + here_error_e error = HereManager::GetHandler()->GetCredentials(szKey); + + return error; +} + +int HerePluginSetPreference(maps_preference_h hPref) +{ + if (!hPref) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + here_error_e error = HereManager::GetHandler()->SetPreference(hPref); + + return error; +} + +int HerePluginGetPreference(maps_preference_h *hPref) +{ + if (!hPref) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + here_error_e error = HereManager::GetHandler()->GetPreference(hPref); + + return error; +} + +int HerePluginGeocode(const char* szAddr, + maps_item_hashtable_h hPref, maps_service_geocode_cb pCbFunc, + void *pUserData, int *nReqId) +{ + /* checking parmaters */ + if (!szAddr || (szAddr && *szAddr == '\0') || !pCbFunc || !nReqId) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + /* creating instance */ + HereGeocode *pGeocode = + (HereGeocode*)(HereManager::GetHandler()->CreateInstance(HereManager::HERE_SVC_GEOCODE, + (void*)pCbFunc, pUserData, nReqId)); + + if(!pGeocode) + return HERE_ERROR_SERVICE_NOT_AVAILABLE; + + /* sending request */ + here_error_e error = HERE_ERROR_NONE; + + do { + error = pGeocode->PrepareQuery(); + if (error != HERE_ERROR_NONE) break; + + error = pGeocode->PreparePreference(hPref); + + error = pGeocode->StartGeocode(szAddr); + } while(0); + + /* finishing task */ + if(error != HERE_ERROR_NONE) + pGeocode->TerminateService(); + + return error; +} + +int HerePluginGeocodeByStructuredAddress(const maps_address_h hAddr, + maps_item_hashtable_h hPref, maps_service_geocode_cb pCbFunc, + void *pUserData, int *nReqId) +{ + /* checking parmaters */ + if (!hAddr || !pCbFunc || !nReqId) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + /* creating instance */ + HereGeocode *pGeocode = + (HereGeocode*)(HereManager::GetHandler()->CreateInstance(HereManager::HERE_SVC_GEOCODE, + (void*)pCbFunc, pUserData, nReqId)); + + if(!pGeocode) + return HERE_ERROR_SERVICE_NOT_AVAILABLE; + + /* sending request */ + here_error_e error = HERE_ERROR_NONE; + + do { + error = pGeocode->PrepareQuery(); + if (error != HERE_ERROR_NONE) break; + + error = pGeocode->PreparePreference(hPref); + + error = pGeocode->StartGeocodeByStructuredAddress(hAddr); + } while(0); + + /* finishing task */ + if(error != HERE_ERROR_NONE) + pGeocode->TerminateService(); + + return error; +} + +int HerePluginGeocodeInsideArea(const char* szAddr, maps_area_h hArea, + maps_item_hashtable_h hPref, maps_service_geocode_cb pCbFunc, + void *pUserData, int *nReqId) +{ + /* checking parmaters */ + if (!szAddr || (szAddr && *szAddr == '\0') || !pCbFunc || !nReqId) + return HERE_ERROR_INVALID_PARAMETER; + + if (!hArea || !HereUtils::IsValid(*(maps_area_s*)hArea)) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + /* creating instance */ + HereGeocode *pGeocode = + (HereGeocode*)(HereManager::GetHandler()->CreateInstance(HereManager::HERE_SVC_GEOCODE, + (void*)pCbFunc, pUserData, nReqId)); + + if(!pGeocode) + return HERE_ERROR_SERVICE_NOT_AVAILABLE; + + /* sending request */ + here_error_e error = HERE_ERROR_NONE; + + do { + error = pGeocode->PrepareQuery(); + if (error != HERE_ERROR_NONE) break; + + error = pGeocode->PreparePreference(hPref); + + error = pGeocode->StartGeocodeInsideArea(szAddr, hArea); + } while(0); + + /* finishing task */ + if(error != HERE_ERROR_NONE) + pGeocode->TerminateService(); + + return error; +} + +int HerePluginReverseGeocode(double dLatitude, double dLongitude, + maps_item_hashtable_h hPref, maps_service_reverse_geocode_cb pCbFunc, + void *pUserData, int *nReqId) +{ + /* checking parmaters */ + if (!HereUtils::IsValidCoord(dLatitude, dLongitude)) + return HERE_ERROR_INVALID_PARAMETER; + + if (!pCbFunc || !nReqId) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + /* creating instance */ + HereRevGeocode *pRevGeocode = + (HereRevGeocode*)(HereManager::GetHandler()->CreateInstance(HereManager::HERE_SVC_REV_GEOCODE, + (void*)pCbFunc, pUserData, nReqId)); + + if(!pRevGeocode) + return HERE_ERROR_SERVICE_NOT_AVAILABLE; + + /* sending request */ + here_error_e error = HERE_ERROR_UNKNOWN; + + do { + error = pRevGeocode->PrepareQuery(); + if (error != HERE_ERROR_NONE) break; + + error = pRevGeocode->PreparePreference(hPref); + + error = pRevGeocode->PreparePosition(dLatitude, dLongitude); + if (error != HERE_ERROR_NONE) break; + + error = pRevGeocode->StartRevGeocode(hPref); + } while(0); + + /* finishing task */ + if(error != HERE_ERROR_NONE) + pRevGeocode->TerminateService(); + + return error; +} + +int HerePluginSearchPlace(maps_coordinates_h hPos, int nDistance, + maps_item_hashtable_h hPref, maps_place_filter_h hFilter, maps_service_search_place_cb pCbFunc, + void *pUserData, int *nReqId) +{ + /* checking parmaters */ + if (!hPos || !HereUtils::IsValid(*(maps_coordinates_s*)hPos) || nDistance <= 0) + return HERE_ERROR_INVALID_PARAMETER; + + if (!hFilter || !pCbFunc || !nReqId) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + /* creating instance */ + HerePlace *pPlace = + (HerePlace*)(HereManager::GetHandler()->CreateInstance(HereManager::HERE_SVC_PLACE, + (void*)pCbFunc, pUserData, nReqId)); + + if(!pPlace) + return HERE_ERROR_SERVICE_NOT_AVAILABLE; + + /* sending request */ + here_error_e error = HERE_ERROR_NONE; + + do { + error = pPlace->PrepareDiscoveryQuery(); + if (error != HERE_ERROR_NONE) break; + + error = pPlace->PrepareDiscoveryPreference(hPref); + + error = pPlace->PrepareDiscoveryFilter(hFilter); + if (error != HERE_ERROR_NONE) break; + + error = pPlace->StartDiscoveryPlace(hPos, nDistance); + } while(0); + + /* finishing task */ + if(error != HERE_ERROR_NONE) + pPlace->TerminateService(); + + return error; +} + +int HerePluginSearchPlaceByArea(maps_area_h hArea, + maps_item_hashtable_h hPref, maps_place_filter_h hFilter, maps_service_search_place_cb pCbFunc, + void *pUserData, int *nReqId) +{ + /* checking parmaters */ + if (!hArea || !HereUtils::IsValid(*(maps_area_s*)hArea)) + return HERE_ERROR_INVALID_PARAMETER; + + if (!hFilter || !pCbFunc || !nReqId) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + /* creating instance */ + HerePlace *pPlace = + (HerePlace*)(HereManager::GetHandler()->CreateInstance(HereManager::HERE_SVC_PLACE, + (void*)pCbFunc, pUserData, nReqId)); + + if(!pPlace) + return HERE_ERROR_SERVICE_NOT_AVAILABLE; + + /* sending request */ + here_error_e error = HERE_ERROR_NONE; + + do { + error = pPlace->PrepareDiscoveryQuery(); + if (error != HERE_ERROR_NONE) break; + + error = pPlace->PrepareDiscoveryPreference(hPref); + + error = pPlace->PrepareDiscoveryFilter(hFilter); + if (error != HERE_ERROR_NONE) break; + + error = pPlace->StartDiscoveryPlaceByArea(hArea); + } while(0); + + /* finishing task */ + if(error != HERE_ERROR_NONE) + pPlace->TerminateService(); + + return error; +} + +int HerePluginSearchPlaceByAddress(const char* szAddr, maps_area_h hArea, + maps_item_hashtable_h hPref, maps_place_filter_h hFilter, maps_service_search_place_cb pCbFunc, + void * pUserData, int *nReqId) +{ + /* checking parmaters */ + if (!szAddr || (szAddr && *szAddr == '\0') || !hFilter || !pCbFunc || !nReqId) + return HERE_ERROR_INVALID_PARAMETER; + + if (!hArea || !HereUtils::IsValid(*(maps_area_s*)hArea)) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + /* creating instance */ + HerePlace *pPlace = + (HerePlace*)(HereManager::GetHandler()->CreateInstance(HereManager::HERE_SVC_PLACE, + (void*)pCbFunc, pUserData, nReqId)); + + if(!pPlace) + return HERE_ERROR_SERVICE_NOT_AVAILABLE; + + /* sending request */ + here_error_e error = HERE_ERROR_NONE; + + do { + error = pPlace->PrepareDiscoveryQuery(); + if (error != HERE_ERROR_NONE) break; + + error = pPlace->PrepareDiscoveryPreference(hPref); + + error = pPlace->PrepareDiscoveryFilter(hFilter); + if (error != HERE_ERROR_NONE) break; + + error = pPlace->StartDiscoveryPlaceByAddress(szAddr, hArea); + } while(0); + + /* finishing task */ + if(error != HERE_ERROR_NONE) + pPlace->TerminateService(); + + return error; +} + +int HerePluginSearchPlaceDetails(const char* szUrl, + maps_item_hashtable_h hPref, maps_service_search_place_cb pCbFunc, + void *pUserData, int *nReqId) +{ + /* checking parmaters */ + if (!szUrl || (szUrl && *szUrl == '\0') || !pCbFunc || !nReqId) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + /* creating instance */ + HerePlace *pPlace = + (HerePlace*)(HereManager::GetHandler()->CreateInstance(HereManager::HERE_SVC_PLACE, + (void*)pCbFunc, pUserData, nReqId)); + + if(!pPlace) + return HERE_ERROR_SERVICE_NOT_AVAILABLE; + + /* sending request */ + here_error_e error = HERE_ERROR_NONE; + + do { + error = pPlace->PreparePlaceDetailsQuery(); + if (error != HERE_ERROR_NONE) break; + + error = pPlace->PreparePlaceDetailsPreference(hPref); + + error = pPlace->StartPlaceDetails(szUrl); + } while(0); + + /* finishing task */ + if(error != HERE_ERROR_NONE) + pPlace->TerminateService(); + + return error; +} + +int HerePluginSearchRoute(maps_coordinates_h hOrigin, maps_coordinates_h hDestination, + maps_item_hashtable_h hPref, maps_service_search_route_cb pCbFunc, + void *pUserData, int *nReqId) +{ + /* checking parmaters */ + if (!hOrigin || !hDestination || !pCbFunc || !nReqId) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereUtils::IsValid(*(maps_coordinates_s*)hOrigin) || + !HereUtils::IsValid(*(maps_coordinates_s*)hDestination)) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + /* creating instance */ + HereRoute *pRoute = + (HereRoute*)(HereManager::GetHandler()->CreateInstance(HereManager::HERE_SVC_ROUTE, + (void*)pCbFunc, pUserData, nReqId)); + + if(!pRoute) + return HERE_ERROR_SERVICE_NOT_AVAILABLE; + + /* sending request */ + here_error_e error = HERE_ERROR_NONE; + + do { + error = pRoute->PrepareQuery(); + if (error != HERE_ERROR_NONE) break; + + error = pRoute->PreparePreference(hPref); + + error = pRoute->PrepareWaypoint(hOrigin, hDestination); + if (error != HERE_ERROR_NONE) break; + + error = pRoute->StartRoute(); + } while(0); + + /* finishing task */ + if(error != HERE_ERROR_NONE) + pRoute->TerminateService(); + + return error; +} + +int HerePluginSearchRouteWaypoints(const maps_coordinates_h* hWaypointList, int nWaypointNum, + maps_item_hashtable_h hPref, maps_service_search_route_cb pCbFunc, + void* pUserData, int *nReqId) +{ + /* checking parmaters */ + if (!hWaypointList || nWaypointNum < 2 || !pCbFunc || !nReqId) + return HERE_ERROR_INVALID_PARAMETER; + + for (int i=0; iCreateInstance(HereManager::HERE_SVC_ROUTE, + (void*)pCbFunc, pUserData, nReqId)); + + if(!pRoute) + return HERE_ERROR_SERVICE_NOT_AVAILABLE; + + /* sending request */ + here_error_e error = HERE_ERROR_NONE; + + do { + error = pRoute->PrepareQuery(); + if (error != HERE_ERROR_NONE) break; + + error = pRoute->PrepareWaypoint(hWaypointList, nWaypointNum); + if (error != HERE_ERROR_NONE) break; + + error = pRoute->PreparePreference(hPref); + + error = pRoute->StartRoute(); + } while(0); + + /* finishing task */ + if(error != HERE_ERROR_NONE) + pRoute->TerminateService(); + + return error; +} + +int HerePluginCancelRequest(int nReqId) +{ + if (nReqId <= 0) + return HERE_ERROR_INVALID_PARAMETER; + + if (!HereManager::GetHandler()) + return HERE_ERROR_INVALID_OPERATION; + + return (HereManager::GetHandler()->CancelInstance(nReqId)); +} diff --git a/src/here_base.cpp b/src/here_base.cpp new file mode 100644 index 0000000..c3589f3 --- /dev/null +++ b/src/here_base.cpp @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "here_base.h" +#include "here_manager.h" +#include +#include +#include +#include +#include + + +HERE_PLUGIN_BEGIN_NAMESPACE + +HereBase::HereBase() +{ + m_nRestReqId = 0; + m_bCanceled = 0; + m_nReqId = 0; +} + +HereBase::~HereBase() +{ + if (HereManager::GetHandler()) + HereManager::GetHandler()->CloseInstance(m_nReqId); +} + +void HereBase::TerminateService(void) +{ + if(m_nRestReqId) + { + m_bCanceled = 1; + return; + } + delete this; +} + +gint HereBase::GetReqId(void) +{ + return m_nReqId; +} + +gint HereBase::GetRestReqId(void) +{ + return m_nRestReqId; +} + +gint HereBase::GetErrorCode(const BaseReply& Reply) +{ + ErrorBase *pError = (ErrorBase*)Reply.GetError(); + maps_error_e error = MAPS_ERROR_UNKNOWN; + CommunicationError *commErr; + FinderError *finderErr; + String errMsg = ""; + + + if (pError) + { + ErrorBase::ErrorCategory category = pError->GetErrorCategory(); + + switch(category) + { + case ErrorBase::ErrorCategory::EC_CommunicationsError: + commErr = (CommunicationError*)pError; + errMsg = commErr->ToString(); + + if (commErr->GetErrorCode() == CommunicationError::ErrorCode::CE_NetworkError) + error = MAPS_ERROR_NETWORK_UNREACHABLE; + else if (commErr->GetErrorCode() == CommunicationError::ErrorCode::CE_RestEngineError) + error = MAPS_ERROR_INVALID_OPERATION; + else + error = HereUtils::ConvertHttpCodeToMapsError(commErr->GetHttpStatusCode()); + break; + + case ErrorBase::ErrorCategory::EC_ParserError: + errMsg = ((ParserError*)pError)->ToString(); + error = MAPS_ERROR_INVALID_OPERATION; + break; + + case ErrorBase::ErrorCategory::EC_RouterError: + errMsg = ((RouterError*)pError)->ToString(); + error = MAPS_ERROR_INVALID_OPERATION; + break; + + case ErrorBase::ErrorCategory::EC_TileMapError: + errMsg = ((TileFetcherError*)pError)->ToString(); + error = MAPS_ERROR_INVALID_OPERATION; + break; + + case ErrorBase::ErrorCategory::EC_FinderError: + finderErr = (FinderError*)pError; + //errMsg = finderErr->ToString(); + + if (finderErr->GetErrorType() == FinderError::ErrorType::ET_InvalidQueryArguments) + error = MAPS_ERROR_INVALID_PARAMETER; + else if (finderErr->GetErrorType() == FinderError::ErrorType::ET_InvalidCredentials) + error = MAPS_ERROR_KEY_NOT_AVAILABLE; + else + error = MAPS_ERROR_INVALID_OPERATION; + break; + default: + error = MAPS_ERROR_INVALID_OPERATION; + break; + } + } + + if (error != MAPS_ERROR_NONE) { + if (errMsg.size() > 0) errMsg += ". "; + MAPS_LOGE("ERROR: %s%s (%s, %ld)", errMsg.data(), + ConverHereErrorToString(ConvertToHereError(error)), + ConvertMapsErrorToChar(error), error); + } + + return error; +} + +HERE_PLUGIN_END_NAMESPACE diff --git a/src/here_geocode.cpp b/src/here_geocode.cpp new file mode 100644 index 0000000..f7464d7 --- /dev/null +++ b/src/here_geocode.cpp @@ -0,0 +1,284 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "here_geocode.h" + +HERE_PLUGIN_BEGIN_NAMESPACE + +HereGeocode::HereGeocode(void *pCbFunc, void *pUserData, int nReqId) +{ + m_pQuery = NULL; + + m_pCbFunc = pCbFunc; + m_pUserData = pUserData; + m_nReqId = nReqId; +} + +HereGeocode::~HereGeocode() +{ + if (m_pQuery) + { + delete m_pQuery; + m_pQuery = NULL; + } +} + +here_error_e HereGeocode::PrepareQuery() +{ + if (m_pQuery) + return HERE_ERROR_PERMISSION_DENIED; + + m_pQuery = new GeoCoderQuery(); + + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + else + return HERE_ERROR_NONE; +} + +here_error_e HereGeocode::PreparePreference(maps_preference_h hPref) +{ + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!hPref) + return HERE_ERROR_INVALID_PARAMETER; + + int ret; + char *szLanguage = NULL; + ret = maps_preference_get_language(hPref, &szLanguage); + if (ret == MAPS_ERROR_NONE && szLanguage && *szLanguage) + { + m_pQuery->AppendPreferredLanguage(szLanguage); + g_free(szLanguage); + } + + int nMaxResults; + ret = maps_preference_get_max_results(hPref, &nMaxResults); + if (ret == MAPS_ERROR_NONE) + { + m_pQuery->SetMaxResults((size_t)nMaxResults); + } + + return HERE_ERROR_NONE; +} + +here_error_e HereGeocode::StartGeocode(const char* szAddr) +{ + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!szAddr || (szAddr && strlen(szAddr) <= 0)) + return HERE_ERROR_INVALID_PARAMETER; + + + String sSearch(szAddr); + m_pQuery->SetSearchtext(sSearch); + + + m_nRestReqId = m_pQuery->Execute(*this, NULL); + + return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION); +} + +here_error_e HereGeocode::StartGeocodeInsideArea(const char* szAddr, const maps_area_h hArea) +{ + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!szAddr || (szAddr && strlen(szAddr) <= 0) || !hArea) + return HERE_ERROR_INVALID_PARAMETER; + + + String sSearch(szAddr); + m_pQuery->SetSearchtext(sSearch); + + maps_area_s *pArea = (maps_area_s *)hArea; + if (pArea->type == MAPS_AREA_RECTANGLE) + { + double dLatTL = pArea->rect.top_left.latitude; + double dLngTL = pArea->rect.top_left.longitude; + GeoCoordinates geoCoordTL(dLatTL, dLngTL); + + double dLatBR = pArea->rect.bottom_right.latitude; + double dLngBR = pArea->rect.bottom_right.longitude; + GeoCoordinates geoCoordBR(dLatBR, dLngBR); + + GeoBoundingBox BoundingBox(geoCoordTL, geoCoordBR); + + m_pQuery->SetBoundingBox(BoundingBox); + } + else if (pArea->type == MAPS_AREA_CIRCLE) + { + MAPS_LOGD("HERE Maps is not supported circle type in GeocoderQuery"); + return HERE_ERROR_NOT_SUPPORTED; + } + else { + return HERE_ERROR_INVALID_PARAMETER; + } + + + m_nRestReqId = m_pQuery->Execute(*this, NULL); + + return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION); +} + +here_error_e HereGeocode::StartGeocodeByStructuredAddress(const maps_address_h hAddr) +{ + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!hAddr) + return HERE_ERROR_INVALID_PARAMETER; + + + Address rAddress; + + int ret; + char *szCountry = NULL; + ret = maps_address_get_country(hAddr, &szCountry); + if (ret == MAPS_ERROR_NONE && szCountry && *szCountry) + rAddress.SetCountry(String(szCountry)); + g_free(szCountry); + + char *szCountryCode = NULL; + ret = maps_address_get_country_code(hAddr, &szCountryCode); + if (ret == MAPS_ERROR_NONE && szCountryCode && *szCountryCode) + rAddress.SetCountryCode(String(szCountryCode)); + g_free(szCountryCode); + + char *szCounty = NULL; + ret = maps_address_get_county(hAddr, &szCounty); + if (ret == MAPS_ERROR_NONE && szCounty && *szCounty) + rAddress.SetCounty(String(szCounty)); + g_free(szCounty); + + char *szState = NULL; + ret = maps_address_get_state(hAddr, &szState); + if (ret == MAPS_ERROR_NONE && szState && *szState) + rAddress.SetState(String(szState)); + g_free(szState); + + char *szCity = NULL; + ret = maps_address_get_city(hAddr, &szCity); + if (ret == MAPS_ERROR_NONE && szCity && *szCity) + rAddress.SetCity(String(szCity)); + g_free(szCity); + + char *szDistrict = NULL; + ret = maps_address_get_district(hAddr, &szDistrict); + if (ret == MAPS_ERROR_NONE && szDistrict && *szDistrict) + rAddress.SetDistrict(String(szDistrict)); + g_free(szDistrict); + + char *szStreet = NULL; + ret = maps_address_get_street(hAddr, &szStreet); + if (ret == MAPS_ERROR_NONE && szStreet && *szStreet) + rAddress.SetStreet(String(szStreet)); + g_free(szStreet); + + char *szBuildingNumber = NULL; + ret = maps_address_get_building_number(hAddr, &szBuildingNumber); + if (ret == MAPS_ERROR_NONE && szBuildingNumber && *szBuildingNumber) + rAddress.SetHouseNumber(String(szBuildingNumber)); + g_free(szBuildingNumber); + + char *szPostalCode = NULL; + ret = maps_address_get_postal_code(hAddr, &szPostalCode); + if (ret == MAPS_ERROR_NONE && szPostalCode && *szPostalCode) + rAddress.SetPostalCode(String(szPostalCode)); + g_free(szPostalCode); + + //not defined in maps-service + //rAddress.SetLabel(String(sLabel)); + //rAddress.SetFloor(String(sFloor)); + //rAddress.SetSuite(String(sSuite)); + + m_pQuery->SetAddress(rAddress); + + + + m_nRestReqId = m_pQuery->Execute(*this, NULL); + + return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION); +} + +void HereGeocode::OnGeoCoderReply(const GeoCoderReply& Reply) +{ + if (m_bCanceled) // ignore call back if it was cancelled. + { + delete this; + return; + } + + Result* pResult; + size_t nResults = Reply.GetNumResults(); + GeoCoordinates hereCoord; + maps_coordinates_h mapsCoord; + + if (nResults == 0) + { + ((maps_service_geocode_cb)m_pCbFunc)(MAPS_ERROR_NOT_FOUND, m_nReqId, + 0, 1, NULL, m_pUserData); + delete this; + return; + } + + for (size_t i = 0 ; i < nResults; i++) + { + pResult = (Result*)Reply.GetResult(i); + + if (pResult) + { + hereCoord = (pResult->GetLocation()).GetDisplayPosition(); + } + else + { + hereCoord.SetLatitude(0.0); + hereCoord.SetLongitude(0.0); + } + + maps_error_e error = (maps_error_e)maps_coordinates_create( + hereCoord.GetLatitude(), hereCoord.GetLongitude(), &mapsCoord); + + if (m_bCanceled) + { + if (mapsCoord) maps_coordinates_destroy(mapsCoord); + break; + } + else + { + if (((maps_service_geocode_cb)m_pCbFunc)(error, m_nReqId, i, + nResults, mapsCoord, m_pUserData) == FALSE) + { + delete this; + return; + } + } + } + + delete this; +} + +void HereGeocode::OnGeoCoderFailure(const GeoCoderReply& Reply) +{ + if (!m_bCanceled) + ((maps_service_geocode_cb)m_pCbFunc)((maps_error_e)GetErrorCode(Reply), m_nReqId, 0, 1, NULL, m_pUserData); + delete this; +} + +HERE_PLUGIN_END_NAMESPACE + diff --git a/src/here_manager.cpp b/src/here_manager.cpp new file mode 100644 index 0000000..2f08b7e --- /dev/null +++ b/src/here_manager.cpp @@ -0,0 +1,481 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "here_manager.h" +#include "here_base.h" +#include "here_geocode.h" +#include "here_revgeocode.h" +#include "here_place.h" +#include "here_route.h" +#include "here_utils.h" +#include + +using namespace HERE_PLUGIN_NAMESPACE_PREFIX; +using namespace TIZEN_MAPS_NAMESPACE_PREFIX; + +HERE_PLUGIN_BEGIN_NAMESPACE + +HereManager *HereManager::m_pHereManager = NULL; +int HereManager::m_nRefCnt = 0; +pthread_mutex_t g_mtxRef; + +HereManager::HereManager() +: m_nNextReqId(1), + m_hPref(NULL) +{ + xmlInitParser(); + m_hConnection = NULL; + pthread_mutex_init(&m_mtxHereList, NULL); + pthread_mutex_init(&g_mtxRef, NULL); +} + +HereManager::~HereManager() +{ + if (m_hConnection) + { + connection_unset_type_changed_cb(m_hConnection); + connection_destroy(m_hConnection); + m_hConnection = NULL; + } + + pthread_mutex_destroy(&m_mtxHereList); + pthread_mutex_destroy(&g_mtxRef); + xmlCleanupParser(); +} + +bool HereManager::Create() +{ + bool result = false; + + if (!m_pHereManager) + { + m_pHereManager = new HereManager(); + } + + pthread_mutex_lock(&g_mtxRef); + if (m_pHereManager) + { + m_nRefCnt++; + result = true; + MAPS_LOGD("Created a HereManager instance (%d).", m_nRefCnt); + } + pthread_mutex_unlock(&g_mtxRef); + + m_pHereManager->SetCredentials(); + return result; +} + +void HereManager::Close() +{ + pthread_mutex_lock(&g_mtxRef); + if (--m_nRefCnt == 0 && m_pHereManager) + { + m_pHereManager->TerminateAllServices(); + HereConfig::Shutdown(); + + delete m_pHereManager; + m_pHereManager = NULL; + } + MAPS_LOGD("Closed a HereManager instance (%d).", m_nRefCnt); + pthread_mutex_unlock(&g_mtxRef); +} + +HereManager* HereManager::GetHandler() +{ + return m_pHereManager; +} + +void* HereManager::CreateInstance(HereSvcType nHereSvc, void* pCbFunc, + void* pUserData, int *nReqId) +{ + HereBase *pHere = NULL; + + *nReqId = m_nNextReqId++; + + switch(nHereSvc) + { + case HERE_SVC_GEOCODE: + pHere = (HereBase*)new HereGeocode(pCbFunc, pUserData, *nReqId); + break; + + case HERE_SVC_REV_GEOCODE: + pHere = (HereBase*)new HereRevGeocode(pCbFunc, pUserData, *nReqId); + break; + + case HERE_SVC_PLACE: + pHere = (HereBase*)new HerePlace(pCbFunc, pUserData, *nReqId); + break; + + case HERE_SVC_ROUTE: + pHere = (HereBase*)new HereRoute(pCbFunc, pUserData, *nReqId); + break; + + default: + return NULL; + } + + pthread_mutex_lock(&m_mtxHereList); + m_HereList.push_back(pHere); + pthread_mutex_unlock(&m_mtxHereList); + + return pHere; +} + +here_error_e HereManager::CloseInstance(int nReqId) +{ + HereSvcList::iterator it; + + pthread_mutex_lock(&m_mtxHereList); + for (it = m_HereList.begin(); it != m_HereList.end(); it++) + { + if ((*it)->GetReqId() == nReqId) + { + m_HereList.erase(it); + break; + } + } + pthread_mutex_unlock(&m_mtxHereList); + + return HERE_ERROR_NONE; +} + +here_error_e HereManager::CancelInstance(int nReqId) +{ + HereSvcList::iterator it; + + pthread_mutex_lock(&m_mtxHereList); + for (it = m_HereList.begin(); it != m_HereList.end(); it++) + { + if ((*it)->GetReqId() == nReqId) + { + m_HereList.erase(it); + RestItemHandle::Cancel((*it)->GetRestReqId()); + (*it)->TerminateService(); + pthread_mutex_unlock(&m_mtxHereList); + return HERE_ERROR_NONE; + } + } + pthread_mutex_unlock(&m_mtxHereList); + + return HERE_ERROR_NOT_FOUND; +} + +bool HereManager::AppInfoMetadataCb(const char *metadata_key, const char *metadata_value, void *user_data) +{ + if (!metadata_key || !metadata_value) + return false; + + if (!strncmp(metadata_key, "http://tizen.org/metadata/here_key", 35) && strlen(metadata_value) > 0 ) + { + if (m_pHereManager->SetCredentials(metadata_value) == HERE_ERROR_NONE) + { + MAPS_LOGD("Succeeded getting credential from metadata"); + } + + return false; + } + + return true; +} + +here_error_e HereManager::SetCredentials(void) +{ + int nRet = 0; + app_info_h hAppInfo; + pid_t nProcessId = -1; + char *strAppId = NULL; + + nProcessId = getpid(); + nRet = app_manager_get_app_id(nProcessId, &strAppId); + if (nRet != APP_MANAGER_ERROR_NONE) + { + MAPS_LOGI("Get app_id [%ld]. nRet[%d]", nProcessId, nRet); + return HERE_ERROR_NONE; + } + + nRet = app_info_create(strAppId, &hAppInfo); + if (nRet != APP_MANAGER_ERROR_NONE) + { + MAPS_LOGI("Get appinfo of [%s]. nRet[%d]", strAppId, nRet); + if (strAppId) free(strAppId); + return HERE_ERROR_NONE; + } + + if (strAppId) free(strAppId); + + nRet = app_info_foreach_metadata(hAppInfo, AppInfoMetadataCb, NULL); + if (nRet != APP_MANAGER_ERROR_NONE) + { + MAPS_LOGI("Get metadata. nRet[%d]", nRet); + } + + nRet = app_info_destroy(hAppInfo); + if (nRet != APP_MANAGER_ERROR_NONE) + { + MAPS_LOGI("Destroy app_info. nRet[%d]", nRet); + } + + return HERE_ERROR_NONE; +} + +here_error_e HereManager::SetCredentials(const char *szKey) +{ + if (!szKey) + return HERE_ERROR_INVALID_PARAMETER; + + String strKey(szKey); + String strAppId, strAppCode; + size_t nCodeStart; + + nCodeStart = strKey.find("/"); + + if(nCodeStart == 0 || nCodeStart >= (strKey.length()-1)) + { + MAPS_LOGE("[error] Key type fault : Key type should be as like XXXXX/YYYYY"); + return HERE_ERROR_INVALID_PARAMETER; + } + + strAppId = strKey.substr(0, nCodeStart); + strAppCode = strKey.substr(nCodeStart+1, std::string::npos); + + if(!ApplicationContext::GetInstance().Initialize(strAppCode, strAppId)) + return HERE_ERROR_INVALID_OPERATION; + + //MAPS_LOGD("[success] credential setted to 'XXXXX/XXXXX'"); + + return HERE_ERROR_NONE; +} + +here_error_e HereManager::GetCredentials(char **szKey) +{ + if (!szKey) + return HERE_ERROR_INVALID_PARAMETER; + + if (!ApplicationContext::GetInstance().IsInitialized()) + return HERE_ERROR_NOT_FOUND; + + String strCredentials = ApplicationContext::GetInstance().GetAppId() + "/" + + ApplicationContext::GetInstance().GetAppCode(); + + *szKey = g_strndup(strCredentials.c_str(), strCredentials.length()); + + if (*szKey == NULL) + return HERE_ERROR_INVALID_OPERATION; + + //MAPS_LOGD("current credential : %s", *szKey); + + return HERE_ERROR_NONE; +} + +here_error_e HereManager::SetPreference(maps_preference_h hPref) +{ + int error = HERE_ERROR_NONE; + + if (!hPref) + return HERE_ERROR_INVALID_PARAMETER; + + if (m_hPref) + { + if (maps_preference_destroy(m_hPref) != MAPS_ERROR_NONE) + return HERE_ERROR_INVALID_OPERATION; + } + + do { + error = maps_preference_clone(hPref, &m_hPref); + if (error != MAPS_ERROR_NONE) break; + + char *szLanguage = NULL; + error = maps_preference_get_language(hPref, &szLanguage); + if (error == MAPS_ERROR_NONE && szLanguage && strlen(szLanguage) > 0) + ApplicationContext::GetInstance().SetPreferredLanguage(String(szLanguage)); + } while(0); + + return (here_error_e)ConvertToHereError(error); +} + +here_error_e HereManager::GetPreference(maps_preference_h *hPref) +{ + int ret = HERE_ERROR_NONE; + + if (!hPref) + return HERE_ERROR_INVALID_PARAMETER; + + if (!m_hPref) + return HERE_ERROR_NOT_FOUND; + + ret = maps_preference_clone(m_hPref, hPref); + + return (here_error_e)ConvertToHereError(ret); +} + +maps_preference_h HereManager::GetPreference() +{ + return m_hPref; +} + +void HereManager::TerminateAllServices(void) +{ + HereSvcList::iterator it; + + while (1) + { + pthread_mutex_lock(&m_mtxHereList); + if (m_HereList.empty()) + { + pthread_mutex_unlock(&m_mtxHereList); + break; + } + it = m_HereList.begin(); + pthread_mutex_unlock(&m_mtxHereList); + + try { + if (*it) (*it)->TerminateService(); + m_HereList.erase(it); + } + catch (std::exception &e) { + } + }; + + if (m_hPref) + { + maps_preference_destroy(m_hPref); + m_hPref = NULL; + } +} + +here_error_e HereManager::ConvertNetworkErrorCode(const int nErrorCode) +{ + here_error_e err = HERE_ERROR_NONE; + + switch (nErrorCode) + { + case CONNECTION_ERROR_NONE: + //MAPS_LOGD("No error"); + err = HERE_ERROR_NONE; + break; + case CONNECTION_ERROR_INVALID_PARAMETER: + MAPS_LOGD("Invalid parameter"); + err = HERE_ERROR_INVALID_PARAMETER; + break; + case CONNECTION_ERROR_OUT_OF_MEMORY: + MAPS_LOGD("Out of memory error"); + err = HERE_ERROR_OUT_OF_MEMORY; + break; + case CONNECTION_ERROR_INVALID_OPERATION: + MAPS_LOGD("Invalid Operation"); + err = HERE_ERROR_INVALID_OPERATION; + break; + case CONNECTION_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED: + MAPS_LOGD("Address family not supported"); + err = HERE_ERROR_NOT_SUPPORTED; + break; + case CONNECTION_ERROR_PERMISSION_DENIED: + MAPS_LOGD("Permission denied"); + err = HERE_ERROR_PERMISSION_DENIED; + break; + case CONNECTION_ERROR_OPERATION_FAILED: + MAPS_LOGD("Operation failed"); + err = HERE_ERROR_INVALID_OPERATION; + break; + case CONNECTION_ERROR_ITERATOR_END: + MAPS_LOGD("End of iteration"); + break; + case CONNECTION_ERROR_NO_CONNECTION: + MAPS_LOGD("There is no connection"); + err = HERE_ERROR_NETWORK_UNREACHABLE; + break; + case CONNECTION_ERROR_NOW_IN_PROGRESS: + MAPS_LOGD("Now in progress"); + err = HERE_ERROR_RESOURCE_BUSY; + break; + case CONNECTION_ERROR_ALREADY_EXISTS: + MAPS_LOGD("Already exists"); + break; + case CONNECTION_ERROR_OPERATION_ABORTED: + MAPS_LOGD("Operation is aborted"); + err = HERE_ERROR_CANCELED; + break; + case CONNECTION_ERROR_DHCP_FAILED: + MAPS_LOGD("DHCP failed"); + break; + case CONNECTION_ERROR_INVALID_KEY: + MAPS_LOGD("Invalid key"); + err = HERE_ERROR_KEY_NOT_AVAILABLE; + break; + case CONNECTION_ERROR_NO_REPLY: + MAPS_LOGD("No Reply"); + err = HERE_ERROR_RESOURCE_BUSY; + break; + case CONNECTION_ERROR_NOT_SUPPORTED: + MAPS_LOGD("Not Supported"); + err = HERE_ERROR_NOT_SUPPORTED; + break; + default: + MAPS_LOGD("Unknown"); + break; + } + //MAPS_LOGD("nErrorCode = 0x%08X", nErrorCode); + + return err; +} + +here_error_e HereManager::SetProxyAddress() +{ + int errorCode = CONNECTION_ERROR_NONE; + + char *proxy_address = NULL; + + if (!m_hConnection) + { + errorCode = connection_create(&m_hConnection); + if (errorCode == CONNECTION_ERROR_NONE) + { + errorCode = connection_set_type_changed_cb(m_hConnection, NetworkStateChangedIndCb, this); + + } + } + if (errorCode != CONNECTION_ERROR_NONE) + return ConvertNetworkErrorCode(errorCode); + + errorCode = connection_get_proxy(m_hConnection, CONNECTION_ADDRESS_FAMILY_IPV4, &proxy_address); + if (errorCode == CONNECTION_ERROR_NONE) + { + MAPS_LOGD("Proxy = %s", (proxy_address ? proxy_address : "(null)")); + Tizen::Maps::HereConfig::SetProxyAddress(proxy_address); + } + g_free(proxy_address); + + return ConvertNetworkErrorCode(errorCode); +} + +void HereManager::NetworkStateChangedIndCb(connection_type_e type, void *user_data) +{ + MAPS_LOGD("Network state is changed. type=%d", type); + + if (!user_data) return; + + HereManager *pManager = (HereManager*)user_data; + + if ((type != CONNECTION_TYPE_DISCONNECTED) && (type != CONNECTION_TYPE_BT)) + pManager->SetProxyAddress(); +} + +HERE_PLUGIN_END_NAMESPACE + diff --git a/src/here_place.cpp b/src/here_place.cpp new file mode 100644 index 0000000..297a811 --- /dev/null +++ b/src/here_place.cpp @@ -0,0 +1,1316 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "here_place.h" + +HERE_PLUGIN_BEGIN_NAMESPACE + +HerePlace::HerePlace(void *pCbFunc, void *pUserData, int nReqId) +{ + m_pDiscoveryQuery = NULL; + m_pPlaceDetailsQuery = NULL; + + m_pCbFunc = pCbFunc; + m_pUserData = pUserData; + m_nReqId = nReqId; + + m_nReplyCnt = 0; + m_nReplyIdx = 0; + m_szSortBy = NULL; +} + +HerePlace::~HerePlace() +{ + if (m_pDiscoveryQuery) + { + delete m_pDiscoveryQuery; + m_pDiscoveryQuery = NULL; + } + + if (m_pPlaceDetailsQuery) + { + delete m_pPlaceDetailsQuery; + m_pPlaceDetailsQuery = NULL; + } + + while(!m_PlaceList.empty()) + { + maps_place_destroy(m_PlaceList.front()); + m_PlaceList.pop_front(); + } +} + +here_error_e HerePlace::PrepareDiscoveryQuery() +{ + if (m_pDiscoveryQuery) + return HERE_ERROR_PERMISSION_DENIED; + + m_pDiscoveryQuery = new DiscoveryQuery(); + + if (!m_pDiscoveryQuery) + return HERE_ERROR_OUT_OF_MEMORY; + else + return HERE_ERROR_NONE; +} + +here_error_e HerePlace::PrepareDiscoveryPreference(maps_preference_h hPref) +{ + if (!m_pDiscoveryQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!hPref) + return HERE_ERROR_INVALID_PARAMETER; + + + int ret; + char *szLanguage = NULL; + ret = maps_preference_get_language(hPref, &szLanguage); + if (ret == MAPS_ERROR_NONE && szLanguage && *szLanguage) + m_pDiscoveryQuery->SetLanguage(szLanguage); + g_free(szLanguage); + + int nMaxResults; + ret = maps_preference_get_max_results(hPref, &nMaxResults); + if (ret == MAPS_ERROR_NONE) + m_pDiscoveryQuery->SetMaxResults((size_t)nMaxResults); + + char *szSortBy; + ret = maps_preference_get(hPref, MAPS_PLACE_FILTER_SORT_BY, &szSortBy); + if (ret == MAPS_ERROR_NONE) + m_szSortBy = szSortBy; + + return HERE_ERROR_NONE; +} + +here_error_e HerePlace::PrepareDiscoveryFilter(maps_place_filter_h hFilter) +{ + if (!m_pDiscoveryQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!hFilter) + return HERE_ERROR_INVALID_PARAMETER; + + int ret; + maps_place_category_h mapsCate = NULL; + if (maps_place_filter_get_category(hFilter, &mapsCate) == MAPS_ERROR_NONE) + { + CategoryList hereCateList; + Category hereCate; + char *szId = NULL, *szName = NULL, *szUrl = NULL; + + ret = maps_place_category_get_name(mapsCate, &szName); + if (ret == MAPS_ERROR_NONE && szName && *szName) + hereCate.SetTitle(szName); + g_free(szName); + + ret = maps_place_category_get_url(mapsCate, &szUrl); + if (ret == MAPS_ERROR_NONE && szUrl && *szUrl) + hereCate.SetHref(szUrl); + g_free(szUrl); + + ret = maps_place_category_get_id(mapsCate, &szId); + if (ret == MAPS_ERROR_NONE && szId && *szId) + { + hereCate.SetCategoryId(CategoryId(szId)); + hereCateList.push_back(hereCate); + m_pDiscoveryQuery->SetCategoriesFilter(hereCateList); + } + g_free(szId); + + maps_place_category_destroy(mapsCate); + } + + char *szName = NULL; + ret = maps_place_filter_get_place_name(hFilter, &szName); + if (ret == MAPS_ERROR_NONE && szName && *szName) + m_pDiscoveryQuery->SetSearchText(szName); + g_free(szName); + + return HERE_ERROR_NONE; +} + +here_error_e HerePlace::StartDiscoveryPlace(maps_coordinates_h hCoord, int nDistance) +{ + if (!m_pDiscoveryQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!hCoord) + return HERE_ERROR_INVALID_PARAMETER; + + + if (m_pDiscoveryQuery->GetSearchText().empty()) + { + m_pDiscoveryQuery->SetType(DiscoveryQuery::QT_EXPLORE); + + double dLat, dLon; + maps_coordinates_get_latitude(hCoord, &dLat); + maps_coordinates_get_longitude(hCoord, &dLon); + GeoCoordinates geoCoord(dLat, dLon); + + if (nDistance > 0) + { + GeoBoundingCircle geoCircle(geoCoord, nDistance); + m_pDiscoveryQuery->SetArea(geoCircle); + } + else if (nDistance == 0) + { + m_pDiscoveryQuery->SetProximity(geoCoord); + } + else + return HERE_ERROR_INVALID_PARAMETER; + + m_nRestReqId = m_pDiscoveryQuery->Execute(*this, NULL); + + return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION); + } + else + { + here_error_e error; + maps_area_h hArea = NULL; + maps_area_create_circle(hCoord, nDistance, &hArea); + error = StartDiscoveryPlaceByAddress(m_pDiscoveryQuery->GetSearchText().data(), hArea); + maps_area_destroy(hArea); + return error; + } +} + +here_error_e HerePlace::StartDiscoveryPlaceByArea(maps_area_h hArea) +{ + if (!m_pDiscoveryQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!hArea) + return HERE_ERROR_INVALID_PARAMETER; + + + if (m_pDiscoveryQuery->GetSearchText().empty()) + { + m_pDiscoveryQuery->SetType(DiscoveryQuery::QT_EXPLORE); + + maps_area_s *pArea = (maps_area_s*)hArea; + if (pArea->type == MAPS_AREA_RECTANGLE) + { + GeoBoundingBox box(pArea->rect.top_left.longitude, pArea->rect.bottom_right.longitude, + pArea->rect.bottom_right.latitude, pArea->rect.top_left.latitude); + m_pDiscoveryQuery->SetArea(box); + } + else if (pArea->type == MAPS_AREA_CIRCLE) + { + GeoCoordinates coord(pArea->circle.center.latitude, pArea->circle.center.longitude); + GeoBoundingCircle circle(coord, pArea->circle.radius); + m_pDiscoveryQuery->SetArea(circle); + } + else + return HERE_ERROR_INVALID_PARAMETER; + + + m_nRestReqId = m_pDiscoveryQuery->Execute(*this, NULL); + + return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION); + } + else + { + return StartDiscoveryPlaceByAddress(m_pDiscoveryQuery->GetSearchText().data(), hArea); + } +} + +here_error_e HerePlace::StartDiscoveryPlaceByAddress(const char *szAddr, maps_area_h hArea) +{ + if (!m_pDiscoveryQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!szAddr || (szAddr && strlen(szAddr) <= 0) || !hArea) + return HERE_ERROR_INVALID_PARAMETER; + + + m_pDiscoveryQuery->SetType(DiscoveryQuery::QT_SEARCH); + + String szSearchText = szAddr; + if (m_pDiscoveryQuery->GetSearchText().size() > 0 && + szSearchText != m_pDiscoveryQuery->GetSearchText()) + { + szSearchText += " " + m_pDiscoveryQuery->GetSearchText(); + } + m_pDiscoveryQuery->SetSearchText(szSearchText); + + maps_area_s *pArea = (maps_area_s*)hArea; + if (pArea->type == MAPS_AREA_RECTANGLE) + { + double dLat1 = pArea->rect.top_left.latitude; + double dLng1 = pArea->rect.top_left.longitude; + double dLat2 = pArea->rect.bottom_right.latitude; + double dLng2 = pArea->rect.bottom_right.longitude; + double dLat = (dLat1 + dLat2) / 2; + double dLng = (dLng1 + dLng2) / 2; + + GeoCoordinates geoCoord(dLat, dLng); + m_pDiscoveryQuery->SetProximity(geoCoord); + } + else if(pArea->type == MAPS_AREA_CIRCLE) + { + double dLat = pArea->circle.center.latitude; + double dLng = pArea->circle.center.longitude; + GeoCoordinates geoCoord(dLat, dLng); + m_pDiscoveryQuery->SetProximity(geoCoord); + } + + + m_nRestReqId = m_pDiscoveryQuery->Execute(*this, NULL); + + return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION); +} + +here_error_e HerePlace::PreparePlaceDetailsQuery() +{ + if (m_pPlaceDetailsQuery) + return HERE_ERROR_PERMISSION_DENIED; + + m_pPlaceDetailsQuery = new PlaceDetailsQuery(); + + if (!m_pPlaceDetailsQuery) + return HERE_ERROR_OUT_OF_MEMORY; + else + return HERE_ERROR_NONE; +} + +here_error_e HerePlace::PreparePlaceDetailsPreference(maps_preference_h hPref) +{ + if (!m_pPlaceDetailsQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!hPref) + return HERE_ERROR_INVALID_PARAMETER; + + int ret; + char *szLanguage = NULL; + ret = maps_preference_get_language(hPref, &szLanguage); + if (ret == MAPS_ERROR_NONE && szLanguage && *szLanguage) + m_pPlaceDetailsQuery->SetLanguage(szLanguage); + g_free(szLanguage); + + return HERE_ERROR_NONE; +} + +here_error_e HerePlace::StartPlaceDetails(const char *szPlaceId) +{ + if (!m_pPlaceDetailsQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!szPlaceId || (szPlaceId && strlen(szPlaceId) <= 0)) + return HERE_ERROR_INVALID_PARAMETER; + + + m_pPlaceDetailsQuery->SetPlaceId(szPlaceId); + + + m_nRestReqId = m_pPlaceDetailsQuery->Execute(*this, NULL); + + return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION); +} + +here_error_e HerePlace::StartPlaceDetailsInternal(const char *szUrl) +{ + if (!szUrl || (szUrl && strlen(szUrl) <= 0)) + return HERE_ERROR_INVALID_PARAMETER; + + + std::unique_ptr pPlaceDetailsQuery (new (std::nothrow)PlaceDetailsQuery()); + + + bool bExcuted = (int)(pPlaceDetailsQuery->Execute(*this, NULL, szUrl) > 0); + + return (bExcuted ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION); +} + +void HerePlace::OnDiscoverReply (const DiscoveryReply &Reply) +{ + if (m_bCanceled) /* ignore call back if it was cancelled. */ + { + delete this; + return; + } + + maps_place_h mapsPlace; + PlaceItemList herePlaceList = Reply.GetPlaceItems(); + PlaceItemList::iterator herePlaceIt; + SearchItemList hereSearchList = Reply.GetSearchItems(); + SearchItemList::iterator hereSearchIt; + LinkObject hereLinkObj; + GeoCoordinates hereCoord; + maps_coordinates_h mapsCoord; + Category hereCate; + maps_place_category_h mapsCate; + maps_place_rating_h mapsRating; + int error = MAPS_ERROR_UNKNOWN, sub_error; + bool is_valid, isPending; + + + m_nReplyIdx = 0; + m_nReplyCnt = herePlaceList.size() + hereSearchList.size(); + + if (m_nReplyCnt == 0) + { + ((maps_service_search_place_cb)m_pCbFunc)(MAPS_ERROR_NOT_FOUND, m_nReqId, + 0, 1, NULL, m_pUserData); + delete this; + return; + } + + for (herePlaceIt = herePlaceList.begin(); + herePlaceIt != herePlaceList.end() && !m_bCanceled; + herePlaceIt++) + { + isPending = false; + + if ((error = maps_place_create(&mapsPlace)) == MAPS_ERROR_NONE) + { + /* title, uri, id */ + hereLinkObj = herePlaceIt->GetLinkObject(); + + if (!hereLinkObj.GetTitle().empty()) + maps_place_set_name(mapsPlace, (char*)hereLinkObj.GetTitle().c_str()); + + if (!hereLinkObj.GetHref().empty()) + maps_place_set_uri(mapsPlace, (char*)hereLinkObj.GetHref().c_str()); + + if (!hereLinkObj.GetId().empty()) + maps_place_set_id(mapsPlace, (char*)hereLinkObj.GetId().c_str()); + + /* icon */ + /* type */ + + /* position */ + hereCoord = herePlaceIt->GetPosition(); + if (maps_coordinates_create(hereCoord.GetLatitude(), hereCoord.GetLongitude(), + &mapsCoord) == MAPS_ERROR_NONE) + { + maps_place_set_location(mapsPlace, mapsCoord); + maps_coordinates_destroy(mapsCoord); + } + + /* rating (optional) */ + if (maps_place_rating_create(&mapsRating) == MAPS_ERROR_NONE) + { + maps_place_rating_set_average(mapsRating, herePlaceIt->GetAverageRating()); + maps_place_set_rating(mapsPlace, mapsRating); + maps_place_rating_destroy(mapsRating); + } + + /* category (optional) */ + hereCate = herePlaceIt->GetCategory(); + + maps_item_list_h mapsCateList; + if (maps_item_list_create(&mapsCateList) == MAPS_ERROR_NONE) + { + if (maps_place_category_create(&mapsCate) == MAPS_ERROR_NONE) + { + is_valid = false; + + if (!hereCate.GetCategoryId().ToString().empty()) + { + sub_error = maps_place_category_set_id(mapsCate, + (char*)hereCate.GetCategoryId().ToString().c_str()); + is_valid |= (sub_error == MAPS_ERROR_NONE); + } + + if (!hereCate.GetTitle().empty()) + { + sub_error = maps_place_category_set_name(mapsCate, + (char*)hereCate.GetTitle().c_str()); + is_valid |= (sub_error == MAPS_ERROR_NONE); + } + + if (!hereCate.GetHref().empty()) + { + sub_error = maps_place_category_set_url(mapsCate, + (char*)hereCate.GetHref().c_str()); + is_valid |= (sub_error == MAPS_ERROR_NONE); + } + + if (is_valid) + { + maps_item_list_append(mapsCateList, mapsCate, maps_place_category_clone); + maps_place_set_categories(mapsPlace, mapsCateList); + maps_item_list_remove_all(mapsCateList, maps_place_category_destroy); + } + maps_place_category_destroy(mapsCate); + } + maps_item_list_destroy(mapsCateList); + } + + /* distance */ + maps_place_set_distance(mapsPlace, (int)herePlaceIt->GetDistance()); + + /* sponser */ + /* herePlaceList.GetIsSponsored() */ + + /* vicinity */ + + /* If needed PlaceDetails information, postpone to send a reply */ + if(__sending_place_details_query_automatically) + { + hereLinkObj = herePlaceIt->GetLinkObject(); + if (!hereLinkObj.GetHref().empty() && !hereLinkObj.GetId().empty()) + { + m_PlaceList.push_back(mapsPlace); + isPending = true; + StartPlaceDetailsInternal(hereLinkObj.GetHref().c_str()); + MAPS_LOGD("Add maps_place_h to the pending list. id=%s", hereLinkObj.GetId().data()); + } + } + } + + if (!isPending) { + m_nReplyIdx++; + m_PlaceList.push_back(mapsPlace); + } + } + + for (hereSearchIt = hereSearchList.begin(); + hereSearchIt != hereSearchList.end() && !m_bCanceled; + hereSearchIt++) + { + error = maps_place_create(&mapsPlace); + + if(error == MAPS_ERROR_NONE) + { + is_valid = false; + + // title, uri, szId + hereLinkObj = hereSearchIt->GetLinkObject(); + + if (!hereLinkObj.GetTitle().empty()) + { + sub_error = maps_place_set_name(mapsPlace, + (char*)hereLinkObj.GetTitle().c_str()); + is_valid |= (sub_error == MAPS_ERROR_NONE); + } + + if (!hereLinkObj.GetHref().empty()) + { + sub_error = maps_place_set_uri(mapsPlace, + (char*)hereLinkObj.GetHref().c_str()); + is_valid |= (sub_error == MAPS_ERROR_NONE); + } + + if (!hereLinkObj.GetId().empty()) + { + sub_error = maps_place_set_id(mapsPlace, + (char*)hereLinkObj.GetId().c_str()); + is_valid |= (sub_error == MAPS_ERROR_NONE); + } + /* icon */ + /* type */ + + if (!is_valid) + error = MAPS_ERROR_NOT_FOUND; + } + + m_PlaceList.push_back(mapsPlace); + m_nReplyIdx++; + } + + + if (m_nReplyIdx == m_nReplyCnt) + { + m_nReplyIdx = 0; + __sortList(m_PlaceList); + + while (m_nReplyIdx < m_nReplyCnt && !m_bCanceled && !m_PlaceList.empty()) + { + mapsPlace = m_PlaceList.front(); + m_PlaceList.pop_front(); + + /* callback function */ + if (((maps_service_search_place_cb)m_pCbFunc)((maps_error_e)error, m_nReqId, + m_nReplyIdx++, m_nReplyCnt, mapsPlace, m_pUserData) == FALSE) + { + break; + } + } + delete this; + } +} + +void HerePlace::OnDiscoverFailure(const DiscoveryReply& Reply) +{ + if (!m_bCanceled) + ((maps_service_search_place_cb)m_pCbFunc)((maps_error_e)GetErrorCode(Reply), m_nReqId, 0, 1, NULL, m_pUserData); + delete this; +} + +void HerePlace::OnPlaceDetailsReply (const PlaceDetailsReply &Reply) +{ + if (m_bCanceled) /* ignore call back if it was cancelled. */ + { + delete this; + return; + } + + if (m_nReplyCnt == 0) + m_nReplyCnt = 1; + + PlaceDetails herePlace = Reply.GetPlaceDetails(); + maps_place_h mapsPlace = NULL; + int error = MAPS_ERROR_NONE, sub_error; + bool is_valid, isPending = false; + char *placeId; + int placeIdLen; + + /* Finding maps_place_h which is already pending since DiscoverReply */ + PlaceList::iterator it; + for (it = m_PlaceList.begin(); it != m_PlaceList.end(); it++) + { + if (maps_place_get_id(*it, &placeId) == MAPS_ERROR_NONE) + { + placeIdLen = strlen(placeId); + if(!herePlace.GetPlaceId().compare(0, placeIdLen, placeId)) + { + mapsPlace = *it; + isPending = true; + MAPS_LOGD("Found maps_place_h in the pending list. id=%s", placeId); + g_free(placeId); + break; + } + } + g_free(placeId); + } + + /* If not found, create new handle */ + if (!mapsPlace) + error = maps_place_create(&mapsPlace); + + if (error == MAPS_ERROR_NONE) + { + is_valid = false; + + /* name */ + if (!herePlace.GetName().empty()) + { + sub_error = maps_place_set_name(mapsPlace, (char*)herePlace.GetName().c_str()); + is_valid |= (sub_error == MAPS_ERROR_NONE); + } + + /* id */ + if (!herePlace.GetPlaceId().empty()) + { + sub_error = maps_place_set_id(mapsPlace, (char*)herePlace.GetPlaceId().c_str()); + is_valid |= (sub_error == MAPS_ERROR_NONE); + } + + /* view */ + if (!herePlace.GetView().empty()) + { + sub_error = maps_place_set_uri(mapsPlace, (char*)herePlace.GetView().c_str()); + is_valid |= (sub_error == MAPS_ERROR_NONE); + } + + if (is_valid) + { + /* icon */ + /* maps not supported // herePlace.GetIconPath(); */ + + /* location */ + ProcessPlaceLocation(herePlace, mapsPlace); + + ProcessPlaceContact(herePlace, mapsPlace); + + ProcessPlaceCategory(herePlace, mapsPlace); + + /* tags */ + /* maps & here not supported */ + + ProcessPlaceImage(herePlace, mapsPlace); + + ProcessPlaceDetails(herePlace, mapsPlace); + + ProcessPlaceReviews(herePlace, mapsPlace); + + ProcessPlaceRatings(herePlace, mapsPlace); + + ProcessPlaceRated(herePlace, mapsPlace); + } + else + { + error = MAPS_ERROR_NOT_FOUND; + } + } + + if (!isPending) + m_PlaceList.push_back(mapsPlace); + + m_nReplyIdx++; + + + if (m_nReplyIdx == m_nReplyCnt) + { + m_nReplyIdx = 0; + __sortList(m_PlaceList); + + while (m_nReplyIdx < m_nReplyCnt && !m_bCanceled && !m_PlaceList.empty()) + { + mapsPlace = m_PlaceList.front(); + m_PlaceList.pop_front(); + + /* callback function */ + if (((maps_service_search_place_cb)m_pCbFunc)((maps_error_e)error, m_nReqId, + m_nReplyIdx++, m_nReplyCnt, mapsPlace, m_pUserData) == FALSE) + { + break; + } + } + delete this; + } +} + +void HerePlace::OnPlaceDetailsFailure(const PlaceDetailsReply& Reply) +{ + if (!m_bCanceled) + ((maps_service_search_place_cb)m_pCbFunc)((maps_error_e)GetErrorCode(Reply), m_nReqId, 0, 1, NULL, m_pUserData); + delete this; +} + +void HerePlace::ProcessPlaceLocation(PlaceDetails herePlace, maps_place_h mapsPlace) +{ + GeoLocation hereLocation = herePlace.GetLocation(); + + /* position */ + GeoCoordinates hereCoord = hereLocation.GetDisplayPosition(); + maps_coordinates_h mapsCoord; + + if (maps_coordinates_create(hereCoord.GetLatitude(), + hereCoord.GetLongitude(), &mapsCoord) == MAPS_ERROR_NONE) + { + maps_place_set_location(mapsPlace, mapsCoord); + maps_coordinates_destroy(mapsCoord); + } + + /* address */ + Address hereAddr = hereLocation.GetAddress(); + maps_address_h mapsAddr; + int error; + bool is_valid; + + if (maps_address_create(&mapsAddr) == MAPS_ERROR_NONE) + { + is_valid = false; + + if (!hereAddr.GetHouseNumber().empty()) + { + error = maps_address_set_building_number(mapsAddr, + hereAddr.GetHouseNumber().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereAddr.GetStreet().empty()) + { + error = maps_address_set_street(mapsAddr, hereAddr.GetStreet().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereAddr.GetDistrict().empty()) + { + error = maps_address_set_district(mapsAddr, hereAddr.GetDistrict().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereAddr.GetCity().empty()) + { + error = maps_address_set_city(mapsAddr, hereAddr.GetCity().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereAddr.GetState().empty()) + { + error = maps_address_set_state(mapsAddr, hereAddr.GetState().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereAddr.GetCountry().empty()) + { + error = maps_address_set_country(mapsAddr, hereAddr.GetCountry().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereAddr.GetCountryCode().empty()) + { + error = maps_address_set_country_code(mapsAddr, hereAddr.GetCountryCode().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereAddr.GetCounty().empty()) + { + error = maps_address_set_county(mapsAddr, hereAddr.GetCounty().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereAddr.GetPostalCode().empty()) + { + error = maps_address_set_postal_code(mapsAddr, hereAddr.GetPostalCode().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereAddr.GetLabel().empty()) + { + error = maps_address_set_freetext(mapsAddr, hereAddr.GetLabel().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (is_valid) + { + maps_place_set_address(mapsPlace, mapsAddr); + } + maps_address_destroy(mapsAddr); + } +} + + +void HerePlace::ProcessPlaceContact(PlaceDetails herePlace, maps_place_h mapsPlace) +{ + /* contact */ + ContactDetailsList hereContList = herePlace.GetContactDetails(); + ContactDetailsList::iterator hereCont; + maps_item_list_h mapsContList; + maps_place_contact_h mapsCont; + int error; + bool is_valid; + + if (hereContList.empty()) return; + + if (maps_item_list_create(&mapsContList) != MAPS_ERROR_NONE) return; + + for (hereCont = hereContList.begin(); hereCont != hereContList.end(); hereCont++) + { + if (maps_place_contact_create(&mapsCont) != MAPS_ERROR_NONE) continue; + + is_valid = false; + + if (!hereCont->GetLabel().empty()) + { + error = maps_place_contact_set_label(mapsCont, + (char*)hereCont->GetLabel().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereCont->GetValue().empty()) + { + error = maps_place_contact_set_value(mapsCont, + (char*)hereCont->GetValue().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereCont->GetContactType().empty()) + { + error = maps_place_contact_set_type(mapsCont, + (char*)hereCont->GetContactType().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (is_valid) + { + maps_item_list_append(mapsContList, mapsCont, + maps_place_contact_clone); + } + maps_place_contact_destroy(mapsCont); + } + + if (maps_item_list_items(mapsContList)) + { + maps_place_set_contacts(mapsPlace, mapsContList); + maps_item_list_remove_all(mapsContList, maps_place_contact_destroy); + } + maps_item_list_destroy(mapsContList); +} + +void HerePlace::ProcessPlaceCategory(PlaceDetails herePlace, maps_place_h mapsPlace) +{ + CategoryList hereCateList = herePlace.GetCategories(); + CategoryList::iterator hereCate; + maps_item_list_h mapsCateList; + maps_place_category_h mapsCate; + int error; + bool is_valid = false; + + if (hereCateList.empty()) return; + + if (maps_item_list_create(&mapsCateList) != MAPS_ERROR_NONE) return; + + // maps-service supports only one category + hereCate = hereCateList.begin(); + if (maps_place_category_create(&mapsCate) == MAPS_ERROR_NONE) + { + if (!hereCate->GetCategoryId().ToString().empty()) + { + error = maps_place_category_set_id(mapsCate, + hereCate->GetCategoryId().ToString().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereCate->GetTitle().empty()) + { + error = maps_place_category_set_name(mapsCate, + hereCate->GetTitle().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereCate->GetHref().empty()) + { + error = maps_place_category_set_url(mapsCate, + hereCate->GetHref().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (is_valid) + { + maps_item_list_append(mapsCateList, mapsCate, maps_place_category_clone); + } + maps_place_category_destroy(mapsCate); + } + + if (maps_item_list_items(mapsCateList)) + { + maps_place_set_categories(mapsPlace, mapsCateList); + maps_item_list_remove_all(mapsCateList, maps_place_category_destroy); + } + maps_item_list_destroy(mapsCateList); +} + +void HerePlace::ProcessPlaceImage(PlaceDetails herePlace, maps_place_h mapsPlace) +{ + ImageContentList hereImageList = herePlace.GetImageContent(); + ImageContentList::iterator hereImage; + maps_item_list_h mapsImageList; + maps_place_image_h mapsImage; + maps_place_link_object_h mapsImageUser; + LinkObject hereImageUser; + int error; + bool is_valid, is_valid2; + + if (hereImageList.empty()) return; + + if (maps_item_list_create(&mapsImageList) != MAPS_ERROR_NONE) return; + + for (hereImage = hereImageList.begin(); hereImage != hereImageList.end(); hereImage++) + { + if (maps_place_image_create(&mapsImage) != MAPS_ERROR_NONE) continue; + + is_valid = false; + + /* here not supported + // maps_place_image_set_height(maps_place_image_h mapsPlace, const int height); */ + + /* here not supported + // maps_place_image_set_media(maps_place_image_h mapsPlace, maps_place_media_h media); */ + + if (!hereImage->GetSource().empty()) + { + error = maps_place_image_set_url(mapsImage, (char*)hereImage->GetSource().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereImage->GetImageId().empty()) + { + error = maps_place_image_set_id(mapsImage, (char*)hereImage->GetImageId().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + hereImageUser = hereImage->GetUser(); + if (maps_place_link_object_create(&mapsImageUser) == MAPS_ERROR_NONE) + { + is_valid2 = false; + + if (!hereImageUser.GetId().empty()) + { + error = maps_place_link_object_set_id(mapsImageUser, + (char*)hereImageUser.GetId().c_str()); + is_valid2 |= (error == MAPS_ERROR_NONE); + } + + if (!hereImageUser.GetTitle().empty()) + { + error = maps_place_link_object_set_name(mapsImageUser, + (char*)hereImageUser.GetTitle().c_str()); + is_valid2 |= (error == MAPS_ERROR_NONE); + } + + if (!hereImageUser.GetHref().empty()) + { + error = maps_place_link_object_set_string(mapsImageUser, + (char*)hereImageUser.GetHref().c_str()); + is_valid2 |= (error == MAPS_ERROR_NONE); + } + + if (!hereImageUser.GetType().empty()) + { + error = maps_place_link_object_set_type(mapsImageUser, + (char*)hereImageUser.GetType().c_str()); + is_valid2 |= (error == MAPS_ERROR_NONE); + } + + if (is_valid2) + { + maps_place_image_set_user_link(mapsImage, mapsImageUser); + is_valid |= is_valid2; + } + maps_place_link_object_destroy(mapsImageUser); + } + + if (is_valid) + { + maps_item_list_append(mapsImageList, mapsImage, maps_place_image_clone); + } + maps_place_image_destroy(mapsImage); + } + + if (maps_item_list_items(mapsImageList)) + { + maps_place_set_images(mapsPlace, mapsImageList); + maps_item_list_remove_all(mapsImageList, maps_place_image_destroy); + } + maps_item_list_destroy(mapsImageList); +} + +void HerePlace::ProcessPlaceDetails(PlaceDetails herePlace, maps_place_h mapsPlace) +{ + EditorialContentList hereEditList = herePlace.GetEditorialContent(); + EditorialContentList::iterator hereEdit; + maps_item_list_h mapsEditList; + maps_place_editorial_h mapsEdit; + int error; + bool is_valid; + + if (hereEditList.empty()) return; + + if (maps_item_list_create(&mapsEditList) != MAPS_ERROR_NONE) return; + + for (hereEdit = hereEditList.begin(); hereEdit != hereEditList.end(); hereEdit++) + { + if (maps_place_editorial_create(&mapsEdit) != MAPS_ERROR_NONE) continue; + + is_valid = false; + + if (!hereEdit->GetDescription().empty()) + { + error = maps_place_editorial_set_description(mapsEdit, + (char*)hereEdit->GetDescription().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereEdit->GetLanguage().empty()) + { + error = maps_place_editorial_set_language(mapsEdit, + (char*)hereEdit->GetLanguage().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + /* maps_place_editorial_set_media(mapsEdit, maps_place_media_h media); */ + + if (is_valid) + { + maps_item_list_append(mapsEditList, mapsEdit, maps_place_editorial_clone); + } + maps_place_editorial_destroy(mapsEdit); + } + + if (maps_item_list_items(mapsEditList)) + { + maps_place_set_editorials(mapsPlace, mapsEditList); + maps_item_list_remove_all(mapsEditList, maps_place_editorial_destroy); + } + maps_item_list_destroy(mapsEditList); +} + +void HerePlace::ProcessPlaceReviews(PlaceDetails herePlace, maps_place_h mapsPlace) +{ + ReviewContentList hereReviewList = herePlace.GetReviewContent(); + ReviewContentList::iterator hereReview; + maps_place_review_h mapsReview; + maps_item_list_h mapsReviewList; + LinkObject hereReviewUser; + maps_place_link_object_h mapsReviewUser; + int error; + bool is_valid, is_valid2; + + if (hereReviewList.empty()) return; + + if (maps_item_list_create(&mapsReviewList) != MAPS_ERROR_NONE) return; + + for (hereReview = hereReviewList.begin(); hereReview != hereReviewList.end(); hereReview++) + { + if (maps_place_review_create(&mapsReview) != MAPS_ERROR_NONE) continue; + + is_valid = false; + + if (!hereReview->GetDateTime().empty()) + { + error = maps_place_review_set_date(mapsReview, + (char*)hereReview->GetDateTime().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereReview->GetDescription().empty()) + { + error = maps_place_review_set_description(mapsReview, + (char*)hereReview->GetDescription().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereReview->GetLanguage().empty()) + { + error = maps_place_review_set_language(mapsReview, + (char*)hereReview->GetLanguage().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + /* maps_place_review_set_media(mapsReview, maps_place_media_h media) */ + + maps_place_review_set_rating(mapsReview, hereReview->GetRating()); + + if (!hereReview->GetTitle().empty()) + { + error = maps_place_review_set_title(mapsReview, + (char*)hereReview->GetTitle().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + hereReviewUser = hereReview->GetUser(); + if (maps_place_link_object_create(&mapsReviewUser) == MAPS_ERROR_NONE) + { + is_valid2 = false; + + if (!hereReviewUser.GetId().empty()) + { + error = maps_place_link_object_set_id(mapsReviewUser, + (char*)hereReviewUser.GetId().c_str()); + is_valid2 |= (error == MAPS_ERROR_NONE); + } + + if (!hereReviewUser.GetTitle().empty()) + { + error = maps_place_link_object_set_name(mapsReviewUser, + (char*)hereReviewUser.GetTitle().c_str()); + is_valid2 |= (error == MAPS_ERROR_NONE); + } + + if (!hereReviewUser.GetHref().empty()) + { + error = maps_place_link_object_set_string(mapsReviewUser, + (char*)hereReviewUser.GetHref().c_str()); + is_valid2 |= (error == MAPS_ERROR_NONE); + } + + if (!hereReviewUser.GetType().empty()) + { + error = maps_place_link_object_set_type(mapsReviewUser, + (char*)hereReviewUser.GetType().c_str()); + is_valid2 |= (error == MAPS_ERROR_NONE); + } + + if (is_valid2) + { + maps_place_review_set_user_link(mapsReview, mapsReviewUser); + is_valid |= is_valid2; + } + maps_place_link_object_destroy(mapsReviewUser); + } + + if (is_valid) + { + maps_item_list_append(mapsReviewList, mapsReview, maps_place_review_clone); + } + maps_place_review_destroy(mapsReview); + } + + if (maps_item_list_items(mapsReviewList)) + { + maps_place_set_reviews(mapsPlace, mapsReviewList); + maps_item_list_remove_all(mapsReviewList, maps_place_review_destroy); + } + maps_item_list_destroy(mapsReviewList); +} + +void HerePlace::ProcessPlaceRatings(PlaceDetails herePlace, maps_place_h mapsPlace) +{ + Ratings hereRating = herePlace.GetRatings(); + maps_place_rating_h mapsRating; + + if (maps_place_rating_create(&mapsRating) != MAPS_ERROR_NONE) return; + + maps_place_rating_set_average(mapsRating, hereRating.GetAverage()); + maps_place_rating_set_count(mapsRating, hereRating.GetCount()); + maps_place_set_rating(mapsPlace, mapsRating); + maps_place_rating_destroy(mapsRating); +} + +void HerePlace::ProcessPlaceRated(PlaceDetails herePlace, maps_place_h mapsPlace) +{ + RelatedItem hereRelated = herePlace.GetRelatedItem(); + maps_place_link_object_h mapsRelated; + int error; + bool is_valid = false; + + if (maps_place_link_object_create(&mapsRelated) != MAPS_ERROR_NONE) return; + + //need to check if GetId() exist + //maps_place_link_object_set_id(mapsRelated, hereRelated.GetId()); + + if (!hereRelated.GetTitle().empty()) + { + error = maps_place_link_object_set_name(mapsRelated, + (char*)hereRelated.GetTitle().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereRelated.GetHref().empty()) + { + error = maps_place_link_object_set_string(mapsRelated, + (char*)hereRelated.GetHref().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (!hereRelated.GetType().empty()) + { + error = maps_place_link_object_set_type(mapsRelated, + (char*)hereRelated.GetType().c_str()); + is_valid |= (error == MAPS_ERROR_NONE); + } + + if (is_valid) + { + maps_place_set_related_link(mapsPlace, mapsRelated); + } + maps_place_link_object_destroy(mapsRelated); +} + +bool HerePlace::__compareWithTitle(const maps_place_h &item1, const maps_place_h &item2) +{ + bool result = false; + char *str1 = NULL, *str2 = NULL; + + if (maps_place_get_name(item1, &str1) == MAPS_ERROR_NONE && + maps_place_get_name(item2, &str2) == MAPS_ERROR_NONE) + { + result = (strcmp(str1, str2) < 0); + } + g_free(str1); + g_free(str2); + return result; +} + +bool HerePlace::__compareWithId(const maps_place_h &item1, const maps_place_h &item2) +{ + bool result = false; + char *str1 = NULL, *str2 = NULL; + + if (maps_place_get_id(item1, &str1) == MAPS_ERROR_NONE && + maps_place_get_id(item2, &str2) == MAPS_ERROR_NONE) + { + result = (strcmp(str1, str2) < 0); + } + g_free(str1); + g_free(str2); + return result; +} + +bool HerePlace::__compareWithDistance(const maps_place_h &item1, const maps_place_h &item2) +{ + bool result = false; + int num1 = 0, num2 = 0; + + if (maps_place_get_distance(item1, &num1) == MAPS_ERROR_NONE && + maps_place_get_distance(item2, &num2) == MAPS_ERROR_NONE) + { + result = (num1 < num2); + } + return result; +} + +bool HerePlace::__compareWithRating(const maps_place_h &item1, const maps_place_h &item2) +{ + bool result = false; + maps_place_rating_h rat1 = NULL, rat2 = NULL; + double num1 = 0, num2 = 0; + + if (maps_place_get_rating(item1, &rat1) == MAPS_ERROR_NONE && + maps_place_get_rating(item2, &rat2) == MAPS_ERROR_NONE) + { + if (maps_place_rating_get_average(rat1, &num1) == MAPS_ERROR_NONE && + maps_place_rating_get_average(rat2, &num2) == MAPS_ERROR_NONE) + { + result = (num1 > num2); + } + } + maps_place_rating_destroy(rat1); + maps_place_rating_destroy(rat2); + return result; +} + +bool HerePlace::__compareWithCategoryCb(int index, int total, + maps_place_category_h category, + void *user_data) +{ + user_data = category; + return false; +} + +bool HerePlace::__compareWithCategory(const maps_place_h &item1, const maps_place_h &item2) +{ + bool result = false; + maps_place_category_h cat1 = NULL, cat2 = NULL; + char *str1 = NULL, *str2 = NULL; + + maps_place_foreach_category(item1, __compareWithCategoryCb, &cat1); + maps_place_foreach_category(item2, __compareWithCategoryCb, &cat2); + + if (maps_place_category_get_id(item1, &str1) == MAPS_ERROR_NONE && + maps_place_category_get_id(item2, &str2) == MAPS_ERROR_NONE) + { + result = (strcmp(str1, str2) < 0); + } + maps_place_category_destroy(item1); + maps_place_category_destroy(item2); + g_free(str1); + g_free(str2); + return result; +} + +void HerePlace::__sortList(PlaceList &list) +{ + if (!m_szSortBy) return; + + if (!strcmp(m_szSortBy, "name") || !strcmp(m_szSortBy, "title")) + { + std::sort(list.begin(), list.end(), __compareWithTitle); + } + else if (!strcmp(m_szSortBy, "id")) + { + std::sort(list.begin(), list.end(), __compareWithId); + } + else if (!strcmp(m_szSortBy, "distance")) + { + std::sort(list.begin(), list.end(), __compareWithDistance); + } + else if (!strcmp(m_szSortBy, "rate") || !strcmp(m_szSortBy, "rating")) + { + std::sort(list.begin(), list.end(), __compareWithRating); + } + else if (!strcmp(m_szSortBy, "category")) + { + std::sort(list.begin(), list.end(), __compareWithCategory); + } +} + +HERE_PLUGIN_END_NAMESPACE diff --git a/src/here_plugin.cpp b/src/here_plugin.cpp new file mode 100644 index 0000000..43e3c77 --- /dev/null +++ b/src/here_plugin.cpp @@ -0,0 +1,302 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include +#include "here_api.h" +#include "here_types.h" +#include "here_utils.h" + +extern "C" +{ + +EXPORT_API int maps_plugin_init(maps_plugin_h *plugin) +{ + if (!plugin) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginInit(plugin); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_shutdown(maps_plugin_h plugin) +{ + if (!plugin) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginShutdown(plugin); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_get_info(maps_plugin_info_h* info) +{ + if (!info) + return MAPS_ERROR_INVALID_PARAMETER; + + maps_plugin_info_create(info); + maps_plugin_info_set_provider_name(*info, "HERE"); + + return MAPS_ERROR_NONE; +} + +EXPORT_API int maps_plugin_set_provider_key(const char* provider_key) +{ + if (!provider_key) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginSetProviderKey(provider_key); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_get_provider_key(char** provider_key) +{ + if (!provider_key) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginGetProviderKey(provider_key); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_set_preference(maps_preference_h preference) +{ + if (!preference) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginSetPreference(preference); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_get_preference(maps_preference_h* preference) +{ + if (!preference) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginGetPreference(preference); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_is_service_supported(maps_service_e service, bool *supported) +{ + if (!supported) + return MAPS_ERROR_INVALID_PARAMETER; + + switch(service) + { + case MAPS_SERVICE_GEOCODE: + case MAPS_SERVICE_GEOCODE_INSIDE_AREA: + case MAPS_SERVICE_GEOCODE_BY_STRUCTURED_ADDRESS: + case MAPS_SERVICE_REVERSE_GEOCODE: + case MAPS_SERVICE_SEARCH_PLACE: + case MAPS_SERVICE_SEARCH_PLACE_BY_AREA: + case MAPS_SERVICE_SEARCH_PLACE_BY_ADDRESS: + case MAPS_SERVICE_SEARCH_ROUTE: + case MAPS_SERVICE_SEARCH_ROUTE_WAYPOINTS: + case MAPS_SERVICE_CANCEL_REQUEST: + *supported = TRUE; + return MAPS_ERROR_NONE; + default: + *supported = FALSE; + return MAPS_ERROR_NOT_SUPPORTED; + } +} + +EXPORT_API int maps_plugin_is_data_supported(maps_service_data_e service, bool *supported) +{ + if (!supported) + return MAPS_ERROR_INVALID_PARAMETER; + + switch(service) + { + case MAPS_PLACE_ADDRESS: + case MAPS_PLACE_RATING: + case MAPS_PLACE_CATEGORIES: + case MAPS_PLACE_ATTRIBUTES: + case MAPS_PLACE_CONTACTS: + case MAPS_PLACE_EDITORIALS: + case MAPS_PLACE_REVIEWS: + case MAPS_PLACE_IMAGE: + case MAPS_PLACE_SUPPLIER: + case MAPS_PLACE_RELATED: + case MAPS_ROUTE_PATH: + case MAPS_ROUTE_SEGMENTS_PATH: + case MAPS_ROUTE_SEGMENTS_MANEUVERS: + *supported = TRUE; + return MAPS_ERROR_NONE; + default: + *supported = FALSE; + return MAPS_ERROR_NOT_SUPPORTED; + } +} + +EXPORT_API int maps_plugin_geocode(const char* address, const maps_preference_h preference, + maps_service_geocode_cb callback, void *user_data, int* request_id) +{ + if (!address || !callback || !request_id) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginGeocode(address, preference, callback, user_data, request_id); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_geocode_inside_area(const char* address, const maps_area_h bounds, + const maps_preference_h preference, maps_service_geocode_cb callback, + void* user_data, int* request_id) +{ + if (!bounds || !address || !callback || !request_id) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginGeocodeInsideArea(address, bounds, preference, callback, user_data, request_id); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_geocode_by_structured_address(const maps_address_h address, + const maps_preference_h preference, maps_service_geocode_cb callback, + void *user_data, int* request_id) +{ + if (!address || !callback || !request_id) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginGeocodeByStructuredAddress(address, preference, callback, user_data, request_id); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_reverse_geocode(double latitude, double longitude, + const maps_preference_h preference, maps_service_reverse_geocode_cb callback, + void *user_data, int* request_id) +{ + if (!callback || !request_id) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginReverseGeocode(latitude, longitude, preference, callback, user_data, request_id); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_search_place(const maps_coordinates_h position, int distance, + const maps_place_filter_h filter, maps_preference_h preference, maps_service_search_place_cb callback, + void* user_data, int* request_id) +{ + if (!position || !filter || !callback || !request_id) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginSearchPlace(position, distance, preference, filter, callback, user_data, request_id); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_search_place_by_area(const maps_area_h boundary, + const maps_place_filter_h filter, maps_preference_h preference, maps_service_search_place_cb callback, + void* user_data, int* request_id) +{ + if (!boundary || !filter || !callback || !request_id) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginSearchPlaceByArea(boundary, preference, filter, callback, user_data, request_id); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_search_place_by_address(const char* address, const maps_area_h boundary, + const maps_place_filter_h filter, maps_preference_h preference, maps_service_search_place_cb callback, + void* user_data, int* request_id) +{ + if (!address || !boundary || !filter || !callback || !request_id) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginSearchPlaceByAddress(address, boundary, preference, filter, callback, user_data, request_id); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_search_route(const maps_coordinates_h origin, const maps_coordinates_h destination, + maps_preference_h preference, maps_service_search_route_cb callback, + void* user_data, int* request_id) +{ + if (!origin || !destination || !callback || !request_id) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginSearchRoute(origin, destination, preference, callback, user_data, request_id); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_search_route_waypoints(const maps_coordinates_h* waypoint_list, int waypoint_num, + maps_preference_h preference, maps_service_search_route_cb callback, + void* user_data, int* request_id) +{ + if (!waypoint_list || waypoint_num <= 0 || !callback || !request_id) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginSearchRouteWaypoints(waypoint_list, waypoint_num, preference, callback, user_data, request_id); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +EXPORT_API int maps_plugin_cancel_request(int request_id) +{ + if (request_id < 0) + return MAPS_ERROR_INVALID_PARAMETER; + + int ret = HerePluginCancelRequest(request_id); + + MAPS_LOGD("here_error_e = %d", ret); + + return ConvertToMapsError(ret); +} + +} // end of extern "C" + diff --git a/src/here_revgeocode.cpp b/src/here_revgeocode.cpp new file mode 100644 index 0000000..914108e --- /dev/null +++ b/src/here_revgeocode.cpp @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "here_revgeocode.h" + +HERE_PLUGIN_BEGIN_NAMESPACE + +HereRevGeocode::HereRevGeocode(void* pCbFunc, void* pUserData, int nReqId) +: m_geoCoord(0,0,0) +{ + m_pQuery = NULL; + m_pCbFunc = pCbFunc; + m_pUserData = pUserData; + m_nReqId = nReqId; +} + +HereRevGeocode::~HereRevGeocode() +{ + if (m_pQuery) + { + delete m_pQuery; + m_pQuery = NULL; + } +} + +here_error_e HereRevGeocode::PrepareQuery() +{ + if (m_pQuery) + return HERE_ERROR_PERMISSION_DENIED; + + m_pQuery = new ReverseGeoCoderQuery(); + + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + else + return HERE_ERROR_NONE; +} + +here_error_e HereRevGeocode::PreparePreference(maps_preference_h hPref) +{ + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!hPref) + return HERE_ERROR_INVALID_PARAMETER; + + int ret; + char *szLanguage; + ret = maps_preference_get_language(hPref, &szLanguage); + if (ret == MAPS_ERROR_NONE && szLanguage && *szLanguage) + m_pQuery->AppendPreferredLanguage(szLanguage); + g_free(szLanguage); + + int nMaxResults; + ret = maps_preference_get_max_results(hPref, &nMaxResults); + if (ret == MAPS_ERROR_NONE) + m_pQuery->SetMaxResults((size_t)nMaxResults); + + return HERE_ERROR_NONE; +} + +here_error_e HereRevGeocode::PreparePosition(double dLat, double dLng) +{ + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + GeoCoordinates geoCoord(dLat, dLng); + if (!HereUtils::IsValid(geoCoord)) + return HERE_ERROR_INVALID_PARAMETER; + + m_pQuery->SetProximity(geoCoord, 0); + m_pQuery->SetMode(ReverseGeoCoderQuery::RM_RetrieveAddresses); + + return HERE_ERROR_NONE; +} + +here_error_e HereRevGeocode::StartRevGeocode(maps_item_hashtable_h hPref) +{ + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + m_nRestReqId = m_pQuery->Execute(*this, NULL); + + return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION); +} + +void HereRevGeocode::OnGeoCoderReply(const GeoCoderReply& Reply) +{ + if (m_bCanceled) // ignore call back if it was cancelled. + { + delete this; + return; + } + + + int nResults = Reply.GetNumResults(); + Result* pResult; + float fDistance, fShortestDistance = 0; + int nShortestIdx = -1; + + for (size_t i = 0; i < (size_t)nResults; i++) + { + pResult = (Result*)Reply.GetResult(i); + + if(pResult) + { + fDistance = pResult->GetDistance(); + + if (nShortestIdx < 0 || fDistance < fShortestDistance) + { + fShortestDistance = fDistance; + nShortestIdx = i; + } + } + } + + + if (nShortestIdx < 0) + { + ((maps_service_reverse_geocode_cb)m_pCbFunc)(MAPS_ERROR_NOT_FOUND, + m_nReqId, 0, 1, NULL, m_pUserData); + delete this; + return; + } + + maps_address_h hAddr = NULL; + maps_error_e error = (maps_error_e)maps_address_create(&hAddr); + + if(error == MAPS_ERROR_NONE) + { + pResult = (Result*)Reply.GetResult(nShortestIdx); + + if (pResult) + { + Address tmpAddr = (pResult->GetLocation()).GetAddress(); + + if(!tmpAddr.GetHouseNumber().empty()) + maps_address_set_building_number(hAddr, tmpAddr.GetHouseNumber().c_str()); + + if(!tmpAddr.GetStreet().empty()) + maps_address_set_street(hAddr, tmpAddr.GetStreet().c_str()); + + if(!tmpAddr.GetDistrict().empty()) + maps_address_set_district(hAddr, tmpAddr.GetDistrict().c_str()); + + if(!tmpAddr.GetCity().empty()) + maps_address_set_city(hAddr, tmpAddr.GetCity().c_str()); + + if(!tmpAddr.GetCounty().empty()) + maps_address_set_county(hAddr, tmpAddr.GetCounty().c_str()); + + if(!tmpAddr.GetState().empty()) + maps_address_set_state(hAddr, tmpAddr.GetState().c_str()); + + if(!tmpAddr.GetCountry().empty()) + maps_address_set_country(hAddr, tmpAddr.GetCountry().c_str()); + + if(!tmpAddr.GetCountryCode().empty()) + maps_address_set_country_code(hAddr, tmpAddr.GetCountryCode().c_str()); + + if(!tmpAddr.GetPostalCode().empty()) + maps_address_set_postal_code(hAddr, tmpAddr.GetPostalCode().c_str()); + + if(!tmpAddr.GetLabel().empty()) + maps_address_set_freetext(hAddr, tmpAddr.GetLabel().c_str()); + } + } + + if (m_bCanceled) + { + maps_address_destroy(hAddr); + } + else + { + ((maps_service_reverse_geocode_cb)m_pCbFunc)(error, m_nReqId, 0, 1, hAddr, m_pUserData); + } + + delete this; +} + +void HereRevGeocode::OnGeoCoderFailure(const GeoCoderReply& Reply) +{ + if (!m_bCanceled) + ((maps_service_reverse_geocode_cb)m_pCbFunc)((maps_error_e)GetErrorCode(Reply), m_nReqId, 0, 1, NULL, m_pUserData); + delete this; +} + +HERE_PLUGIN_END_NAMESPACE + diff --git a/src/here_route.cpp b/src/here_route.cpp new file mode 100644 index 0000000..a8eb95e --- /dev/null +++ b/src/here_route.cpp @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "here_route.h" + +HERE_PLUGIN_BEGIN_NAMESPACE + +HereRoute::HereRoute(void *pCbFunc, void *pUserData, int nReqId) +{ + m_pQuery = NULL; + + m_pCbFunc = pCbFunc; + m_pUserData = pUserData; + m_nReqId = nReqId; +} + +HereRoute::~HereRoute() +{ + if (m_pQuery) + { + delete m_pQuery; + m_pQuery = NULL; + } +} + +here_error_e HereRoute::PrepareQuery() +{ + if (m_pQuery) + return HERE_ERROR_PERMISSION_DENIED; + + GeoCoordinates origCoord, destCoord; + m_pQuery = new GeoRouteQuery(origCoord, destCoord); + + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + else + return HERE_ERROR_NONE; +} + +here_error_e HereRoute::PrepareWaypoint(maps_coordinates_h hOrigin, maps_coordinates_h hDestination) +{ + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!hOrigin || !hDestination) + return HERE_ERROR_INVALID_PARAMETER; + + + const int nWaypointNum = 2; + maps_coordinates_h hWaypointList[nWaypointNum]; + hWaypointList[0] = hOrigin; + hWaypointList[1] = hDestination; + + return PrepareWaypoint(hWaypointList, nWaypointNum); +} + +here_error_e HereRoute::PrepareWaypoint(const maps_coordinates_h* hWaypointList, int nWaypointNum) +{ + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!hWaypointList || nWaypointNum <= 0) + return HERE_ERROR_INVALID_PARAMETER; + + GeoCoordinateList hereCoordList; + GeoCoordinates hereCoord; + double dLatitude, dLongitude; + + for (int index = 0; index < nWaypointNum; index++) + { + if (hWaypointList[index] != NULL) { + maps_coordinates_get_latitude(hWaypointList[index], &dLatitude); + maps_coordinates_get_longitude(hWaypointList[index], &dLongitude); + + //MAPS_LOGD("Waypoint --> Lat : %f, Long : %f", dLatitude, dLongitude); + + hereCoord = GeoCoordinates(dLatitude, dLongitude); + + if (!HereUtils::IsValid(hereCoord)) + return HERE_ERROR_INVALID_PARAMETER; + + hereCoordList.push_back(hereCoord); + } + } + + m_pQuery->SetWaypoints(hereCoordList); + + return HERE_ERROR_NONE; +} + +here_error_e HereRoute::PreparePreference(maps_preference_h hPref) +{ + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + if (!hPref) + return HERE_ERROR_INVALID_PARAMETER; + +/* + SegmentDetail aSegmentDetail; + ManeuverDetail aMneuverDetail; + m_pQuery->SetSegmentDetail(aSegmentDetail); + m_pQuery->SetManeuverDetail(aMneuverDetail); +*/ + + /* transport mode */ + maps_route_transport_mode_e eTransMode; + if (maps_preference_get_route_transport_mode(hPref, &eTransMode) == MAPS_ERROR_NONE) + { + m_pQuery->SetTravelModes(HereUtils::Convert(eTransMode)); + } + + /* eFeature */ + maps_route_feature_e eFeature; + maps_route_feature_weight_e eFeatureWeight; + if (maps_preference_get_route_feature(hPref, &eFeature) == MAPS_ERROR_NONE && + maps_preference_get_route_feature_weight(hPref, &eFeatureWeight) == MAPS_ERROR_NONE) + { + m_pQuery->SetFeatureWeight(HereUtils::Convert(eFeature), + HereUtils::Convert(eFeatureWeight)); + } + + /* exclude areas */ + char *szAreaToAvoid; + if (maps_preference_get(hPref, MAPS_ROUTE_RECT_AREA_TO_AVOID, &szAreaToAvoid) == MAPS_ERROR_NONE) + { + GeoBoundingBox gbBox; + GeoBoundingBoxList gbBoxList; + gbBoxList.push_back(HereUtils::Convert(szAreaToAvoid, gbBox)); + m_pQuery->SetExcludeAreas(gbBoxList); + g_free(szAreaToAvoid); + } + + /* optimization */ + GeoRouteQuery::RouteOptimization hereOpt; + maps_route_optimization_e mapsOpt; + if (maps_preference_get_route_optimization(hPref, &mapsOpt) == MAPS_ERROR_NONE) + { + switch (mapsOpt) + { + case MAPS_ROUTE_TYPE_FASTEST: hereOpt = GeoRouteQuery::RO_FastestRoute; break; + case MAPS_ROUTE_TYPE_SHORTEST: hereOpt = GeoRouteQuery::RO_ShortestRoute; break; + default: hereOpt = GeoRouteQuery::RO_FastestRoute; break; + } + m_pQuery->SetRouteOptimization(hereOpt); + } + + /* Metric System */ + GeoRouteQuery::MetricSystem eMetric; + maps_distance_unit_e eUnit; + if (maps_preference_get_distance_unit(hPref, &eUnit) == MAPS_ERROR_NONE) + { + switch (eUnit) + { + case MAPS_DISTANCE_UNIT_M: eMetric = GeoRouteQuery::DIST_metric; break; + case MAPS_DISTANCE_UNIT_KM: eMetric = GeoRouteQuery::DIST_metric; break; + default: eMetric = GeoRouteQuery::DIST_imperial; break; + } + m_pQuery->SetMetricSystem(eMetric); + } + + char *szViewBounds; + if (maps_preference_get(hPref, MAPS_ROUTE_GEOMETRY_BOUNDING_BOX, &szViewBounds) == MAPS_ERROR_NONE) + { + GeoBoundingBox gbBox; + HereUtils::Convert(szViewBounds, gbBox); + m_pQuery->SetViewBounds(gbBox); + g_free(szViewBounds); + } + + return HERE_ERROR_NONE; +} + +here_error_e HereRoute::StartRoute(void) +{ + if (!m_pQuery) + return HERE_ERROR_OUT_OF_MEMORY; + + m_nRestReqId = m_pQuery->Execute(*this, NULL); + + return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION); +} + +void HereRoute::OnRouteReply(const GeoRouteReply& Reply) +{ + if (m_bCanceled) // ignore call back if it was cancelled. + { + delete this; + return; + } + + maps_route_h mapsRoute; + maps_error_e error; + GeoRouteList hereRouteList = Reply.GetRoutes(); + int nReplyIdx = 0, nReplyNum = hereRouteList.size(); + GeoRouteList::iterator hereRoute; + + if (nReplyNum == 0) + { + ((maps_service_search_route_cb)m_pCbFunc)(MAPS_ERROR_NOT_FOUND, m_nReqId, + 0, 1, NULL, m_pUserData); + delete this; + return; + } + + for (hereRoute = hereRouteList.begin() ; hereRoute != hereRouteList.end() ; hereRoute++) + { + error = (maps_error_e)maps_route_create(&mapsRoute); + + if (error == MAPS_ERROR_NONE) + { + /* route id */ + if (!hereRoute->GetRouteId().empty()) + maps_route_set_route_id(mapsRoute, (char*)hereRoute->GetRouteId().c_str()); + + /* distance */ + maps_route_set_total_distance(mapsRoute, hereRoute->GetDistance()); + + /* duration */ + maps_route_set_total_duration(mapsRoute, hereRoute->GetTravelTime()); + + /* travel mode */ + maps_route_transport_mode_e eTransportMode; + eTransportMode = HereUtils::Convert(hereRoute->GetTravelMode()); + maps_route_set_transport_mode(mapsRoute, eTransportMode); + + /* path */ + GeoCoordinateList herePathList = hereRoute->GetPath(); + maps_item_list_h mapsPathList; + maps_coordinates_h mapsPath; + + if (maps_item_list_create(&mapsPathList) == MAPS_ERROR_NONE) + { + GeoCoordinateList::iterator herePath; + for (herePath = herePathList.begin(); herePath != herePathList.end(); herePath++) + { + double dLat = herePath->GetLatitude(); + double dLng = herePath->GetLongitude(); + + if(maps_coordinates_create(dLat, dLng, &mapsPath) == MAPS_ERROR_NONE) + { + if (herePath == herePathList.begin()) + maps_route_set_origin(mapsRoute, mapsPath); + else if (herePath == herePathList.end()-1) + maps_route_set_destination(mapsRoute, mapsPath); + else + maps_item_list_append(mapsPathList, mapsPath, maps_coordinates_clone); + + maps_coordinates_destroy(mapsPath); + } + } + + if (maps_item_list_items(mapsPathList)) + { + maps_route_set_path(mapsRoute, mapsPathList); + maps_item_list_remove_all(mapsPathList, maps_coordinates_destroy); + } + maps_item_list_destroy(mapsPathList); + } + + /* bounding box */ + maps_area_h hMapsArea = NULL; + HereUtils::Convert(hereRoute->GetBounds(), hMapsArea); + if (hMapsArea) + { + maps_route_set_bounding_box(mapsRoute, hMapsArea); + maps_area_destroy(hMapsArea); + } + + /* segments */ + ProcessSegments(mapsRoute, hereRoute->GetRouteSegmentList()); + } + + if (m_bCanceled) + { + maps_route_destroy(mapsRoute); + break; + } + else + { + if (((maps_service_search_route_cb)m_pCbFunc)(error, m_nReqId, + nReplyIdx++, nReplyNum, mapsRoute, m_pUserData) == FALSE) + { + delete this; + return; + } + //maps_route_destroy(mapsRoute); + } + } + + if(nReplyIdx >= nReplyNum) + delete this; +} + +void HereRoute::OnRouteFailure(const GeoRouteReply& Reply) +{ + if (!m_bCanceled) + ((maps_service_search_route_cb)m_pCbFunc)((maps_error_e)GetErrorCode(Reply), m_nReqId, 0, 1, NULL, m_pUserData); + delete this; +} + +maps_error_e HereRoute::ProcessSegments(maps_route_h mapsRoute, const RouteSegmentList& hereSegmList) +{ + maps_item_list_h mapsSegmList; + maps_route_segment_h mapsSegm; + maps_error_e error; + + if (hereSegmList.empty()) return MAPS_ERROR_NOT_FOUND; + + if ((error = (maps_error_e)maps_item_list_create(&mapsSegmList)) != MAPS_ERROR_NONE) + return error; + + RouteSegmentList::const_iterator hereSegm; + for (hereSegm = hereSegmList.begin() ; hereSegm != hereSegmList.end() ; hereSegm++) + { + if (maps_route_segment_create(&mapsSegm) != MAPS_ERROR_NONE) continue; + + /* distance */ + maps_route_segment_set_distance(mapsSegm, hereSegm->GetDistance()); + + /* tranvel time */ + maps_route_segment_set_duration(mapsSegm, hereSegm->GetTravelTime()); + + /* origin, destination */ + GeoCoordinateList herePathList = hereSegm->GetPath(); + int here_path_list_size = herePathList.size(); + + if (here_path_list_size > 0) + { + GeoCoordinates hereOrig = herePathList.at(0); + GeoCoordinates hereDest = herePathList.at(here_path_list_size-1); + + maps_coordinates_h mapsOrig, mapsDest; + maps_coordinates_create(hereOrig.GetLatitude(), + hereOrig.GetLongitude(), &mapsOrig); + maps_coordinates_create(hereDest.GetLatitude(), + hereDest.GetLongitude(), &mapsDest); + maps_route_segment_set_origin(mapsSegm, mapsOrig); + maps_route_segment_set_destination(mapsSegm, mapsDest); + maps_coordinates_destroy(mapsOrig); + maps_coordinates_destroy(mapsDest); + } + + /* maneuver */ + ProcessManeuver(mapsSegm, hereSegm->GetManeuverList()); + + maps_item_list_append(mapsSegmList, mapsSegm, maps_route_segment_clone); + maps_route_segment_destroy(mapsSegm); + } + + if (maps_item_list_items(mapsSegmList)) + { + maps_route_set_segments(mapsRoute, mapsSegmList); + maps_item_list_remove_all(mapsSegmList, maps_route_segment_destroy); + } + maps_item_list_destroy(mapsSegmList); + + return MAPS_ERROR_NONE; +} + +maps_error_e HereRoute::ProcessManeuver(maps_route_segment_h mapsSegm, const ManeuverList& hereManeList) +{ + maps_item_list_h mapsManeList; + maps_route_maneuver_h mapsManeuver; + maps_coordinates_h mapsCoord; + maps_error_e error; + + if (hereManeList.empty()) return MAPS_ERROR_NOT_FOUND; + + if ((error = (maps_error_e)maps_item_list_create(&mapsManeList)) != MAPS_ERROR_NONE) + return error; + + ManeuverList::const_iterator hereMane; + for (hereMane = hereManeList.begin() ; hereMane != hereManeList.end() ; hereMane++) + { + if (maps_route_maneuver_create(&mapsManeuver) != MAPS_ERROR_NONE) continue; + + /* position */ + if (maps_coordinates_create(hereMane->GetPosition().GetLatitude(), + hereMane->GetPosition().GetLongitude(), &mapsCoord) == MAPS_ERROR_NONE) + { + maps_route_maneuver_set_position(mapsManeuver, mapsCoord); + maps_coordinates_destroy(mapsCoord); + } + + /* instruction */ + if (!hereMane->GetInstructionText().empty()) + maps_route_maneuver_set_instruction_text(mapsManeuver, + (char*)hereMane->GetInstructionText().c_str()); + + /* length */ + maps_route_maneuver_set_distance_to_next_instruction(mapsManeuver, + hereMane->GetDistanceToNextInstruction()); + + /* travel time */ + maps_route_maneuver_set_time_to_next_instruction(mapsManeuver, + hereMane->GetTimeToNextInstruction()); + + /* direction -> turn type */ + maps_route_maneuver_set_turn_type(mapsManeuver, + HereUtils::Convert(hereMane->GetDirection())); + + maps_item_list_append(mapsManeList, mapsManeuver, maps_route_maneuver_clone); + maps_route_maneuver_destroy(mapsManeuver); + } + + if (maps_item_list_items(mapsManeList)) + { + maps_route_segment_set_maneuvers(mapsSegm, mapsManeList); + maps_item_list_remove_all(mapsManeList, maps_route_maneuver_destroy); + } + maps_item_list_destroy(mapsManeList); + + return MAPS_ERROR_NONE; +} + +HERE_PLUGIN_END_NAMESPACE + diff --git a/src/here_utils.cpp b/src/here_utils.cpp new file mode 100644 index 0000000..60f1fb9 --- /dev/null +++ b/src/here_utils.cpp @@ -0,0 +1,359 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "here_utils.h" +#include + + +static const double LATITUDE_RANGE = 85.05113; +static const double LONGITUDE_RANGE = 180.0; + + +extern "C" +{ +int ConvertToMapsError(int nErr) +{ + switch (nErr) + { + case HERE_ERROR_NONE: return MAPS_ERROR_NONE; + case HERE_ERROR_PERMISSION_DENIED: return MAPS_ERROR_PERMISSION_DENIED; + case HERE_ERROR_OUT_OF_MEMORY: return MAPS_ERROR_OUT_OF_MEMORY; + case HERE_ERROR_INVALID_PARAMETER: return MAPS_ERROR_INVALID_PARAMETER; + case HERE_ERROR_NOT_SUPPORTED: return MAPS_ERROR_NOT_SUPPORTED; + case HERE_ERROR_CONNECTION_TIME_OUT: return MAPS_ERROR_CONNECTION_TIME_OUT; + case HERE_ERROR_NETWORK_UNREACHABLE: return MAPS_ERROR_NETWORK_UNREACHABLE; + case HERE_ERROR_INVALID_OPERATION: return MAPS_ERROR_INVALID_OPERATION; + case HERE_ERROR_KEY_NOT_AVAILABLE: return MAPS_ERROR_KEY_NOT_AVAILABLE; + case HERE_ERROR_RESOURCE_BUSY: return MAPS_ERROR_RESOURCE_BUSY; + case HERE_ERROR_CANCELED: return MAPS_ERROR_CANCELED; + case HERE_ERROR_UNKNOWN: return MAPS_ERROR_UNKNOWN; + case HERE_ERROR_SERVICE_NOT_AVAILABLE: return MAPS_ERROR_SERVICE_NOT_AVAILABLE; + case HERE_ERROR_NOT_FOUND: return MAPS_ERROR_NOT_FOUND; + } + return MAPS_ERROR_UNKNOWN; +} + +int ConvertToHereError(int nErr) +{ + switch (nErr) + { + case MAPS_ERROR_NONE: return HERE_ERROR_NONE; + case MAPS_ERROR_PERMISSION_DENIED: return HERE_ERROR_PERMISSION_DENIED; + case MAPS_ERROR_OUT_OF_MEMORY: return HERE_ERROR_OUT_OF_MEMORY; + case MAPS_ERROR_INVALID_PARAMETER: return HERE_ERROR_INVALID_PARAMETER; + case MAPS_ERROR_NOT_SUPPORTED: return HERE_ERROR_NOT_SUPPORTED; + case MAPS_ERROR_CONNECTION_TIME_OUT: return HERE_ERROR_CONNECTION_TIME_OUT; + case MAPS_ERROR_NETWORK_UNREACHABLE: return HERE_ERROR_NETWORK_UNREACHABLE; + case MAPS_ERROR_INVALID_OPERATION: return HERE_ERROR_INVALID_OPERATION; + case MAPS_ERROR_KEY_NOT_AVAILABLE: return HERE_ERROR_KEY_NOT_AVAILABLE; + case MAPS_ERROR_RESOURCE_BUSY: return HERE_ERROR_RESOURCE_BUSY; + case MAPS_ERROR_CANCELED: return HERE_ERROR_CANCELED; + case MAPS_ERROR_UNKNOWN: return HERE_ERROR_UNKNOWN; + case MAPS_ERROR_SERVICE_NOT_AVAILABLE: return HERE_ERROR_SERVICE_NOT_AVAILABLE; + case MAPS_ERROR_NOT_FOUND: return HERE_ERROR_NOT_FOUND; + } + return HERE_ERROR_UNKNOWN; +} + +const char* ConverHereErrorToString(int nErr) +{ + switch (nErr) + { + case HERE_ERROR_NONE: return "No errors"; + case HERE_ERROR_PERMISSION_DENIED: return "Permission denied"; + case HERE_ERROR_OUT_OF_MEMORY: return "Out of memory"; + case HERE_ERROR_INVALID_PARAMETER: return "Invalid Parameter"; + case HERE_ERROR_NOT_SUPPORTED: return "Not suppoerted"; + case HERE_ERROR_CONNECTION_TIME_OUT: return "Connection time out"; + case HERE_ERROR_NETWORK_UNREACHABLE: return "Network unreachable"; + case HERE_ERROR_INVALID_OPERATION: return "Invalid operation"; + case HERE_ERROR_KEY_NOT_AVAILABLE: return "Key not available"; + case HERE_ERROR_RESOURCE_BUSY: return "Resource busy"; + case HERE_ERROR_CANCELED: return "Canceled"; + case HERE_ERROR_UNKNOWN: return "Unknown"; + case HERE_ERROR_SERVICE_NOT_AVAILABLE: return "Service not available"; + case HERE_ERROR_NOT_FOUND: return "Not found"; + } + return "Unknown"; +} + +const char* ConvertMapsErrorToChar(int nErr) +{ + switch (nErr) + { + case MAPS_ERROR_NONE: return "MAPS_ERROR_NONE"; + case MAPS_ERROR_PERMISSION_DENIED: return "MAPS_ERROR_PERMISSION_DENIED"; + case MAPS_ERROR_OUT_OF_MEMORY: return "MAPS_ERROR_OUT_OF_MEMORY"; + case MAPS_ERROR_INVALID_PARAMETER: return "MAPS_ERROR_INVALID_PARAMETER"; + case MAPS_ERROR_NOT_SUPPORTED: return "MAPS_ERROR_NOT_SUPPORTED"; + case MAPS_ERROR_CONNECTION_TIME_OUT: return "MAPS_ERROR_CONNECTION_TIME_OUT"; + case MAPS_ERROR_NETWORK_UNREACHABLE: return "MAPS_ERROR_NETWORK_UNREACHABLE"; + case MAPS_ERROR_INVALID_OPERATION: return "MAPS_ERROR_INVALID_OPERATION"; + case MAPS_ERROR_KEY_NOT_AVAILABLE: return "MAPS_ERROR_KEY_NOT_AVAILABLE"; + case MAPS_ERROR_RESOURCE_BUSY: return "MAPS_ERROR_RESOURCE_BUSY"; + case MAPS_ERROR_CANCELED: return "MAPS_ERROR_CANCELED"; + case MAPS_ERROR_UNKNOWN: return "MAPS_ERROR_UNKNOWN"; + case MAPS_ERROR_SERVICE_NOT_AVAILABLE: return "MAPS_ERROR_SERVICE_NOT_AVAILABLE"; + case MAPS_ERROR_NOT_FOUND: return "MAPS_ERROR_NOT_FOUND"; + } + return "MAPS_ERROR_UNKNOWN"; +} +} + + +HERE_PLUGIN_BEGIN_NAMESPACE + +HereUtils::HereUtils() +{ +} + +HereUtils::~HereUtils() +{ +} + +GeoRouteQuery::TravelMode HereUtils::Convert(maps_route_transport_mode_e nVal) +{ + switch (nVal) + { + case MAPS_ROUTE_TRANSPORT_MODE_CAR: return GeoRouteQuery::TM_CarTravel; + case MAPS_ROUTE_TRANSPORT_MODE_PEDESTRIAN: return GeoRouteQuery::TM_PedestrianTravel; + case MAPS_ROUTE_TRANSPORT_MODE_PUBLICTRANSIT: return GeoRouteQuery::TM_PublicTransitTravel; + default: break; + } + return GeoRouteQuery::TM_CarTravel; +} + +maps_route_transport_mode_e HereUtils::Convert(GeoRouteQuery::TravelMode nVal) +{ + switch (nVal) + { + case GeoRouteQuery::TM_CarTravel: return MAPS_ROUTE_TRANSPORT_MODE_CAR; + case GeoRouteQuery::TM_PedestrianTravel: return MAPS_ROUTE_TRANSPORT_MODE_PEDESTRIAN; + case GeoRouteQuery::TM_PublicTransitTravel: return MAPS_ROUTE_TRANSPORT_MODE_PUBLICTRANSIT; + default: break; + } + return MAPS_ROUTE_TRANSPORT_MODE_CAR; +} + +GeoRouteQuery::FeatureType HereUtils::Convert(maps_route_feature_e nVal) +{ + switch (nVal) + { + case MAPS_ROUTE_FEATURE_NO: return GeoRouteQuery::FT_NoFeature; + case MAPS_ROUTE_FEATURE_TOLL: return GeoRouteQuery::FT_TollFeature; + case MAPS_ROUTE_FEATURE_MOTORWAY: return GeoRouteQuery::FT_MotorwayFeature; + case MAPS_ROUTE_FEATURE_BOATFERRY: return GeoRouteQuery::FT_BoatFerryFeature; + case MAPS_ROUTE_FEATURE_RAILFERRY: return GeoRouteQuery::FT_RailFerryFeature; + case MAPS_ROUTE_FEATURE_PUBLICTTRANSIT: return GeoRouteQuery::FT_PublicTransitFeature; + case MAPS_ROUTE_FEATURE_TUNNEL: return GeoRouteQuery::FT_TunnelFeature; + case MAPS_ROUTE_FEATURE_DIRTROAD: return GeoRouteQuery::FT_DirtRoadFeature; + case MAPS_ROUTE_FEATURE_PARKS: return GeoRouteQuery::FT_ParksFeature; + case MAPS_ROUTE_FEATURE_HOVLANE: return GeoRouteQuery::FT_HOVLane; + case MAPS_ROUTE_FEATURE_STAIRS: return GeoRouteQuery::FT_Stairs; + default: break; + } + return GeoRouteQuery::FT_NoFeature; +} + +GeoRouteQuery::FeatureWeight HereUtils::Convert(maps_route_feature_weight_e nVal) +{ + switch (nVal) + { + case MAPS_ROUTE_FEATURE_WEIGHT_NORMAL: return GeoRouteQuery::FW_NormalFeatureWeight; + case MAPS_ROUTE_FEATURE_WEIGHT_PREFER: return GeoRouteQuery::FW_PreferFeatureWeight; + case MAPS_ROUTE_FEATURE_WEIGHT_AVOID: return GeoRouteQuery::FW_AvoidFeatureWeight; + case MAPS_ROUTE_FEATURE_WEIGHT_SOFTEXCLUDE: return GeoRouteQuery::FW_SoftExcludeFeatureWeight; + case MAPS_ROUTE_FEATURE_WEIGHT_STRICTEXCLUDE: return GeoRouteQuery::FW_StrictExcludeFeatureWeight; + default: break; + } + return GeoRouteQuery::FW_NormalFeatureWeight; +} + +maps_route_turn_type_e HereUtils::Convert(Maneuver::InstructionDirection nVal) +{ + switch (nVal) + { + case Maneuver::ID_NoDirection: return MAPS_ROUTE_TURN_TYPE_NONE; + case Maneuver::ID_DirectionForward: return MAPS_ROUTE_TURN_TYPE_STRAIGHT; + case Maneuver::ID_DirectionBearRight: return MAPS_ROUTE_TURN_TYPE_BEAR_RIGHT; + case Maneuver::ID_DirectionLightRight: return MAPS_ROUTE_TURN_TYPE_LIGHT_RIGHT; + case Maneuver::ID_DirectionRight: return MAPS_ROUTE_TURN_TYPE_RIGHT; + case Maneuver::ID_DirectionHardRight: return MAPS_ROUTE_TURN_TYPE_HARD_RIGHT; + case Maneuver::ID_DirectionUTurnRight: return MAPS_ROUTE_TURN_TYPE_UTURN_RIGHT; + case Maneuver::ID_DirectionUTurnLeft: return MAPS_ROUTE_TURN_TYPE_UTURN_LEFT; + case Maneuver::ID_DirectionHardLeft: return MAPS_ROUTE_TURN_TYPE_HARD_LEFT; + case Maneuver::ID_DirectionLeft: return MAPS_ROUTE_TURN_TYPE_LEFT; + case Maneuver::ID_DirectionLightLeft: return MAPS_ROUTE_TURN_TYPE_LIGHT_LEFT; + case Maneuver::ID_DirectionBearLeft: return MAPS_ROUTE_TURN_TYPE_BEAR_LEFT; + default: break; + } + return MAPS_ROUTE_TURN_TYPE_NONE; +} + +Maneuver::InstructionDirection HereUtils::Convert(maps_route_turn_type_e nVal) +{ + switch (nVal) + { + case MAPS_ROUTE_TURN_TYPE_NONE: return Maneuver::ID_NoDirection; + case MAPS_ROUTE_TURN_TYPE_STRAIGHT: return Maneuver::ID_DirectionForward; + case MAPS_ROUTE_TURN_TYPE_BEAR_RIGHT: return Maneuver::ID_DirectionBearRight; + case MAPS_ROUTE_TURN_TYPE_LIGHT_RIGHT: return Maneuver::ID_DirectionLightRight; + case MAPS_ROUTE_TURN_TYPE_RIGHT: return Maneuver::ID_DirectionRight; + case MAPS_ROUTE_TURN_TYPE_HARD_RIGHT: return Maneuver::ID_DirectionHardRight; + case MAPS_ROUTE_TURN_TYPE_UTURN_RIGHT: return Maneuver::ID_DirectionUTurnRight; + case MAPS_ROUTE_TURN_TYPE_UTURN_LEFT: return Maneuver::ID_DirectionUTurnLeft; + case MAPS_ROUTE_TURN_TYPE_HARD_LEFT: return Maneuver::ID_DirectionHardLeft; + case MAPS_ROUTE_TURN_TYPE_LEFT: return Maneuver::ID_DirectionLeft; + case MAPS_ROUTE_TURN_TYPE_LIGHT_LEFT: return Maneuver::ID_DirectionLightLeft; + case MAPS_ROUTE_TURN_TYPE_BEAR_LEFT: return Maneuver::ID_DirectionBearLeft; + default: break; + } + return Maneuver::ID_NoDirection; +} + +maps_error_e HereUtils::ConvertHttpCodeToMapsError(int nVal) +{ + switch (nVal) + { + case 200:/*Ok*/ return MAPS_ERROR_NONE; + case 408:/*Request timeout*/ + case 504:/*Gateway timeout*/ + case 598:/*Network reading timeout*/ + case 599:/*Network connection timeout*/ return MAPS_ERROR_CONNECTION_TIME_OUT; + + case 404:/*Not found*/ + case 407:/*Proxy auth. required*/ + case 502:/*Bad gateway*/ return MAPS_ERROR_NETWORK_UNREACHABLE; + + case 401:/*Unauthorized*/ + case 402:/*Payment required*/ return MAPS_ERROR_KEY_NOT_AVAILABLE; + + case 405:/*Method not allowed*/ + case 413:/*Request entity too larget*/ + case 414:/*Request uri too large*/ return MAPS_ERROR_INVALID_OPERATION; + + case 403:/*Forbidden*/ + case 500:/*Server internal error*/ + case 501:/*Not implemented*/ + case 503:/*Service unavailable*/ return MAPS_ERROR_SERVICE_NOT_AVAILABLE; + } + + if (nVal > 0 && nVal < 100) // curl error code + return MAPS_ERROR_NETWORK_UNREACHABLE; + + if (nVal >= 400 && nVal < 500) // http code 4xx (client-side error) + return MAPS_ERROR_INVALID_OPERATION; + + if (nVal >= 500 && nVal < 600) // http code 5xx (server-side error) + return MAPS_ERROR_SERVICE_NOT_AVAILABLE; + + return MAPS_ERROR_UNKNOWN; +} + +GeoBoundingBox& HereUtils::Convert(maps_area_h hArea, GeoBoundingBox& Box) +{ + maps_area_s* area_s = (maps_area_s*)hArea; + + if (!area_s || area_s->type != MAPS_AREA_RECTANGLE) return Box; + + GeoCoordinates hereCoordLT(area_s->rect.top_left.latitude, area_s->rect.top_left.longitude); + GeoCoordinates hereCoordRB(area_s->rect.bottom_right.latitude, area_s->rect.bottom_right.longitude); + + Box.SetTopLeft(hereCoordLT); + Box.SetBottomRight(hereCoordRB); + + return Box; +} + +maps_area_h& HereUtils::Convert(GeoBoundingBox Box, maps_area_h& hArea) +{ + maps_coordinates_h mapsCoordLT, mapsCoordRB; + GeoCoordinates hereCoordLT, hereCoordRB; + + hereCoordLT = Box.GetTopLeft(); + hereCoordRB = Box.GetBottomRight(); + + maps_coordinates_create(hereCoordLT.GetLatitude(), hereCoordLT.GetLongitude(), &mapsCoordLT); + maps_coordinates_create(hereCoordRB.GetLatitude(), hereCoordRB.GetLongitude(), &mapsCoordRB); + + maps_area_create_rectangle(mapsCoordLT, mapsCoordRB, &hArea); + + maps_coordinates_destroy(mapsCoordLT); + maps_coordinates_destroy(mapsCoordRB); + + return hArea; +} + +void HereUtils::Convert(String strUtf8, WString& strUtf16) +{ + strUtf16.assign(strUtf8.begin(), strUtf8.end()); +} + +void HereUtils::Convert(WString strUtf16, String& strUtf8) +{ + strUtf8.assign(strUtf16.begin(), strUtf16.end()); +} + +GeoBoundingBox& HereUtils::Convert(const char *src, GeoBoundingBox &box) +{ + int i = 0; + char *token, *next; + double coord[4] = { 0.0, }; + + token = strtok_r((char*)src, ",;", &next); + while (token && i < 4) + { + coord[i++] = atof(token); + token = strtok_r(NULL, ",;", &next); + } + box.SetTopLeft(GeoCoordinates(coord[0], coord[1])); + box.SetBottomRight(GeoCoordinates(coord[2], coord[3])); + return box; +} + +bool HereUtils::IsValid(GeoCoordinates geoCoord) +{ + return IsValidCoord(geoCoord.GetLatitude(), geoCoord.GetLongitude()); +} + +bool HereUtils::IsValid(maps_coordinates_s geoCoord) +{ + return IsValidCoord(geoCoord.latitude, geoCoord.longitude); +} + +bool HereUtils::IsValidCoord(double dLat, double dLng) +{ + return ((dLat <= LATITUDE_RANGE && dLat >= -LATITUDE_RANGE) && + (dLng <= LONGITUDE_RANGE && dLng >= -LONGITUDE_RANGE)); +} + +bool HereUtils::IsValid(maps_area_s hArea) +{ + if (hArea.type == MAPS_AREA_RECTANGLE) + { + return (HereUtils::IsValid(hArea.rect.top_left) && + HereUtils::IsValid(hArea.rect.bottom_right)); + } + else if(hArea.type == MAPS_AREA_CIRCLE) + { + return HereUtils::IsValid(hArea.circle.center); + } + else + return false; +} + + +HERE_PLUGIN_END_NAMESPACE diff --git a/x86_64/libheremaps-engine.so.1 b/x86_64/libheremaps-engine.so.1 deleted file mode 120000 index 0fc20c3..0000000 --- a/x86_64/libheremaps-engine.so.1 +++ /dev/null @@ -1 +0,0 @@ -libheremaps-engine.so.1.0.6_6 \ No newline at end of file diff --git a/x86_64/libheremaps-engine.so.1.0.6_6 b/x86_64/libheremaps-engine.so.1.0.6_6 deleted file mode 100755 index 3e2a062..0000000 Binary files a/x86_64/libheremaps-engine.so.1.0.6_6 and /dev/null differ diff --git a/x86_64/libmaps-plugin-here.so b/x86_64/libmaps-plugin-here.so deleted file mode 120000 index 89d69a6..0000000 --- a/x86_64/libmaps-plugin-here.so +++ /dev/null @@ -1 +0,0 @@ -libmaps-plugin-here.so.0 \ No newline at end of file diff --git a/x86_64/libmaps-plugin-here.so.0 b/x86_64/libmaps-plugin-here.so.0 deleted file mode 120000 index f343856..0000000 --- a/x86_64/libmaps-plugin-here.so.0 +++ /dev/null @@ -1 +0,0 @@ -libmaps-plugin-here.so.0.1.6 \ No newline at end of file diff --git a/x86_64/libmaps-plugin-here.so.0.1.6 b/x86_64/libmaps-plugin-here.so.0.1.6 deleted file mode 100755 index 879b8e5..0000000 Binary files a/x86_64/libmaps-plugin-here.so.0.1.6 and /dev/null differ